numpy Highlight
- Reference
- NumPy
- Import
- Array Creation(ndarray)
- Broadcasting
- Indexing
- Useful Functions
- Operations
- Applications
- Numerical Python
import numpy as np
- N Dimensional Array
A = np.array([1,2,3])
A
mylist = [3, 4, 5]
array_from_list = np.array(mylist)
array_from_list
mytuple = (4,5,6)
array_from_tuple = np.array(mytuple)
array_from_tuple
np.array(range(10))
np.linspace(0,1,12) # 0 ~ 1을 12등분하여 만듬 (끝점을 포함)
len(np.linspace(0,1,12))
np.arange(5)
np.arange(1,6)
np.zeros(3) # 0을 3개
np.zeros((3,3))
np.ones(3) # 1을 3개
np.ones((3,3))
np.eye(3) # 단위 행렬
np.diag([1,2,3]) # 대각선이 1,2,3인 행렬
A+1 # 덧셈
A-4 # 뺄셈
A*2 # 곱셈
A/2 # 나눗셈
A**2 # 제곱
A%2 # 나머지
np.sqrt(A)
np.log(A)
np.exp(A)
np.sin(A)
A = np.array([11,22,33,44,55,66])
A[2]
A[5]
A[1:4]
A[[0,2,4]]
A[[True, False, True, False, False, True]]
A < 33
A[A<33]
A2 = np.array([[1,2,3,4],[-1,-2,-3,-4],[5,6,7,8],[-5,-6,-7,-8]])
A2
A2[1][3]
A2[1,3]
A2[0, 0:2]
A2[0]
A2[0, 2:]
A2[:, :]
A2[[0,2], :]
A2[[0,2]]
{python}
np.random.
{python}
np.random.rand(N)
np.random.rand(10) # 0~1 사이에서 10개의 난수 생성
np.random.rand(10)*2 # (0~1)*2 = 0~2 사이에서 10개의 난수 생성
np.random.rand(10)+1 # 1~2 사이에서 10개의 난수 생성
np.random.rand(10)*2+1 # 1~3 사이에서 10개의 난수 생성
{python}
np.random.randn(N)
np.random.randn(10) # 표준정규분포에서 10개 추출
np.random.randn(10)*2 # 평균이 0이고 표준편차가 2인 정규분포
np.random.randn(10)*2 + 3 # 평균이 0이고 표준편차가 3인 정규분포
- 중복을 허용하지 않고 정수를 생성한다.
np.random.randint(7) # [0,7)의 범위에서 정수 한 개 생성
np.random.randint(7, size = (20,))
np.random.randint(7, size = (2,2)) # [0,7)의 범위 무작위 정수가 원소인 2x2 행렬을 생성한다.
np.random.randint(low=10, high=20, size=(2,5)) # [10, 20)의 범위에서 정수 한 개 생성
Warning :np.random.randint(high = N)은 사용할 수 없다.
- 복원추출이 default
np.random.choice(5,20)
np.random.choice(['apple', 'orange', 'banana'], 20)
np.random.choice(5, 2, replace = False) # Replace = False로 하면 비복원추출을 시행한다.
np.random.binomial(n=10, p=0.2, size = (5,))
{python}
np.random.normal(loc = mean, scale = stdev, size)
default : np.random.normal(loc = 0, scale = 1, size = None)
np.random.normal(2, 3, 10) # 평균이 2이고 표준편차가 3인 정규분포
np.random.uniform(low=2, high=4, size = (5,)) # 균등분포
np.random.poisson(lam=5, size=(5,))
np.random.poisson(lam=5, size=(5,))
np.random.seed(43052)
x= np.random.randn(10000)
y= np.random.randn(10000)*2
z= np.random.randn(10000)*0.5
np.corrcoef([x,y,z]).round(2)
np.cov([x,y,z]).round(2)
dim
함수와 유사하다.
A = np.array([11,22,33,44,55,66])
A
A.reshape(2,3)
A
A = A.reshape(2,3)
A
note :reshape with
-1
A = np.arange(24)
A
A.reshape(2,-1) # 행의 수가 2인 행렬, 열은 알아서 맞춰
A.reshape(4, -1) # 행의 수가 4인 행렬, 열은 알아서 맞춰
A.reshape(-1, 4) # 열의 수가 4인 행렬, 행은 알아서 맞춰
A.reshape(-1) # 다시 길이가 24인 벡터로
A = np.array(3.14) # Scalar, 0d array
A.shape
A = np.array([3.14]) # Vector, 1d array
A.shape
A = np.array([[3.14]]) # Matrix, 2d array
A.shape
A = np.array([[[3.14]]]) # Tensor, 3d array
A.shape
A = np.array([[1,2,3],[2,5,6],[4,4,2]])
A.shape
A = np.arange(4).reshape(2,2)
A
A.T # 전치행렬
np.linalg.inv(A) # 역행렬
A @ np.linalg.inv(A)
A = np.array([1,2])
B = np.array([4,5])
np.concatenate([A, B])
A = np.arange(4).reshape(2,2)
B = np.arange(10,14).reshape(2,2)
np.concatenate([A, B]) # axis = 0이 생략되어 있다.
A=np.array(range(4)).reshape(2,2)
B=np.array(range(2)).reshape(2,1)
np.concatenate([a,b],axis=1) # 꼭 같은 차원일 필요는 없고, 붙여지는 부분의 길이만 같으면 됨
A = np.arange(4).reshape(2,2)
B = np.arange(10,14).reshape(2,2)
np.concatenate([A, B], axis=1)
A = np.array(range(2*3*4)).reshape(2,3,4)
B = - A
A, B
np.concatenate([A,B], axis=0)
np.concatenate([A,B], axis=1)
np.concatenate([A,B], axis=2)
Warning :
A = np.array([1,2,3])
B = np.array([2,3,4])
np.concatenate([A,B], axis = 1)
A = np.array([1,2,3])
B = np.array([2,3,4])
np.stack([A,B], axis=0)
np.stack([A,B], axis=1)
A = np.arange(3*4*5).reshape(3,4,5)
B = - A
A.shape, B.shape
np.stack([A,B], axis = 0)
np.stack([A,B], axis = 0).shape # axis = 0 <==> axis = -4
np.stack([A,B], axis = 1).shape # axis = 1 <==> axis = -3
np.stack([A,B], axis = 2).shape # axis = 2 <==> axis = -2
np.stack([A,B], axis = 3).shape # axis = 3 <==> axis = -1
np.concatenate
는 축의 총 개수를 유지하면서 결합한다.
np.stack
은 축의 개수를 하나 증가시키면서 결합한다.
A = np.arange(6)
B = - A
np.vstack([A, B])
A = np.arange(6)
B = - A
np.hstack([A, B])
A = np.arange(30).reshape(5,6)
B = - np.arange(8).reshape(2,2,2)
A.shape, B.shape
np.append(A, B) # 다 풀어서 더한다.
A = np.arange(2*3*4).reshape(2,3,4)
B = - A
A, B
A.shape, B.shape, np.append(A, B, axis = 0).shape
np.append(A, B, axis = 0)
A = np.array([1,2,4,6,7])
np.diff(A)
np.diff(np.diff(A))
np.diff(A, prepend=100) # np.diff(np.array([100] + A.tolist()) ), 즉 맨 앞에 100을 추가하여 차분
np.diff(A, append=100) # np.diff(np.array(A.tolist() + [100]) ), 즉 맨 뒤에 100을 추가하여 차분
A = np.arange(24).reshape(4,6)
A
np.diff(A, axis = 0)
np.diff(A, axis = 1)
A = np.array([0,0,0,1,0])
np.where(A==1) # 조건을 만족하는 인덱스를 반환
np.random.seed(43052)
A = np.random.randn(12).reshape(3,4)
np.where(A<0) # 조건을 만족하는 인덱스가 (1,2), (1,3), (2,0), (2,1), (2,3) 이라는 의미
A[np.where(A<0)]
np.where(A<0, 0, A) # 조건이 True이면 0, False이면 A
np.where(A<0, 5, 1) # 조건이 True이면 0, False이면 1
A = np.array([0,0,0,1,0])
np.argwhere(A==1)
np.random.seed(43052)
A = np.random.randn(12).reshape(3,4)
np.argwhere(A<0) # 조건을 만족하는 인덱스가 (1,2), (1,3), (2,0), (2,1), (2,3) 이라는 의미
A[np.argwhere(A<0)] # 불가능
np.where
는 인덱스의 좌표를 읽는 가독성이 떨어지지만 조건에 맞는 원소를 출력하거나 처리하기에 좋다.
np.argwhere
는 인덱스의 좌표를 읽는 가독성은 좋지만 조건에 맞는 원소를 출력하거나 처리하기에 좋지 못하다.
A = np.arange(12).reshape(3,4)
A
- A[[0,1], [0,1]]이 A[0:2, 0:2]를 의미하게 하려면 아레와 같이 np.ix_를 사용한다.
A[np.ix_([0,1],[0,1])]
A = np.array([1,2,3])
A.sum()
A = np.array([1,2,3])
A.mean()
A = np.array([1,2,3])
A.min()
A = np.array([1,2,3])
A.max()
A = np.array([1,2,3])
A.prod()
A = np.arange(1,20)
A.std() # 분포를 n으로 나누는 것이 default이다.
A = A = np.array([1,2,3])
A.std(ddof=1) # ddof 옵션을 사용하여 분포를 n-1로 나눈다.
A = A = np.array([1,2,3])
A.std(ddof=2) # ddof 옵션을 사용하여 분포를 n-1로 나눈다.
A = np.array([1,2,3]) # 가장 작은 값의 인덱스를 리턴
A.argmin()
np.random.seed(43052)
A = np.random.randn(4*5).reshape(4,5)
A
A.argmin(axis = 0)
A.argmin(axis = 1)
A = np.array([1,2,3]) # 가장 큰 값의 인덱스를 리턴
A.argmax()
np.random.seed(43052)
A = np.random.randn(4*5).reshape(4,5)
A
A.argmax(axis = 0)
A.argmax(axis = 1)
A = np.array([1,2,3,4])
A.cumsum() # 누적합
A = np.array([1,2,3,4])
A.cumprod() # 누적곱
A = np.array([2**i for i in np.arange(10)])
A
A.cumprod()
$\begin{cases} y+z+w = 3 \\ x+z+w = 3 \\ x+y+w = 3 \\ x+y+z = 3 \end{cases}$
$\begin{bmatrix} 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix} = \begin{bmatrix} 3 \\ 3 \\ 3 \\ 3 \end{bmatrix}$
$ \begin{bmatrix} 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 \end{bmatrix}^{\,-1} \begin{bmatrix} 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix} = \begin{bmatrix} 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 \end{bmatrix}^{\,-1} \begin{bmatrix} 3 \\ 3 \\ 3 \\ 3 \end{bmatrix}$
$ \begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix} = \begin{bmatrix} 0 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 \end{bmatrix}^{\,-1} \begin{bmatrix} 3 \\ 3 \\ 3 \\ 3 \end{bmatrix}$
v = 'x', 'y', 'z'
A = np.linalg.inv(np.array([[0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0]]))
B = np.array([3,3,3,3]).reshape(4,1)
answer = A@B.reshape(-1)
for v, i in zip(v, answer): print(v, ':', i)