본문 바로가기
Python/NumPy

NumPy 복사 및 조회

by 찐남 2021. 9. 11.
본 포스팅은 NumPy 패키지 홈페이지의 원문을 기반으로 하여 작성하였습니다.

 

배열을 조작하고 다룰 때 데이터가 새 배열로 복사되는 경우가 있고 그렇지 않은 경우가 있습니다. 이것은 종종 초보자에게 혼란을 주는 주요 원인입니다. 세 가지 경우가 있습니다. 

 



1. No Copy at All

 

단순 할당은 개체 또는 해당 데이터의 복사본을 만들지 않습니다. 

 

>>> import numpy as np
>>> a = np.array([[ 0, 1, 2, 3],
____________________[ 4, 5, 6, 7],
____________________[ 8, 9, 10, 11]])
>>> b = a    # 새로운 객체가 생성되지 않음
>>> b is a    # a 및 b는 동일한 ndarray 객체에 대한 두 개의 이름입니다.
True

 

Python은 변경 가능한 객체를 참조로 전달하므로 함수 호출은 복사본을 만들지 않습니다.

 

>>> def f(x):
________print(id(x))
>>> id(a)           # id는 객체의 고유 식별자입니다.
2479589856336   # 출력 값이 저와 다를 수 있습니다.
>>> f(a)
2479589856336   # 출력값이 저와 다를 수 있습니다.

 

2. View or Shallow Copy(얕은 복사)

 

다른 배열 개체는 동일한 데이터를 공유할 수 있습니다. view 메서드는 동일한 데이터를 보는 새로운 배열 객체를 생성합니다. 

 

>>> c = a.view()
>>> c is a
False
>>> c.base is a # c는 a가 소유한 데이터의 뷰입니다.
True
>>> c.flags.owndata
False
>>>
>>> c = c.reshape((2, 6)) # a의 모양은 변하지 않는다.
>>> a.shape
(3, 4)
>>> c[0, 4] = 1234 # a의 데이터는 변합니다.
>>> a
array([[ 0, 1, 2, 3],
_______[1234, 5, 6, 7],
_______[ 8, 9, 10, 11]])

 

배열을 슬라이싱하면 배열의 뷰가 반환됩니다.

 

>>> s = a[:, 1:3]
>>> s[:] = 10     # s[:]는 s의 뷰입니다. s = 10과 s[:] = 10의 차이에 유의하세요.
>>> a
array([[ 0, 10, 10, 3],
_______[1234, 10, 10, 7],
_______[ 8, 10, 10, 11]])

 

3. Deep Copy(깊은 복사)

 

copy 메소드는 배열과 해당 데이터의 전체 복사본을 만듭니다.

 

>>> d = a.copy()   # 새 데이터가 있는 새 배열 객체가 생성됩니다.
>>> d is a
False
>>> d.base is a     # d는 아무것도 공유하지 않습니다.
False
>>> d[0, 0] = 9999
>>> a
array([[ 0, 10, 10, 3],
_______[1234, 10, 10, 7],
_______[ 8, 10, 10, 11]])

 

원본 배열이 더 이상 필요하지 않은 경우 슬라이싱 후에 copy를 호출해야 하는 경우가 있습니다. 예를 들어, a가 거대한 중간 결과이고 최종 결과 b가 슬라이싱을 사용하여 b를 구성할 때 깊은 복사를 만들어야 하는 작은 부분만 포함한다고 가정합니다. 

 

>>> a = np.arange(int(1e8))
>>> b = a[:100].copy()
>>> del a    # ``a``의 메모리를 해제할 수 있습니다.

 

b = a[:100]이 대신 사용되면 a는 b에 의해 참조되며 del a가 실행되더라도 메모리에 유지됩니다. 

 



함수화 메소드 Overview

 

다음은 범주별로 정렬된 몇 가지 유용한 NumPy 함수 및 메서드 이름 목록입니다. 자세한 설명은 별도 포스팅을 통해 알아보겠습니다.

 

배열 생성

arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity,
linspace, logspace, mgrid, ogrid, ones, ones_like, r_, zeros, zeros_like

 

변환

ndarray.astype, atleast_1d, atleast_2d, atleast_3d, mat

 

조작

array_split, column_stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, ndarray.item, 
newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack

 

질의

all, any, nonzero, where

 

정렬

argmax, argmin, argsort, max, min, ptp, searchsorted, sort

 

운영

choose, compress, cumprod, cumsum, inner, ndarray.fill, imag, prod, put, putmask, real, sum

 

기초통계

cov, mean, std, var

 

기초 선형대수

cross, dot, outer, linalg.svd, vdot

 



반응형

'Python > NumPy' 카테고리의 다른 글

Numpy 고급 인덱싱 및 인덱스 트릭  (0) 2021.10.04
NumPy 배열 모양 변경  (0) 2021.09.10
NumPy 인덱싱, 슬라이싱, 반복  (0) 2021.09.09
NumPy 기본 옵션 및 함수  (0) 2021.09.08
NumPy 활용 기초 코드 작성  (0) 2021.09.07

댓글