2016-05-15 125 views
1

剛纔問了一個關於乘法矩陣的問題,可以找到here,我還有一個問題,雖然有關乘法矩陣。說我有以下矩陣:Python矩陣乘法變化

matrix_a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

matrix_b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

我怎麼能得到的結果是這樣的:

[[1, 4, 9], [16, 25, 36], [49, 64, 81]] 

......讓每一個元素基本上是乘以另一個數組的單個相應元素。有誰知道這是怎麼做到的嗎?

謝謝你們!

+1

有沒有你不使用NumPy的理由嗎? – mtrw

回答

2

你可以表達使用list comprehensionszip逐元素乘積(和矩陣積),並且* argument-unpacking operator

matrix_a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  
matrix_b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

elementwise_product = [[ai*bi for ai, bi in zip(*rows)] 
         for rows in zip(matrix_a, matrix_b)]  
print(elementwise_product) 
# [[1, 4, 9], [16, 25, 36], [49, 64, 81]] 

matrix_product = [[sum([ai*bi for ai, bi in zip(row_a, col_b)]) 
        for col_b in zip(*matrix_b)] 
        for row_a in matrix_a] 
print(matrix_product) 
# [[30, 36, 42], [66, 81, 96], [102, 126, 150]] 
+0

這太棒了!十分感謝你的幫助! – Jaromjj

0

的numpy的包提供一種陣列對象,可以做到既逐元素和基質 - 明智的計算:

import numpy as np 
matrix_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
matrix_b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 

matrix_a*matrix_b 
np.dot(matrix_a, matrix_b) 

此輸出:

array([[ 1, 4, 9], 
     [16, 25, 36], 
     [49, 64, 81]]) 

array([[ 30, 36, 42], 
     [ 66, 81, 96], 
     [102, 126, 150]]) 

Numpy可以使用pip install numpy或使用數字python分佈之一,如anaconda或pythonxy。

0

由於這些列表相同,因此您可以將其與自身相乘。下面是一個稍微冗長的方式來迭代矩陣並將結果存儲在一個新矩陣中。

matrix = [[1,2,3],[4,5,6],[7,8,9]] 

result_matrix = [[],[],[]] 

print (matrix) 

for i in range(0, len(matrix)): 
    for j in range(0,len(matrix[i])): 
     result_matrix[i].append(matrix[i][j] * matrix[i][j]) 
print (result_matrix) 

輸出繼電器

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]