numpy中的3d数组访问

时间:2017-07-07 08:18:43

标签: python arrays python-3.x numpy

我有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子数组来获取结果数组。

1 个答案:

答案 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)的数组,结果