59doit
[Python-Numpy] #4 본문
▷
.reshape
arr = np.arange(32).reshape(8,-1)
arr
# <출력>
# 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]])
shape은 (차원, 행, 열)
▷
.mean & .sum
arr = np.random.randn(5,4)
arr
arr.mean()
np.mean(arr)
# <출력> -0.15612707816159727
# arr.mean() = np.mean(arr) 값이 똑같다
arr.sum()
# <출력> -3.1225415632319455
▷
axis ; 0, 1, 2의 값을 가진다.
차원=0 / 행=1 / 열=2
axis = 0은 차원을 따라서 압축
axis=1 은 행을 따라서 압축
axis=2 은 열을 따라서 압축
arr.mean(axis=1)
# <출력> array([ 0.01952549, 0.12535683, 0.53172117, -0.96561754, -0.49162134])
arr.sum(axis=0)
# <출력> array([-0.67891732, -3.61662064, -1.36188536, 2.53488176])
▷
누적합 & 누적곱 (cumsum & cumprod)
arr1=np.array([0,1,2,3,4,5,6,7])
arr1.cumsum()
# <출력> array([ 0, 1, 3, 6, 10, 15, 21, 28])
arr2=np.array([[0,1,2],[3,4,5],[6,7,8]])
arr2
# <출력>
# array([[0, 1, 2],
# [3, 4, 5],
# [6, 7, 8]])
arr2.cumsum(axis=0)
# <출력>
# array([[ 0, 1, 2],
# [ 3, 5, 7],
# [ 9, 12, 15]])
arr2.cumprod(axis=1)
# <출력>
# array([[ 0, 0, 0],
# [ 3, 12, 60],
# [ 6, 42, 336]])
▷
sum 메서드를 실행하면 불리언 배열에서 True 인 원소의 개수 셀 수 있다.
arr = np.random.randn(100)
(arr > 0).sum()
# <출력> 51
▷
.any() & .all()
bools = np.array([False, False, True, False])
bools.any()
# <출력> True
bools.all()
# <출력> False
.any() : 하나 이상의 값이 True 인지 검사
.all() : 모든 원소가 True 인지 검사
▷
sort (오름차순 & 내림차순)
arr=np.random.randn(6)
arr
# <출력>
# array([ 1.81341706, -0.55495495, 1.08890978, 0.04406718, 1.98924833, -0.27492286])
arr.sort()
arr
# <출력>
# array([-0.55495495, -0.27492286, 0.04406718, 1.08890978, 1.81341706, 1.98924833])
# 내림차순
arr_dasc = arr[::-1]
arr_dasc
# <출력>
# array([ 1.98924833, 1.81341706, 1.08890978, 0.04406718, -0.27492286,-0.55495495])
내림차순에만 dasc
▷
다차원 [] 안의 내림차순
arr = np.random.randn(5,3)
arr
# <출력>
# array([[-2.24363158, -1.01167904, -0.9661356 ],
# [-1.40012224, 0.24285708, 0.89566477],
# [-0.39138188, 0.79215742, 0.17208338],
# [ 1.49774096, -0.84961851, 0.10679284],
# [-0.40281519, -0.99546957, 1.13569311]])
arr.sort (1)
arr
# <출력>
# array([[-2.24363158, -1.01167904, -0.9661356 ],
# [-1.40012224, 0.24285708, 0.89566477],
# [-0.39138188, 0.17208338, 0.79215742],
# [-0.84961851, 0.10679284, 1.49774096],
# [-0.99546957, -0.40281519, 1.13569311]])
arr_innerdesc = arr[:,::-1]
arr_innerdesc
# <출력>
# array([[-0.9661356 , -1.01167904, -2.24363158],
# [ 0.89566477, 0.24285708, -1.40012224],
# [ 0.79215742, 0.17208338, -0.39138188],
# [ 1.49774096, 0.10679284, -0.84961851],
# [ 1.13569311, -0.40281519, -0.99546957]])
▷
배열 직접 변경 x -> 가지고 있는 복사본 반환
large_arr = np.random.randn(1000)
large_arr
large_arr.sort()
large_arr[int(0.05*len(large_arr))]
▷
unique
set 동일 ; 중복제거 에 의미를 둠
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
np.unique(names)
# <출력> array(['Bob', 'Joe', 'Will'], dtype='<U4')
ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
np.unique(ints)
# <출력> array([1, 2, 3, 4])
▷
np.inlod()
두 개의 배열을 인자로 받아서 첫 번째 배열의 원소가 두 번째 배열의 원소를 포함하는지 나타내는 불리언 배열을 반환
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])
# <출력> array([ True, False, False, True, True, False, True])
▷▶▶▶▶▶▶▶▶▶▶▶▶
불러오기 np.load() np.save()
▶▶▶▶▶
▷
dot
행렬의 곱셈
x=np.array([[1.,2.,3.],[4.,5.,6.]])
y=np.array([[6.,23.],[-1,7],[8,9]])
# x.dot(y) == np.dot(x,y)
x.dot(y)
# <출력>
# array([[ 28., 64.],
# [ 67., 181.]])
np.dot(x,y)
# <출력>
# array([[ 28., 64.],
# [ 67., 181.]])
x.dot(y) = np.dot(x,y) 값이 같다
np.dot(x,np.ones(3))
x @ np.ones(3)
# <출력> array([ 6., 15.])
np.dot(x,np.ones(3)) = x @ np.ones(3) 값이 같다
▷
np.linalg ; 역행렬
from numpy.linalg import inv,qr
x = np.random.randn(5,5)
x
mat = x.T.dot(x) #x의 전치행렬과 x의 곱
mat
inv(mat)
mat.dot(inv(mat))
q,r = qr(mat)
q
r
▷
np.random.seed: NumPy 에 존재하는 random generator 에 직접 접근하여 난수 생성
np.random.seed(1234)
np.random.uniform(0, 10, 5)
np.random.rand(3,3)
▷
np.random.RandomState: 난수 생성기라는 object 를 만들어서 접근
rng2 = np.random.RandomState(1234)
rng2.uniform(0, 10, 5)
np.random.rand(3,3)
EX)
계단 오르내리기 예제
import numpy as np
import matplotlib.pyplot as plt
import random
position = 0
walk = [position]
steps = 1000
for i in range(steps):
step = 1 if random.randint(0,1) else -1
position += step
walk.append(position)
plt.figure()
▼
# 처음 100회
plt.plot(walk[:100])
▼AA▼▼▼
▼
#1000번 수행
np.random.seed(12345)
nsteps = 1000
draws = np.random.randint(0,2,size=nsteps)
steps = np.where(draws > 0,1,-1)
walk = steps.cumsum # 누적한 층수
walk.min()
walk.max()
# 10 또는 -10인 시점
(np.abs(walk) >= 10).argmax()
▼
'Programming > Python(파이썬)' 카테고리의 다른 글
[Python-Pandas] #2 index (0) | 2022.11.07 |
---|---|
[Python-Pandas] #1 (2) | 2022.11.07 |
[Python-Numpy] #3 (0) | 2022.11.06 |
[Python-Numpy] #2 (2) | 2022.11.06 |
[Python-Numpy] #1 (0) | 2022.11.06 |