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

Jinku Hu 2023년12월11일
  1. numpy.reshape()
  2. ndarray.reshape()
  3. reshape()함수 / 메소드 공유 메모리
  4. numpy.resize()
NumPy Tutorial-NumPy 어레이 재구성 및 크기 조정

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]])
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook