我有一个问题,如何有效地应用一个以n维数组的m维切片作为输入的函数。
例如,我有一个n维的形状数组(i,j,k,l)。在尺寸(j,l)上,我想应用函数,它给我一个形状矩阵(j,l)。生成的numpy数组应该再次具有形状(i,j,k,l)。
例如,我想应用以下规范化函数
def norm(arr2d):
return arr2d - np.mean(arr2d)
数组
arrnd = np.arange(2*3*4*5).reshape(2,3,4,5) # Shape is (2,3,4,5)
切片(j,l)上的。
我想要实现的结果是通过(缓慢?)Python列表理解和移动轴得到的。
result = np.asarray([ [ f(arrnd[:,j,:,l]) for l in range(5) ] for j in range(3)]) # Shape is (3,5,2,4)
result = np.moveaxis(np.moveaxis(result,2,0),2,3).shape # Shape is (2,3,4,5) again
有没有更好,更多" numpyic"实现这一目标的方法,没有任何涉及的循环?
我看了np.apply_along_axis()
和np.apply_over_axes()
,但前者仅适用于1-d函数,后者只有在我的函数实现为ufunc时才有效。
我提供的例子只是一个玩具示例。该解决方案应该适用于任何python函数。
((如果规范化切片将是我的具体问题,我可以使用ufunc
' s axes=(..)
来循环使用python循环和moveaxis。)