您可以使用 3 个单独的 1D numpy 数组来使用矢量化操作 3D 数组吗?

Can you use 3 seperate 1D numpy arrays to manipulate a 3D array using vectorization?

我正在尝试将数组的特定位置乘以特定值,其中该位置由索引和 num 数组的值确定。该特定值来自乘法器数组的相同索引位置。如果 needs_multiplier is value at the index position is true,我们只想应用此乘数。我认为代码会更好地解释这一点。我正在尝试对此进行矢量化并避免 for 循环。

import numpy as np

data = np.array([[[ 2.,  2.,  2.,  2.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.]],

                 [[ 1.,  1.,  1.,  1.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.]],

                 [[ 3.,  3.,  3.,  3.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.]],

                 [[ 5.,  5.,  5.,  5.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.],
                  [ 0.,  0.,  0.,  0.]]])

needs_multiplier = np.array([True, True, False, True])
num = np.array([1, 2, 2, 3])
multipler = np.array([0.5, 0.6, 0.2, 0.3])


for i, cfn in enumerate(num):
    if needs_multiplier[i]:
        data[i, 1, cfn] = multipler[i] * data[i, 0, cfn]
        data[i, 2, cfn] = data[i, 0, cfn]-data[i, 1, cfn]

print(data) # this is the result I am looking for

[[[2.  2.  2.  2. ]
  [0.  1.  0.  0. ]
  [0.  1.  0.  0. ]
  [0.  0.  0.  0. ]]

 [[1.  1.  1.  1. ]
  [0.  0.  0.6 0. ]
  [0.  0.  0.4 0. ]
  [0.  0.  0.  0. ]]

 [[3.  3.  3.  3. ]
  [0.  0.  0.  0. ]
  [0.  0.  0.  0. ]
  [0.  0.  0.  0. ]]

 [[5.  5.  5.  5. ]
  [0.  0.  0.  1.5]
  [0.  0.  0.  3.5]
  [0.  0.  0.  0. ]]]
在使用 num[needs_multiplier]

选择“活动”值后,

num 可用作索引数组

然后向量化表达式就非常简单了:

b = needs_multiplier
num_b = num[needs_multiplier]

data[b, 1, num_b] = multipler[b] * data[b, 0, num_b]
data[b, 2, num_b] = data[b, 0, num_b] - data[b, 1, num_b]