Python 一次进行多个单独的二维旋转

Python 一次进行多个单独的二维旋转,python,numpy,Python,Numpy,我有一组(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

我有一组(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=???)

似乎您正在保持两个数组之间的第一个轴-
p
R
对齐,并将
和减少
分别与输入数组的其余轴隔开。因此,我们可以使用,因为它将允许我们轴对齐标准

您正在使用
p
中的最后一个轴进行总和缩减。现在,根据旋转计算的
R
的哪个轴的
和减少
,其中一个轴应该可以完成这项工作-

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

输出阵列的形状是什么?形状应该与P相同(P的每个点都是旋转的),谢谢!第一个选项和最后一个选项之间的几何解释是什么?@NicolasRougier嗯,我可以帮你处理代码部分,但不确定这里所涉及的几何。所以,对不起,我不能对此发表评论。到时我会试验的。再次感谢。