python - 使用 numpy 将 2D 数组中的第 n 列乘以 3D 数组中的第 n 列

标签 python arrays numpy

我有一个 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/

相关文章:

python - subprocess.Popen shell=True to shell=False

Python fmin 太慢

javascript - 直接插入的数组长度

java - 如何复制二维字符串数组?

c++ - 如何在不初始化每个元素的情况下为数组保留空间?

python - 迭代 NumPy 数组的列和另一个数组的元素?

python - matplotlib 中的误差线显示在其他曲线上

python - Pipenv "ModuleNotFoundError: No module named ' pip'"升级到python3.7后

python - 比较序列的优雅方式

python - Enthought Canopy 找不到某些模块?