NumPy - Копии и просмотры
При выполнении функций некоторые из них возвращают копию входного массива, а некоторые возвращают представление. Когда содержимое физически хранится в другом месте, оно называетсяCopy. Если, с другой стороны, предоставляется другое представление того же содержимого памяти, мы называем этоView.
Нет копии
Простые назначения не делают копию объекта массива. Вместо этого для доступа к нему он использует тот же идентификатор (), что и исходный массив. Вid() возвращает универсальный идентификатор объекта Python, аналогичный указателю в C.
Более того, любые изменения в одном отражаются в другом. Например, изменение формы одного из них также изменит форму другого.
пример
import numpy as np
a = np.arange(6)
print 'Our array is:'
print a
print 'Applying id() function:'
print id(a)
print 'a is assigned to b:'
b = a
print b
print 'b has same id():'
print id(b)
print 'Change shape of b:'
b.shape = 3,2
print b
print 'Shape of a also gets changed:'
print a
Он выдаст следующий результат -
Our array is:
[0 1 2 3 4 5]
Applying id() function:
139747815479536
a is assigned to b:
[0 1 2 3 4 5]
b has same id():
139747815479536
Change shape of b:
[[0 1]
[2 3]
[4 5]]
Shape of a also gets changed:
[[0 1]
[2 3]
[4 5]]
Просмотр или неглубокая копия
NumPy имеет ndarray.view()метод, который представляет собой новый объект массива, который просматривает те же данные, что и исходный массив. В отличие от предыдущего случая, изменение размеров нового массива не меняет размеров оригинала.
пример
import numpy as np
# To begin with, a is 3X2 array
a = np.arange(6).reshape(3,2)
print 'Array a:'
print a
print 'Create view of a:'
b = a.view()
print b
print 'id() for both the arrays are different:'
print 'id() of a:'
print id(a)
print 'id() of b:'
print id(b)
# Change the shape of b. It does not change the shape of a
b.shape = 2,3
print 'Shape of b:'
print b
print 'Shape of a:'
print a
Он выдаст следующий результат -
Array a:
[[0 1]
[2 3]
[4 5]]
Create view of a:
[[0 1]
[2 3]
[4 5]]
id() for both the arrays are different:
id() of a:
140424307227264
id() of b:
140424151696288
Shape of b:
[[0 1 2]
[3 4 5]]
Shape of a:
[[0 1]
[2 3]
[4 5]]
Часть массива создает представление.
пример
import numpy as np
a = np.array([[10,10], [2,3], [4,5]])
print 'Our array is:'
print a
print 'Create a slice:'
s = a[:, :2]
print s
Он выдаст следующий результат -
Our array is:
[[10 10]
[ 2 3]
[ 4 5]]
Create a slice:
[[10 10]
[ 2 3]
[ 4 5]]
Глубокая копия
В ndarray.copy()функция создает глубокую копию. Это полная копия массива и его данных, не имеющая общего с исходным массивом.
пример
import numpy as np
a = np.array([[10,10], [2,3], [4,5]])
print 'Array a is:'
print a
print 'Create a deep copy of a:'
b = a.copy()
print 'Array b is:'
print b
#b does not share any memory of a
print 'Can we write b is a'
print b is a
print 'Change the contents of b:'
b[0,0] = 100
print 'Modified array b:'
print b
print 'a remains unchanged:'
print a
Он выдаст следующий результат -
Array a is:
[[10 10]
[ 2 3]
[ 4 5]]
Create a deep copy of a:
Array b is:
[[10 10]
[ 2 3]
[ 4 5]]
Can we write b is a
False
Change the contents of b:
Modified array b:
[[100 10]
[ 2 3]
[ 4 5]]
a remains unchanged:
[[10 10]
[ 2 3]
[ 4 5]]