넘파이를 사용하면서 자주 등장하고 쓰이는 함수들에 대해 정리해보았다.
numpy 변환, random, 연산 등 기본적인 것들이라 이미 알고있다면 넘어가도 좋다.
※ 자주 사용하는 numpy 함수¶
In [1]:
import numpy as np
numpy 배열¶
In [2]:
np.array([0,1,2,3])
Out[2]:
array([0, 1, 2, 3])
기존 리스트를 numpy배열로 변환¶
In [3]:
tmp = [[0,2],[2,3],[6,8]]
np.asarray(tmp)
Out[3]:
array([[0, 2], [2, 3], [6, 8]])
In [4]:
tmp = [[0,2],[2,3],[6,8]]
np.array(tmp)
Out[4]:
array([[0, 2], [2, 3], [6, 8]])
numpy배열을 리스트로 변환¶
In [5]:
tmp = np.array([[0,2],[2,3],[6,8]])
tmp.tolist()
Out[5]:
[[0, 2], [2, 3], [6, 8]]
numpy 배열 1차원으로¶
In [6]:
tmp = np.array([[0,2],[2,3],[6,8]])
print(tmp)
tmp=tmp.flatten()
print(tmp)
[[0 2] [2 3] [6 8]] [0 2 2 3 6 8]
0으로 채워넣기¶
In [7]:
np.zeros(4)
Out[7]:
array([0., 0., 0., 0.])
In [8]:
np.zeros([10,10])
Out[8]:
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., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
덧붙이기¶
In [9]:
left = [1,2,3]
right = [3,4,5]
np.append(left,right)
Out[9]:
array([1, 2, 3, 3, 4, 5])
In [10]:
left = [[1,2,3]]
right = [[3,4,5]]
print(np.append(left,right,axis=1)) #default
print(np.append(left,right,axis=0))
[[1 2 3 3 4 5]] [[1 2 3] [3 4 5]]
numpy aggregations¶
In [11]:
a = np.array([100,200,3,44,55])
a
Out[11]:
array([100, 200, 3, 44, 55])
In [12]:
print("최댓값 : ",a.max())
print("최솟값 : ",a.min())
print("표준편차 : ",a.std())
print("평균 : ",a.mean())
print("합 : ",a.sum())
print("최댓값 위치 : ",a.argmax())
print("최솟값 위치 : ", a.argmin())
최댓값 : 200 최솟값 : 3 표준편차 : 67.30408605723726 평균 : 80.4 합 : 402 최댓값 위치 : 1 최솟값 위치 : 2
기본연산¶
In [13]:
b = np.array([100, 101, 102, 103, 104])
In [14]:
print("더하기 : ", b+100)
print("빼기 : ",b-100)
print("곱하기 : ", b*100)
print("나누기 : ",b/100)
print("조건 : ", b%2==0)
더하기 : [200 201 202 203 204] 빼기 : [0 1 2 3 4] 곱하기 : [10000 10100 10200 10300 10400] 나누기 : [1. 1.01 1.02 1.03 1.04] 조건 : [ True False True False True]
In [15]:
b+100
Out[15]:
array([200, 201, 202, 203, 204])
특정 값 위치 찾기¶
In [16]:
c = np.array([11,22,5,533,23,44,74, 533])
np.argwhere(c==533)
Out[16]:
array([[3], [7]], dtype=int64)
해당 값인지 확인¶
찾는 게 있는지에 대한 여부를 각 인덱스별로 True/False로 나타냄
In [17]:
np.isin(c, 533)
Out[17]:
array([False, False, False, True, False, False, False, True])
인덱싱¶
Boolean Indexing¶
특정 조건을 만족하는 배열의 모든 열을 선별
In [18]:
d = np.asarray([1,2,3,4,5,6,7,8,9])
d[d%2==0]
Out[18]:
array([2, 4, 6, 8])
배열 두개를 활용할 수 있음
a배열에서 특정값을 갖는 인덱스인 부분만 b열에서 추출
In [19]:
condition = np.array([0,0,0,0,1,1,1,1,2,3,3,4,5,1])
value = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14])
value[condition==1]
Out[19]:
array([ 5, 6, 7, 8, 14])
다차원 하위배열 인덱싱¶
In [20]:
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a
Out[20]:
array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]])
행은 2까지, 열은 3까지
In [21]:
a[:2,:3]
Out[21]:
array([[1, 2, 3], [5, 6, 7]])
모든 행, 열은 걸러서 하나씩
In [22]:
a[:,::2]
Out[22]:
array([[ 1, 3], [ 5, 7], [ 9, 11]])
모든 행에 대해 첫번째 열
In [23]:
a[:,1]
Out[23]:
array([ 2, 6, 10])
모든 행에 대해 1,2번째 열
In [24]:
a[:, 1:3]
Out[24]:
array([[ 2, 3], [ 6, 7], [10, 11]])
첫번째 행
In [25]:
a[1,:] #a[1]
Out[25]:
array([5, 6, 7, 8])
random 함수¶
필요한 경우 앞에 np.을 붙여서 사용하자
In [26]:
import random
0과 1사이의 실수¶
In [27]:
random.random()
Out[27]:
0.2117993402344297
In [28]:
np.random.random()
Out[28]:
0.0018760767147326662
범위 내 실수¶
In [29]:
random.uniform(0,255)
Out[29]:
113.31573756926788
In [30]:
np.random.uniform(0,355)
Out[30]:
54.54401454199284
- size 매개변수 : size크기의 배열에 난수 생성
In [31]:
np.random.uniform(0,255, size=[4,3])
Out[31]:
array([[ 27.3758797 , 151.4362127 , 189.41842184], [225.199215 , 176.29267068, 166.60040061], [199.06867954, 115.15073579, 226.43156584], [148.46993803, 172.17224862, 105.24542081]])
In [32]:
np.random.random_sample((5,))
Out[32]:
array([0.73584019, 0.67211648, 0.30868949, 0.3211621 , 0.32941343])
int형 난수¶
In [33]:
np.random.randint(10)
Out[33]:
5
In [34]:
random.randint(1,10)
Out[34]:
10
In [35]:
np.random.randint(6,10)
Out[35]:
6
range 범위 내 난수¶
In [36]:
random.randrange(0,100,30)
Out[36]:
90
랜덤하게 하나 고르기¶
In [37]:
random.choice([121,445,563])
Out[37]:
445
In [38]:
np.random.choice([121,445,563])
Out[38]:
445
In [39]:
random.choice('adkfjs')
Out[39]:
'j'
랜덤하게 여러개 고르기¶
In [40]:
random.sample([1, 2, 3, 4, 5], 3)
Out[40]:
[2, 5, 3]
In [41]:
print("첫번째 값까지를 두번째 값만큼 고르기 : ", np.random.choice(10,3))
print("첫번째 값에 있는 것 중 두번째 값만큼르기 : ", np.random.choice((30,36,44),5))
첫번째 값까지를 두번째 값만큼 고르기 : [9 2 1] 첫번째 값에 있는 것 중 두번째 값만큼르기 : [30 44 36 30 44]
데이터 변환¶
예시 데이터 - MNIST¶
In [42]:
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test,y_test) = mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 11493376/11490434 [==============================] - 16s 1us/step
In [43]:
(x_train.shape, y_train.shape)
Out[43]:
((60000, 28, 28), (60000,))
In [44]:
(x_test.shape, y_test.shape)
Out[44]:
((10000, 28, 28), (10000,))
데이터 형태 변환¶
In [45]:
x_train = x_train.reshape(60000,28,28,1)
x_test = x_test.reshape(10000,28,28,1)
(x_train.shape, x_test.shape)
Out[45]:
((60000, 28, 28, 1), (10000, 28, 28, 1))
데이터 타입 변환¶
In [46]:
x_train = x_train.astype(np.float32)/255.0
x_test = x_test.astype(np.float32)/255.0