* AIFFEL의 FUNDINEMENTAL 자료를 참고했습니다.
😎 기본적인 Numpy문법 정리 입니다. 계속해서 추가 혹은 새로운 게시물로 업로드할 예정입니다.
✌ numpy
# 아래 A와 B는 결과적으로 같은 ndarray 객체를 생성합니다.
A = np.arange(5)
B = np.array([0,1,2,3,4]) # 파이썬 리스트를 numpy ndarray로 변환
# 하지만 C는 좀 다를 것입니다.
C = np.array([0,1,2,3,'4'])
# D도 A, B와 같은 결과를 내겠지만, B의 방법을 권합니다.
# D = np.ndarray((5,), np.int64, np.array([0,1,2,3,4]))
print(A)
print(type(A))
print("--------------------------")
print(B)
print(type(B))
print("--------------------------")
print(C)
print(type(C))
# print("--------------------------")
# print(D)
# print(type(D))
>>>
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
['0' '1' '2' '3' '4']
<class 'numpy.ndarray'>
# shape
A = np.arange(10).reshape(2, 5) # 길이 10의 1차원 행렬을 2X5 2차원 행렬로 바꿔봅니다.
print("행렬의 모양:", A.shape)
print("행렬의 축 개수:", A.ndim)
print("행렬 내 원소의 개수:", A.size)
>>>
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
['0' '1' '2' '3' '4']
<class 'numpy.ndarray'>
# type
A= np.arange(6).reshape(2, 3)
print(A)
print(A.dtype)
print(type(A))
print("-------------------------")
B = np.array([0, 1, 2, 3, 4, 5])
print(B)
print(B.dtype)
print(type(B))
print("-------------------------")
C = np.array([0, 1, 2, 3, '4', 5])
print(C)
print(C.dtype)
print(type(C))
print("-------------------------")
D = np.array([0, 1, 2, 3, [4, 5], 6]) # 이런 ndarray도 만들어질까요?
print(D)
print(D.dtype)
print(type(D))
>>>
[[0 1 2]
[3 4 5]]
int32
<class 'numpy.ndarray'>
-------------------------
[0 1 2 3 4 5]
int32
<class 'numpy.ndarray'>
-------------------------
['0' '1' '2' '3' '4' '5']
<U11
<class 'numpy.ndarray'>
-------------------------
[0 1 2 3 list([4, 5]) 6]
object
<class 'numpy.ndarray'>
# 단위행렬
np.eye(3)
>>>
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
# 0 행렬
np.zeros([2,3])
>>>
array([[0., 0., 0.],
[0., 0., 0.]])
# 1행렬
np.ones([3,3])
>>>
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
# 브로드캐스트
A = np.arange(9).reshape(3,3)
A
# ndarray A에 2를 상수배 했을 때,
A * 2
>>>
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
# ndarray A에 2를 더했을 때,
A + 2
>>>
array([[ 2, 3, 4],
[ 5, 6, 7],
[ 8, 9, 10]])
# 3 X 3 행렬에 1 X 3 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
B = np.array([1, 2, 3])
print("A:", A)
print("B:", B)
print("\nA+B:", A+B)
>>>
A: [[0 1 2]
[3 4 5]
[6 7 8]]
B: [1 2 3]
A+B: [[ 1 3 5]
[ 4 6 8]
[ 7 9 11]]
# 3 X 3 행렬에 3 X 1 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
C = np.array([[1], [2], [3]])
print("A:", A)
print("C:", C)
print("\nA+C:", A+C)
>>>
A: [[0 1 2]
[3 4 5]
[6 7 8]]
C: [[1]
[2]
[3]]
A+C: [[ 1 2 3]
[ 5 6 7]
[ 9 10 11]]
# 3 X 3 행렬에 1 X 2 행렬을 더하는 것은 허용되지 않습니다.
A = np.arange(9).reshape(3,3)
D = np.array([1, 2])
print("A:", A)
print("D:", D)
print("\nA+D:", A+D) # error
print(np.array([1,2])+np.array([3,4]))
print(np.array([1,2])+3)
>>>
[4 6]
[4 5]
#slice & indexing
# 3 X 3 행렬의 첫번째 행을 구해 봅시다.
A = np.arange(9).reshape(3,3)
print("A:", A)
B = A[0]
print("B:", B)
>>>
A: [[0 1 2]
[3 4 5]
[6 7 8]]
B: [0 1 2]
# 0, 1을 인덱싱 하면 A의 첫번째 행에서 두번째 값을 참조합니다.
# 아래 두 결과는 정확히 같습니다.
print(A[0, 1])
print(B[1])
>>>
1
1
# 슬라이싱도 비슷합니다.
A[:-1]
>>>
array([[0, 1, 2],
[3, 4, 5]])
np.random.randint()
np.random.choice()
np.random.permutation()
np.random.normal()
np.random.uniform()
# 의사 난수를 생성하는 예제입니다. 여러번 실행해 보세요.
print(np.random.random()) # 0에서 1사이의 실수형 난수 하나를 생성합니다.
print(np.random.randint(0,10)) # 0~9 사이 1개 정수형 난수 하나를 생성합니다.
print(np.random.choice([0,1,2,3,4,5,6,7,8,9])) # 리스트에 주어진 값 중 하나를 랜덤하게 골라줍니다.
>>>
0.0193865137090653
9
7
# 무작위로 섞인 배열을 만들어 줍니다.
# 아래 2가지는 기능면에서 동일합니다.
print(np.random.permutation(10))
print(np.random.permutation([0,1,2,3,4,5,6,7,8,9]))
>>>
[4 0 7 2 6 9 1 5 3 8]
[6 8 5 7 9 3 4 1 2 0]
# 아래 기능들은 어떤 분포를 따르는 변수를 임의로 표본추출해 줍니다.
# 이것은 정규분포를 따릅니다.
print(np.random.normal(loc=0, scale=1, size=5)) # 평균(loc), 표준편차(scale), 추출개수(size)를 조절해 보세요.
# 이것은 균등분포를 따릅니다.
print(np.random.uniform(low=-1, high=1, size=5)) # 최소(low), 최대(high), 추출개수(size)를 조절해 보세요.
>>>
[ 0.31742023 0.80406453 -0.55785806 -1.4844065 -1.24216212]
[0.68380915 0.45571294 0.99614325 0.83746214 0.97521404]
# transpose
A = np.arange(24).reshape(2,3,4)
print("A:", A) # A는 (2,3,4)의 shape를 가진 행렬입니다.
print("A의 전치행렬:", A.T)
print("A의 전치행렬의 shape:", A.T.shape) # A의 전치행렬은 (4,3,2)의 shape를 가진 행렬입니다.
>>>
A: [[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
A의 전치행렬: [[[ 0 12]
[ 4 16]
[ 8 20]]
[[ 1 13]
[ 5 17]
[ 9 21]]
[[ 2 14]
[ 6 18]
[10 22]]
[[ 3 15]
[ 7 19]
[11 23]]]
A의 전치행렬의 shape: (4, 3, 2)
# np.transpose는 행렬의 축을 어떻게 변환해 줄지 임의로 지정해 줄 수 있는 일반적인 행렬 전치 함수입니다.
# np.transpose(A, (2,1,0)) 은 A.T와 정확히 같습니다.
B = np.transpose(A, (2,0,1))
print("A:", A) # A는 (2,3,4)의 shape를 가진 행렬입니다.
print("B:", B) # B는 A의 3, 1, 2번째 축을 자신의 1, 2, 3번째 축으로 가진 행렬입니다.
print("B.shape:", B.shape) # B는 (4,2,3)의 shape를 가진 행렬입니다.
>>>
A: [[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
B: [[[ 0 4 8]
[12 16 20]]
[[ 1 5 9]
[13 17 21]]
[[ 2 6 10]
[14 18 22]]
[[ 3 7 11]
[15 19 23]]]
B.shape: (4, 2, 3)
import numpy as np
def numbers():
X = []
number = input("Enter a number (<Enter key> to quit)")
# 하지만 2개 이상의 숫자를 받아야 한다는 제약조건을 제외하였습니다.
while number != "":
try:
x = float(number)
X.append(x)
except ValueError:
print('>>> NOT a number! Ignored..')
number = input("Enter a number (<Enter key> to quit)")
return X
def main():
nums = numbers() # 이것은 파이썬 리스트입니다.
num = np.array(nums) # 리스트를 Numpy ndarray로 변환합니다.
print("합", num.sum())
print("평균값",num.mean())
print("표준편차",num.std())
print("중앙값",np.median(num)) # num.median() 이 아님에 유의해 주세요.
main()
>>>
Enter a number (<Enter key> to quit)1
Enter a number (<Enter key> to quit)2
Enter a number (<Enter key> to quit)2
Enter a number (<Enter key> to quit)3
Enter a number (<Enter key> to quit)4
Enter a number (<Enter key> to quit)
합 12.0
평균값 2.4
표준편차 1.019803902718557
중앙값 2.0