NumPy 의 얕 은 복사 와 깊 은 복사

2737 단어
시리즈
NumPy 입문 기초 지식 을 한꺼번에 해결 NumPy 의 조작 ndarray 의 모양 NumPy 의 얕 은 복사 와 깊 은 복사 NumPy 의 색인 기법
개술
NumPy 는 크기 가 큰 데이터 구 조 를 조작 하 는 경우 가 많아 조심 하지 않 으 면 메모리 와 성능 낭비 가 클 수 있 으 므 로 조작 중의 각종 행 위 를 이해 하고 실제 상황 에 따라 가장 합 리 적 인 방법 을 선택해 야 한다.
전혀 복사 안 했 어 요.
간단 한 할당 작업 만 한다 면 복사 행 위 는 일어나 지 않 을 것 이다.
>>> a = np.arange(12)
>>> b = a            
>>> b is a           # a b             
True
>>> b.shape = 3,4 
>>> a.shape
(3, 4)

이것 은 Python 언어 차원 에서 보장 하 는 것 입 니 다. 할당 작업 을 할 때 Python 이 진행 할 때 인용 하여 전달 합 니 다. 두 변 수 는 같은 메모리 영역 을 가리 키 고 있 습 니 다.
>>> def f(x):
...     print(id(x))
...
>>> id(a)                           
148293216
>>> f(a)
148293216

보기 또는 얕 은 복사
서로 다른 ndarray 대상 은 같은 데이터 영역 을 공유 할 수 있 습 니 다.view 방법 은 새로운 ndarray 를 만 들 수 있 습 니 다. 이 새로운 ndarray 와 원시 적 인 ndarray 는 대상 이 아 닙 니 다. (데이터 구역 을 제외 하고 다른 속성, 예 를 들 어 모양 이 다 를 수 있 음 을 의미 합 니 다)
>>> c = a.view()
>>> c is a                               
False                                      # c a       
>>> c.base is a                        # c      a
True
>>> c.flags.owndata            
False
>>>
>>> c.shape = 2,6                      #   c          a
>>> a.shape
(3, 4)
>>> c[0,4] = 1234                      #          ,  c        a
>>> a
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])

색인 작업 은 원본 ndarray 의 view 를 되 돌려 줍 니 다.
>>> s = a[ : , 1:3]
>>> s
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])
>>> s[:] = 10
>>> s
array([[10, 10],
       [10, 10],
       [10, 10]])
>>>
>>> a                   #   s         a      
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])

딥 카피copy 방법 은 완전한 새로운 ndarray 대상 을 만 들 수 있 습 니 다. 이 ndarray 대상 은 원래 의 ndarray 와 아무런 관계 가 없습니다.
>>> d = a.copy()                          #     ,     
>>> d is a
False
>>> d.base is a                           
False
>>> d[0,0] = 9999
>>> a                                        #   d          a
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])

전형 적 인 응용 장면 은 색인 작업 을 사용 한 후에 원시 적 인 ndarray 가 필요 하지 않 으 면 먼저 깊 은 복사 본 을 한 다음 에 원시 ndarray 를 없 애 면 메모리 소 모 를 줄 일 수 있다 는 것 이다.
>>> a = np.arange(int(1e8))
>>> b = a[:100].copy()
>>> del a  # a         

좋은 웹페이지 즐겨찾기