我有一个 2D 和一个 3D numpy 数组,并且希望将 2D 数组的每一列与其各自的数组相乘。例如乘法
[[[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]
[1. 1.]]]
由
[[ 5 6]
[ 4 7]
[ 8 10]]
给出
[[[ 5. 5.]
[ 4. 4.]
[ 8. 8.]]
[[ 6. 6.]
[ 7. 7.]
[10. 10.]]]
我当前的代码是:
three_d_array = np.ones([2,3,2])
two_d_array = np.array([(5,6), (4,7), (8,10)])
list_of_arrays = []
for i in range(np.shape(two_d_array)[1]):
mult = np.einsum('ij, i -> ij', three_d_array[i], two_d_array[:,i])
list_of_arrays.append(mult)
stacked_array = np.stack(list_of_arrays, 0)
使用 Multiplying across in a numpy array 的答案 但有没有一种方法可以不使用 for 循环呢?非常感谢,丹
最佳答案
2D 数组中的第 n 列将是第二个轴,3D 数组中的第 n 列将是第二个轴,看来您的意思是沿第一个轴的 2D 切片。因此,我们的想法是将第一个轴沿 third_d_array
对齐,第二个轴沿 two_d_array
对齐。在其余轴中,two_d_array
中的第一个轴似乎与 third_d_array
中的第二个轴对齐。
因此,为了解决这个问题,我们可以使用两种方法和函数。
方法#1
转置 2D 数组,然后将维度扩展到 3D 以便在末尾有一个单例,然后与其他 3D 数组执行元素乘法,利用广播
实现矢量化解决方案 -
three_d_array*two_d_array.T[...,None]
方法#2
使用np.einsum
-
np.einsum('ijk,ji->ijk',three_d_array, two_d_array)
关于python - 使用 numpy 将 2D 数组中的第 n 列乘以 3D 数组中的第 n 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51807198/