【发布时间】:2023-03-20 04:47:02
【问题描述】:
以下代码旨在对一组 3d 坐标进行线性坐标变换。变换矩阵为A,包含坐标的数组为x。 x 的第零轴在 x、y、z 维度上运行。它可以具有除此之外的任意形状。
这是我的尝试:
A = np.random.random((3, 3))
x = np.random.random((3, 4, 2))
x_prime = np.einsum('ij,j...->i...', A, x)
输出是:
x_prime = np.einsum('ij,j...->i...', A, x)
ValueError: operand 0 did not have enough dimensions
to match the broadcasting, and couldn't be extended
because einstein sum subscripts were specified at both
the start and end
如果我在x 中明确指定附加下标,错误就会消失。换句话说,以下工作:
x_prime = np.einsum('ij,jkl->ikl', A, x)
我希望x 能够在第零轴之后拥有任意数量的轴,因此我给出的解决方法不是最佳的。我实际上不确定为什么第一个 einsum 示例不起作用。我正在使用 numpy 1.6.1。这是一个错误,还是我误解了documentation?
【问题讨论】:
-
FWIW 您的代码似乎在 numpy 1.9.0.dev-b785070 中按原样工作。
-
我注意到我的 numpy 版本中至少还有一个 einsum 错误(三个操作数的结果不正确),所以如果这是第二个错误,我不会感到惊讶。我认为 einsum 是在 v1.6.0 中引入的。
-
x_prime = np.einsum('...ij,j...->i...', A, x)也应该可以工作。此问题已在http://stackoverflow.com/questions/16591696/ellipsis-broadcasting-in-numpy-einsum/中提出,并已在最新代码中更正。