我有NxMx3 numpy数组,想要访问大小为3的子数组。例如我想要而不是
arr = [[[...]]]
for i in range(N):
for j in range(M):
b = do_something(arr[i][j])
写
map(lambda x: do_something(x), ???) # x - is array of size 3
我该怎么做?
函数do_something
接受大小为3的数组并返回一个标量,我希望通过将函数应用于我输入的每个length-3子数组来获取结果数组。
答案 0 :(得分:0)
如果可能,您应该手动矢量化原始函数,因为使用矢量化算法将是最有效的解决方案。
如果您不想或不想这样做,可以使用numpy.vectorize
来使用沿单个维度工作的函数,并将其推广到更高维数组。它可能不会比手动循环更快(vectorize
本质上是for
循环的包装器),但至少它会为你提供一个更简单的接口来调用你的函数。
示例:
import numpy as np
def foo(x):
''''sum three numbers from input'''
return x[0]+x[1]+x[2] # otherwise x.sum(), of course
foo_vector = np.vectorize(foo,signature='(n)->()')
# try with dummy input
arr = np.random.rand(2,4,3)
#print(foo(arr)) # leads to an error
print(foo_vector(arr).shape)
# (2, 4)
print(np.allclose(foo_vector(arr),arr.sum(axis=-1)))
# True
从上面可以看出,vectorize
处理数组的其他前导维度,并适当地应用您的函数。由于您确实希望沿最后一个维度应用函数,因此它应该像魅力一样工作,将foo_vector
应用于形状(M,N,3)
的数组应该返回一个形状(M,N)
的数组,结果