我有一组(n)几何形状,由固定数量(p)的2D点定义。这些形状是独立的,但出于效率原因,我将时间存储在一个numpy数组中。缩放或翻译这些形状很容易,但我想旋转它们,我不知道该怎么做。我怀疑np.tensordot
是我的朋友,但我找不到正确使用它的方法。
n = 100 # Number of shape
p = 4 # Points per shape
P = np.random.uniform(0, 1, (n, p, 2))
# Scaling
S = 0.5*np.ones(n)
P *= S
# Translating
T = np.random.uniform(0, 1, (n, 1, 2))
P += T
# Rotating
A = np.random.uniform(0, 2*np.pi, n)
cosA, sinA = np.cos(A), np.sin(A)
R = np.empty((n,2,2))
R[:,0,0] = cosA
R[:,1,0] = sinA
R[:,0,1] = -sinA
R[:,1,1] = cosA
np.tensordot(P, R, axes=???)
答案 0 :(得分:2)
似乎你保持两个阵列之间的第一个轴 - P
和R
对齐,sum-reducing
每个离开输入数组的剩余轴。因此,我们可以使用np.einsum
,因为它将允许我们使用轴对齐标准。
您正在使用P
中的最后一个轴进行总和减少。现在,根据R
的哪一个轴失去sum-reduction
进行轮换计算,其中一个应该完成这项任务 -
np.einsum('ijk,ilk->ijl',P,R) # Using last dim of R for sum-reduction
np.einsum('ijk,ikl->ijl',P,R) # Using second dim of R for sum-reduction