
Numerical Python
import numpy as np
x = np.array([1,2,3])
x
>array([1,2,3])
type(x)
>numpy.ndarray
numpy 에서는 해당 array 의 크기를 알 수 있다. shape 을 확인함으로써 몇 개의 데이터가 있는지, 몇 차원으로 존재하는지 등을 확인할 수 있다.
arr.shape 는 tuple 이다.
arr = np.array([1,2,3,4,5])
arr
>
array([1,2,3,4,5)]
arr.shape
>(5,)
즉 arr은 1차원, 크기는 5이다.
arr.ndim
>1
.ndim 과 len(arr.shape) 은 같다
arr.size
>5
len(arr)
>5
arr.dtype
>dtype('int64')
정수 64bit(8byte)를 말한다
arr2 = np.array([10,3.14,2,0.12)]
arr2
>
array([10. ,3.14, 2. ,0.12])
arr2.dtype
>dtype('float64')
numpy에서 사용되는 자료형(자료형 뒤에 붙는 숫자는 몇 비트 크기인지를 의미함)
x=np.array([1,2,3,4])
y=np.array([[2,3,4],[1,2,4]])
x
>array([1,2,3,4])
x.shape
>(4,)
x.ndim
>1
len(x)
>4
x.size
>4
y
>array([[2,3,4],
[1,2,4]])
y.shape
>(2,3)
y.ndim
>2
len(y)
>2
y.size
>6
# 2x3x4
z = np.array([
[
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
],
[
[101,102,103,104],
[105,106,107,108],
[109,110,111,112]
],
])
z
>array([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]],
[[101, 102, 103, 104],
[105, 106, 107, 108],
[109, 110, 111, 112]]])
z.shape
>(2,3,4)
z.size
>24
‘차원 변환’ 중요함.
#scalar 0차원
np.array(10)
>array(10)
#1차원
np.array([10])
>array([10])
#2차원
np.array([[10]])
>array([10])
#3차원
np.array([[[10]]])
>array([10])
np.arange(10)
>array([0,1,2,3,4,5,6,7,8,9])
np.arange(1,10)
>array([1,2,3,4,5,6,7,8,9])
np.arange(1,10,2)
>array([1,3,5,7,9])
d = np.arange(3,10)
d
>array([3,4,5,6,7,8,9])
d.astype(np.float32)
>array([3.,4.,5.,6.,7.,8.,9.],dtype=float32)
d
>array([3,4,5,6,7,8,9])
#(12, )->(2,6)
np.arange(12).reshape(2,6)
>array([[0,1,2,3,4,5],
[6,7,8,9,10,11]])
np.arange(12).reshape(3,2,2)
>
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[ 8, 9],
[10, 11]]])np.arange(12).reshape(2,4)
ValueError: cannot reshape array of size 12 into shape (2,4)
np.ones(5)
>array([1.,1.,1.,1.,1.])
np.ones(6).reshape(2,3)
>array([[1., 1., 1.],
[1., 1., 1.]])
np.eye(5)
>
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
#0~1 사이 10개의 랜덤
np.random.rand(10)
>
array([0.7022079 , 0.4568314 , 0.1572509 , 0.9945428 , 0.60413926,
0.26675034, 0.06674856, 0.6047497 , 0.18090705, 0.39759417])
np.random.rand(2,3)
>array([[0.07368398, 0.03856894, 0.55895503],
[0.18494501, 0.31118853, 0.63923653]])
np.random.randn(5)
>array([-0.28035118, -0.34143822, 1.05176861, -1.4786252 , 1.15442739])
#0~4 사이의 정수 난수
np.random.randint(5)
#1~99 사이 숫자로 (3,5,2) 형태의 배열
np.random.randint(1,100,(3,5,2))
>array([[[21, 33],
[44, 85],
[14, 62],
[34, 29],
[57, 53]],
[[71, 97],
[33, 58],
[73, 94],
[43, 68],
[82, 4]],
[[38, 50],
[43, 24],
[74, 25],
[44, 54],
[90, 33]]])
np.random.seed(0)
np.random.rand(4)
>array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
np.unique([11,11,2,2,34,34])
> array([2,11,34])
x = np.arange(10)
x
>array([0,1,2,3,4,5,6,7,8,9])
x[0]
>0
x[-1],x[9]
>(9,9)
x[3] = 100
x
>
array([ 0, 1, 2, 100, 4, 5, 6, 7, 8, 9])
x = np.arange(10).reshape(2,5)
x
>array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
x[0]#1차원
> array([0,1,2,3,4])
x[0][2]#0차원
>2
x[0,2]
>2
x[1,4],x[1,-1],x[-1,-1]
>(9,9,9)
x
>array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
x[0]
> array([0, 1, 2, 3, 4])
#0번째 원소가 담긴 2차원 배열이 된다
x[[0]]
>array([[0, 1, 2, 3, 4]])
x[[1,0,0]]
>array([[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
x=np.arange(10)
x
>array([0,1,2,3,4,5,6,7,8,9])
x[1:7]
>array([1,2,3,4,5,6])
x[1::3]
>array([1,4,7])
y = [[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]
y
>[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]
y[:2]
>[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
#차원별 slicing 즉 여기서는 1~3과 6~8 을 뽑아내고 싶다는 뜻
y[:2][1:4]
->XX 불가함
x = np.arange(15).reshape(3,5)
x
>
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
x[:2,1:4]
> array([[1, 2, 3],
[6, 7, 8]])
차원 변환은 데이터분석과 인공지능에서 자주 발생하는 작업이기 때문에 자유자재로 변환 가능해야함. 머리속으로 내가 변환하는 데이터의 구조가 그려지도록 익숙해져야 좋아용
EX. 이미지 데이터 벡터화 - 이미지는 기본적으로 2차원 혹은 3차원이나 트레이닝을 위해 1차원으로 변형하여 사용된다.
x
>array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
x.ravel()
>array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
#row (행) 방향으로 펼쳐짐 (axis 0부터 펼쳐진다)
np.ravel(x,order='C')
>array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
#column 방향으로 펼쳐짐 -1부터 펼쳐짐
np.ravel(x,order='F')
>array([ 0, 5, 10, 1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14])
y = np.arange(15).reshape(3,5)
y
>array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]
y.flatten()
> array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
x2 = np.arange(36)
x2
>
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35])
x2.reshape(6,6)
>array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
#차원 유추
x2.reshape(6,-1)
>array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
#(6,?,2) ?는 3!
x2.reshape(6,-1,2)
>array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15],
[16, 17]],
[[18, 19],
[20, 21],
[22, 23]],
[[24, 25],
[26, 27],
[28, 29]],
[[30, 31],
[32, 33],
[34, 35]]])
차원 확장/제거 하는 동작도 머신러닝에서 많이 사용된다
reshape() 로 차원 변환(확장/제거) 자유롭게 가능
차원 확장: np.expand_dims()
차원 자동 제거 :squeeze, np.squeeze()
x3 = np.arange(6)
x3
>array([0, 1, 2, 3, 4, 5])
x3.shape
>(6,)
#(6,)=>(6,1)로 차원 확장
x3 = x3.reshape(6,1)
x3
>array([[0],
[1],
[2],
[3],
[4],
[5]])
x3 = x3.reshape(6,1,1)
x3
>array([[[0]],
[[1]],
[[2]],
[[3]],
[[4]],
[[5]]])
#1차원으로 축소(차원 제거)
x3 = x3.reshape((6,))
x3
>array([0, 1, 2, 3, 4, 5])
x3 = x3.reshape(1,1,1,6)
x3
>array([[[[0, 1, 2, 3, 4, 5]]]])
#차원 크기가 1인 차원을 제거 (6,)
x3.squeeze()
>array([0, 1, 2, 3, 4, 5])
x4 = np.arange(4).reshape((2,1,2))
x4
>array([[[0, 1]],
[[2, 3]]])
#(2,1,2)=>(2,2)
x4.squeeze()
x5 = np.arange(3)
x5
>array([0,1,2])
#0번째 차원축에 새로운 차원 추가
y5 = np.expand_dims(x5,axis=0)
y5
>array([[0, 1, 2]])
전치행렬(transpose matrix), 차원 축 바꾸기
a = np.arange(15).reshape(3,5)
a
>array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
np.transpose(a)
>array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
a.T
>array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
#axis 0과 axis 1을 바꾸기
np.swapaxes(a,0,1)
>array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])