인사말
정말 오랜만에 글을 쓰네요! 야심 차게 시작했지만 블로그에 무언가를 기록한다는 게 정말 손이 많이 가더라구요. 그림 자료도 나름대로 이해하기 쉽도록 구상해서 만들고 맞춤법도 검사하고 내용도 검토하고 등등! 그래도 공부하는 김에 글도 같이 쓰고 사람들과 공유하면 좋잖아요? 그래서 제가 스스로 만들고 싶은 작품을 만들면서 공부하게 된 여러 가지 지식들을 잘 정리해서 적어볼까 합니다. 무엇부터 시작할까 하다가 파이썬에 관한 정보는 이미 너무나도 많고 알고 계신 분들이 많을 거라고 생각해서~ 파이썬에서 가장 많이 사용되는 도구인 넘파이 패키지를 가지고 왔습니다! (numpy==2.2.0 기준으로 작성되었습니다.)
소개
넘파이를 배우러 오셨으니까 독자가 파이썬의 기본적인 문법이나 코드의 흐름을 이해하고 있다고 가정하고 설명하겠습니다. 넘파이는 행렬, 벡터 등의 편리한 배열 자료형을 제공하고 이러한 배열의 다양한 연산을 제공해 주는 패키지입니다. 선형 대수, 푸리에 변환, 난수 생성 등의 기능도 제공을 한다고 합니다. 더욱 자세한 기능을 알고 싶다면 홈페이지를 참고하세요.
Provides (제공)
1. An array object of arbitrary homogeneous items. (임의의 동질적인 항목의 배열 객체)
2. Fast mathematical operations over arrays. (배열을 통한 빠른 수학적 연산)
3. Linear Algebra, Fourier Transforms, Random Number Generation. (선형 대수, 푸리에 변환, 난수 생성)
numpy는 정말 정말 유명한 패키지입니다. 그래서 인터넷 등지에 많은 레퍼런스들이 떠다니고 있는데요. 아나콘다(anaconda)나 코랩(coLab)에서는 이미 설치가 되어 있을 정도로 기본적인 패키지라는 인식이 강합니다. 따로 설치가 안 되어 있으신 분들은 Bash에서 직접 다운로드하시면 됩니다.
pip install numpy
그리고 레퍼런스가 많다 보니 numpy를 활용한 여러 가지 코드를 보실 수 있는데요. 모든 코드들의 공통점은 "np"라는 별칭을 붙여서 사용한다는 겁니다. 누가 먼저 시작했는지는 알 수 없지만 모두들 "np"라고 부르고 쓰니까 우리도 그렇게 하면 되겠습니다. 따라서 패키지를 import 할 때는 항상 다음과 같이 해주세요.
import numpy as np
파이썬 내장 함수인 help()를 통해서 여러 가지 numpy의 기능에 대한 설명을 얻을 수 있습니다. 어떤 파라미터를 넣어야 할지, 무슨 기능을 하는지 궁금하다면 한 번 사용해 보는 것도 좋을 것 같아요. (ChatGPT가 더 쉽고 빠르겠지만) 예를 들어서 np.sort() 함수에 대한 설명을 살펴볼까요?
import numpy as np
help(np.sort)
밑에 쭉쭉쭉 엄청 길게도 설명해 주네요. 너무 길어서 다 볼 필요는 없고 파라미터가 어떤 게 있고 뭘 리턴해주는 지만 알면 되겠네요.
서브 패키지로 lib, random, linalg, fft, polynomial, testing, distutils 등을 제공합니다. 거의 써 본 기억이 없고 random 패키지는 굉장히 많이 사용했습니다. 푸리에 변환할 때 fft도 정말 유용한 것 같더라구요. 아마 더 다양한 프로젝트를 경험하면서 사용하게 되지 않을까 싶습니다.
Available subpackages (사용가능한 서브 패키지들)
---------------------
lib : Basic functions used by several sub-packages. (여러 하위 패키지에서 사용하는 기본 기능.)
random : Core Random Tools. (핵심 랜덤 도구)
linalg : Core Linear Algebra Tools. (핵심 선형 대수 도구)
fft : Core FFT routines. (핵심 FFT 루틴)
polynomial : Polynomial tools. (다항식 도구)
testing : NumPy testing tools. (NumPy 테스트 도구)
distutils : Enhancements to distutils with support for / Fortran compilers support and more (for Python <= 3.11)
다음과 같은 유틸도 제공한다니 참고해 보도록 하고 바로 다음 장으로 넘어가 볼까요?
Utilities (유틸리티들)
---------
test : Run numpy unittests. (numpy 단위 테스트 실행)
show_config : Show numpy build configuration. (Numpy 빌드 구성 표시)
__version__ : NumPy version string. (버전 확인 기능)
Viewing documentation using IPython
-----------------------------------
배열 생성
numpy가 가장 널리 쓰이는 이유에는 ndarray라는 강력한 도구가 있습니다. 파이썬에는 리스트 같은 기본으로 제공하는 배열이 있지만 배열끼리의 연산은 기능이 제한적입니다. 예를 들어 행렬 연산 같은 경우에 직접 기능을 만들어야 하는 번거로움이 있죠. 요즘 세간의 주목을 받고 있는 딥러닝도 결국 행렬 연산입니다. 이를 도와줄 numpy에서 제공하는 ndarray에는 다양한 기능이 있습니다. 가장 기본적인 array() 메서드를 통해 ndarray를 생성해 보겠습니다.
import numpy as np
lst = [1,2,3]
ndarr = np.array(lst)
print(ndarr)
>> [1 2 3]
겉보기엔 리스트를 출력한 것과 똑같습니다. 그러나 리스트와 달리 ndarray는 원소끼리 서로 다른 자료형을 가지면 안 됩니다. 그리고 또 주의할 점은 파라미터로 iterative한 자료형(리스트나 튜플 등)을 넣어야 한다는 점입니다.
import numpy as np
a = np.array([1,2,3]) #(O)
b = np.array(1,2,3) #(X) 에러 발생
lst = [1,'second',3.0] #(0)
ndarr = np.array(lst) #(X) 컴파일 에러X 논리적 에러 발생 가능성O
ndarray는 다음과 같은 다양한 속성을 갖습니다.
ndim : 배열 축 혹은 차원의 개수
shape : 배열의 모양. 튜플 형으로 배열의 크기를 알려줌.
size : 원소의 개수
dtype : 원소의 자료형
itemsize : 바이트 단위의 원소 크기
data : 실제 원소 값을 가지고 있는 버퍼
각 속성을 출력해 보겠습니다.
import numpy as np
lst = [1,2,3]
ndarr = np.array(lst)
print(ndarr.ndim)
print(ndarr.shape)
print(ndarr.size)
print(ndarr.dtype)
print(ndarr.itemsize)
print(ndarr.data)
>> 1
>> (3,)
>> 3
>> int64
>> 8
이렇게 생성한 ndarray의 추가적인 정보를 알고 싶으면 np.info() 메서드를 사용할 수 있습니다.
import numpy as np
lst = [1,2,3]
ndarr = np.array(lst)
np.info(ndarr)
>> class: ndarray
>> shape: (3,)
>> strides: (8,)
>> itemsize: 8
>> aligned: True
>> contiguous: True
>> fortran: True
>> data pointer: 0x241988ec1d0
>> byteorder: little
>> byteswap: False
>> type: int64
포인터까지 알려주네요? 옛날에 얼핏 듣기로 python이 C 기반으로 만들어졌다고 했던 것 같은데 정말인가 봅니다.
이제 기본적인 속성과 선언 방법을 알았으니 ndarray를 생성하는 다양한 방법을 알아볼까요?
1. np.zeros( (m,n) )
: 모든 원소가 0인 mXn 배열 생성
2. np. ones( (m,n) )
: 모든 원소가 0인 mXn 배열 생성
3. np. full( (m,n), x )
: 모든 원소가 x인 mXn 배열 생성
4. np.eye( n )
: nXn 단위행렬 (대각선만 1인 행렬) 생성
5. np.diag( obj )
: 대각선이 obj(iterative한 오브젝트. 리스트나 튜플같은거)로 이루어진 배열 생성
6. np.triu( obj ) / np.tril( obj )
: 상/하 삼각 행렬(대각선을 기준으로 위/아래가 전부 0인 행렬) 생성
7. np.arange( start, end, step )
: start에서 end-1까지 step 간격인 원소를 가진 배열 생성
8. np.linspace( start, end, n )
: start에서 end까지 n개의 균등한 간격의 원소를 가진 배열 생성
9. np.logspace( start, end, n )
: 10의 start승에서 10의 end승까지 로그 스케일로 n개의 원소를 가진 배열 생성
10. np.random.rand( m, n )
: 0부터 1 사이의 균등 분포 난수를 갖는 배열 생성
11. np.random.randn( m, n )
: 평균이 0, 표준편차가 1인 정규 분포 난수를 갖는 배열 생성
12. np.random.randint( start, end, (m,n) )
: start에서 end까지의 랜덤한 정수를 갖는 mXn 배열 생성
13. np.random.uniform( start, end, (m,n) )
: start에서 end까지의 랜덤한 실수를 갖는 mXn 배열 생성
1. np.zeros( (m,n) )
: 모든 원소가 0인 mXn 배열 생성
a1 = np.zeros((2,3))
[[0. 0. 0.]
[0. 0. 0.]]
2. np. ones( (m,n) )
: 모든 원소가 0인 mXn 배열 생성
a2 = np.ones((3,2))
[[1. 1.]
[1. 1.]
[1. 1.]]
3. np. full( (m,n), x )
: 모든 원소가 x인 mXn 배열 생성
a3 = np.full((4,3),5)
[[5 5 5]
[5 5 5]
[5 5 5]
[5 5 5]]
4. np.eye( n )
: nXn 단위행렬 (대각선만 1인 행렬) 생성
a4 = np.eye(3)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
5. np.diag( obj )
: 대각선이 obj(iterative한 오브젝트. 리스트나 튜플같은거)로 이루어진 배열 생성
a5 = np.diag([1,2,3])
[[1 0 0]
[0 2 0]
[0 0 3]]
6. np.triu( obj ) / np.tril( obj )
: 상/하 삼각 행렬(대각선을 기준으로 위/아래가 전부 0인 행렬) 생성
a6 = np.triu([[1,2,3],[4,5,6],[7,8,9]])
[[1 2 3]
[0 5 6]
[0 0 9]]
※ k 값을 파라미터로 줘서 대각선을 포함할지 말지 정해줄 수 있습니다.
7. np.arange( start, end, step )
: start에서 end-1까지 step 간격인 원소를 가진 배열 생성
a7 = np.arange(10)
[0 1 2 3 4 5 6 7 8 9]
※ 기본 내장 함수 range() 쓰듯이 쓰시면 됩니다.
8. np.linspace( start, end, n )
: start에서 end까지 n개의 균등한 간격의 원소를 가진 배열 생성
a8 = np.linspace(0,10,5)
[ 0. 2.5 5. 7.5 10. ]
9. np.logspace( start, end, n )
: 10의 start승에서 10의 end승까지 로그 스케일로 n개의 원소를 가진 배열 생성
a9 = np.logspace(0,2,5)
[ 1. 3.16227766 10. 31.6227766 100. ]
10. np.random.rand( m, n )
: 0부터 1 사이의 균등 분포 난수를 갖는 배열 생성
a10 = np.random.rand(3,3)
[[0.5461251 0.1690781 0.6931297 ]
[0.28562667 0.02319412 0.3663956 ]
[0.83944443 0.16638481 0.3784674 ]]
11. np.random.randn( m, n )
: 평균이 0, 표준편차가 1인 정규 분포 난수를 갖는 배열 생성
a11 = np.random.randn(3,3)
[[-0.61852324 -1.58808431 -1.49533257]
[-1.59938322 0.15007424 1.72471554]
[ 0.34776855 1.43588547 -0.29625052]]
12. np.random.randint( start, end, (m,n) )
: start에서 end까지의 랜덤한 정수를 갖는 mXn 배열 생성
a12 = np.random.randint(0,5,(4,3))
[[4 0 1]
[1 0 0]
[3 4 1]
[0 3 1]]
13. np.random.uniform( start, end, (m,n) )
: start에서 end까지의 랜덤한 실수를 갖는 mXn 배열 생성
a13 = np.random.uniform(0,1,(4,3))
[[0.94388928 0.09627351 0.9181406 ]
[0.00149588 0.63699067 0.48342154]
[0.79641061 0.69229383 0.68477417]
[0.88739108 0.41470256 0.75748218]]
끝까지 봐주셔서 감사합니다!
다음에는 ndarray의 shape을 다양하게 변화시키는 방법과 유용한 기능들을 들고 오겠습니다.
'컴퓨터공학 > 프로그래밍언어' 카테고리의 다른 글
파이썬(python) - 넘파이(numpy)(2) : shape 탐구하기 (4) | 2024.12.17 |
---|