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

标签 python arrays multidimensional-array

我的一维数组正确导入并正确显示,当我手动执行时我的逻辑也有效,所以我不确定哪里出了问题。当我将 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/

相关文章:

python - 估计句子之间的 'approximate'语义相似度有哪些好方法?

java - java 获取二维数组中行和列的最大长度

python - argmax 用于沿某个轴的多维数组

javascript - Lodash key与数组具有相同的属性

java - 偶数/奇数相加的方法

python - Mayavi 中的时间相关数据

python - 如何在 python 中打印二维数组

python - 解包 SequenceMatcher 循环结果

python - 随机森林在 opencv python (cv2) 中不起作用

python - 范围倒计时到零