Numpy Tutorial-NumPy 어레이 재구성 및 크기 조정

  1. numpy.reshape()
  2. ndarray.reshape()
  3. reshape()함수 / 메소드 공유 메모리
  4. numpy.resize()

NumPy 에는 배열 모양을 변경하는 reshaperesize 의 두 가지 기능 (및 방법)이 있습니다. 이 장에서 우리가 중점을 둘 중요한 차이점이 있습니다.

numpy.reshape()

배열의 모양을 바꾸는 함수 인 reshape()부터 시작해 봅시다.

import numpy as np

arrayA = np.arange(8)
# arrayA = array([0, 1, 2, 3, 4, 5, 6, 7])

np.reshape(arrayA, (2, 4))
#array([[0, 1, 2, 3],
#       [4, 5, 6, 7]])

8 개의 요소로 구성된 벡터를(4, 2)모양의 배열로 변환합니다. 모양 변경 전후의 요소 수가 동일하기 때문에 성공적으로 실행될 수 있습니다. 금액이 다르면 ‘ValueError’가 발생합니다.

In [1]: np.reshape(arrayA, (3, 4))
    ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: cannot reshape array of size 8 into shape (3,4)

재구성 된 배열을 자세히 살펴 보겠습니다. 첫 번째 행은 ‘arrayA’의 첫 번째 4 개 데이터이고 두 번째 행은 마지막 4 개를 취합니다.이 변형 변환에서 행 순서로 데이터를 채 웁니다.

데이터를 채우는 순서가 열이되도록하려면 order 매개 변수를 변경해야합니다.

In [1]: np.reshape(arrayA, (2, 4), order='F')
Out[1]: array([[0, 2, 4, 6],
        	  [1, 3, 5, 7]])

order 의 기본값은 C 와 같은 인덱스 순서 또는 행 순서로 간단한 단어로 데이터를 읽거나 쓰는 것을 의미하는 C 입니다. F 는 Fortan 과 같은 인덱스 순서로 데이터를 읽거나 쓰는 것을 의미합니다. 다양한 인덱싱 방법에 대한 자세한 내용은 공식 NumPy 설명서를 참조하십시오.

ndarray.reshape()

NumPy 는 reshape 기능 외에도 ndarray 객체에 reshape 메소드를 가지고 있습니다. 이 메소드에는 함수와 동일한 매개 변수가 있지만 매개 변수로 지정된 배열이 없습니다.

In [1]: arrayB = arrayA.reshape((2, 4))
    
In [2]: arrayB
Out[2]:	array([[0, 1, 2, 3],
       		[4, 5, 6, 7]])
In [1]: arrayA
Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7])    

reshape 방법은 reshape 기능과 유사합니다. 또한 ndarray.reshape () 메서드는 원래 배열의 데이터와 모양을 변경하지 않지만 새로운 ‘ndarray’인스턴스를 반환합니다.

reshape()함수 / 메소드 공유 메모리

reshape 함수 나 메소드에서 변환 된 배열은 원래 배열과 동일한 메모리를 공유합니다. 한 배열에서 데이터를 변경하면 다른 배열의 해당 데이터도 수정되는 Python 의 경우 ‘얕은 복사’로 생각할 수 있습니다.

In [1]: arrayA = np.arange(8)
    	arrayB = arrayA.reshape((2, 4))
        arrayB
Out[2]:	array([[0, 1, 2, 3],
       		[4, 5, 6, 7]])
In [2]: arrayA[0] = 10
    	arrayA
Out[2]: array([10, 1, 2, 3, 4, 5, 6, 7]) 
In [3]: arrayB    
Out[3]:	array([[10, 1, 2, 3],
       		[4, 5, 6, 7]])    

numpy.resize()

numpy.resize()는 모양 변환의 관점에서 shashape 와 약간 비슷합니다. 그러나 몇 가지 중요한 차이점이 있습니다.

  1. order 매개 변수가 없습니다. resize 의 순서는 reshapeorder = 'C'와 동일합니다.
  2. 대상 배열의 요소 수가 원래 배열과 동일하지 않으면 크기를 강제로 조정하지만 오류는 발생하지 않습니다.

두 번째 차이점에 초점을 맞추겠습니다.

In [1]: arrayA = np.arange(8)
        arrayB = np.resize(arrayA, (2, 4))
Out[1]: array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

요소 번호가 동일한 경우 결과는 reshpae 의 결과와 동일합니다.

In [1]: arrayC = np.resize(arrayA, (3, 4))
    	arrayC
Out[1]: array([[0, 1, 2, 3],
       [4, 5, 6, 7],
       [0, 1, 2, 3]])
In [2]: arrayD = np.resize(arrayA, (4, 4))
    	arrayD
Out[2]: array([[0, 1, 2, 3],
       [4, 5, 6, 7],
       [0, 1, 2, 3],
       [4, 5, 6, 7]])

새 배열에 더 많은 행이 있으면 원래 배열의 데이터는 반복되지만 오류는 발생하지 않습니다.

In [1]: arrayE = np.resize(arrayA, (2, 2))
		arrayE
Out[1]: array([[0, 1],
       [2, 3]])    
In [2]: np.resize(arrayA, (1,4))
Out[2]: array([[0, 1, 2, 3]])

새 배열의 요소 수가 적 으면 새 배열을 채우는 데 필요한 요소 수를 행 순서대로 가져옵니다.

resize 기능 / 방법 메모리

새로운 배열은 resize 함수 / 방법의 원래 배열과 동일한 메모리를 공유하지 않습니다. 한 어레이의 데이터 변경은 다른 어레이에 매핑되지 않습니다.

In [1]: arrayA = np.arange(8)
    	arrayB = arrayA.reshape((2, 4))
        arrayB
Out[2]:	array([[0, 1, 2, 3],
       		[4, 5, 6, 7]])
In [2]: arrayA[0] = 10
    	arrayA
Out[2]: array([10, 1, 2, 3, 4, 5, 6, 7]) 
In [3]: arrayB    
Out[3]:	array([[0, 1, 2, 3],
       		[4, 5, 6, 7]])    
comments powered by Disqus