2014-06-24 42 views
3

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

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

new3dmat = np.vectorize(func2dmat)(my3dmat) 

,并完成同样的事情,这样的:

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

我怎样才能做到这一点?

+0

你不能重写你的'func2dmat'来操作整个3D阵列吗? YMMV,但tHat通常是这种矢量化的最佳途径。 – Jaime

+0

我可以这样做,但循环解决方案更可取。我希望能够对一个复合数据结构(3d矩阵)进行简洁的操作,并使用一个可以对其成分(二维矩阵)进行操作的函数 - 而且这个函数不需要知道这些成分来自哪个大结构。这样我只需要一个函数,而不是每个包含2d矩阵的可能结构的特殊函数。 –

+0

您需要一个GUFUNC,例如['np.linalg.det'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.det.html)......这个惯例是让你的函数在每个2D上运行数组放在输入的最后2个维上。如果你能写出快速的矢量化代码,那么让它在其他轴上工作只是明智地使用['np.rollaxis']的问题(http://docs.scipy.org/doc/numpy/reference/generated/ numpy.rollaxis.html)等。如果你想充分利用numpy,Python循环解决方案几乎不可取。 – Jaime

回答

3

我恐怕下面的东西是简洁性和性能之间的最佳折衷。不幸的是,apply_along_axis不会占用多个坐标轴。

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

这不是额外拨款方面的理想等,但除非.shape [0]大相对于.size,额外的开销应该是最小的。

+0

嗯,这看起来没问题。我想知道,是否有办法让my3dmat中的slice沿着与第一个不同的轴进行迭代? –

+0

您可以使用np.rollaxis将所需的轴重复到前面 –