Language/Python
python_numpy_day01
송 이
2023. 9. 25. 16:23
Numpy 학습목표
- 배열의 데이터 타입(인공지능에서 사용하게 되는 데이터타입)
- 생성, 다루는 방법
- 통계에 관련된 함수를 지원
- 벡터화 연산, 행렬 연산
- 파이썬의 리스트와는 다르다(요소의 타입이 같아야 한다)
- 원소의 갯수를 변경할 수 없다(resizing X)
- 배열의 차원, 크기, 타입(ndim , shape, dtype)
In [88]:
import numpy as np
import pandas as pd
- 배열을 생성하는 함수 : array(), arange(), reshape()
In [9]:
lst = [1,2,3,4,5]
print('type - ', type(lst))
ary = np.array(lst)
print(type(ary))
print('shape - ', ary.shape) #shape = 크기
print('ndim -', ary.ndim)
print('dtype -', ary.dtype)
type - <class 'list'> <class 'numpy.ndarray'> shape - (5,) ndim - 1 dtype - int32
In [13]:
def aryInfo(ary) :
print('type - ', type(ary))
print('shape - ', ary.shape) #shape = 크기
print('ndim -', ary.ndim)
print('dtype -', ary.dtype)
print('data - ')
print(ary)
In [14]:
aryInfo(ary)
type - <class 'numpy.ndarray'> shape - (5,) ndim - 1 dtype - int32 data - [1 2 3 4 5]
In [18]:
lst = [1,2,3,4,5,6,7,8,9]
print(lst * 2)
ary = np.array(lst)
print(ary * 2)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9] [ 2 4 6 8 10 12 14 16 18]
In [19]:
print('산술연산 -')
ary01 = np.array([1,2,3,4,5,])
ary02 = np.array([10,20,30,40,50])
print(ary01 + ary02)
산술연산 - [11 22 33 44 55]
In [25]:
print('비교연산 - ')
print(ary01 == 2)
booleanMasking = (ary01 == 2)
print(booleanMasking)
print('indexing - ', ary01[0])
print('indexing - ', ary01[1])
print('slicing - ', ary01[0:3])
print('boolean indexing - ', ary01[booleanMasking])
비교연산 - [False True False False False] [False True False False False] indexing - 1 indexing - 2 slicing - [1 2 3] boolean indexing - [2]
In [31]:
print('논리연산 - ')
print(ary01 == 2)
print(ary02 > 10)
print((ary01 == 2)&(ary02 > 10))
print((ary02 > 10)|(ary02 > 10))
논리연산 - [False True False False False] [False True True True True] [False True False False False] [False True True True True]
In [32]:
# 2차원 배열(행렬,matrix) : list of list
In [41]:
print('2*3 배열을 생성하고 싶다면 ?')
lst = [[1,2,3],[4,5,6]]
print(lst[0][0])
for ridx, row in enumerate(lst) :
for cidx,col in enumerate(row) :
#print(ridx, cidx)
#prin)t(col, end = '\t')
print(lst[ridx][cidx], end = '\t')
print()
2*3 배열을 생성하고 싶다면 ? 1 1 2 3 4 5 6
In [44]:
ary = np.array(lst)
aryInfo(ary)
print(len(ary))
print(len(ary[0]))
print(len(ary[1]))
type - <class 'numpy.ndarray'> shape - (2, 3) ndim - 2 dtype - int32 data - [[1 2 3] [4 5 6]] 2 3 3
In [50]:
print(' 2*3*4 배열을 생성하고 싶다면 ?') #배열은 3행4열*2 순서
lst = [ [[1,2,3,4],[5,6,7,8],[9,10,11,12]],
[[13,14,15,16],[17,18,19,20],[21,22,23,24]] ]
ary = np.array(lst, dtype = object)
aryInfo(ary)
print(len(ary))
print(len(ary[0]))
print(len(ary[1]))
2*3*4 배열을 생성하고 싶다면 ? type - <class 'numpy.ndarray'> shape - (2, 3, 4) ndim - 3 dtype - object data - [[[1 2 3 4] [5 6 7 8] [9 10 11 12]] [[13 14 15 16] [17 18 19 20] [21 22 23 24]]] 2 3 3
- astype() : 요소의 타입을 변경할 때
- 1차원, 2차원 적용이 가능
In [52]:
aryInfo(ary.astype(np.float64))
type - <class 'numpy.ndarray'> shape - (2, 3, 4) ndim - 3 dtype - float64 data - [[[ 1. 2. 3. 4.] [ 5. 6. 7. 8.] [ 9. 10. 11. 12.]] [[13. 14. 15. 16.] [17. 18. 19. 20.] [21. 22. 23. 24.]]]
- 배열에서 인덱싱, 슬라이싱
In [99]:
print('[행,열]')
ary = np.array([[1,2,3,4],[5,6,7,8]])
print(ary)
aryInfo(ary)
print('첫번째 행의 첫번째 열의 값을 추출 -', ary[0,0], ary[0][0])
print('두번째 행의 첫번째 열의 값을 추출 -', ary[1,0], ary[1][0])
print('마지막 행의 마지막 열의 값을 추출 -', ary[-1,-1], ary[-1][-1])
print('첫번째 행의 전체 열의 값을 추출 -' , ary[0, :], ary[0][:])
print('두번째 행의 전체 열의 값을 추출 -', ary[1, :], ary[1][:])
print('두번째 행의 두번째 열부터 끝까지의 값을 추출 -', ary[1, 1:], ary[1][1:])
[행,열] [[1 2 3 4] [5 6 7 8]] type - <class 'numpy.ndarray'> shape - (2, 4) ndim - 2 dtype - int32 data - [[1 2 3 4] [5 6 7 8]] 첫번째 행의 첫번째 열의 값을 추출 - 1 1 두번째 행의 첫번째 열의 값을 추출 - 5 5 마지막 행의 마지막 열의 값을 추출 - 8 8 첫번째 행의 전체 열의 값을 추출 - [1 2 3 4] [1 2 3 4] 두번째 행의 전체 열의 값을 추출 - [5 6 7 8] [5 6 7 8] 두번째 행의 두번째 열부터 끝까지의 값을 추출 - [6 7 8] [6 7 8]
In [67]:
print('fancy indexing - 정수배열 인덱싱(첨자), 불리언 배열 인덱싱(T/F)')
ary = np.array([0,1,2,3,4,5,6,7,8,9])
aryInfo(ary)
print('짝수의 원소만 출력한다면 - ')
#print('dir - ', dir(ary))
for data in ary :
if data % 2 == 0 :
print(data)
print('boolean indexing -', ary[ary%2==0])
evenIdx = np.array([0,2,4,6,8])
print('정수배열 인덱싱 -' , ary[evenIdx])
fancy indexing - 정수배열 인덱싱(첨자), 불리언 배열 인덱싱(T/F) type - <class 'numpy.ndarray'> shape - (10,) ndim - 1 dtype - int32 data - [0 1 2 3 4 5 6 7 8 9] 짝수의 원소만 출력한다면 - 0 2 4 6 8 boolean indexing - [0 2 4 6 8] 정수배열 인덱싱 - [0 2 4 6 8]
In [75]:
#돌발퀴즈
#3의 배수만 출력
#4로 나누어 1이 남는 값들만 출력
#3의 배수이고 4로 나누어 1이 남는 값들만 출력
ary = np.arange(1,21)
aryInfo(ary)
print('boolean indexing -', ary[ary%3==0])
print('boolean indexing -', ary[ary%4==1])
print('boolean indexing -', ary[(ary%3==0) & (ary%4==1)])
type - <class 'numpy.ndarray'> shape - (20,) ndim - 1 dtype - int32 data - [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] boolean indexing - [ 3 6 9 12 15 18] boolean indexing - [ 1 5 9 13 17] boolean indexing - [9]
- reshape() : 배열의 변형
In [98]:
ary = np.arange(1,13).reshape(3, -1) #reshape(행,열) 열을 알아서 지정하려면 -> -1을 입력!
aryInfo(ary)
colIdx = [0,3]
print('정수 배열 인덱싱을 이용해서 모든 행의 0,3 열 값 출력', ary[:, colIdx])
bolIdx = [True, False, False, True]
print('불리언 배열 인덱싱을 이용해서 모든 행의 0,3 열 값 출력', ary[:,bolIdx])
print('5 값 추출', ary[1,0])
print('[[2],[10]] 값 추출', ary[[0,2],1 ]) #ary[[0,2], 1:2]
print('[[1,3][9,11]] 값 추출', ary[[0,2]][:,[0,2]]) #ary[np.ix_([0,2],[0,2])]
type - <class 'numpy.ndarray'> shape - (3, 4) ndim - 2 dtype - int32 data - [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] 정수 배열 인덱싱을 이용해서 모든 행의 0,3 열 값 출력 [[ 1 4] [ 5 8] [ 9 12]] 불리언 배열 인덱싱을 이용해서 모든 행의 0,3 열 값 출력 [[ 1 4] [ 5 8] [ 9 12]] 5 값 추출 5 [[2],[10]] 값 추출 [ 2 10] [[1,3][9,11]] 값 추출 [[ 1 3] [ 9 11]]
In [ ]: