2016-05-15 164 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]]