Как сделать так, чтобы добавление работало так, как было задумано для массивов? - PullRequest
3 голосов
/ 25 марта 2019

У меня проблема с этим кодом.Я думаю, что делаю что-то не так.

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

Это последний массив, который я добавил к массивам, а не первый.Почему это происходит и что более важно, что я могу сделать, чтобы получить желаемый результат?

Ответы [ 5 ]

4 голосов
/ 25 марта 2019

Я думаю, вы ожидаете:

arrays.append(array)

, чтобы добавить КОПИЮ вашего основного массива в список массивов .Но это не то, что вы делаете.Каждый раз вы нажимаете другую ссылку на один и тот же массив:

arrays.append(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.]
0 голосов
/ 25 марта 2019

Фактический способ сделать это в 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.]])
0 голосов
/ 25 марта 2019

просто добавьте это изменение:

arrays.append(np.array(array))
0 голосов
/ 25 марта 2019

Может быть, вы ищете это, просто добавили, если условие в вашем коде

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.]
0 голосов
/ 25 марта 2019

Вы можете использовать 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.]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...