用于沿第一轴索引将函数应用于3D阵列的Pythonic算法

时间:2017-06-01 21:25:21

标签: arrays performance python-2.7 numpy scipy

我有像A

这样的3D数组
A = np.random.randint(20,size=(4,2,2))
array([[[18,  8],
    [ 2, 11]],

   [[ 9,  8],
    [ 9, 10]],

   [[ 0,  1],
    [10,  6]],

   [[ 1,  8],
    [ 4,  2]]])

我想要做的是将函数应用于沿轴= 0的某些索引。例如,我想将A [1]和A [3]乘以2并将它们加10。我知道一个选择是:

for index in [1,3]:
    A[index] = A[index]*2+10

给出了:

array([[[18,  8],
        [ 2, 11]],

       [[28, 26],
        [28, 30]],

       [[ 0,  1],
        [10,  6]],

       [[12, 26],
        [18, 14]]])

但我的原始数组大小为(2500,300,300),我需要每次沿着轴= 0将该函数应用于500个非连续索引。是否有更快,更pythonic的方式来做它?

1 个答案:

答案 0 :(得分:2)

你可以使用阶梯式切片

A[1::2] = A[1::2] * 2 + 10
A

array([[[18,  8],
        [ 2, 11]],

       [[28, 26],
        [28, 30]],

       [[ 0,  1],
        [10,  6]],

       [[12, 26],
        [18, 14]]])

或假设您的切片名为slc

A[slc] = A[slc] * 2 + 10