Numpy- 计算矩阵行的加权和
我想用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倍!