【问题标题】:numpy einsum with '...'带有'...'的numpy einsum
【发布时间】:2023-03-20 04:47:02
【问题描述】:

以下代码旨在对一组 3d 坐标进行线性坐标变换。变换矩阵为A,包含坐标的数组为xx 的第零轴在 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/ 中提出,并已在最新代码中更正。

标签: python numpy


【解决方案1】:

是的,这是一个错误。它已在此拉取请求中修复:https://github.com/numpy/numpy/pull/4099

这是一个月前才合并的,所以它需要一段时间才能成为稳定版本。

编辑:正如@hpaulj 在评论中提到的那样,即使指定了所有索引,您也可以通过添加省略号来解决此限制:

np.einsum('...ij,j...->i...', A, x)

【讨论】:

  • 如果您从@hpaulj 的评论中添加建议,这个答案将是正确的。其他人可能会在未来一段时间内遇到同样的问题,因为下一个稳定版本的 numpy 需要一段时间才能包含在主要发行版中(Ubuntu 14.04 LTS 可能不会包含它,CentOS 需要很长时间才能发布新版本等)。
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2023-03-21
  • 2020-08-21
相关资源
最近更新 更多