Numpy- 计算矩阵行的加权和

5 投票
2 回答
10193 浏览
提问于 2025-04-16 12:14

我想用Python和Numpy来做以下事情:

  • 把一个(n列 x m行)的矩阵的每一行看作一个向量
  • 给每一行加权(对向量的每个元素进行数值乘法)
  • 把每一行相加,得到一个最终的向量(向量相加)。

这些权重是以一个常规的Numpy数组给出的,形状是n x 1,这样矩阵中的每个向量m都应该乘以权重n。

这是我目前的代码(用了一些测试数据;实际的矩阵非常大),可能不是很符合Numpy和Python的风格。有没有人能做得更好?谢谢!

import numpy

# test data
mvec1 = numpy.array([1,2,3])
mvec2 = numpy.array([4,5,6])
start_matrix = numpy.matrix([mvec1,mvec2])
weights = numpy.array([0.5,-1])

#computation
wmatrix = [ weights[n]*start_matrix[n] for n in range(len(weights)) ]

vector_answer = [0,0,0]
for x in wmatrix: vector_answer+=x

2 个回答

8

在这种情况下,使用二维的 numpy.array 会比 numpy.matrix 更方便。

start_matrix = numpy.array([[1,2,3],[4,5,6]])
weights = numpy.array([0.5,-1])
final_vector = (start_matrix.T * weights).sum(axis=1)
# array([-3.5, -4. , -4.5])

这里的乘法符号 * 能够正确地工作,这要归功于 NumPy 的广播规则。

9

虽然已经有一个“技术上”正确的答案了,我还是想给出我简单明了的回答:

from numpy import array, dot
dot(array([0.5, -1]), array([[1, 2, 3], [4, 5, 6]]))
# array([-3.5 -4. -4.5])

这个答案更符合线性代数的精神(也符合问题上面提到的那三个要求)。

更新:这个解决方案真的很快,不是稍微快一点,而是比之前提到的方案快了大约10到15倍!

撰写回答