Python非方矩阵如何相乘?
Python how to multiply non square matrices?
假设A是一个MxN矩阵。我想将 A 与其转置相乘。是否可以使用纯嵌套循环(即不使用 np.transpose)来实现?当我尝试遍历它时,我不知道如何找出范围问题,因为结果的形状与 A 不同。
假设 A 是 3x4。那么 A*(A^T) 的结果将是 3x3。 i
, j
in result[i][j]
都不能大于4,那么如何按行和列迭代呢?
是的,可以,如果你想纯粹依赖嵌套,可以试试这个
x = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
result = []
for k in range(len(x)):
temp = []
for i in range(len(x)):
tempSum = 0
for j in range(len(x[0])):
tempSum += x[k][j]*x[i][j]
temp.append(tempSum)
result.append(temp)
print(result)
输出:
[[14, 38, 62], [38, 126, 214], [62, 214, 366]]
你可以用numpy验证一下:
>>> x = np.arange(12).reshape(3,4)
>>> x@x.T
array([[ 14, 38, 62],
[ 38, 126, 214],
[ 62, 214, 366]])
通过直接使用矩阵乘法定义和标准 numpy 广播,这应该是很有可能的:
import numpy as np
def matrix_multiplication_nested_loop(A, B):
res = np.zeros((A.shape[0], B.shape[1]))
for _x in range(A.shape[0]):
for _y in range(B.shape[1]):
res[_x, _y] = np.sum(A[_x, :] * B[:, _y])
return res
A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [0, 1, 2, 1]])
B = np.array([[1, 5, 0], [2, 6, 1], [3, 7, 2], [4, 8, 1]]) # A.T
试试这个。没有 numpy,常规列表并且可以转移到任何语言
for i in range(len(A)):
for j in range(len(A)):
# R must be initialized above with the proper shape (n x n)!
R[i][j] = 0
for k in range(len(A[0])):
R[i][j] += A[i][k] * A[j][k]
这是一个使用列表推导和 sum
:
的解决方案
a = [[1, 2], [3, 4], [5, 6]]
result = [
[ sum(x*y for x, y in zip(row1, row2)) for row2 in a ]
for row1 in a
]
# result = [[5, 11, 17], [11, 25, 39], [17, 39, 61]]
之所以有效,是因为A和Aᵀ的矩阵乘积中的每个元素都是A的一行与Aᵀ的一列的乘积,而Aᵀ的列就是A的行。
假设A是一个MxN矩阵。我想将 A 与其转置相乘。是否可以使用纯嵌套循环(即不使用 np.transpose)来实现?当我尝试遍历它时,我不知道如何找出范围问题,因为结果的形状与 A 不同。
假设 A 是 3x4。那么 A*(A^T) 的结果将是 3x3。 i
, j
in result[i][j]
都不能大于4,那么如何按行和列迭代呢?
是的,可以,如果你想纯粹依赖嵌套,可以试试这个
x = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
result = []
for k in range(len(x)):
temp = []
for i in range(len(x)):
tempSum = 0
for j in range(len(x[0])):
tempSum += x[k][j]*x[i][j]
temp.append(tempSum)
result.append(temp)
print(result)
输出:
[[14, 38, 62], [38, 126, 214], [62, 214, 366]]
你可以用numpy验证一下:
>>> x = np.arange(12).reshape(3,4)
>>> x@x.T
array([[ 14, 38, 62],
[ 38, 126, 214],
[ 62, 214, 366]])
通过直接使用矩阵乘法定义和标准 numpy 广播,这应该是很有可能的:
import numpy as np
def matrix_multiplication_nested_loop(A, B):
res = np.zeros((A.shape[0], B.shape[1]))
for _x in range(A.shape[0]):
for _y in range(B.shape[1]):
res[_x, _y] = np.sum(A[_x, :] * B[:, _y])
return res
A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [0, 1, 2, 1]])
B = np.array([[1, 5, 0], [2, 6, 1], [3, 7, 2], [4, 8, 1]]) # A.T
试试这个。没有 numpy,常规列表并且可以转移到任何语言
for i in range(len(A)):
for j in range(len(A)):
# R must be initialized above with the proper shape (n x n)!
R[i][j] = 0
for k in range(len(A[0])):
R[i][j] += A[i][k] * A[j][k]
这是一个使用列表推导和 sum
:
a = [[1, 2], [3, 4], [5, 6]]
result = [
[ sum(x*y for x, y in zip(row1, row2)) for row2 in a ]
for row1 in a
]
# result = [[5, 11, 17], [11, 25, 39], [17, 39, 61]]
之所以有效,是因为A和Aᵀ的矩阵乘积中的每个元素都是A的一行与Aᵀ的一列的乘积,而Aᵀ的列就是A的行。