ylab 2022. 2. 21. 15:07

Numpy(Numerical python)
np.array 함수를 사용하여 배열 생성
리스트와는 다르게 하나의 데이터 type만 배열에 사용가능
=> dynamic typing not supported
리스트는 객체들의 레퍼런스의 모임이지만 배열은 한개의 객체임

import numpy as np

a=np.array([1,2,3,4],float)
print(a)
#astype()메써드로 바꾸기가능
b=a.astype(np.int16)
print(b.dtype)

[1. 2. 3. 4.]
int16
 
 

shape 넘파이 배열 차원의 구성을 반환함 // 차원의 길이를 의미
dtype 넘파이 배열 데이터 타입 반환
ndim (number of dimension) 몇차원인지 의미
size  원소개수

 

import numpy as np

a= np.array([[1,2,3,4],[5,6,7,8],[9,6,2,1]])

print(a.ndim,a.shape,a.size)

2 (3, 4) 12

 

array의 RANK에 따라 다음과 같이 불림
0 scalar
1 vector
2 matrix
3 3-tensor
n n-tensor

 

np.array([4.5,5,6],dtype=int)
array([4, 5, 6])
 
 

reshape
array의 shape크기를 변경함 원소 개수는 동일(=size만 같으면 가능)

a=[[1,2,3,4],[4,3,2,1]]

np.array(a).shape
(2, 4)
a.reshape(-1,2).shape    #-1:size를 기반으로 행(row) 개수 선정
array([1, 2, 3, 4, 4, 3, 2, 1])
a=a.flatten()    #다차원 array를 1차원 array로 변환
print(a.shape,a.ndim)
(4, 2)

 

 

인덱싱 & 슬라이싱
행과 열 부분 나눠서 슬라이싱 가능

a = np.array([[1,2,3,4,5],[4,5,6,7,8]])

a
array([[1, 2, 3],
       [4, 5, 6]])
 
a[0][1]# a[0]을 만든후에 다시 [1]인덱싱 하므로 느림
2
a[0,1]
2
 
a[:,2:]  #전체 2열이상
a[1,1:3] #1행, 1~2열
a[1:3]   #1행~2행 전체
array([[3],
       [6]])

 

배열 생성

a=np.arange(10) #0~10까지
print(a)
b=np.arange(0,5,0.5)
print(b)
c=np.ones((1,5),int)
print(c)
d=np.zeros((1,5),int)
print(d)
e=np.empty((1,5),int)#shape만 주어지고 비어있음
print(e)
f=np.eye(3)#대각선 1인 행렬
print(f)
g=np.eye(3,5,k=2)#k값의 시작 index변경가능
print(g)
h=np.random.random((2,2))
print(h)
i=np.identity(n=3) #단위행렬 생성
print(i)
j= np.full((3,3),1)
print(j)
k = np.arange(9).reshape(3,3)
k=np.diag(k)#대각 행렬의 값 추출
print(k)
l = np.linspace(0,10,num=5) #간격이 동일한 숫자들
print(l)
m = np.random.uniform(0,1,10).reshape(2,5)#균등분포
print(m)
o=np.random.normal(0,1,10).reshape(2,5)#정규분포
print(o)

[0 1 2 3 4 5 6 7 8 9]
[0.  0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5]
[[1 1 1 1 1]]
[[0 0 0 0 0]]
[[0 0 0 0 0]]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
[[0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]
[[0.76893618 0.99737931]
 [0.59870531 0.45823205]]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
[0 4 8]
[ 0.   2.5  5.   7.5 10. ]
[[0.44718027 0.09638236 0.67958903 0.10397707 0.13779765]
 [0.10982099 0.92789691 0.70572563 0.27952112 0.80801699]]
[[-0.82595933 -1.10910898 -1.07887584 -1.1625917   0.37258493]
 [-1.27214653 -0.91132852  0.31568216  1.02814766  0.1145498 ]]

 

배열 연산

a= np.arange(9).reshape(3,3)
print(a)
print(a.sum())#모든축
print(a.sum(axis=0))#0번축
print(a.sum(axis=1))#1번축

[[0 1 2]
 [3 4 5]
 [6 7 8]]
36
[ 9 12 15]
[ 3 12 21]
b=np.arange(27).reshape(3,3,3)
print(b)
print(b.sum(axis=0))
print(b.sum(axis=1))
print(b.sum(axis=2))

[[[ 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 30 33]
 [36 39 42]
 [45 48 51]]
[[ 9 12 15]
 [36 39 42]
 [63 66 69]]
[[ 3 12 21]
 [30 39 48]
 [57 66 75]]
print(a.mean(),a.mean(axis=0),a.std()) #평균, 표준편차
4.0 [3. 4. 5.] 2.581988897471611
 
#vstack, hstack, concatenate
a=np.array([1,2,3])
b=np.array([2,3,4])
c=np.vstack((a,b))
print(c)
d=np.hstack((a,b))
print(d)
e=np.concatenate((a,b),axis=0)
#f=np.concatenate((a,b),axis=1)  //원래 직선이라 방향이 axis=0뿐임
#print(f)
print(a+b)
print(a-b)
print(a*b)

[[1 2 3]
 [2 3 4]]
[1 2 3 2 3 4]
[3 5 7]
[-1 -1 -1]
[ 2  6 12]
 
#dot 행렬 연산
a = np.arange(1,7).reshape(2,3)
b = np.arange(7,13).reshape(3,2)
print(a.dot(b))

[[ 58  64]
 [139 154]]
#transpose
a=np.arange(1,7).reshape(2,3)
print(a.transpose())
print(a.T)

[[1 4]
 [2 5]
 [3 6]]
[[1 4]
 [2 5]
 [3 6]]
#broadcating =>shape이 다른 배열간 연산을 지원하는 기능
a=np.array([[1,2,3],[4,5,6]])
scalar=3

print(a+scalar)
#뺄셈, 곱셈, 나눗셈, 몫, 제곱 가능

[[4 5 6]
 [7 8 9]]

 

 

비교 

a=np.arange(10)
print(np.any(a>5)) #하나라도 조건 만족하면 true
print(np.all(a>5)) #모두 만족해야 true

a=np.array([1,2,3])
b=np.array([2,3,4])
print(a>b)

True
False
[False False False]

a=np.array([1,2,4,5,8,78,23,3])
print(np.argmax(a),np.argmin(a))
b=np.array([[1,2,4,7],[9,88,4,12],[1,2,3,4]])
print(np.argmax(b,axis=1),np.argmin(b,axis=0))

5 0
[3 1 3] [0 0 2 2]

a=np.array([2,4,6,8])
b=np.array([0,0,1,3,2,1])
print(a[b])
print(a.take(b))

[2 2 4 8 6 4]
[2 2 4 8 6 4]
 
a= np.arange(8)
print(a>3)
print(a[a>3])

[False False False False  True  True  True  True]
[4 5 6 7]
 
 
numpy.clip(array,min,max)

array내의 요소들에 대해 min 값보다 작은 값들을 min값으로 바꿔주고
max 값 보다 큰값들은 max로 바꿔줌
 
 
 
#pillow
#array to image
import numpy as np
from PIL import Image

image = Image.open("lena.png")
np_array = np.array(image)

pil_image=Image.fromarray(np_array)
pil_image.show()
 
#image to array
from PIL import Image
import numpy as np

img = Image.open("이미지 경로")
check_img = np.array(img)
check_img.shape
 
 
 
 
 
reference: 네이버 커넥트, etc