2013-04-04 4 views
1

Это может показаться глупым вопросом, но я чертовски новичок в Python (и в программировании). Я использую физическое моделирование, которое включает в себя множество (~ 10 000) 2x2-матриц, которые я храню в массиве. Я называю эти матрицы M и массив T в коде ниже. Тогда я просто хочу вычислить произведение всех этих матриц. Это то, что я придумал, но он выглядит уродливым, и это будет так много работы для 10000 + 2x2 матриц. Есть ли более простой способ или встроенная функция, которую я мог бы использовать?Умножающиеся матрицы, которые хранятся в массиве в Python

import numpy as np 
#build matrix M (dont read it, just an example, doesnt matter here)  
def M(k1 , k2 , x): 
    a = (k1 + k2) * np.exp(1j * (k2-k1) * x) 
    b = (k1 - k2) * np.exp(-1j * (k1 + k2) * x) 
    c = (k1 - k2) * np.exp(1j * (k2 + k1) * x) 
    d = (k1 + k2) * np.exp(-1j * (k2 - k1) * x) 
    M = np.array([[a , b] , [c , d]]) 
    M *= 1./(2. * k1) 
    return M 


#array of test matrices T 
T = np.array([M(1,2,3), M(3,3,3), M(54,3,9), M(33,11,42) ,M(12,9,5)]) 
#compute the matrix product of T[0] * T[1] *... * T[4] 
#I originally had this line of code, which is wrong, as pointed out in the comments 
#np.dot(T[0],np.dot(T[1], np.dot(T[2], np.dot(T[2],np.dot(T[3],T[4]))))) 
#it should be: 
np.dot(T[0], np.dot(T[1], np.dot(T[2],np.dot(T[3],T[4])))) 
+0

ли матрицы всегда 'я * M' для' i' от 1 до какого-то числа? –

+0

нет, они действительно сложны. Я на самом деле планирую их вычислять на ходу в цикле for, если я могу понять, как это сделать. следует ли изменить это в моем фрагменте кода? может быть, это сбивает с толку. – seb

+2

Есть ли причина для размещения матриц в массиве? Я думаю, что я, вероятно, просто поместил бы их в список ... – mgilson

ответ

1

Не очень NumPythonic, но вы могли бы сделать:

reduce(lambda x,y: np.dot(x,y), T, np.eye(2)) 

Или более кратко, как это было предложено

reduce(np.dot, T, np.eye(2)) 
+2

'lambda x, y: np.dot (x, y)' - это просто 'np.dot'. –

+1

Я думал, что это похоже на работу для 'reduce' – mgilson

+0

Doh, конечно же, cheers – YXD