我的dtype如下:
pose_dtype = np.dtype([('x', np.float64), ('y', np.float64), ('theta', np.float64)])
现在,我可以写:
pose = np.array((1, 2, np.pi), dtype=pose_dtype)
我想添加一个xy
字段,以便更轻松地使用它。我可以这样做:
pose_dtype = np.dtype(dict(
names=['x', 'y', 'theta', 'xy'],
formats=[np.float64, np.float64, np.float64, (np.float64, 2)],
offsets=[0, 8, 16, 0]
))
但是,现在我不能再使用我以前的方法构造数组了,不得不诉诸:
pose = np.array((1, 2, np.pi, [1, 2]), dtype=pose_dtype)
这是危险的重复。
有什么方法可以将属性标记为彼此的别名,这样我就不必处理这个问题了?
答案 0 :(得分:1)
按字段而不是记录
填充数组的实验In [207]: pose_dtype = np.dtype(dict(
names=['x', 'y', 'theta', 'xy'],
formats=[np.float64, np.float64, np.float64, (np.float64, 2)],
offsets=[0, 8, 16, 0]
))
In [209]: A=np.zeros((3,),dtype=pose_dtype)
In [210]: A
Out[210]:
array([(0.0, 0.0, 0.0, [0.0, 0.0]), (0.0, 0.0, 0.0, [0.0, 0.0]),
(0.0, 0.0, 0.0, [0.0, 0.0])],
dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24})
In [211]: A['x']=[1,2,3]
In [212]: A
Out[212]:
array([(1.0, 0.0, 0.0, [1.0, 0.0]), (2.0, 0.0, 0.0, [2.0, 0.0]),
(3.0, 0.0, 0.0, [3.0, 0.0])],
dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24})
In [213]: A['y']=[4,5,6]
In [214]: A
Out[214]:
array([(1.0, 4.0, 0.0, [1.0, 4.0]), (2.0, 5.0, 0.0, [2.0, 5.0]),
(3.0, 6.0, 0.0, [3.0, 6.0])],
dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24})
In [215]: A['xy']
Out[215]:
array([[ 1., 4.],
[ 2., 5.],
[ 3., 6.]])
In [216]: A['xy']=np.arange(10,16).reshape(3,2)
In [217]: A
Out[217]:
array([(10.0, 11.0, 0.0, [10.0, 11.0]), (12.0, 13.0, 0.0, [12.0, 13.0]),
(14.0, 15.0, 0.0, [14.0, 15.0])],
dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24})
In [219]: A['xy'].dot(A['xy'].T)
Out[219]:
array([[ 221., 263., 305.],
[ 263., 313., 363.],
[ 305., 363., 421.]])
另一种将2个字段作为浮点数组(不太漂亮)的方法
In [228]: A[['x','y']].view(float).reshape(-1,2)
Out[228]:
array([[ 10., 11.],
[ 12., 13.],
[ 14., 15.]])