NumPy 라이브러리
- 행렬이나 대규모 다차원 배열을 쉽게 처리할 수 있도록 하는 Python의 라이브러리 (출처: 위키백과)
- 주로 빠른 데이터 처리에 이용됨
1. 다차원 배열 객체 생성 ndarray(N-Dimensional array)
- 파이썬의 리스트와 다르게 넘파이 어레이는 원소가 모두 같은 데이터 타입이어야 한다.
1) array 함수 이용
data1 = [1,2,3,4]
arr1=np.array(data1)
- dtype 메소드: array의 데이터 타입 보여줌
- ndim 메소드: 행렬의 차원 보여줌
- shape 메소드: 행렬의 행과 열의 크기
2) 명시적으로 데이터 타입 지정하여 배열 생성
arr1=np.array([1,2,3],dtype=np.float64)
3) 새로운 배열 생성 함수 이용
- array 함수
- arange 함수
- zeros 함수: 입력받은 길이 또는 차원만큼의 배열에 모두 0이 들어있는 배열 생성
np.zeros(4)
#>> [0.,0.,0.,0.]
- ones 함수: 입력받은 길이 또는 차원만큼의 배열에 모두 1이 들어있는 배열 생성
#튜플로 shape 지정도 가능하다.
np.ones((2,2))
'''
>>
[[1.,1.],
[1.,1.]]
'''
- empty 함수: 입력받은 길이 또는 차원만큼 초기화되지 않은 값이 들어있는 배열 생성
** 여기서 초기화란 zeros, one 함수와 가장 다른 점으로 zeros, ones 함수는 메모리를 할당받아 0과 1로 초기화하고 반환하지만, empty는 메모리만 할당받고 아무 값이나 내보낸다. 장점은 타함수보다 빠르다는 것, 단점은 쓸 데가 많이 없다는 것.
2. ndarray의 데이터 타입
1) astype: 배열을 다른 데이터 타입으로 반환
#dytype('int64')
arr=np.array([1,2,3])
#변환 => np.float64
float_arr=arr.astype(np.float64)
- float -> int 소수점 버려짐
- int -> float 정수 뒤에 점 찍힘
- 숫자형식 문자열 -> 숫자형 가능
arr.astype(np.int32)
#>>>array([1, 2, 3, 4, 5], dtype=int32)
arr.astype(int)
#>>>array([1, 2, 3, 4, 5])
*** 차이가 뭔지 모르겠숴요
2) 다른 배열 주고, 그 배열의 dtype으로 변환 가능
#int형 배열 생성
int_arr=np.arange(10)
#타배열
following_arr=np.array([.1,.2,.4], dtype=np.float64)
#형변환
int_arr.astype(following_arr.dtype)
3. NumPy 배열 산술 연산
1) 배열간 연산
- 벡터화되어있기에, for 문을 사용하지 않고 배열의 각 원소끼리 산술 연산한다.
arr=np.array([[1.,2.,3.],[4.,5.,6.]])
arr+arr
#>>> array([[ 2., 4., 6.],
# [ 8., 10., 12.]])
arr*arr
#>>> array([[ 1., 4., 9.],
# [16., 25., 36.]])
arr-arr
#>>> array([[0., 0., 0.],
# [0., 0., 0.]])
2) 배열-스칼라 연산
- 배열의 모든 원소와 스칼라 산술 연산
arr*10
#>>> array([[ 10., 20., 30.],
# [ 40., 50., 60.]])
3) 비교 연산
- 같은 크기의 배열 간 비교 연산 가능, Boolean 값 반환
4) 브로드캐스팅
- 배열의 크기를 일치시켜 다른 크기 (shape)의 배열도 연산을 가능하게 한다.
4. NumPy 인덱싱과 슬라이싱
- 인덱싱: [단일 값]
- 슬라이싱: [:]
1) 배열 조각에 스칼라값 대입하기
: 원본 배열을 슬라이싱해 새로운 스칼라값을 대입하면 원본 배열이 바뀌며, 해당 슬라이싱 조각의 특정 인덱스에 새로운 값을 다시 대입해도 여전히 원본 배열이 바뀐다.
** .copy()를 통해 복사본을 만들어 활용하기도 한다.
2) 다차원 배열에 접근하기
arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
- 재귀적으로 접근하기; 0번 인덱스 안에 1번 인덱스에 접근하기
arr2d[0][1]
#=
arr2d[0,1]
- 일반 리스트에서는 다차원 슬라이싱이 불가능하다
#np.array
arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d[:2,1:]
#list
list1= [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
#ok
print(list1[:2])
#not ok
print(list1[:2, 1:])