array_a = array_b [:] но изменить изменения b также (numpy) - PullRequest
0 голосов
/ 12 февраля 2019

извините, этот вопрос возник здесь раньше Установка двух массивов равными Но решение не сработало, и я не знаю почему.

import numpy as np

zero_matrix = np.zeros((3,3)) # 3x3 zero matrix

test_matrix = zero_matrix[:] # test_matrix is a view of zero_matrix. Without [:] it would be same object
print (zero_matrix)
print ()
print (test_matrix)
print ()
print(id(test_matrix))
print ()
print(id(zero_matrix))
print ()

test_matrix[1] = 42

print (test_matrix)
print ()
print (zero_matrix)

'zero_matrix' также изменяется, когда яустановить test_matrix [1] = 42.

И я не понимаю, почему оба имеют разные идентификаторы объектов.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Они действительно имеют оба разных идентификатора объекта, но, как вы пишете сами: test_matrix - это представление zero_matrix.

Объект обычно называют «объектом просмотра», когда он предоставляет способчтобы получить доступ к другому объекту (будь то чтение или запись).В этом случае доступ к этому объекту представления отклоняется к другому объекту как при чтении, так и при записи.

Это специальность numpy объектов, в отличие от "обычных" объектов python.

Но даже pythonимеет эти объекты, но не использует их, если явно не запрошено.

0 голосов
/ 12 февраля 2019

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

a = np.arange(10)
b = a[::2] # create a view of every other element starting with the 0-th
assert list(b) == [0, 2, 4, 6, 8]
assert a[4] == 4
b[2] = -1
assert a[4] == -1

Представления являются мощными, поскольку они позволяют выполнять более сложные операции без необходимости копировать большие объемы данных.Отсутствие необходимости постоянно копировать данные может означать, что некоторые операции выполняются быстрее, чем в противном случае.

Осторожно, не все операции с индексами создают представления.например.

a = np.arange(10, 20)
b = a[[1,2,5]]
assert list(b) == [11, 12, 15]
b[0] == -1
assert a[1] != -1
0 голосов
/ 12 февраля 2019

Используйте copy для копирования ваших пустых массивов:

zero_matrix = np.zeros((3,3))
test_matrix = zero_matrix.copy()
test_matrix[1] = 42
print(zero_matrix)
print(test_matrix)

Числовые массивы и списки Python ведут себя по-разному.

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