【问题标题】:"Vectorized" Matrix-Vector multiplication in numpynumpy 中的“向量化”矩阵向量乘法
【发布时间】:2023-01-11 10:41:41
【问题描述】:

我有一个 $I$ 索引数组 $V = (V_i)_{i \in I}$ of (column) vectors $V_i$,我想逐点(沿着 $i \in I$)乘以一个矩阵$M$。所以我正在寻找一个“向量化”操作,其中单个操作是矩阵与向量的乘法;那是

$W = (M V_i)_{i \in I}$

有没有办法做到这一点?

numpy.dot 不幸的是假设 $V$ 是一个矩阵,而不是 $I$ 索引的向量族,这显然是失败的。

【问题讨论】:

  • 你能把你的方程式作为图片发布吗?不幸的是,降价/乳胶方程式不会在 SO 上呈现。
  • 另外,您能否提供一些输入 numpy 数组和预期输出
  • numpy 中,* 是逐点或逐元素乘法。 @ 是矩阵乘法 - 具有特定对维度上的乘积之和。 np.dotnp.matmul 记录了维度是如何配对的。 np.einsum 是一个更通用的工具,用于指定乘法和求和轴。对于*乘法,适用broadcasting的规则(broadcasting也用于加法和其他运算。
  • 您对向量和矩阵的使用可能含糊不清。 numpy 有数组,可以是 1d 或 2d(或 0d 或 3d 等)。 vector/matrix 不是“原生”numpy 术语。二维矩阵可能被认为是“矩阵”,但“向量”可能具有形状 (n,),或 (n,1) 或 (1,n)。
  • 为清楚起见,迭代计算的示例通常会有所帮助。

标签: python numpy vectorization linear-algebra


【解决方案1】:

IIUC,您正在寻找矩阵M 和向量V(带广播)的逐点乘法。

这里的矩阵是(3,3),而V是一个包含 4 个列向量的数组,您希望每个列向量独立地与矩阵相乘,同时遵守广播规则。

# Broadcasting Rules

 M ->     3, 3
 V ->  4, 1, 3   #V.T[:,None,:] 
----------------
 R ->  4, 3, 3
----------------

为此的代码 -

M = np.array([[1,1,1],
              [0,0,0],
              [1,1,1]])    #3,3 matrix M

V = np.array([[1,2,3,4],
              [1,2,3,4],   #4,3 indexed vector
              [1,2,3,4]])  #store 4 column vectors
                           


R = M * V.T[:,None,:]          #<--------------
R
array([[[1, 1, 1],
        [0, 0, 0],
        [1, 1, 1]],

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

       [[3, 3, 3],
        [0, 0, 0],
        [3, 3, 3]],

       [[4, 4, 4],
        [0, 0, 0],
        [4, 4, 4]]])

如果您有任何聚合,请发布此信息,您可以使用所需的操作减少矩阵。

例如,Matrix M * 列向量 [1,1,1] 结果为 -

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

Matrix M * 列向量 [4,4,4] 结果 -

array([[[4, 4, 4],
        [0, 0, 0],
        [4, 4, 4]],

【讨论】:

  • 我认为这实际上是。我肯定会玩它,谢谢
  • 很酷,如果是这样,那么基本上 numpy 就是利用广播来满足您的需求。检查更新的broadcasting rules表(在代码部分之前)以获取有关其工作原理的参考。
  • 抱歉,输出 $W$ 不是 $I$ 索引的向量族,就像 $V$ 一样。但我会查看您的广播技巧,因为它们可能会有很大帮助。
  • 你能举一个实际形状的例子吗?比如 M 的形状、列向量的数量和 V 的每个向量的形状,以及输出的预期形状?
  • 好的,我会尽快添加一些信息。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 2020-10-29
相关资源
最近更新 更多