【发布时间】:2022-01-17 12:38:02
【问题描述】:
输入是一个numpy矩阵,过程是在矩阵中找到所有大于3的条目。当程序找到一个值为 4 或更高的条目时,程序必须从该矩阵位置中减去 4 并将该 4 分配 - 一个到上面的单元格,一个到下面的单元格,一个到左边的单元格,一个到右边的单元格。
输入为 [ [3,3,3], [3,4,3], [3,3,3] ],我期望输出为 [ [3,4,3], [4,0 ,4], [3,4,3] ]。
相反,我得到 [ [3,4,4], [4,2,1], [4,1,1] ]
需要取出输入矩阵中间的4,重新分配给矩阵的相邻单元格元素;一个在上面,一个在下面,一个在左边,一个在右边。 这不会发生。我无法理解它。任何人,请。
我添加了一些约束 - 因此,如果矩阵中的条目在矩阵边界附近确实有 4 或更大的条目 - 这将确保您仅向矩阵中的现有条目添加一个。
import numpy as np
dimension = 3
abba = np.matrix( [ [3,3,3], [3,4,3], [3,3,3] ] )
# implement the rules
def sandpile(field):
for x in range(dimension):
for y in range (dimension):
if field[x,y] > 3:
field[x,y] = field[x,y] - 4
if x+1 < dimension:
field[x+1,y] = field[x+1,y] + 1
if x-1 >= 0:
field[x-1,y] = field[x-1,y] + 1
if y-1 >= 0:
field[x,y-1] = field[x,y-1] + 1
if y+1 < dimension:
field[x,y+1] = field[x,y+1] + 1
return (field)
print(abba)
abba = sandpile(abba)
print(abba)
【问题讨论】:
-
因为您在迭代输入矩阵时正在改变它。您应该在迭代之前制作一个单独的输出矩阵,作为输入矩阵的副本,并在使用输入矩阵进行 if 测试时对其进行更改。
-
另外,由于只有在输入元素大于 3 时才会发生与 1 的加法,因此您应该缩进最后四个 if 语句:它们应该是第一个 if 语句的一部分。目前,无论输入单元格是否大于 3,它们都会发生(如果它们的条件为真)。
-
你是对的 - 我现在明白了......谢谢
标签: python numpy matrix iteration