如何使附加工作按数组的预期进行?

时间:2019-03-25 04:54:34

标签: 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.] 但是我得到了:[1。 1. 1. 1. 1. 1. 1. 1. 1. 1. 1。]

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

5 个答案:

答案 0 :(得分:4)

我认为您正在期待:

arrays.append(array)

将主阵列的COPY添加到阵列列表。但这不是你在做什么。每次您都将另一个对同一数组的引用推入:

arrays.append(array)

因此,在循环结束时,您将获得列表 arrays (列表),其中包含对创建的相同原始数组的10个引用。到那时,您已经将一个数组的每个值都设置为1。因此,您会得到 arrays 中的第一个值包含一个数组,其中每个值都设置为1,因为 arrays < / strong>是同一数组。

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

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.]

答案 1 :(得分:0)

只需添加此更改:

arrays.append(np.array(array))

答案 2 :(得分:0)

numpy中执行此操作的实际方法是使用np.tri()

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.]])

答案 3 :(得分:-1)

您可以按照{Steve的建议,使用array.copy()在numpy数组上定义的方法。

  

由于已经在解决此问题的一个答案(@Steve的答案)中使用过,所以我选择了另一种方法,即deepcopy() function以获取结果。

import numpy as np 
from copy import deepcopy

array = np.zeros(10)
arrays = []

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

print(arrays)
# [array([1., 0., 0., 0., 0., 0., 0., 0., 0., 0.]), array([1., 1., 0., 0., 0., 0., 0., 0., 0., 0.]), array([1., 1., 1., 0., 0., 0., 0., 0., 0., 0.]), array([1., 1., 1., 1., 0., 0., 0., 0., 0., 0.]), array([1., 1., 1., 1., 1., 0., 0., 0., 0., 0.]), array([1., 1., 1., 1., 1., 1., 0., 0., 0., 0.]), array([1., 1., 1., 1., 1., 1., 1., 0., 0., 0.]), array([1., 1., 1., 1., 1., 1., 1., 1., 0., 0.]), array([1., 1., 1., 1., 1., 1., 1., 1., 1., 0.]), array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])]

print(arrays[0])
# [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

print(arrays[-1])
# [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

答案 4 :(得分:-1)

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

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.]