[NumPy] 넘파이 배열(array)
- -
넘파이 배열(array)
NumPy(넘파이)의 배열은 파이썬에서 다차원 배열을 효율적으로 다룰 수 있게 해주는 라이브러리이다. NumPy 배열은 리스트와 유사하지만 훨씬 더 효율적인 연산을 지원하며 다차원 데이터를 처리하는 데 특화되어 있다.
넘파이의 주요 특징을 한 번 살펴보자.
- 다차원 배열 - NumPy는 다차원 배열을 지원하며, 1D, 2D, 3D 등 다양한 차원의 배열을 생성하고 다룰 수 있다.
- 백터화 연산 - NumPy 배열은 요소 간 연산을 간편하게 수행할 수 있도록 백터화 연산을 지원한다. 이는 반복문을 사용하지 않고도 배열 전체에 대한 연산을 수행할 수 있게 해 준다.
- 효율적인 메모리 사용 - NumPy 배열은 원시 데이터 타입을 사용하며 연속된 메모리 블록에 데이터를 저장하므로 효율적인 메모리 사용이 가능하다.
- 브로드캐스팅 - 다른 모양의 배열 간에도 연산이 가능한데, 이를 브로드캐스팅이라고 한다. 브로드캐스팅을 통해 서로 다른 크기의 배열 간에도 연산이 가능하게 된다.
- 풍부한 함수와 메서드 - NumPy는 다양한 수학 함수와 배열 조작 메서드를 제공하여 데이터를 효율적으로 다룰 수 있다.
NumPy 배열은 데이터 과학, 머신러닝, 과학 계산 등 다양한 분야에서 사용되며, 많은 다른 라이브러리들도 NumPy 배열을 기반으로 구촉 되어 있다.
NumPy 배열의 기본 구조
NumPy 배열은 다차원 배열로 구성되어 있다. 가장 기본적인 배열은 1차원 배열이며 , 이를 기반으로 2차원, 3차원 등 다차원 배열을 만들 수 있다.
NumPy 배열 생성 방법
이제는 NumPy에서 배열을 생성하는 다양한 방법들에 대해 살펴보자.
array()
array() 함수는 NumPy 배열을 생성하는 데 사용되는 주요 함수 중 하나이다. 이 함수를 사용하면 파이썬 리스트를 NumPy 배열로 변환할 수 있다. NumPy 배열은 다차원 배열을 지원하며, 데이터의 효율적인 처리와 다양한 수학 연산을 가능하게 한다.
import numpy as np
# 1차원 배열 생성
arr_1d = np.array([1, 2, 3, 4, 5])
print("1D Array")
print(arr_1d)
# 2차원 배열 생성
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print("\n2D Array")
print(arr_2d)
# 3차원 배열 생성
arr_3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print("\n3D Array")
print(arr_3d)
array() 함수를 사용하여 리스트를 NumPy 배열로 변환할 수 있다. NumPy 배열은 파이썬 리스트보다 더 많은 기능과 효율적인 연산을 제공한다. 배열을 생성한 후에는 배열을 통해 다양한 수학적인 연산이나 배열 조작을 수행할 수 있다.
1D Array
[1 2 3 4 5]
2D Array
[[1 2 3]
[4 5 6]]
3D Array
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
실행 결과
zeros()
zeros() 함수는 지정된 크기의 모든 요소가 0으로 초기화된 NumPy 배열을 생성하는 데 사용된다. 이 함수는 0으로 초기화된 배열을 만들고자 할 때 유용하다. 함수의 기본 구조는 다음과 같다.
numpy.zeros(shape, dtype = float, order='C')
- shape - 배열의 형태를 나타내는 튜플이나 리스트이다. 각 차원의 크기를 지정한다. 예를 들어, (2,3)은 2행 3열의 2차원 배열을 의미한다.
- dtype(선택 사항) - 배열의 데이터 타입을 지정한다. 기본값은 float이다. 다양한 데이터 타입을 선택할 수 있다. 예를 들어, int, float32, float64 등이 있다.
- order(선택 사항) - 다차원 배열의 메모리 레이아웃을 지정한다. 'C'는 C 스타일의 로우 마지향 배열, 'F'는 포트란 스타일의 칼럼 마지향 배열을 의미한다.
import numpy as np
# 1차원 배열, 크기 5
arr_1d = np.zeros(5)
print("1D Array")
print(arr_1d)
# 2차원 배열, 크기 (2, 3)
arr_2d = np.zeros((2, 3))
print("\n2D Array")
print(arr_2d)
# 3차원 배열, 크기 (2, 3, 4)
arr_3d = np.zeros((2, 3, 4), dtype = int)
print("\n3D Array")
print(arr_3d)
위의 예제는 각 차원의 크기에 따라 0으로 초기화된 배열을 생성하는 예제이다. 데이터 타입을 지정하지 않으면 기본적으로 float으로 설정된다.
1D Array
[0. 0. 0. 0. 0.]
2D Array
[[0. 0. 0.]
[0. 0. 0.]]
3D Array
[[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]]
실행 결과
ones()
ones() 함수는 지정된 크기의 모든 요소가 1로 초기화된 NumPy 배열을 생성하는 데 사용된다. 이 함수는 1로 초기화된 배열을 만들고자 할 때 유용하다. 함수의 기본 구조는 다음과 같다.
numpy.ones(shape, dtype = float, order='C')
- shape - 배열의 형태를 나타내는 튜플이나 리스트이다. 각 차원의 크기를 지정한다. 예를 들어, (2,3)은 2행 3열의 2차원 배열을 의미한다.
- dtype(선택 사항) - 배열의 데이터 타입을 지정한다. 기본값은 float이다. 다양한 데이터 타입을 선택할 수 있다. 예를 들어, int, float32, float64 등이 있다.
- order(선택 사항) - 다차원 배열의 메모리 레이아웃을 지정한다. 'C'는 C 스타일의 로우 마지향 배열, 'F'는 포트란 스타일의 칼럼 마지향 배열을 의미한다.
import numpy as np
# 1차원 배열, 크기 5
arr_1d = np.ones(5)
print("1D Array")
print(arr_1d)
# 2차원 배열, 크기 (2, 3)
arr_2d = np.ones((2, 3))
print("\n2D Array")
print(arr_2d)
# 3차원 배열, 크기 (2, 3, 4)
arr_3d = np.ones((2, 3, 4), dtype=int)
print("\n3D Array")
print(arr_3d)
각 차원의 크기에 따라 1로 초기화된 배열을 생성하는 예제이다. 데이터 타입을 지정하지 않으면 기본적으로 float이 설정된다.
1D Array
[1. 1. 1. 1. 1.]
2D Array
[[1. 1. 1.]
[1. 1. 1.]]
3D Array
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
실행 결과
arrange()
arrange() 함수는 지정된 범위와 간격으로 일정한 간격을 가진 값들로 이루어진 NumPy 배열을 생성하는 데 사용된다. 이 함수의 기본 구조는 다음과 같다.
numpy.arange(start, stop, step, dtype = None)
- start(선택 사항) - 시퀀스의 시작값으로, 기본값은 0이다.
- stop - 시퀀스의 끝값으로, 생성된 배열에는 이 값이 포함되지 않는다.
- step(선택 사항) - 각 항목 간의 간격으로, 기본값은 1이다.
- dtype(선택 사항) - 배열의 데이터 타입을 지정한다. 기본값은 None이며, 자동으로 추정된다.
import numpy as np
# 0부터 9까지의 정수로 이루어진 배열 생성
arr1 = np.arange(10)
print("Example 1:")
print(arr1)
# 3에서 12까지의 정수로 이루어진 배열 생성
arr2 = np.arange(3, 13)
print("\nExample 2")
print(arr2)
# 0부터 1까지 0.2 간격으로 이루어진 배열 생성
arr3 = np.arange(0, 1, 0.2)
print("\nExample 3")
print(arr3)
위의 코드에서는 각각의 예제에서 arrange() 함수를 사용하여 배열을 생성하고 있다. 시작값, 끝값, 간격을 지정하여 원하는 형태의 배열을 생성할 수 있다.
Example 1:
[0 1 2 3 4 5 6 7 8 9]
Example 2
[ 3 4 5 6 7 8 9 10 11 12]
Example 3
[0. 0.2 0.4 0.6 0.8]
실행 결과
linspace()
linspace() 함수는 지정된 범위에서 균일한 간격으로 일정한 수의 값을 가진 NumPy 배열을 생성하는 데 사용된다. 이 함수는 시작값과 끝값을 포함한 범위를 지정하고, 해당 범위 내에서 원하는 개수의 값들을 균등하게 생성한다. linspace() 함수의 기본 구조는 다음과 같다.
numpy.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None)
- start - 시퀀스의 시작 값
- stop - 시퀀스의 끝값
- num - 생성할 값의 개수. 기본값은 50
- endpoint - 끝값을 포함할지 여부. 기본값은 True이며, False로 설정하면 끝값을 포함하지 않는다.
- retstep - 반환된 간격 값을 함께 반환할지 여부. 기본값은 False이며, True로 설정하면 (배열, 간격) 튜플이 반환된다.
- dtype - 배열의 데이터 타입. 기본값은 None이며, 자동으로 추정된다.
import numpy as np
# 0부터 1까지 5개의 값으로 이루어진 배열 생성
arr1 = np.linspace(0, 1, 5)
print("Example 1")
print(arr1)
# -1부터 1까지 11개의 값으로 이루어진 배열 생성
arr2 = np.linspace(-1, 1, 11)
print("\nExample 2")
print(arr2)
# 10부터 20까지 6개의 값으로 이루어진 배열 생성 (끝값 포함)
arr3 = np.linspace(10, 20, 6, endpoint = True)
print("\nExample 3")
print(arr3)
# 2부터 4까지 3개의 값으로 이루어진 배열 생성 (끝값 포함하지 않음)
arr4 = np.linspace(2, 4, 3, endpoint = False)
print("\nExample 4")
print(arr4)
위의 예제에서는 linspace() 함수를 사용하여 각각의 범위에서 원하는 개수의 값을 생성하고 있다. 시작값, 끝값, 생성할 값의 개수를 지정하여 원하는 형태의 배열을 생성할 수 있다.
Example 1
[0. 0.25 0.5 0.75 1. ]
Example 2
[-1. -0.8 -0.6 -0.4 -0.2 0. 0.2 0.4 0.6 0.8 1. ]
Example 3
[10. 12. 14. 16. 18. 20.]
Example 4
[2. 2.66666667 3.33333333]
실행 결과
NumPy 배열의 주요 속성
넘파이 배열은 다양하고 유용한 속성을 제공해 준다. 아래의 목록을 살펴보며 어떤 속성들이 있는지 한 번 살펴보자.
- shape - 배열의 형태(차원 및 크기)를 나타내는 튜플
- dtype - 배열 요소의 데이터 타입
- ndim - 배열의 차원 수
- size - 배열에 있는 요소의 총 수
- itemsize - 배열의 각 요소의 바이트 크기
- nbytes - 배열의 전체 바이트 크기
- flags - 메모리 레이아웃 및 속성을 설명하는 플래그
- strides - 각 차원의 바이트 오프셋을 나타내는 튜플
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(f"Shape : {arr.shape}")
print(f"Data Type : {arr.dtype}")
print(f"Dimentions : {arr.ndim}")
print(f"Size : {arr.size}")
print(f"Item Size : {arr.itemsize}")
print(f"Total Bytes : {arr.nbytes}")
print(f"-------- Flags --------")
print(f"{arr.flags}")
print(f"-----------------------")
print(f"Strides : {arr.strides}")
Shape : (2, 3)
Data Type : int32
Dimentions : 2
Size : 6
Item Size : 4
Total Bytes : 24
-------- Flags --------
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
-----------------------
Strides : (12, 4)
실행 결과
NumPy 배열의 flags 속성은 배열의 여러 속성에 대한 정보를 포함하는데, 위의 예제 코드에서 제시된 속성들의 의미는 다음과 같다.
- C_CONTIGUOUS(C Order Contiguity) - 배열이 C 스타일로 메모리에 연속적으로 저장되었는지 여부를 나타낸다. C스타일은 행이 먼저 채워지는 순서로, 가로 방향이 연속적인 메모리에 저장되는 것을 의미한다. True이면 C 스타일로 저장되었음을 나타낸다.
- F_CONTIGUOUS(Fortran Order Contiguity) - 배열이 Fortran 스타일로 메모리에 연속적으로 저장되었는지 여부를 나타낸다. Fortran 스타일은 열이 먼저 채워지는 순서로, 세로 방향으로 연속적인 메모리에 저장되는 것을 의미한다. True이면 Fortran 스타일로 저장되었음을 나타낸다.
- OWNDATA - 배열이 메모리 소유자인지 여부를 나타낸다. 만약 True이면 배열이 자체적으로 데이터를 소유하고 있음을 나타낸다.
- WRITEABLE - 배열의 내용을 변경할 수 있는지 여부를 나타낸다. 만약 True이면 배열의 값을 변경할 수 있다.
- ALIGNED - 배열의 요소가 메모리에서 정렬되어 있는지 여부를 나타낸다. True이면 배열의 요소가 정렬되어 있음을 나타낸다.
- WRITEBACKIFCOPY - 만약 배열이 다른 배열의 복사본이라면, 복사본이 수정되면 원본 배열을 수정할 것인지 여부를 나타낸다. True이면 복사본이 수정되면 원본도 수정된다.
이러한 속성들은 배열이 메모리에 어떻게 저장되어 있는지, 소유자인지, 수정 가능한지 등에 대한 정보를 제공한다.
읽어주셔서 감사합니다.
'Library > NumPy' 카테고리의 다른 글
[NumPy] 넘파이 newaxis (1) | 2023.11.30 |
---|---|
[NumPy] 넘파이 squeeze() 함수 (0) | 2023.11.29 |
[NumPy] 넘파이 moveaxis() 함수 (0) | 2023.11.25 |
[NumPy] 넘파이 swapaxes() 함수 (1) | 2023.11.24 |
[NumPy] 넘파이 ravel() 함수 (0) | 2023.11.23 |
소중한 공감 감사합니다