gpt4 book ai didi

python - 将一维数组转换为二维数组会导致错误的数组值

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:06 24 4
gpt4 key购买 nike

我的一维数组正确导入并正确显示,当我手动执行时我的逻辑也有效,所以我不确定哪里出了问题。当我将 1-D 数组中的每个值复制到 2-D 中时,它正在执行一种奇怪的复制模式以及放入错误的值。

这是一维数组:

 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

这是以下输出:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
row: 0 col: 0
0
In loop... [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
row: 0 col: 1
1
In loop... [[2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0]]
row: 0 col: 2
2
In loop... [[3, 0, 0, 0], [3, 0, 0, 0], [3, 0, 0, 0], [3, 0, 0, 0]]
row: 0 col: 3
3
In loop... [[4, 0, 0, 0], [4, 0, 0, 0], [4, 0, 0, 0], [4, 0, 0, 0]]
row: 1 col: 0
4
In loop... [[4, 5, 0, 0], [4, 5, 0, 0], [4, 5, 0, 0], [4, 5, 0, 0]]
row: 1 col: 1
5
In loop... [[4, 6, 0, 0], [4, 6, 0, 0], [4, 6, 0, 0], [4, 6, 0, 0]]
row: 1 col: 2
6
In loop... [[4, 7, 0, 0], [4, 7, 0, 0], [4, 7, 0, 0], [4, 7, 0, 0]]
row: 1 col: 3
7
In loop... [[4, 8, 0, 0], [4, 8, 0, 0], [4, 8, 0, 0], [4, 8, 0, 0]]
row: 2 col: 0
8
In loop... [[4, 8, 9, 0], [4, 8, 9, 0], [4, 8, 9, 0], [4, 8, 9, 0]]
row: 2 col: 1
9
In loop... [[4, 8, 10, 0], [4, 8, 10, 0], [4, 8, 10, 0], [4, 8, 10, 0]]
row: 2 col: 2
10
In loop... [[4, 8, 11, 0], [4, 8, 11, 0], [4, 8, 11, 0], [4, 8, 11, 0]]
row: 2 col: 3
11
In loop... [[4, 8, 12, 0], [4, 8, 12, 0], [4, 8, 12, 0], [4, 8, 12, 0]]
row: 3 col: 0
12
In loop... [[4, 8, 12, 13], [4, 8, 12, 13], [4, 8, 12, 13], [4, 8, 12, 13]]
row: 3 col: 1
13
In loop... [[4, 8, 12, 14], [4, 8, 12, 14], [4, 8, 12, 14], [4, 8, 12, 14]]
row: 3 col: 2
14
In loop... [[4, 8, 12, 15], [4, 8, 12, 15], [4, 8, 12, 15], [4, 8, 12, 15]]
row: 3 col: 3
15
In loop... [[4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16]]
Before return... [[4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16]]

函数代码如下:

def makeTwoArr(array, height, width):
print(array)
newArray=[]
line=[0]*width
for i in range(height):
newArray.append(line)
location=0
print(newArray)
for row in range(height):
for col in range(width):
print("row: ",row," col: ",col);
print(location)
## #print(array[location])
newArray[col][row]=array[location]
## print(newArray)
location+=1
print("In loop...",newArray)

print("Before return...",newArray)
return newArray

我和我的计算机科学教授都无法弄清楚为什么这些值是错误的,或者为什么它在错误的迭代中填充了某些位置。

最佳答案

当您使用 line=[0]*width 然后使用 append(line) 时,您实际上为同一行创建了多个引用,因此,当您修改循环中的一行时,您实际上修改了所有行。您实际上需要创建不同的行,以便在分配期间不会通过引用在同一列表中到处修改值。记住列表是可变的始终很重要,附加相同的列表会创建对相同列表的引用。


顺便说一句,我猜出于您的(教育)目的,您需要以这种循环方式进行赋值,但是如果您尝试使用标准库更习惯地这样做,您可以使用 iterzip 解包以创建列表列表,尽管这只有在您确信您的原始列表具有正确数量的元素时才有效。这通过将相同的迭代器传递给 zip 您所需的次数来解压缩整个序列。

new_arr = list(map(list,zip(*[iter(arr)]*4)))

输出:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

关于python - 将一维数组转换为二维数组会导致错误的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660129/

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