【问题标题】:Multiplying a 2d array with each slice of 3d array - Numpy将 2d 数组与 3d 数组的每个切片相乘 - Numpy
【发布时间】:2018-10-10 22:28:37
【问题描述】:

我正在寻找一种优化的方法来计算 2d 数组的元素乘法乘以 3d 数组的每个切片(使用 numpy)。

例如:

w = np.array([[1,5], [4,9], [12,15]]) y = np.ones((3,2,3))

我想得到一个与y 形状相同的 3d 数组。

不允许使用 * 运算符进行广播。 就我而言,第三维很长,for 循环不方便。

【问题讨论】:

  • z = np.einsum('ij,ijk->ijk',w,y) 完成这项工作!

标签: python arrays numpy multiplication lapack


【解决方案1】:

给定数组

import numpy as np

w = np.array([[1,5], [4,9], [12,15]])

print(w)

[[ 1  5]
 [ 4  9]
 [12 15]]

y = np.ones((3,2,3))

print(y)

[[[ 1.  1.  1.]
  [ 1.  1.  1.]]

 [[ 1.  1.  1.]
  [ 1.  1.  1.]]

 [[ 1.  1.  1.]
  [ 1.  1.  1.]]]

我们可以直接多个数组,

z = ( y.transpose() * w.transpose() ).transpose()

print(z)

[[[  1.   1.   1.]
  [  5.   5.   5.]]

 [[  4.   4.   4.]
  [  9.   9.   9.]]

 [[ 12.  12.  12.]
  [ 15.  15.  15.]]]

我们可能会注意到,这会产生与 np.einsum('ij,ijk->ijk',w,y) 相同的结果,可能需要更少的努力和开销。

【讨论】:

  • 您在答案中看到的内容是从我的屏幕上复制的。我只是再次尝试确认。请尝试创建一个新的程序文件并仅插入那四行代码(或使用打印语句插入七行)
  • 是的,它适用于这个例子,但是当我在计算中使用它时,它会引发错误(当它的长度不等于第一个 dim/. ..)。无论如何,谢谢!
  • 你说得对,我修复了它,错过了 y 数组上的转置。它现在可以推广到第三维中任何大于 0 的数字
  • 请注意,在使用足够大的数组时,请注意生成大量缓存未命中并检查时序。
  • 有没有办法做到这一点,但使用矩阵乘法而不是元素乘法?
猜你喜欢
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2018-07-09
  • 2020-02-23
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多