Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连续二维切片上的Numpy矢量化函数_Python_Arrays_Numpy_Vectorization - Fatal编程技术网

Python 连续二维切片上的Numpy矢量化函数

Python 连续二维切片上的Numpy矢量化函数,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,我有一个3D numpy阵列。我想通过在沿轴的连续2d切片上执行一个函数,并将生成的切片堆叠在一起,来形成一个新的3d数组。显然有很多方法可以做到这一点;我想用最简洁的方式来做。我认为这在numpy.vectorize中是可能的,但这似乎产生了一个函数,它迭代数组中的每个值,而不是沿着第一个轴移动的2D切片 基本上,我希望代码看起来像这样: new3dmat = np.vectorize(func2dmat)(my3dmat) 完成了与此相同的事情: new3dmat = np.empty_l

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

基本上,我希望代码看起来像这样:

new3dmat = np.vectorize(func2dmat)(my3dmat)
完成了与此相同的事情:

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

我怎样才能做到这一点呢?

恐怕下面这样的内容是简洁性和性能之间的最佳折衷。不幸的是,沿_轴应用_不会采用多个轴

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

就额外分配等而言,它并不理想,但除非.shape[0]相对于.size较大,否则额外的开销应该是最小的。

您不能重写
func2dmat
以在整个3D阵列上操作吗?YMMV,但这通常是进行这类矢量化的最佳方式。我可以这样做,但循环解决方案更可取。我希望能够简洁地对复合数据结构(3d矩阵)进行操作,并使用对其组成部分(2d矩阵)进行操作的函数——该函数不需要了解这些组成部分来自的更大结构。这样我只需要一个函数,而不是包含2d矩阵的每个可能结构的特殊函数。。。约定是使函数作用于输入的最后2维上的每个2D数组。如果您可以为此编写快速矢量化代码,那么让它在其他轴上工作只是明智地使用等问题。如果您想充分利用numpy,Python循环解决方案几乎是不可取的。。如果切片足够大,性能差异应该最小,Sean的逻辑是合理的;有多少个轴(如果有的话)存在,这不是内部函数的概念性业务。在没有明显的性能优势的情况下,编写代码来处理这种一般情况会散发出过早优化的味道。@Jaime我喜欢按照惯例在最后两个轴上运行函数的想法。感谢你们两位的帮助,现在使用Eelco的解决方案。嗯,这看起来不错。我想知道,有没有一种方法可以使my3dmat中的
切片沿着与第一个轴不同的轴进行迭代?您可以使用np.rollaxis将要迭代的轴带到前面