【问题标题】:Multiply matrix by array element-wise on numpy?在numpy上将矩阵乘以数组元素?
【发布时间】:2020-08-17 17:45:33
【问题描述】:

我想要的真的很简单,但我不知道如何在 numpy 上做到这一点。

我有以下矩阵:

M = [[1, 1, 1],
     [1, 1, 1],
     [1, 1, 1]]

还有这个数组:

A = [1, 2, 3]

我想将矩阵与数组中的每个元素相乘以产生:

[[[1, 1, 1],
  [1, 1, 1],
  [1, 1, 1]],
 [[2, 2, 2],
  [2, 2, 2],
  [2, 2, 2]],
 [[3, 3, 3],
  [3, 3, 3],
  [3, 3, 3]]]

没有任何 for 循环,我只想要一个 numpy 函数。

【问题讨论】:

  • 我不确定“没有任何循环”,因为您需要数组的每个元素;因此是一个循环。可能类似于np.array([M*i for i in A]) 的东西?
  • 你有一个迭代过程;你必须有某种循环,即使它是隐式的。请注意,这不是典型的 NumPy 广播操作:您不会将 A 复制到 M 的大小以进行元素操作。相反,您希望输出形状是两种尺寸的乘积。
  • 可以做的是传递与A相同形状的M(在第三轴上复制)并应用元素操作。我就是不能使用 python for 循环。
  • 我收回了!下面有两个出色的解决方案。今天学到了新东西! :-)

标签: python numpy


【解决方案1】:
In [146]: M = np.ones((3,3),int)                                                                     
In [147]: M                                                                                          
Out[147]: 
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
In [148]: A = np.array([1,2,3])   

广播乘法是这样做的:

In [149]: A[:,None,None]*M                                                                           
Out[149]: 
array([[[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]],

       [[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3],
        [3, 3, 3]]])

A改为(3,1,1); M自动广播到(1,3,3),一起(3,3,3)

【讨论】:

  • 对了,如果我把 M 改成 4 x 4,为什么同样的代码不起作用?
【解决方案2】:

使用einsum

np.einsum('ij,k->kji', M, A)

array([[[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]],

       [[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3],
        [3, 3, 3]]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2017-12-12
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多