퀀트

02. Numpy : 배열 생성, indexing, slicing, 연산, broadcast, aggregation

만 기 2022. 11. 30. 17:32

Numpy

다차원 배열(데이터)을 다루는 도구

다차원 배열, 행렬의 생성과 연산, 정렬 등 편리한 기능이 있음

 

numpy import

import numpy as np

 

numpy 배열 생성

다차원

# 1차원
array_1 = np.array([1,2,3,4])
print(array_1)
# [1 2 3 4]

# 2차원
array_2 = np.array([[1,2,3,4],[11,12,13,14]])
print(array_2)
# [[ 1  2  3  4]
#  [11 12 13 14]]

# 3차원
array_3 = np.array([[[1,2,3,4],[11,12,13,14]], [[21,22,23,24],[31,32,33,34]]])
print(array_3)
# [[[ 1  2  3  4]
#   [11 12 13 14]]
#
#  [[21 22 23 24]
#   [31 32 33 34]]]

# 배열 모양보기
print(array_1.shape)
print(array_2.shape)
print(array_3.shape)
# (4,)
# (2, 4)
# (2, 2, 4)
  • np.array() : 리스트로 넘파이 배열을 만드는 함수
  • 리스트가 중첩된 깊이가 곧 배열의 차원이 됨
  • .shape : 배열 형태 보기 (층, 행, 열)

 

특정배열 생성

# 0 으로 채운 배열 만들기
z1 = np.zeros([4])  
print(z1)
# [0. 0. 0. 0.]

# 1 로 채운 배열 만들기
o2 = np.ones([3,4])   
print(o2)
# [[1. 1. 1. 1.]
#  [1. 1. 1. 1.]
#  [1. 1. 1. 1.]]

# 랜덤한 숫자 배열 만들기
r2 = np.random.randn(2,3)   
print(r2)
# [[-0.58450478 -0.21677856 -1.60593065]
#  [ 0.43379032 -1.19737432 -1.65608937]]
  • np.zeros()
  • np.ones()
  • np.random.randn()

 

4차원 랜덤 배열 생성

array_4 = np.random.randn(2,2,4,5).round(3)
print(array_4)
[[[[ 0.579 -0.686  1.575  0.563  1.89 ]
   [-0.611 -0.134 -0.718 -0.403 -0.258]
   [-0.291  0.479 -0.227 -1.925 -1.215]
   [-0.168  0.778  0.896 -0.576  1.55 ]]

  [[ 0.559  1.781 -0.189  1.082  0.37 ]
   [-0.089 -0.114  1.126  0.072  1.216]
   [ 0.349 -0.39   1.434  1.646  0.322]
   [ 0.513  0.48  -1.32  -0.701  0.539]]]

 [[[-0.407  0.662 -0.767 -0.882 -0.258]
   [-1.413  0.137 -1.521 -1.009  0.202]
   [ 0.259 -0.126 -0.201 -1.259 -1.758]
   [-0.681  0.29  -0.508  0.408 -0.437]]

  [[ 0.927  1.21   2.003  0.319  0.708]
   [ 0.482 -1.161 -1.158 -0.541  1.319]
   [ 0.576  0.091  0.79   1.603  0.517]
   [-0.825 -1.335 -1.375  1.043 -1.088]]]]
  • np.random.randn().round() : 나타낼 소숫점 자리수

 

배열 Indexing (조회)

print(array_4[1][0][2][4])
# -1.758

print(array_4[1, 0, 2, 4])
# -1.758

 

배열 Slicing (자르기)

print(array_4[1, 0][1:4:2])
print(array_4[1, 0, 1:4:2])

[[-1.102 -0.265  0.283 -0.074 -0.785]
 [-0.78   0.352 -0.264 -0.927  1.367]]

print(array_4[1][0][1:4:2][1][3:])
print(array_4[1, 0, 1:4:2][1, 3:])

[-0.927  1.367]
  • [ 시작인덱스 : 끝인덱스 : 간격 ]
  • 생략시 시작=0, 끝=길이, 간격=1
  • 끝 인덱스는 포함하지 않음.

 

배열 연산

arr = np.array([[1, 2, 3, 4],[10, 11, 12, 13]])
print(arr)
[[ 1  2  3  4]
 [10 11 12 13]]

print(arr + arr)
[[ 2  4  6  8]
 [20 22 24 26]]

+-*/ 모두 가능

 

Broadcasting

print(arr + 20)
[[21 22 23 24]
 [30 31 32 33]]

print(arr * 100)
[[ 100  200  300  400]
 [1000 1100 1200 1300]]

 

배열이 맞지 않는 Broadcasting

arr1 = np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
arr2 = np.array([[0,1,2],[0,1,2],[0,1,2],[0,1,2]])

[[ 0  0  0]
 [10 10 10]
 [20 20 20]
 [30 30 30]]
[[0 1 2]
 [0 1 2]
 [0 1 2]
 [0 1 2]]

print(arr1 + arr2)     # (4x3)  +  (4x3)
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

print(arr1 + np.array([0,1,2]))     # (4x3) + (1x3)
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

print(np.array([[10], [20], [30], [40]]) + np.array([1, 2, 3]))     #  (4x1) + (1x3)
[[11 12 13]
 [21 22 23]
 [31 32 33]
 [41 42 43]]

 

Aggregation (집계)

배열의 모든 원소를 집계하는 연산

# 배열 전체의 덧셈, 평균, 곱셈, 최댓값, 최솟값
print(**arr.sum(), arr.mean(), arr.prod(), arr.max(), arr.min()**)
# (56, 7.0, 411840, 13, 1)

# 배열에서의 최대인 원소의 번호, 최소인 원소의 번호
print(arr.argmax(), arr[1].argmax(), arr.argmin())
# (7, 3, 0)

# 특정 축(차원)으로 덧셈 수행하기
print(arr.sum(axis=0), arr.sum(axis=1))
# [11 13 15 17] [10 46]

# Indexing + Slicing + Aggregation 응용
print(arr[1].min(), arr[1][2:].sum())
# (10, 25)
  • axis=0 ⇒ ↔️
  • axis=1 ⇒ ↕️