我有包含头部位置矢量(x,y,z)和头部旋转矩阵(3x3)的运动数据。对于每个时间点,我每个都有一个。它们存储在两个这样的DataArrays中:
rotated = np.einsum('tij,tj->ti', rot, pos)
如何通过将位置矢量乘以旋转矩阵来计算每个时间点的旋转位置矢量?
使用纯粹的numpy,我可以使用:
<DATA>
<NAME><![CDATA[FIRSTNAME LASTNAME MIDDLENAME ]]></NAME>
<NUM>3731</NUM>
<person_type>4</person_type>
<birth_date><![CDATA[01.11.1992]]></birth_date>
<DESCRIPTION><![CDATA[DESCRIPTION]]></DESCRIPTION>
</DATA>
文档说xarray.dot就像np.einsum,但我无法使其正常工作。同样,暗点也不相同,在einsum中有两个i,但是暗点是矩阵的h_rot_i和位置矢量的h_pos。.
答案 0 :(得分:0)
您需要将h_rot_j
维度重命名为h_pos
(或反之),以便名称匹配。然后,您还需要在dims='time'
中指定dot
,以明确保留时间维度。
从理论上讲,以下方法应该可以工作,但是由于xarray bug的原因,目前会引发错误:
>>> rot_data2 = rot_data.rename({'h_rot_j': 'h_pos'}
>>> xr.dot(rot_data2, pos_data, dims='h_pos')
ValueError: indexes along dimension 'x' are not equal
作为一种解决方法,您还应该将h_pos
坐标值分配给rot_data2
,例如
>>> rot_data2 = rot_data.rename({'h_rot_j': 'h_pos'})
>>> rot_data2.coords['h_pos'] = pos_data.h_pos
>>> xr.dot(rot_data2, pos_data, dims='h_pos')
<xarray.DataArray (time: 1000, h_rot_i: 3)>
array([[1.034348, 0.655469, 1.235536],
[0.815916, 0.632311, 0.603557],
[0.87191 , 0.54483 , 0.586762],
...,
[0.629219, 0.716169, 0.721611],
[0.517938, 0.440981, 0.649848],
[0.763335, 0.624545, 0.370505]])
Dimensions without coordinates: time, h_rot_i
这时,您可能还想使用rename
和坐标分配来切换h_rot_i
-> h_pos
,但我将其留给读者练习:)