np.adarry()
array의 뜻은 배열이다.
np.adarry() 함수는 넘파이의 배열을 만들어주는 함수이다.
🧐그러면 배열은 무엇일까 ?
우선 배열에 대하여 알아야 한다.
- 스칼라(Scalar)은 하나의 값을 의미한다.
- 벡터(Vector)는 스칼라의 배열을 의미이며, 1차원이라고도 한다.
- 매트릭스(Matrix)는 벡터의 배열이며, 2차원이라 한다.
- 텐서(Tensor)는 매트릭스의 배열이며, 3차원이다.
또 하나 알아두어야 할 것이 있다 !
파이썬에서는 벡터 연산이 불가능하다.
a = [1, 2, 3]
print(a * 2)
print(type(a))
# 출력값
# [1, 2, 3, 1, 2, 3]
# <class 'list'>
a라는 리스트에 2를 곱해주면 [2, 4, 6]이 출력이 될 줄 알았다.
그러나, 파이썬에서는 위와 같이 [1, 2, 3, 1, 2, 3]으로 나열이 된다.
import numpy as np
a = np.array([1, 2, 3])
print(a*2)
print(type(a))
# 출력값
# [2 4 6]
# <class 'numpy.ndarray'>
단, 넘파이 패키지를 이용하면 벡터 연산이 가능하다.
numpy.array() 함수는 파이썬의 리스트 같은 인자를 입력받아 ndarray로 변환해주는 기능을 한다.
import numpy as np
np.array(List or Tuple)
우선, 넘파이를 사용하기 위해서는 Numpy 모듈을 불러오는 것이 필수이다.
numpy.array 함수 인자값에는 파이썬의 리스트나 튜플 등의 값들을 입력해주면 된다.
넘파이에서 '차원'과 '형태'가 어떻게 나타나는지 확인해보자.
차원을 확인하는 함수은 .ndim이다.
dim은 Dimension의 약자로 '차원'이라는 뜻이다.
형태를 나타내는 함수는 .shape이다.
스칼라(Scalar)
- 차원 : 0차원
- 형태 : ()
import numpy as np
a = np.array(1)
print(a)
print('차원 :', a.ndim, '형태 :', a.shape)
# 출력값
# 1
# 차원 : 0 형태 : ()
벡터(Vector)
- 차원 : 1차원
- 형태 : (3, )
import numpy as np
a = np.array([1, 2, 3])
print(a)
print('차원 :', a.ndim, '형태 :', a.shape)
# 출력값
# [1 2 3]
# 차원 : 1 형태 : (3,)
매트릭스(Matrix)
- 차원 : 2차원
- 형태 : (2, 3)
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print('차원 :', a.ndim, '형태 :', a.shape)
# 출력값
# [[1 2 3]
# [4 5 6]]
# 차원 : 2 형태 : (2, 3)
텐서(Tensor)
- 차원 : 3
- 형태 : (2, 2, 3)
import numpy as np
a = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
print(a)
print('차원 :', a.ndim, '형태 :', a.shape)
# 출력값
# [[[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]]
# 차원 : 3 형태 : (2, 2, 3)
위의 각 결과값의 특징을 보았을 때,
Scalar ==> ()
Vector ==> (y, )
Matrix ==> (x, y)
Tensor ==> (z, x, y)
형태는 차원에 따라 하나씩 뒤로 밀려나는 형태이며,
대괄호[ ]의 갯수 만큼 차원이 늘어나는 것을 알 수 있다.
넘파이의 데이터 타입 (Data Type)은 정수, 실수, 문자형, 불 값 등이 모두 가능하다.
import numpy as np
a = np.array([1, 2, 3])
print(a, a.dtype) # [1 2 3] int64
b = np.array([1.1, 2, 3])
print(b, b.dtype) # [1.1 2. 3. ] float64
c = np.array(['A', 'B', 1])
print(c, c.dtype) # ['A' 'B' '1'] <U21
d = np.array([True, False, True])
print(d, d.dtype) # [ True False True] bool
단,
int에 float가 한 개라도 있으면 모두 float로 변경된다.
int에 str이 포함되어 있어도 동일하다.
다만, 데이터 타입 (Data Type)은 고정이 아니다.
np.astype() 함수를 사용하여 데이터 타입을 변환할 수 있다.
import numpy as np
a = np.array([1, 2, 3])
print(a, a.dtype) # [1 2 3] int64
a = a.astype(float)
print(a, a.dtype) # [1. 2. 3.] float64
a = a.astype(str)
print(a, a.dtype) # ['1.0' '2.0' '3.0'] <U32
넘파이에서도 랜덤함수를 사용할 수 있다.
random 모듈을 사용하지 않고 말이다.
np.random
import numpy as np
arr = np.random.random() # 0.0 이상 1.0 미만 사이의 임의의 실수값 반환
print(arr) # 0.06183306121110821
arr = np.random.random(5) # 임의의 실수값 5개 반환
print(arr) # [0.25864461 0.90325478 0.69688349 0.78187284 0.04546817]
arr = np.random.randint(1, 5, 5) # 1이상 5미만의 5개 정수 반환
print(arr) # [4 2 4 1 2]
위의 함수보다 더 많은 함수가 존재하지만 우선은 간단하게 랜덤 함수를 사용할 수 있다는 것만 알아두자 !
그 외에 데이터를 채울 수 있는 여러가지 함수가 있다.
하나씩 알아보자 !
우선은 np.arange() 함수이다.
파이썬의 range() 함수와 같다.
지정한 범위 만큼 값을 반환한다.
또한, 데이터 타입의 변환도 가능하다.
import numpy as np
arr = np.arange(3) # 0이상 3미만의 수를 1 차이씩 반환
print(arr, arr.ndim, arr.shape) # [0 1 2] 1 (3,)
arr = np.arange(0, 4, 2) # 0이상 4미만 2의 간격씩 반환
print(arr, arr.ndim, arr.shape) # [0 2] 1 (2,)
arr = np.arange(0, 4, 2, dtype=float) # 0이상 4미만 2의 간격씩 반환, 데이터타입은 실수형
print(arr, arr.ndim, arr.shape) # [0. 2.] 1 (2,)
np.arange() 함수 외에 데이터를 채울 수 있는 값은 더 있다.
몇 가지를 더 소개하자면 ,
np.zeros( ), np.ones( ), np.empty( ), np.full( ) 함수가 있다.
import numpy as np
arr = np.zeros(3) # 3열 크기의 벡터를 0으로 모두 반환
print(arr, arr.ndim, arr.shape) # [0. 0. 0.] 1 (3,)
arr = np.ones(3) # 3열 크기의 벡터를 1로 모두 반환
print(arr, arr.ndim, arr.shape) # [1. 1. 1.] 1 (3,)
arr = np.empty(4) # 3열 크기의 벡터를 임의의 값으로 모두 반환
print(arr, arr.ndim, arr.shape) # [-2.00000000e+000 -2.00000000e+000 9.88131292e-324 2.78134232e-309] 1 (4,)
arr = np.full(3, 'A') # 3열 크기의 벡터를 지정한 값 'A'로 모두 반환
print(arr, arr.ndim, arr.shape) # ['A' 'A' 'A'] 1 (3,)
😀이번에 알아볼 것은 가장 자주 쓰이는 함수이니 꼭 기억 하도록 하자 !
np.reshape() 라는 함수이다.
위 함수는 '넘파이 배열의 차원과 크기를 변경'하는 함수이다 !
import numpy as np
arr = np.arange(10) # 0이상 10미만의 1씩 증가씩 총 10개 값 반환
print(arr, arr.ndim, arr.shape)
'''
[0 1 2 3 4 5 6 7 8 9] 1 (10,)
'''
arr = np.arange(10).reshape(2, 5) # 위 값을 2행 5열로 변환
print(arr, arr.ndim, arr.shape)
'''
[[0 1 2 3 4]
[5 6 7 8 9]] 2 (2, 5)
'''
arr = np.arange(10).reshape(2, 1, 5) # 2면 1행 5열로 변환
print(arr, arr.ndim, arr.shape)
'''
[[[0 1 2 3 4]]
[[5 6 7 8 9]]] 3 (2, 1, 5)
'''
지정되어 있는 값을 원하는 배열 (면, 행, 열)로 변경할 수 있다.
다만,
주의해야 할 부분은 'Scalar'의 갯수와 변환하려는 배열의 갯수가 일치 해야 한다는 것이다.
예를 들어,
Scalar의 갯수가 3개 인데 (2행, 2열) 로 변환을 하고싶을 경우,
2행 2열의 필요 요소 값은 4개이기 때문에 변환을 할 수가 없다.
import numpy as np
arr = np.arange(3).reshape(2, 2) # 3개의 Scalar 값을 2행 2열로 변환할 경우
print(arr, arr.ndim, arr.shape)
# ValueError: cannot reshape array of size 3 into shape (2,2)
각 요소의 값을 알 수 있는 함수가 있다.
그것은 np.size 함수이다.
배열의 크기가 작을 경우 사용할 필요가 없지만,
많은 양의 데이터를 처리할 경우에는 용이하게 사용할 수 있으니 알아두도록 하자.
import numpy as np
arr = np.arange(20).reshape(4, 5)
print(arr, arr.ndim, arr.shape, arr.size)
'''
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]] 2 (4, 5) 20
'''
다음에는 넘파이 배열의 '색인 및 슬라이싱'과 '병합 및 분할' , '함수' 들에 대해 알아볼 예정이다.
넘파이는 판다스에서 기반이 되는 패키지이기 때문에 개념을 꼭 알자 !