用加速度计测量结构的振动后,我得到一个带有时间和数据集的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']
据我所知,问题是字符串不能被负标量乘以。我将不胜感激任何帮助或更简单的想法。谢谢!
答案 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中对这个多字段索引的工作方式做了一些改变,我仍然试图理解它。 view
和astype
无法正常工作。 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 ]])