矩阵的Numpy-weight和sum行

Pet*_*ete 5 python numpy vector matrix

使用Python和Numpy,我想:

  • 将(n列x m行)矩阵的每一行视为向量
  • 每行的权重(向量的每个分量的标量乘法)
  • 添加每一行以创建最终向量(向量添加).

权重以规则的numpy数组nx 1给出,因此矩阵中的每个向量m应乘以权重n.

这就是我所拥有的(测试数据;实际矩阵很大),这可能是非Numpy和非Pythonic.谁能做得更好?谢谢!

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
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 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])
Run Code Online (Sandbox Code Playgroud)

*由于NumPy的广播规则,乘法运算符在这里做正确的事情.


eat*_*eat 8

即使是一个'技术上'正确的答案已经准备就绪,我会给出我直截了当的答案:

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

这一点更多的是线性代数的精神(以及问题顶部的三个点状要求).

更新: 这个解决方案非常快,而不是边缘,但比所有现成的解决方案快一些(10-15)x!