본 포스팅은 NumPy 패키지 홈페이지의 원문을 기반으로 하여 작성하였습니다.
Example
>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<class 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<class 'numpy.ndarray'>
Array 생성
배열을 만드는 방법에는 여러 가지가 있습니다. 예를 들어, 배열 함수를 사용하여 일반 Python 리스트 또는 튜플에서 배열을 만들 수 있습니다. 결과 배열의 유형은 시퀀스의 요소 유형에서 추론됩니다.
>>> import numpy as np
>>> a = np.array([2, 3, 4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')
코드 작성 시에 발생하는 빈번한 오류는 단일 시퀀스를 인수로 제공하는 대신 여러 인수로 배열을 호출하는 것으로 구성됩니다.
>>> a = np.array(1, 2, 3, 4) # WRONG
Traceback (most recent call last): ... TypeError: array() takes from 1 to 2 positional arguments but 4 were given >>> a = np.array([1, 2, 3, 4]) # RIGHT
array는 시퀀스의 시퀀스를 2차원 배열로, 시퀀스의 시퀀스의 시퀀스를 3차원 배열로 변환하는 식입니다.
>>> b = np.array([(1.5, 2, 3), (4, 5, 6)])
>>> b
array([[1.5, 2. , 3. ], [4. , 5. , 6. ]])
배열의 유형은 생성 시 명시적으로 지정할 수도 있습니다.
>>> c = np.array([[1, 2], [3, 4]], dtype=complex)
>>> c
array([[1.+0.j, 2.+0.j], [3.+0.j, 4.+0.j]])
종종 배열의 요소는 원래 알려지지 않았지만 크기는 알려져 있습니다. 따라서 NumPy는 초기 자리 표시자 콘텐츠로 배열을 생성하는 여러 기능을 제공합니다. 이는 어레이를 확장해야 하는 필요성과 값비싼 작업을 최소화합니다.
함수 zeros는 0으로 가득 찬 배열을 만들고, 함수 ones는 1로 가득 찬 배열을 만들고, empty 함수는 초기 내용이 무작위이고 메모리 상태에 따라 달라지는 배열을 만듭니다. 기본적으로 생성된 배열의 dtype은 float64이지만 키워드 인수 dtype을 통해 지정할 수 있습니다.
>>> np.zeros((3, 4))
array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
>>> np.ones((2, 3, 4), dtype=np.int16)
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]]], dtype=int16)
>>> np.empty((2, 3))
array([[3.73603959e-262, 6.02658058e-154, 6.55490914e-260], # may vary
[5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
숫자 시퀀스를 생성하기 위해 NumPy는 Python 내장 범위와 유사하지만 배열을 반환하는 arange 함수를 제공합니다.
>>> np.arange(10, 30, 5)
array([10, 15, 20, 25])
>>> np.arange(0, 2, 0.3) # it accepts float arguments
array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
범위가 부동 소수점 인수와 함께 사용되는 경우 유한 부동 소수점 정밀도로 인해 일반적으로 획득한 요소 수를 예측할 수 없습니다. 이러한 이유로 일반적으로 단계 대신 원하는 요소 수를 인수로 받는 linspace 함수를 사용하는 것이 좋습니다.
>>> from numpy import pi
>>> np.linspace(0, 2, 9) # 9 numbers from 0 to 2
array([0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
>>> x = np.linspace(0, 2 * pi, 100) # useful to evaluate function at lots of points
>>> f = np.sin(x)
(※ array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, numpy.random.Generator.rand, numpy.random.Generator.randn 함수 등도 있습니다.)
배열 출력
배열을 출력할 때 NumPy는 중첩 목록과 유사한 방식으로 배열을 표시하지만 다음 레이아웃을 사용합니다.
- 마지막 축은 왼쪽에서 오른쪽으로 인쇄되고,
- 마지막에서 두 번째는 위에서 아래로 인쇄되고,
- 나머지 부분도 위에서 아래로 인쇄되며 각 슬라이스는 빈 줄로 다음 슬라이스와 구분됩니다.
그런 다음 1차원 배열은 행으로, 2차원은 행렬로, 3차원은 행렬 리스트로 출력됩니다.
>>> a = np.arange(6) # 1d array
>>> print(a)
[0 1 2 3 4 5]
>>>
>>> b = np.arange(12).reshape(4, 3) # 2d array
>>> print(b)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
>>> >>> c = np.arange(24).reshape(2, 3, 4) # 3d array
>>> print(c)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
배열이 너무 커서 출력할 수 없는 경우 NumPy는 자동으로 배열의 중앙 부분을 건너뛰고 모서리만 출력합니다.
>>> print(np.arange(10000))
[ 0 1 2 ... 9997 9998 9999]
>>>
>>> print(np.arange(10000).reshape(100, 100))
[[ 0 1 2 ... 97 98 99]
[ 100 101 102 ... 197 198 199]
[ 200 201 202 ... 297 298 299]
...
[9700 9701 9702 ... 9797 9798 9799]
[9800 9801 9802 ... 9897 9898 9899]
[9900 9901 9902 ... 9997 9998 9999]]
이 동작을 비활성화하고 NumPy가 전체 배열을 인쇄하도록 하려면 set_printoptions를 사용하여 인쇄 옵션을 변경할 수 있습니다.
>>> np.set_printoptions(threshold=sys.maxsize) # sys 모듈을 가져와야 함
다음 포스팅에서는 기초적인 옵션에 대해서 살펴보겠습니다.
'Python > NumPy' 카테고리의 다른 글
NumPy 인덱싱, 슬라이싱, 반복 (0) | 2021.09.09 |
---|---|
NumPy 기본 옵션 및 함수 (0) | 2021.09.08 |
NumPy 기초 (0) | 2021.09.06 |
Python 리스트와 NumPy 배열의 차이점 (0) | 2021.09.05 |
NumPy 개요 및 패키지 설치하기 (0) | 2021.09.04 |
댓글