您可以使用 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]
我正在尝试将数组的特定位置乘以特定值,其中该位置由索引和 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]