带有str和negative的Numpy矩阵乘法

2024-07-05 15:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在用加速度计测量了结构的振动后,我得到了一个csv,其中包含时间和数据集,包括每个传感器坐标方向的加速度值。在未来,我将使用大约100个传感器,这些传感器具有不同于全局CS的本地CS。因此,我想用一个转换矩阵来绘制每个方向的加速度。在

输入文件可能如下所示:

time;loc1_x;loc1_y;loc1_z
0;0.0068;0.0419;0.0107
0.00042;0.0083;0.042;0.021
0.00083;0.0083;0.045;0.009

因此,如果我想绘制全局z加速度,我的plt.plot表达式需要绘制loc1_y乘以-1的所有值。在

^{pr2}$

在本例中,我的数据集可由字符串表达式(如“loc1_x”)调用,并已放在一个名为loc_sens的数组中。因为我需要绘制“loc 1_y”的负值,所以我想使用一个转换矩阵,它给我一个如下所示的数组:

glo_sens = ['loc1_x', 'loc1_z', '-loc1_y']

据我所知,问题是字符串不能乘以负标量。我会很感激任何帮助或更简单的想法。谢谢!在


Tags: 数据字符串表达式绘制矩阵传感器数组cs
1条回答
网友
1楼 · 发布于 2024-07-05 15:21:19

正在创建data数组:

In [97]: txt = """time;loc1_x;loc1_y;loc1_z
    ...: 0;0.0068;0.0419;0.0107
    ...: 0.00042;0.0083;0.042;0.021
    ...: 0.00083;0.0083;0.045;0.009""".splitlines()
In [98]: data = np.genfromtxt(txt, delimiter=';', dtype=None, names=True)
In [99]: data
Out[99]: 
array([(0.     , 0.0068, 0.0419, 0.0107),
       (0.00042, 0.0083, 0.042 , 0.021 ),
       (0.00083, 0.0083, 0.045 , 0.009 )],
      dtype=[('time', '<f8'), ('loc1_x', '<f8'), ('loc1_y', '<f8'), ('loc1_z', '<f8')])

按名称访问字段

^{pr2}$

字符串就是字符串:

In [102]: 'loc1_x'
Out[102]: 'loc1_x'
In [103]: loc_sens = np.array(['loc1_x', 'loc1_y', 'loc1_z'])
     ...: trans = np.array([[1, 0, 0], [0, 0, 1], [0, -1, 0]])
     ...: 

字符串数组就是字符串数组

In [104]: loc_sens
Out[104]: array(['loc1_x', 'loc1_y', 'loc1_z'], dtype='<U6')

在字符串上dot没有多大意义

In [105]: np.dot(loc_sens, trans)
...
ValueError: data type must provide an itemsize

Python确实为字符串定义了乘法,但我认为这不是您想要的:

In [106]: [str*n for n, str in zip([1,2,3],loc_sens)]
Out[106]: ['loc1_x', 'loc1_yloc1_y', 'loc1_zloc1_zloc1_z']

我想您想要的是data中的3列作为3x3矩阵。在

In [107]: locs = np.stack((data['loc1_x'], data['loc1_y'], data['loc1_z']))
In [108]: locs
Out[108]: 
array([[0.0068, 0.0083, 0.0083],
       [0.0419, 0.042 , 0.045 ],
       [0.0107, 0.021 , 0.009 ]])
In [109]: np.dot(locs, trans)
Out[109]: 
array([[ 0.0068, -0.0083,  0.0083],
       [ 0.0419, -0.045 ,  0.042 ],
       [ 0.0107, -0.009 ,  0.021 ]])

或者你想用locs.T(转置)。在

将结构化数组的几个字段转换为二维数组有点棘手。另外,多个字段的访问方式也有了变化(在v1.14中)。所以我选择了各个字段中最安全的一种(连接为列)。在


从注释和代码看来,您认为data的字段可以简单地由字符串引用。或者字符串是变量名之类的。是的,您使用字符串作为字段索引,就像使用字符串作为字典的键一样。在


如果我以浮点形式加载数据,就可以按片访问列

In [112]: data1 = np.genfromtxt(txt, delimiter=';', dtype=float, skip_header=1)
In [113]: data1
Out[113]: 
array([[0.     , 0.0068 , 0.0419 , 0.0107 ],
       [0.00042, 0.0083 , 0.042  , 0.021  ],
       [0.00083, 0.0083 , 0.045  , 0.009  ]])
In [114]: np.dot(data1[:,1:], trans)
Out[114]: 
array([[ 0.0068, -0.0107,  0.0419],
       [ 0.0083, -0.021 ,  0.042 ],
       [ 0.0083, -0.009 ,  0.045 ]])
In [115]: np.dot(data1[:,1:].T, trans)
Out[115]: 
array([[ 0.0068, -0.0083,  0.0083],
       [ 0.0419, -0.045 ,  0.042 ],
       [ 0.0107, -0.009 ,  0.021 ]])

或者用更华丽的数据类型

In [118]: data2 = np.genfromtxt(txt, delimiter=';', dtype=[('time','f8'),('loc1'
     ...: ,'f8',(3,))], skip_header=1)
In [119]: data2
Out[119]: 
array([(0.     , [0.0068, 0.0419, 0.0107]),
       (0.00042, [0.0083, 0.042 , 0.021 ]),
       (0.00083, [0.0083, 0.045 , 0.009 ])],
      dtype=[('time', '<f8'), ('loc1', '<f8', (3,))])
In [121]: data2['loc1']
Out[121]: 
array([[0.0068, 0.0419, 0.0107],
       [0.0083, 0.042 , 0.021 ],
       [0.0083, 0.045 , 0.009 ]])

我们可以使用字符串列表访问结构化数组的多个字段:

In [128]: data[loc_sens]
Out[128]: 
array([(0.0068, 0.0419, 0.0107), (0.0083, 0.042 , 0.021 ),
       (0.0083, 0.045 , 0.009 )],
      dtype={'names':['loc1_x','loc1_y','loc1_z'], 'formats':['<f8','<f8','<f8'], 'offsets':[8,16,24], 'itemsize':32})

他们对v1.14中的多字段索引的工作方式做了一些改变,我仍在努力理解它。view和{}不工作。tolist是用于转换到/来自结构化数组的旧回退方法:

In [137]: data[loc_sens].tolist()
Out[137]: [(0.0068, 0.0419, 0.0107), (0.0083, 0.042, 0.021), (0.0083, 0.045, 0.009)]
In [138]: np.array(data[loc_sens].tolist())
Out[138]: 
array([[0.0068, 0.0419, 0.0107],
       [0.0083, 0.042 , 0.021 ],
       [0.0083, 0.045 , 0.009 ]])

相关问题 更多 >