2013-05-15 2 views
2

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

import numpy as np 

# Three matrices/double arrays            
a = np.array([[1,2], [3, 4]]) 
b = np.array([[2,3], [4, 5]]) 
c = np.array([[3,4], [5, 6]]) 

# An array of matrices              
d = np.array([a, b, c]) 

# A vector                 
e = np.array([1,2,3]) 

# Multiply every matrix by the corresponding value in the vector    
f = [ d[i] * e[i] for i in range(len(e)) ] 

# Somewhat to my surpise however, this doesn't work       
g = d * e # <-- Doesn't work 

# Nor does                 
h = e * d # <-- Doesn't work 

Так что список постижение работает, но я как-то сомневаюсь, что это наиболее эффективный способ ведения дел.

Я пропустил что-то действительно простое?

ответ

1

Вы должны выровнять оси:

f = d * e[:,np.newaxis,np.newaxis] 

d.shape 
(3, 2, 2) 
e.shape 
(3,) 
e[:,np.newaxis,np.newaxis].shape 
(3, 1, 1) 

Альтернативой было бы сделать форму d «s (2,2,3), а затем e (с формой (3)) будет Broadcast- способный к d 's форма.

Что вы действительно хотите узнать больше о broadcasting.

EDIT:

как для вашего второго вопроса, то для INPLACE умножения:

d *= e[:,np.newaxis,np.newaxis] 

не создаются копии.

+0

Спасибо. Это работает! Но ... как именно ...?!? – Tom

+0

Кроме того, формируйте то, на что это похоже, у меня создается впечатление, что матрицы скопированы, правильно ..?!? Могу ли я сделать подобный трюк на d (как мне кажется, будет дешевле) \ – Tom

+0

уверен. см. мое редактирование – shx2

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