Python 如何使用数组使append按预期工作?

Python 如何使用数组使append按预期工作?,python,numpy,Python,Numpy,我对这个代码有问题。我想我做错了什么 import numpy as np array = np.zeros(10) arrays = [] for i in range(len(array)): array[i] = 1 arrays.append(array) print(arrays[0]) 我希望得到:[1.0.0.0.0.0.0.0.0.0.0.0] 但我得到的是:[1.1.1.1.1.1.1.1.1.1.1.1.1.1] 这是我附加到数组的最后一个

我对这个代码有问题。我想我做错了什么

 import numpy as np

 array = np.zeros(10)

 arrays = []

 for i in range(len(array)):
    array[i] = 1
    arrays.append(array)

 print(arrays[0])
我希望得到:[1.0.0.0.0.0.0.0.0.0.0.0] 但我得到的是:[1.1.1.1.1.1.1.1.1.1.1.1.1.1]


这是我附加到数组的最后一个数组,而不是第一个。为什么会发生这种情况?更重要的是,我可以做些什么来获得所需的输出?

您可以使用@Steve建议的
array.copy()
在numpy数组上定义的方法

因为它已经在这个问题的一个答案(@Steve的答案)中使用过,所以我选择了另一种方法,即
deepcopy()函数
来获得结果


我想你在期待:

arrays.append(array)
将主阵列的副本添加到阵列列表中。但那不是你要做的。每次执行以下操作时,都会将另一个引用推送到同一数组:

arrays.append(array)
因此,在循环的末尾,有一个列表array,其中有10个对您创建的同一原始数组的引用。到那时,您已经将该数组的每个值都设置为1。因此,可以得到数组中的第一个值包含一个数组,每个值都设置为1,因为数组中的每个数组都是同一个数组

如果您每次都将一个新数组复制到数组中,我打赌您会得到预期的结果。为此,请将该行更改为:

arrays.append(array.copy())
这是使用此修复程序的完整版本。我还将其更改为在数组中打印所有10个数组:

def main():
    import numpy as np

    array = np.zeros(10)

    arrays = []

    for i in range(len(array)):
        array[i] = 1
        arrays.append(array.copy())

    for array in arrays:
        print(array)
结果:

[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 1. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 0.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

也许您正在寻找这个,只是在代码中添加了if条件

import numpy as np

array = np.zeros(10)

arrays = []

for i in range(len(array)):
    if i==0:
        array[i] = 1
    arrays.append(array)

print(arrays[0])
out: [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
只需添加以下更改:

arrays.append(np.array(array))

numpy
中执行此操作的实际方法是:


提示:代码中有多少不同的数组?你创建了多少个数组?为什么不使用
np.eye
?将数组转换为nympy数组我用了一个简单的例子来说明发生了什么,实际上我使用的是矩阵数组,其值来自数据,但问题是相同的。当你修改对象列表、字典、
ndarray
,并将其附加到列表中时,您需要附加一个副本,而不是一直在修改的对象。否则,列表中的所有元素最终看起来都是一样的,因为它们是相同的对象。列表附加不会自动保存副本;你必须自己去做。
array
不是一个列表;这是一个NumPy阵列。它们看起来很相似,但类型非常不同,不应该混淆。Doh!谢谢你指出这一点。然后我展示了如何修复错误,哈哈!我不知道numpy。我展示了这个问题,以及如何解决它的想法。如果这家伙真的需要一个numpy阵列,我希望他能自己解决这个问题。不过…你是对的…我会修正我的答案我猜我的输出在打印时看起来不一样应该给我提示。我有时表现得并不那么聪明。再次感谢@如果这解决了你的问题,请考虑接受它。你也犯了我最初在回答中犯的同样的错误。数组不是一个列表…它是一个numpy数组。在这里,您要更改容器的类型,而不仅仅是复制它。就像我说的,我本来也犯了同样的错误。@user2357112指出了我的错误。谢谢你对@tripleee的评论。我已经更新了我的答案。我知道
array.copy()
是个不错的选择,但它已经是1个答案的一部分,所以使用
deepcopy()
来获得结果。
arrays.append(np.array(array))
np.tri(10)
Out[]:
array([[ 1.,  0.,  0., ...,  0.,  0.,  0.],
       [ 1.,  1.,  0., ...,  0.,  0.,  0.],
       [ 1.,  1.,  1., ...,  0.,  0.,  0.],
       ..., 
       [ 1.,  1.,  1., ...,  1.,  0.,  0.],
       [ 1.,  1.,  1., ...,  1.,  1.,  0.],
       [ 1.,  1.,  1., ...,  1.,  1.,  1.]])