Копирование массива python numpy

Копирование массива Numpy в Python

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

Чтобы скопировать данные массива в другой с помощью библиотеки Numpy в Python, вы можете использовать функцию numpy.ndarray.copy().

Синтаксис

Ниже приведен синтаксис для копирования массива numpy в другой массив.

Где, array1 – n-мерный массив. array1.copy() возвращает новый массив, но с точными значениями элементов, как у array1.

Пример 1

В следующем примере мы скопируем элементы массива a в другой массив b.

import numpy as np # create a numpy array a = np.array([[8, 2, 3], [4, 7, 6]]) # copy contents of a to b b = a.copy() # modify a a[1, 2] = 13 # check if b has remained the same print('a\n',a) print('\nb\n',b)
a [[ 8 2 3] [ 4 7 13]] b [[8 2 3] [4 7 6]]

Даже если мы изменили содержимое a, это не повлияет на содержимое b.

Пример 2: если мы воспользуемся оператором присваивания

Этот пример объясняет, почему вы должны использовать функцию copy() вместо оператора присваивания, когда вам нужно создать дубликат массива.

import numpy as np # create a numpy array a = np.array([[8, 2, 3], [4, 7, 6]]) # assign a to b b = a # modify a a[1, 2] = 13 # check if b has remained the same print('a\n',a) print('\nb\n',b)
a [[ 8 2 3] [ 4 7 13]] b [[ 8 2 3] [ 4 7 13]]

b действует как простая ссылка на a, и когда вы меняете a, изменяется и b. Следовательно, использование оператора присваивания – это не способ дублировать или копировать массив numpy.

Источник

numpy.copy#

Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if a is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of a as closely as possible. (Note that this function and ndarray.copy are very similar, but have different default values for their order= arguments.)

subok bool, optional

If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (defaults to False).

Array interpretation of a.

Preferred method for creating an array copy

Create an array x, with a reference y and a copy z:

>>> x = np.array([1, 2, 3]) >>> y = x >>> z = np.copy(x) 

Note that, when we modify x, y changes, but not z:

>>> x[0] = 10 >>> x[0] == y[0] True >>> x[0] == z[0] False 

Note that, np.copy clears previously set WRITEABLE=False flag.

>>> a = np.array([1, 2, 3]) >>> a.flags["WRITEABLE"] = False >>> b = np.copy(a) >>> b.flags["WRITEABLE"] True >>> b[0] = 3 >>> b array([3, 2, 3]) 

Note that np.copy is a shallow copy and will not copy object elements within arrays. This is mainly important for arrays containing Python objects. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):

>>> a = np.array([1, 'm', [2, 3, 4]], dtype=object) >>> b = np.copy(a) >>> b[2][0] = 10 >>> a array([1, 'm', list([10, 3, 4])], dtype=object) 

To ensure all elements within an object array are copied, use copy.deepcopy :

>>> import copy >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object) >>> c = copy.deepcopy(a) >>> c[2][0] = 10 >>> c array([1, 'm', list([10, 3, 4])], dtype=object) >>> a array([1, 'm', list([2, 3, 4])], dtype=object) 

Источник

Читайте также:  Изучение основ html css

Copies and views#

When operating on NumPy arrays, it is possible to access the internal data buffer directly using a view without copying data around. This ensures good performance but can also cause unwanted problems if the user is not aware of how this works. Hence, it is important to know the difference between these two terms and to know which operations return copies and which return views.

The NumPy array is a data structure consisting of two parts: the contiguous data buffer with the actual data elements and the metadata that contains information about the data buffer. The metadata includes data type, strides, and other important information that helps manipulate the ndarray easily. See the Internal organization of NumPy arrays section for a detailed look.

View#

It is possible to access the array differently by just changing certain metadata like stride and dtype without changing the data buffer. This creates a new way of looking at the data and these new arrays are called views. The data buffer remains the same, so any changes made to a view reflects in the original copy. A view can be forced through the ndarray.view method.

Copy#

When a new array is created by duplicating the data buffer as well as the metadata, it is called a copy. Changes made to the copy do not reflect on the original array. Making a copy is slower and memory-consuming but sometimes necessary. A copy can be forced by using ndarray.copy .

Indexing operations#

Views are created when elements can be addressed with offsets and strides in the original array. Hence, basic indexing always creates views. For example:

>>> x = np.arange(10) >>> x array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> y = x[1:3] # creates a view >>> y array([1, 2]) >>> x[1:3] = [10, 11] >>> x array([ 0, 10, 11, 3, 4, 5, 6, 7, 8, 9]) >>> y array([10, 11]) 

Here, y gets changed when x is changed because it is a view.

Читайте также:  Python bs4 find img

Advanced indexing , on the other hand, always creates copies. For example:

>>> x = np.arange(9).reshape(3, 3) >>> x array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> y = x[[1, 2]] >>> y array([[3, 4, 5], [6, 7, 8]]) >>> y.base is None True 

Here, y is a copy, as signified by the base attribute. We can also confirm this by assigning new values to x[[1, 2]] which in turn will not affect y at all:

>>> x[[1, 2]] = [[10, 11, 12], [13, 14, 15]] >>> x array([[ 0, 1, 2], [10, 11, 12], [13, 14, 15]]) >>> y array([[3, 4, 5], [6, 7, 8]]) 

It must be noted here that during the assignment of x[[1, 2]] no view or copy is created as the assignment happens in-place.

Other operations#

The numpy.reshape function creates a view where possible or a copy otherwise. In most cases, the strides can be modified to reshape the array with a view. However, in some cases where the array becomes non-contiguous (perhaps after a ndarray.transpose operation), the reshaping cannot be done by modifying strides and requires a copy. In these cases, we can raise an error by assigning the new shape to the shape attribute of the array. For example:

>>> x = np.ones((2, 3)) >>> y = x.T # makes the array non-contiguous >>> y array([[1., 1.], [1., 1.], [1., 1.]]) >>> z = y.view() >>> z.shape = 6 Traceback (most recent call last): . AttributeError: Incompatible shape for in-place modification. Use `.reshape()` to make a copy with the desired shape. 

Taking the example of another operation, ravel returns a contiguous flattened view of the array wherever possible. On the other hand, ndarray.flatten always returns a flattened copy of the array. However, to guarantee a view in most cases, x.reshape(-1) may be preferable.

How to tell if the array is a view or a copy#

The base attribute of the ndarray makes it easy to tell if an array is a view or a copy. The base attribute of a view returns the original array while it returns None for a copy.

>>> x = np.arange(9) >>> x array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> y = x.reshape(3, 3) >>> y array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> y.base # .reshape() creates a view array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> z = y[[2, 1]] >>> z array([[6, 7, 8], [3, 4, 5]]) >>> z.base is None # advanced indexing creates a copy True 

Note that the base attribute should not be used to determine if an ndarray object is new; only if it is a view or a copy of another ndarray.

Читайте также:  Post запрос body json python

Источник

numpy.copy#

Controls the memory layout of the copy. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if a is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of a as closely as possible. (Note that this function and ndarray.copy are very similar, but have different default values for their order= arguments.)

subok bool, optional

If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (defaults to False).

Array interpretation of a.

Preferred method for creating an array copy

Create an array x, with a reference y and a copy z:

>>> x = np.array([1, 2, 3]) >>> y = x >>> z = np.copy(x) 

Note that, when we modify x, y changes, but not z:

>>> x[0] = 10 >>> x[0] == y[0] True >>> x[0] == z[0] False 

Note that, np.copy clears previously set WRITEABLE=False flag.

>>> a = np.array([1, 2, 3]) >>> a.flags["WRITEABLE"] = False >>> b = np.copy(a) >>> b.flags["WRITEABLE"] True >>> b[0] = 3 >>> b array([3, 2, 3]) 

Note that np.copy is a shallow copy and will not copy object elements within arrays. This is mainly important for arrays containing Python objects. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):

>>> a = np.array([1, 'm', [2, 3, 4]], dtype=object) >>> b = np.copy(a) >>> b[2][0] = 10 >>> a array([1, 'm', list([10, 3, 4])], dtype=object) 

To ensure all elements within an object array are copied, use copy.deepcopy :

>>> import copy >>> a = np.array([1, 'm', [2, 3, 4]], dtype=object) >>> c = copy.deepcopy(a) >>> c[2][0] = 10 >>> c array([1, 'm', list([10, 3, 4])], dtype=object) >>> a array([1, 'm', list([2, 3, 4])], dtype=object) 

Источник

Оцените статью