numpy - python Numpy einsum() 用于meshgrid的旋转

  显示原文与译文双语对照的内容

我有一组使用 meshgrid() 生成的3d 坐标。 我希望能够绕 3轴旋转这些轴。

我试图解释meshgrid并在每个点上做一个旋转,但是meshgrid大,但内存不足。

这个问题在 2d 中用 einsum ( ) 解决这个问题,但是在扩展到 3时我无法找出字符串格式。

关于 einsum() 和它的格式字符串,我已经读过几页,但还没找到。

编辑:

我调用meshgrid轴X,Y 和Z,每个都是形状( 213,48,37 ) 。 另外,当我尝试将结果放回meshgrid时,实际的内存错误出现了。

当我尝试'解开'以逐点旋转时,我使用了以下函数:


def mg2coords(X, Y, Z):


 return np.vstack([X.ravel(), Y.ravel(), Z.ravel()]).T



我用下面的方法对结果进行了循环:


def rotz(angle, point):


 rad = np.radians(angle)


 sin = np.sin(rad)


 cos = np.cos(rad)


 rot = [[cos, -sin, 0],


 [sin, cos, 0],


 [0, 0, 1]]



 return np.dot(rot, point)



旋转后,我将使用点插入到。

时间: 原作者:

使用你的定义:


In [840]: def mg2coords(X, Y, Z):


 return np.vstack([X.ravel(), Y.ravel(), Z.ravel()]).T



In [841]: def rotz(angle):


 rad = np.radians(angle)


 sin = np.sin(rad)


 cos = np.cos(rad)


 rot = [[cos, -sin, 0],


 [sin, cos, 0],


 [0, 0, 1]]


 return np.array(rot)


 # just to the rotation matrix



定义示例网格:


In [842]: X,Y,Z=np.meshgrid([0,1,2],[0,1,2,3],[0,1,2],indexing='ij') 


In [843]: xyz=mg2coords(X,Y,Z)



按行逐行旋转:


In [844]: xyz1=np.array([np.dot(rot,i) for i in xyz])



按行计算等效 einsum 行:


In [845]: xyz2=np.einsum('ij,kj->ki',rot,xyz)



它们匹配:


In [846]: np.allclose(xyz2,xyz1)


Out[846]: True



或者我可以将 3个数组收集到一个 4d array 中,然后用 einsum 旋转。 这里 np.array 在开始处添加一个维度。 因此 dot sum j 维度为 1,数组的3d 为:


In [871]: XYZ=np.array((X,Y,Z))


In [872]: XYZ2=np.einsum('ij,jabc->iabc',rot,XYZ)



In [873]: np.allclose(xyz2[:,0], XYZ2[0,...].ravel())


Out[873]: True



12的Similary 。

或者,我可以将 XYZ2 拆分为 3个组件数组:


In [882]: X2,Y2,Z2 = XYZ2


In [883]: np.allclose(X2,xyz2[:,0].reshape(X.shape))


Out[883]: True



如果要向另一个方向旋转,请使用 ji 而不是 ij 。换句话说,使用 rot.T

原作者:
...