728x90

Numpy

  • Python 에서 과학 계산을 위한 기본 패키지
  • 다차원 배열(ndarray)을 다룹니다.
# Numpy 라이브러리 불러오기, 약칭 np
import numpy as np
  • numpy 라이브러리는 정말 많이 쓰이기 때문에 암묵적인 룰로서 약칭을 np로 한다.
l = list(range(1,11))
print(l)
print(type(l))
  • 1 부터 11을 제외한 정수까지 리스트로 l 에 할당한다.
  • 1~10 까지의 정수가 나오며 이 l 의 타입은 list 이다.
array = np.array(l) # list 를 array로 만들어준다.
print(array)
print(type(array)) # vector
  • 리스트인 l 을 np의 array메서드를 통해 array로 만들고 array 변수에 할당한다.
  • array를 프린트하면, 리스트랑 비슷하게 나오지만 구분자인 , 가 없이 띄어쓰기로 나온다.
  • array의 타입은 <class 'numpy.ndarray'> 으로 출력된다.
# 리스트와 동일하게 이터러블 하다.
for i in array:
  print(i)

for i in l:
  print(i)
  • 둘가 for문을 돌려서 하나씩 출력하면 동일하게 나온다.
l = [1,2.5,'Dog', True]

# 리스트는 각각 다른 데이터타입이 들어갈 수 있다.
for i in l:
  print(type(i))
  • 리스트에는 int, float, str, bool 등 다른 데이터 타입이 들어갈 수 있다.
a = np.array(l)
a
  • 하지만 np.array를 이용하여 이 리스트를 array 로 만들면
# 배열(array)는 같은 데이터 타입만 들어갈 수 있다.
# 같은 데이터 타입이 아닐 경우 가능한 데이터 타입으로 자동으로 바꾼다.
for i in a:
  print(type(i))
  • array(배열)에는 리스트와 다르게 같은 데이터 타입만 들어갈 수 있기 때문에
  • 각기 다른 데이터 타입이 같은 데이터 타입으로 통일이 된다.
  • 위 l 리스트들의 타입이 array로 바꾸면 모든 안의 요소가 str(문자열) 이된다.
b = np.array([1.,'2',3])
b
type(b)

# dtype 어트리뷰트를 통해서 데이터타입을 확인할 수 있다.
b.dtype
  • 리스트로 만들면 float, str,int 로 나와야할 타입들이
  • araay로 만들어서 각각 문자열 데이터 타입으로 변한다.

넘파이 배열 백터화

# arange 메소드를 통해 새로운 배열 생성
np.arange(1,11)

# 시작 인덱스 = 0, 처음은 포함, 끝은 포함하지 않습니다.
np.arange(11)

np.arange(1,11,2)
  • array도 리스트와 마찬가지로 range를 쓸 수 있다.
  • np.arange()를 이용해 리스트와 동일한 방식으로 숫자 배열을 만든다.
l = [1,2,3,4]
l

l * 4
  • 보통 리스트내의 요소들을 변화시키려면 그냥 리스트에 숫자를 곱하면
  • 리스트 내의 요소들이 곱한만큼 반복되는거에 그친다.
li = []
for i in l:
  li.append(i*2)
print(li)

[i*2 for i in li]
  • 리스트 내의 값들을 하나하나 변경하고 싶으면 for문이나 리스트내for문을 이용하여 수행해야 한다.
# 리스트의 정수 덧셈은 불가하다.
# l + 2
a = np.arange(1,5)
a

a * 2 # 배열에서는 요소 하나하나의 곱셈 연산이 산술연산자로 가능

a + 2 # 배열에서는 요소 하나하나의 덧셈 연산이 산술연산자로 가능

a ** 2 # 제곱

np.sqrt(a) # 루트

np.log(a) # 로그

np.sum(a) # 합계
  • 1~4까지의 배열을 a 에 할당한다.
  • 배열에서는 모든 연산자가 재기능을 한다.
# 배열의 길이를 구하는 두가지 방법
len(a), a.size
  • len()과 .size 를 통해서 해당 배열의 요소개수를 구할 수 있다.
# 절대값 구하기
b = np.array([-3,-1.5,-0.5, 0, 1, 3, 5.4])
np.abs(b)
  • 배열도 리스트처럼 .abs() 함수를 통해서 절대값을 구할 수 있다.
# 올림
np.ceil(b)

# 내림
np.floor(b)

# 반올림
np.around(b)

배열의 인덱싱

a = np.arange(1,11)
a

# 첫번째 요소
a[0]

# 마지막 요소
a[-1]
  • array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])를 a 에 할당한다.
  • a의 첫번째 요소인 1이 나온다.
  • a의 마지막 요소인 10이 나온다.
# enumerate : (0:index, 1:value)
list(enumerate(a))
  • enumerate는 해당값의 인덱스와 그 값을 튜플로 반환해 준다.
  • [(0, 1),(1, 2),(2, 3),(3, 4),(4, 5),(5, 6),(6, 7),(7, 8),(8, 9),(9, 10)] 이 출력된다.
# 슬라이싱
a[2:6]

# 끝자락 요소는 포함하지 않는다
a[:5]

# 처음 요소는 포함한다.
a[6:]

a[::2]
  • a는 array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
  • 리스트의 슬라이싱이랑 동일하다
  • [start:end"step] 이 있다.
# 배열 내 요소값 변환
a[0] = 100
a

# 리스트와 다르게 한꺼번에 할당하는 것이 가능
a[2:5] = 50
a

a[2:5] = [50,51,52]
a
  • 해당 배열의 특정 값을 임의의 값으로 변경시킬수 있다.
  • 리스트와 다르게 한번에 바꿀 수도 있다.
  • 바꿀 값도 한번에 지정해줄 수 있다.
a = np.arange(1,11)
a

b = a[2:8]
b

b[0] = 100
b

# 슬라이싱으로 새로운 변수에 참조한 경우,
# 슬라이싱 배열의 요소가 변경되면 기존 배열의 값도 같이 변경된다.
  • a 배열을 슬라이싱하여 나온 값을 b에 할당할 경우
  • a에게 할당받은 b의 값이 변경되면 a의 값도 같이 변경된다.
# 리스트의 경우, 슬라이싱 참조 리스트값이 변경되도
# 원본 리스트의 값이 변경되지 않는다.
l = list(range(1,11))
m = l[2:8]
m[0] = 100
print(m)
print(l)
  • 배열과 달리 리스트의 경우 할당된 배열의 값을 바꾸어도 기존배열의 값은 바뀌지 않는다.

배열의 Shape,다차원

a = np.arange(1,13)
a
type(a)
  • a 는 array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
  • a 의 타입은 numpy.ndarray
a.shape # 현재 차원과 구성요소를tuple 로 반환

# 행이 2개, 열이 6개인  2차원 배열로 변경
a = a.reshape(2,6)
a

a.shape
  • .shape 메서드를 이용하여 현제 배열의 차원과 구성요소를 반환받을 수 있다.
  • .reshpe를 이용해 행고 열을 지정하여 2차원배열로 변경할 수 있다.
# 행이 6개, 열이2개인  2차원 배열고 변경
a = a.reshape(6,2)
a

a.shape

a + 100 # 산술연산자가 작동한다.
  • array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) 를 6행 2열로 reshape한다.
  • 이때 변경된 배열에서도 산술연산자가 장동된다.
# 3차원 배열
a = a.reshape(2,2,3)
a

a.shape

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

       [[ 7,  8,  9],
        [10, 11, 12]]])
  • 2행 3열로 3차원 배열을 만든다.
# 한 줄로 메소드 체이닝하여 배열 생성 및 차원 조정 가능
b = np.arange(1,101).reshape(25,4)
b


array([[  1,   2,   3,   4],
       [  5,   6,   7,   8],
       [  9,  10,  11,  12],
       [ 13,  14,  15,  16],
       [ 17,  18,  19,  20],
       [ 21,  22,  23,  24],
       [ 25,  26,  27,  28],
       [ 29,  30,  31,  32],
       [ 33,  34,  35,  36],
       [ 37,  38,  39,  40],
       [ 41,  42,  43,  44],
       [ 45,  46,  47,  48],
       [ 49,  50,  51,  52],
       [ 53,  54,  55,  56],
       [ 57,  58,  59,  60],
       [ 61,  62,  63,  64],
       [ 65,  66,  67,  68],
       [ 69,  70,  71,  72],
       [ 73,  74,  75,  76],
       [ 77,  78,  79,  80],
       [ 81,  82,  83,  84],
       [ 85,  86,  87,  88],
       [ 89,  90,  91,  92],
       [ 93,  94,  95,  96],
       [ 97,  98,  99, 100]])
  • 1부터 100까지의 수를 25행 4열의 배열로 만든다.
a = np.arange(1,13) 
# 배열 요소의 순서를 변경하고 싶을 때
a.reshape(3,4, order='F')
array([[ 1,  4,  7, 10],
       [ 2,  5,  8, 11],
       [ 3,  6,  9, 12]])

a = a.reshape(3,4, order='C')
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
  • 1에서12까지의 정수 배열을 3행 4열로 reshape한다.
  • order속성인 'F'와 'C' 를 이용하여 순서를 변경 시킬 수 있다.
# 인덱싱을 할 경우 차원 축소
a[0]
# array([1, 2, 3, 4])

a[-1]
# array([ 9, 10, 11, 12])
  • 3차원배열의 인덱싱을 할 경우 차원이 축소되어 2차원의 배열이 나온다.
# 차원축소 : 2d(행렬) -> 1d(백터) -> 0d(스칼라)
a[0][0]
  • a[0]으로 한번 차원축소를하고 또 다시 [0]으로 차원축소를하면 3차원에서 1차원의 값이 나온다.
  • a[0][0] 은 첫번째 행의 첫번째 열 즉, 1이 나온다.
# 대괄호 하나로 여러 차원의 인덱싱 접근
a[1,1]
  • 굳이 대괄호를 여러게 쓸 필요 없이 구분자를 이용하여 여러 차원의 인덱싱의 접근이 가능하다
  • a의 두번째 행의 두번째 열의 값인 6이 나온다.
# 모든 행의 값, 첫번째 열의 값
a[:,0]
  • :, 은 모든 행의값을 뜻한다.
  • 즉, 모든행의 첫번째 열의 값을 반환한다.
  • 3차원배열을 2차원 배열로 반환했으니 array([1, 5, 9]) 가 출력된다.
# 2차원 각각 슬라이싱
a[:2,1:3]
  • 두번째 행까지의 두번째 열부터 세번쩨 열까지 반환한다.
  • array([[2, 3], [6, 7]])
# 축을 변경한다 : Transpose -> 속성
a.T

# transpose 메소드
a.transpose()
  • 원래 배열에서 왼쪽 위에서부터 오른쪽 아래까지 일직선을 축으로 반전 시킨다.
  • .T.transpose() 둘다 기능이다.
# 0 행렬 생성하기
np.zeros((5,5))

# 1 행열 생성하기
np.ones((5,5))

# 3차원 행열
np.zeros((2,3,4))

# 지정한 숫자로 채우는 행열
np.full((3,3),7)

# 단위 행열 만들기
np.eye(3)
  • .zeros()는 값이 0인 행열 생성한다. 3차원 행열도 만들 수 있다.
  • .ones()는 값이 1인 행열을 생성한다.
  • .full을 이용하여 임의의 행열에 값을 정해줄 수 있다.
  • 단위 행열을 만들수 있다.
a = np.arange(1,13).reshape(3,4)

# 다차원 행열 합계
a.sum()

# 행을 기준(축)으로 각 열의 합계
a.sum(axis=0)

# 열을 기준(축)으로 각 행의 합계
a.sum(axis=1)
  • 다차원 행열을 sum으로 모든 행과 열의 값을 더해줄 수 있다.
  • axis=0을 이용하여 행을 기준으로 각 열의 합을 구한다.
  • axis=1을 이용하여 각 열을 기준으로 각 행의 합을 구한다.
# 누적합
a.cumsum()

a.cumsum(axis = 0)

a.cumsum(axis = 1)
  • 점진적으로 다음 값을 한버씩 더하여 출력한다.
  • axis를 이용하여 행이나 열을 축으로 누적시킬 수 있다.
# 내부 요소 전체 곱
a.prod()

a.prod(axis=0)

a.prod(axis=1)
  • prod는 위의 행위를 곱으로 수행해 준다.
728x90

'Python' 카테고리의 다른 글

26-1. DataFrame(1) (Pandas)  (0) 2022.11.28
25-2. Numpy(2)  (0) 2022.11.28
21. 크롤링  (0) 2022.11.22
20. 네트워크  (0) 2022.11.22
19. 정규식...(진짜 너무한다..)  (0) 2022.11.18

+ Recent posts