【发布时间】: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