【问题标题】:Numpy Vectorized Function Over Successive 2d Slices连续二维切片上的 Numpy 矢量化函数
【发布时间】:2014-08-15 01:40:26
【问题描述】:

我有一个 3D numpy 数组。我想通过在沿轴的连续 2d 切片上执行一个函数并将生成的切片堆叠在一起来形成一个新的 3d 数组。显然有很多方法可以做到这一点;我想以最简洁的方式做到这一点。我认为numpy.vectorize 可以做到这一点,但这似乎会产生一个迭代数组中每个值的函数,而不是通过沿第一个轴移动来获取二维切片。

基本上,我想要看起来像这样的代码:

new3dmat = np.vectorize(func2dmat)(my3dmat)

并完成与此相同的事情:

new3dmat = np.empty_like(my3dmat)
for i in range(my3dmat.shape[0]):
  new3dmat[i] = func2dmat(my3dmat[i])

我怎样才能做到这一点?

【问题讨论】:

  • 你不能重写你的func2dmat 来操作完整的 3D 数组吗? YMMV,但这通常是进行此类矢量化的最佳方式..
  • 我可以这样做,但循环解决方案更可取。我希望能够简洁地对复合数据结构(3d 矩阵)进行操作,并使用对其成分(2d 矩阵)进行操作的函数——并且该函数不需要了解这些成分来自的更大结构。这样我只需要一个函数,而不是包含二维矩阵的每个可能结构的特殊函数。
  • 你想要一个 GUFUNC,例如np.linalg.det... 惯例是让您的函数作用于输入的最后 2 维上的每个 2D 数组。如果您可以为此编写快速矢量化代码,那么让它在其他轴上工作只是明智地使用np.rollaxis 之类的问题。如果您想充分利用 numpy,那么 Python 循环解决方案几乎是不可取的。
  • 优选是主观的..如果切片足够大,性能差异应该是最小的,并且Sean的逻辑是合理的;存在多少其他轴(如果有的话)不是内部功能的概念事务。当过早优化没有明显的性能优势时,编写代码来处理这种一般情况。
  • @Jaime 我喜欢按照惯例在最后两个轴上运行的函数的想法。感谢您的帮助,目前使用 Eelco 的解决方案。

标签: python arrays numpy vectorization


【解决方案1】:

恐怕像下面这样的东西是简洁性和性能之间的最佳折衷。不幸的是,apply_along_axis 不采用多个轴。

new3dmat = np.array([func2dmat(slice) for slice in my3dmat])

在额外分配等方面并不理想,但除非 .shape[0] 相对于 .size 很大,否则额外开销应该是最小的。

【讨论】:

  • 嗯,这看起来不错。我想知道,有没有办法让slice in my3dmat 沿着与第一个不同的轴迭代?
  • 您可以使用 np.rollaxis 将所需的轴迭代到前面
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2017-12-17
  • 2011-10-16
  • 2017-08-09
  • 2020-04-06
相关资源
最近更新 更多