我有一个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循环的方法吗?非常感谢,丹
答案 0 :(得分:1)
nth
数组中的2D
列将是第二个轴,而nth
数组中的3D
数组将似乎是2D
切片第一轴。因此,该想法是使第一轴沿three_d_array
对齐,第二轴沿two_d_array
对齐。在其余轴中,two_d_array
的第一个轴似乎与three_d_array
的第二个轴对齐。
因此,要解决此问题,我们可以使用两种方法和功能。
方法1
转置2D
数组,然后将尺寸扩展到3D
以在末尾具有一个单例,然后与其他3D
数组进行元素乘法,并利用broadcasting
进行向量化解决方案-
three_d_array*two_d_array.T[...,None]
方法2
使用np.einsum
-
np.einsum('ijk,ji->ijk',three_d_array, two_d_array)