2016-06-30 4 views
0

numpy Предоставляет встроенный способ суммирования матрицы вдоль оси, заданной соответствующим весовым вектором? Моя цель состоит в том, чтобы получить z в качестве вывода:Суммировать матрицу вдоль оси, заданную весовым вектором, используя numpy

q = np.array([[1, 2, 3], [10, 20, 30]]) 
w = [.3, .4] 
z = (q[0] * w[0]) + (q[1] * w[1]) 

print z 
>> [ 4.3 8.6 12.9] 

Если нет, то есть эффективный способ выполнения этой операции, используя преимущество вещания с использованием numpy?

+1

@Nickil Действительно это, кажется, ответ; Я видел тот же пост и пробовал 'np.dot', но поставил параметры в неправильном порядке и получил ошибку. Выполнение 'np.dot (w, q)' достигает желаемого результата. спасибо – Ryan

+0

Какой смысл отмечать дубликат, когда вопрос уже имеет принятый ответ? Ответы, которые лучше, чем так называемый дубликат. Я испытываю соблазн переключать вещи, а другой - дублировать, ссылаясь на это. – hpaulj

+0

@hpaulj Приказ, который я делал, был отменен; Я отметил его как дубликат, а затем принял ответ. Моя мотивация для принятия ответа заключалась в том, чтобы вознаградить человека, который взял время, чтобы дать хороший ответ – Ryan

ответ

3

Если включить w в Numpy массив с формой (2, 1), то вы можете broadcast умножение над рядами q. Один из способов сделать перепрофилирование будет индексировать w с np.newaxis (или, что эквивалентно, с None):

q = np.array([[1, 2, 3], [10, 20, 30]]) 
w = np.array([.3, .4]) 
print(w[:, None] * q).sum(0) 
# [ 4.3 8.6 12.9] 

Быстрее и чище способ будет выполнять matrix-vector multiplication с помощью np.dot:

print(w.dot(q)) 
# [ 4.3 8.6 12.9] 
+0

Argv. Почему я не увидел «.dot» там :-) – mgilson

+0

Приятное использование 'np.dot()'. Это правильный путь для решения этой проблемы. +1 –

2

Это, кажется, сделать трюк:

>>> np.sum(q * w[:, np.newaxis], axis=0) 
array([ 4.3, 8.6, 12.9]) 

Хитрость заключается в том, чтобы понять, что для того, чтобы умножить q на w, нам нужно вставить новую ось в w. Затем Numpy может расширяться вдоль этой оси, чтобы соответствовать форме q с помощью обычных правил вещания. Как только умножение было сделано, вам просто нужно суммировать правильную ось, а Боб - ваш дядя.

+0

спасибо за вашу перспективу/объяснение! Я буду придерживаться 'np.dot' на этом, хотя – Ryan

+0

@ Ryan. Так я бы посоветовал вам пойти тоже :-). – mgilson

Смежные вопросы