파이썬과 라이브러리_2

우주먼지·2020년 7월 8일
0

인공지능 사관학교

목록 보기
7/15

파이썬과 라이브러리

Numpy패키지

  • 과학계산과 데이터를 다루기 용이하다.
  • 고차원 배열(array)을 객체로 제공하며 배열관련 여러 메서드를 제공한다.
  • 라이브러리가 C로 제작되어 있기 때문에 연산속도는 최적화가 잘 되어 있다.
  • 연산의 벡터화를 제공하여 코딩하기 편리하며 가독성이 좋다.
  • 제일 기본적인 라이브러리이며, 다른 라이브러리의 기초가 된다.

Numpy 정보 획득 사이트

numpy배열과 리스트의 차이점

  • numpy배열은 크기가 정해져있따. 크기를 변경하면 새로운 객체가 생성됨.
  • numpy배열의 개개 원소의 자료형이 일치되어야한다.
  • numpy배열은 많은 수학 연산을 기본적으로 제공한다. 통계함수를 기본적으로 제공함.
  • numpy배열을 다른 패키지에서도 기초 자료형으로 사용한다.
import numpy as np
arr1 = np.array([1, 3, 5, 7, 9]) # list던지 tuple이던지 같은 배열의 타입이 된다.
arr2 = np.array((1, 3, 5, 7, 9))
arr3 = arr1
id(arr1), id(arr3)
arr4 = arr1.copy()

arr1, arr2에 numpy배열을 선언해주었다. 리스트를 이용하던, 튜플을 이용하던 같은 타입을 같는다. 생성된 arr1 = arr3로 복사했을때 id값은 같은 값을 같게 된다. 즉 이름만 다를 뿐, 같은 배열을 가지고 있다는 것을 알 수 있다. 따라서 copy를 이용하여 shallow copy를 사용해야 복사가 된다.

arr = np.arange(10)
arr.size # 배열의 값의 개수를 출력해준다. len은 2,3차원이 되도 길이만 출력.

arr = array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
list(range(10))과 같은 결과를 보인다.

np.linspace(0, 10, 6)
arr = np.linespace(0, 10, 6, retstep=True) 
	# arr[0] =array([0., 2., 4., 6., 8., 10.], arr[1] = 2.0, arr[0][1] = 2.0

linspace를 실행한 결과는 튜플로 저장된다.
array([0., 2., 4., 6., 8., 10.]) => 이경우 1차원 배열로 저장된다
(array([0., 2., 4., 6., 8., 10.]), 2.0) => 이경우 2차원 배열로 저장되며 arr[1] = 2.0이 출력된다.
0에서 10까지를 6개의 숫자로 나눠준다. retstep을 True로 지정해주면 간격이 얼마인지를 출력해준다.

np.zeros((3, 5))
arr = np.ones((5, 6))
np.zeros((3, 5), dtype='int32') # dtype='int_'랑 같다, int64하면 옆에 dtype=int64가 출력됨.
arr.astype('float32') # 타입 변환. 보여주는 것일뿐 항구적으로 남진 않는다. 대입이 필요

0으로 채워진 배열을 생성해준다. 3행 5열의 0배열을 출력. 숫자 하나만 넣으면 1차원 배열이 생성.
1로 채워진 배열을 생성.
타입을 정수 32비트로 지정해준다.( default=float64). int의 경우 [0, 0, 0]...이런식으로 저장되는 반면에, flaot는 [0., 0., 0.,]...으로 저장된다.

arr2 = np.array([[[1, 2, 5], [-7, 8, 10]])

2차원 배열도 마찬가지로 생성이 가능하다.

my_list = [1, 2, 3, 'a', ,'b', 'c', True, False, True]
my_array = np.array(my_list)
np.array([1, 2, 3, True, False])

array([1, 2, 3, 1., 0.])
my_array = array(['1', '2', '3', 'a', 'b', 'c', 'True', 'False', 'True'])
수치와 불린은 모두 숫자로 변환되고,
수치, 문자, 불린이 같이 있을 경우는 모두 문자열로 변환된다.

numpy배열의 인덱싱은 리스트와 같은 방식을 사용한다.

a = np.array([1, 2, 3],[4, 5, 6],[7, 8, 9]])
a[2][1]
a[2, 1]
a[2:3][1:2]
a[2:3, 1:2]
a[1:, 1:]
a[[0,2]] # array([1, 2, 3], [7, 8, 9]])

모두 같은 값으로 8이 출력된다.
마지막 출력은 array([[5,6],[8,9]])가 출력된다.
a[[0,2]] 는 0번째 행과 2번째 행이 출력된다.

a.shape
a.ndim
arr1.shape # arr1은 1차원배열

shape는 전체적인 모양을 나타낸다. a의 경우는 (3, 3)으로 출력된다.
ndim은 차원의 수로 a는 2를 출력한다.
1차원 배열의 shape를 출력하면 (5, )가 출력된다. 이는 가로세로가 없는 그냥 벡터이다. 가로방향의 배열을 만들고자 하면, np.array([[1, 3, 5, 7, 9]])로 선언하면 shape는 (1, 5)가 출력된다.
세로방향의 배열은 np.array([[1],[3],[5],[7],[9]])로 선언하면 shape는 (5,1)로 출력된다.

a = np.arange(15)
a.reshape(3, 5) # 항구적이지 않으므로 대입이 필요함
a.shape = (3, 5) # 이 또한 같은 결과는 나오지만 추천하지 않는 방식이다.
a = a.reshape(5, -1) # 이는 행을 알아서 찾아서 지정해준다.

array([[0, 1, 2, 3, 4],[5, 6, 7, 8], [10, 11, 12, 13, 14]])
변환이 불가능한 배열의 수치를 넣으면 오류가 발생한다. (예를 들어 a.reshape(10, 2)는 오류 발생)

a = np.arange(10)
b = a.reshape(2,5)
c = a.reshape(2,5).copy()

b는 a와 같은 배열이며 이름만 다른 것이나, c는 복사가 된 다른 객체이다. numpy배열도 마찬가지로 얉은 복사를 통해 복사를 해야만 제대로된 복사가 된다.

numpy배열의 사칙연산을 사용하면(arr / 5), 모든 요소에 연산이 적용된다.
%연산자를 사용하면 모두 True나 False로 바뀐다.

a = np.arange(100)
arr = (((a % 10) == 0) & (a > 0))

arr = array([10, 20, 30, 40, 50, 60, 70, 80, 90])
이경우 5의 배수만을 추출하여 출력하게 된다.

a[((50 > a) & (a <= 60))]

array([51, 52, 53, 54, 55, 56, 57, 58, 59, 60])
이 경우 a의 배열이 달라지는게 아니라 특정 조건에 맞는 요소들만을 가져오는 것이지, 배열의 요소가 줄어들거나 달라지는것은 아니다.
for, if를 사용하지 않고 연산이 가능하다. 이를 통해 비용을 줄일 수 있다.

a = np.array([1, 2, 3])
b = np.append(a, [4, 5, 6])
b

array([1, 2, 3, 4, 5, 6])

a = np.array([[1, 2], [3, 4]])
b = np.append(a, [[9, 9]], axis = 0) # 행추가
c = np.append(a, [[9],[9]], axis = 1) # 열추가

b = array([[1, 2],[3, 4],[9, 9]])
c = array([[1, 2, 9], [3, 4, 9]])

a = np.array([[1, 2, 3], [4, 5, 6]]) 
np.delete(a, 0) # 비항구적, 원소 하나 삭제
np.delete(a, (0, 2, 4)) # 비항구적 지정 원소 삭제
np.delete(a, 0, axis=0) # 비항구적, 행전체 삭제

array([2, 3, 4, 5, 6])
=> axis를 명시해주지 않았으므로 첫번쨰 원소가 삭제되면서 1차원배열로 바뀌었다.
axis를 명시해주지 않았으므로 0, 2, 4, 번째 원소가 삭제된다. => array([2, 4, 6])
axis를 0으로 해주면 0번쨰 행을 삭제된다. => array([4, 5, 6])
1로하면 0번째 열을 삭제한다. => array([[1, 2], [4, 5]])

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
a + b

array([5, 7, 9])
numpy배열끼리 더하면 요소 하나하나 끼리 더해준다.

profile
안녕하세요 ㅎㅎ

0개의 댓글