Numpy矩阵乘法与str和negativ int

时间:2018-02-15 08:41:41

标签: python numpy matrix

用加速度计测量结构的振动后,我得到一个带有时间和数据集的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。

import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt(filepath+'\\'+filename, delimiter=';', skip_header=0,
                     names=['time', 'loc1_x', 'loc1_y', 'loc1_z'])

loc_sens = np.array(['loc1_x', 'loc1_y', 'loc1_z'])
trans = np.array([[1, 0, 0], [0, 0, 1], [0, -1, 0]])

glo_sens = np.dot(loc_sens, trans)

fig = plt.figure()
plt.plot(data['time'], glo_sens[i], color='xcolor', label='xlabel')

在这个例子中,我的数据集可以通过像'loc1_x'这样的字符串表达式来调用,并且已经放在一个名为loc_sens的数组中。因为我需要绘制'loc1_y'的负值,我想使用一个变换矩阵,它给我一个如下的数组:

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

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

1 个答案:

答案 0 :(得分:1)

创建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')])

按名称访问字段

In [100]: data['time']
Out[100]: array([0.     , 0.00042, 0.00083])
In [101]: data['loc1_x']
Out[101]: array([0.0068, 0.0083, 0.0083])

字符串只是一个字符串:

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(转置)。

将结构化数组的多个字段转换为二维数组有点棘手。此外,多个字段的访问方式也发生了变化(第1.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 ]])

或者有一位鸽友dtype

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})

他们已经在v 1.14中对这个多字段索引的工作方式做了一些改变,我仍然试图理解它。 viewastype无法正常工作。 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 ]])