Числовой вес и сумма строк матрицы - PullRequest
5 голосов
/ 21 февраля 2011

Используя Python & Numpy, я бы хотел:

  • Рассмотрим каждую строку (n столбцов х м строк) матрица как вектор
  • Вес каждого ряда (скаляр умножение на каждый компонент вектор)
  • Добавьте каждую строку, чтобы создать окончательный вектор (сложение векторов).

Веса даны в регулярном массиве numpy, n x 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

Ответы [ 2 ]

8 голосов
/ 21 февраля 2011

Даже «технически» правильный ответ уже готов, я дам свой прямой ответ:

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) раз быстрее, чем все готовое предложенное!

8 голосов
/ 21 февраля 2011

В этом случае будет удобнее использовать двумерный 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...