Почему одни и те же операции над списками numpy и python дают разные результаты? - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь заменить значение первого элемента значением второго элемента в массиве numpy и списке, элементы которого точно такие же, но результат, который я получаю, отличается.

1) тест на массиве numpy:

test=np.array([2,1])
left=test[:1]
right=test[1:]
test[0]=right[0]
print('left=:',left)

Я получаю: left=: [1]

2) тест по списку питонов:

 test=[2,1]
 left=test[:1]
 right=test[1:]
 test[0]=right[0]
 print('left=:',left)

Я получаю: left=: [2]

Может кто-нибудь объяснить, почему результаты отличаются? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Нарезка (индексация с помощью двоеточий) массива numpy возвращает представление в массив numpy, поэтому при последующем обновлении значения test [0] обновляется значение left, поскольку left - это просто представление массива.

Когда вы врезаетесь в список python, он просто возвращает копию, поэтому при обновлении значения test [0] значение left не меняется.

Это сделано потому, что пустые массивы часто бывают очень большими, и создание большого количества копий массивов может быть весьма проблематичным.

1 голос
/ 17 мая 2019

Чтобы расширить объяснение Джеймса Дауна о пустых массивах, вы можете использовать .copy(), если вам действительно нужна КОПИЯ, а не ВИД вашего среза массива. Однако, когда вы делаете копию, вам нужно будет сделать копию left снова после переназначения test[0]=right[0], чтобы получить новое значение.

Также, что касается метода списка, вы устанавливаете test [0] = right [0], поэтому, если вы print (list) после назначения, вы получите [1 1] вместо исходного [2, 1]. Как указал Джеймс, left является копией элемента списка, поэтому не обновляется при изменении списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...