乘以大型二维 numpy 数组

multiplying large 2D numpy arrays

我想以最有效的方式乘以下列矩阵(使用 numpy)。

这是矩阵的代码:

a = np.array([[1, 5], [2, 6], [3, 7], [4, 8]])
m = np.array([[1, 0, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 1, 1]])

这些是可视化效果更好的矩阵:

a:
[[1 5]
 [2 6]
 [3 7]
 [4 8]]

m:
[[1 0 0 1]
 [1 0 1 0]
 [0 1 0 1]
 [0 1 1 1]]

我想将a乘以(矩阵m的第一列),像这样

   a    m[:,0]       x0

[[1 5]   [[1]      [[1 5]
 [2 6] *  [1]   =   [2 6]    
 [3 7]    [0]       [0 0]
 [4 8]]   [0]]      [0 0]

然后我想将a乘以(矩阵m的第二列),像这样

a  *  m[:,1]    =   x1

然后是第3列和第4列

a  *  m[:,2]    =   x2
a  *  m[:,3]    =   x3

最后,我想将生成的矩阵 x0、x1、x2、x3 全部放在一个矩阵中。

X = [x0, x1, x2, x3]

本例中的尺寸 X 为 4 x 8。

本例最终结果为:

X = 

[[[1 5 0 0 0 0 1 5]
  [2 6 0 0 2 6 0 0]
  [0 0 3 7 0 0 3 7]
  [0 0 4 8 4 8 4 8]]

我想知道如何使用 numpy 的内置函数和生成器来执行此操作,而不是使用 2 个 for 循环(如果可能的话)。

这只是一个例子。实际上,矩阵的维度很大,乘法尽可能快地完成很重要。

谢谢

您可以转置和扩展 m 的维度以获得想要的结果:

m.T[...,None] * a

array([[[1, 5],
        [2, 6],
        [0, 0],
        [0, 0]],

       [[0, 0],
        [0, 0],
        [3, 7],
        [4, 8]],
        ...

如果要水平堆叠数组以得到 2D 数组,请使用 np.hstack:

np.hstack(m.T[...,None] * a)

array([[1, 5, 0, 0, 0, 0, 1, 5],
       [2, 6, 0, 0, 2, 6, 0, 0],
       [0, 0, 3, 7, 0, 0, 3, 7],
       [0, 0, 4, 8, 4, 8, 4, 8]])

或重塑为:

(a[:,None] * m[...,None]).reshape(m.shape[0], -1)

这就是我一直在寻找的答案。谢谢 Yatu 和 hpaulj。

X = m.T[...,None] * a
for i in range(4):
    reshaped = np.hstack(X[i,:,:])
    reshaped_simpler = np.hstack(X)
print (reshaped_simpler)

我从以下 link 中得到了其余答案:

我重新安排了 for 循环,因为我收到了一条关于生成器将在 Numpy 的未来版本中被弃用的警告。

你可以通过broadcast和reshape来实现

arr_out = (a[:,None] * m[...,None]).reshape(4,8)

Out[176]:
array([[1, 5, 0, 0, 0, 0, 1, 5],
       [2, 6, 0, 0, 2, 6, 0, 0],
       [0, 0, 3, 7, 0, 0, 3, 7],
       [0, 0, 4, 8, 4, 8, 4, 8]])