gpt4 book ai didi

Python ijk 乘法,为什么我们使用下面的赋值符号或代码行?

转载 作者:行者123 更新时间:2023-12-01 09:12:51 25 4
gpt4 key购买 nike

我正在尝试实现两个 2*2 矩阵的简单乘法。我遇到了以下代码。

def ikjMatrixProduct(A, B):
n = len(A)
C = [[0 for i in range(n)] for j in range(n)]
for i in range(n):
for k in range(n):
for j in range(n):
C[i][j] += A[i][k] * B[k][j]
return C

为什么我们使用这个赋值:C = [[0 for i in range(n)] for j in range(n)] in line 3

我以前从未见过该作业。可以请有人解释一下吗?

我自己的代码抛出错误,因为我使用了 c = [] 并且此代码有效。

最佳答案

正如 Merlin1896 所说,C = [[0 for i in range(n)] for j in range(n)] 创建一个 2D 列表,即 n 的列表 列表,每个内部列表包含 n 个零。列表是空的,直到你用一些东西填充它。如果 C 是空列表,则不能执行 C[i][j] += A[i][k] * B[k][j] ,因为 C[ i][j] 尚不存在。

初始化矩阵的更快方法是

C = [[0] * n for j in range(n)]

在最里面的列表上使用列表乘法是安全的,因为它们包含不可变的整数。但在外部列表上安全,因为列表是可变的。执行 C = [[0] * n] * n 会使外部列表引用一个列表对象。例如,

n = 4
C = [[0] * n] * n
print(C)
C[0][0] = 1
print(C)

输出

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
<小时/>

但是,如果我们重新组织代码,这样我们就不必预先用零填充列表,那就更好了。我们可以通过更改循环顺序来做到这一点,使 k 循环位于最内层。然后我们可以使用内置的 sum 函数和生成器表达式。

def ikjMatrixProduct(A, B):
n = len(A)
C = []
for i in range(n):
row = []
for j in range(n):
row.append(sum(A[i][k] * B[k][j] for k in range(n)))
C.append(row)
return C

我们可以将其转换为列表理解,尽管许多人认为三重嵌套列表理解/生成器表达式的可读性不是很好。 ;)

def ikjMatrixProduct(A, B):
nrange = range(len(A))
return [[sum(A[i][k] * B[k][j] for k in nrange) for j in nrange] for i in nrange]

关于Python ijk 乘法,为什么我们使用下面的赋值符号或代码行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51506175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com