多个数组的Python apply_along_axis

时间:2015-03-06 12:31:09

标签: python numpy

如果我有一个函数,f(x)以单个1d数组作为参数并产生1d数组作为输出,我可以使用numpy.apply_along_axis将函数应用于2d的每一行-array X,其行是f。

的有效参数

现在我想用一个带两个参数的函数做类似的事情。 例如。我有一个函数f(x,y),它将两个1d数组作为参数,我还有两个2d数组X,Y都有n行。我想对每对行应用f,产生一个又有n行的数组。

如何以有效的方式实现这一目标?

我也对变体感兴趣,其中f需要更多参数或涉及更高维数组:

例如f可以取3个x,y,z形状的阵列(2,2); (3); (5) 并产生形状的结果(4,4)。

我有X,Y,Z形状(50,100,2,2); (50,100,3); (50,100,5) 并想要一个形状的结果(50,100,4,4)

1 个答案:

答案 0 :(得分:9)

查看numpy.apply_along_axis的代码我发现它只是迭代其他维度,将您的函数应用于每个'行'。有额外的代码允许维度大约为2.但对于2d X,它归结为:

result = np.empty_like(X)
for i, x in enumerate(X):
    result[i] = func1d(x)

还有一些代码可以推断result应具有的形状。例如,如果func1dnp.sum,则result将为1d,而非输入为2d。

所以这个功能没有特别的“效率”。多个输入的扩展可以是普通的Python zip:

 result = np.empty_like(X)
 for i,(x,y) in enumerate(zip(X,Y)):
     result[i] = func1d(x,y)

np.ndindex是生成索引的便捷工具。值得一看的是它的代码。它使用通用的numpy迭代器np.nditer,它可以看到:http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html

  

例如f可以取3个x,y,z形状的阵列(2,2); (3); (5,)并产生形状的结果(4,4)。

     

我有X,Y,Z形状(50,100,2,2); (50,100,3); (50,100,5)并且想要形状的结果(50,100,4,4)

for i,j in np.ndindex(50,100):
    result[i,j,:,:] = f(X[i,j,:,:], Y[i,j,:,:], Z[i,j,:,:])

':'不是必需的,但要明确我们正在对2个维度进行索引,并对其余维度进行切片。如果你想迭代1和3维,并切片第2维,那么它们将是必需的。