python ์ •๋ฆฌ 7

donghaniยท2023๋…„ 10์›” 27์ผ

๐Ÿ“Œ Numpy๋ž€,

ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜
์ˆ˜์˜ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์„ ํ˜•๋Œ€์ˆ˜ ๊ด€๋ จ๋œ ์—ฐ์‚ฐ์ด ์ •์˜๋˜์žˆ๊ณ ,
n-์ฐจ์› array๋‚˜ matrix์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ๋“ค
๋ฐ์ดํ„ฐ ๋ถ„์„์— ํšจ๊ณผ์ ์ธ ์ž๋ฃŒํ˜•์„ ์ œ๊ณตํ•ด์ค€๋‹ค.

๐Ÿ“Œ Numpy ๋ฉ”์†Œ๋“œ๋“ค

import numpy as np

a = np.arange(1,11, 2) #์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ •ํ•ด์„œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ 
a1D = np.array([7, 2, 9, 10]) #์ด๋Ÿฐ ์‹์œผ๋กœ ํŒŒ์ด์ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ numpy array๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

#์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒ์„ฑ ๋ฐฉ๋ฒ•
p = np.zeros((3,3)) # 3x3 ํ–‰๋ ฌ์„ ๊ฐ’์ด 0์œผ๋กœ ์„ ์–ธ
q = np.ones((2,2)) # 2x2 ํ–‰๋ ฌ์„ ๊ฐ’์ด 1๋กœ ์„ ์–ธ
r = np.full((2,2), 4) # 2x2, ๊ฐ’์„ ์ „๋ถ€ 4๋กœ ์ฑ„์šด๋‹ค.
s = np.eye(4) # ํ•ญ๋“ฑ ํ–‰๋ ฌ ๋งŒ๋“ค๊ธฐ, 1์ด 4๊ฐœ -> 4x4 ํ–‰๋ ฌ
t = np.random.random((3,3)) #๋žœ๋ค์œผ๋กœ ๋งŒ๋“  ์ˆ˜๋ฅผ ๋žœ๋ค์œผ๋กœ 3x3ํ–‰๋ ฌ 

์ด๋Ÿฐ ์‹์œผ๋กœ ๋‹ค์–‘ํ•œ ์„ ์–ธ์ด ๊ฐ€๋Šฅ
์ด ์™ธ์— ๋ชจ์–‘์ด ์–ด๋–ค์ง€๋„ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

a1D = np.array([7, 2, 9, 10])
print(a1D.shape, "\n")

a2D = np.array([[5.2, 3.0, 4.5], [9.1, 0.1, 0.3]])
print(a2D.shape, "\n")

a3D = np.array([[[1, 2], [4, 3], [7, 4]], [[2, 0], [9, 0], [7, 5]], [[1, 0], [3, 0], [0, 2]], [[9, 0], [6, 0], [9, 8]]])
print(a3D.shape, "\n")

shape ํ•จ์ˆ˜๋กœ ํ•œ ์—ด์— ๊ฐ’์ด 2๊ฐœ์”ฉ ๋“ค์–ด๊ฐ„ ๊ฒƒ๋„ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

import numpy as np

a2D = np.array([[5.2, 3.0, 4.5], [9.1, 0.1, 0.3]])
print(a2D, "\n")
print(a2D[:, 2], "\n") # get specific column
print(a2D[1, :], "\n") # get specific row
print("\n")

ํŠน์ • ํ–‰๊ณผ ํŠน์ • ์—ด์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
Numpy arrays์— ์†ํ•˜๋Š” element๋Š” ๋ชจ๋‘ ๊ฐ™์€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.
class 'numpy.ndarray'

๋ฐ์ดํ„ฐ ํƒ€์ž…ํ™•์ธ ๋ฐ ์ง€์ •

var1=np.arange(1,11, dtype='f')
#๊ธฐ์กด int ์˜€๋‹ค๋ฉด float์œผ๋กœ ๋ณ€๊ฒฝ
arr = arr.astype(float)
#๊ฐ™์€ ๋งฅ๋ฝ
arr = np.arange(1, 10)
print(arr, "\n")

list1 = arr.tolist()
print(list1)
#list๋กœ ๋ณ€ํ™˜ array๋ฅผ

ํ–‰๋ ฌ ํ˜•ํƒœ ๋ณ€๊ฒฝ -> reshape๋ฅผ ์‚ฌ์šฉ

import numpy as np

arr = np.arange(12)
print(arr, "\n")

arr_rs = arr.reshape(3, 4) = 3ํ–‰ 4์—ด
print(arr_rs, "\n")

arr_rs = arr.reshape(4, 3) = 4ํ–‰ 3์—ด
print(arr_rs)

reshape ๋ฉ”์†Œ๋“œ๋ฅผ ์“ธ ๋•Œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€, ๋ฐฐ์—ด ์ธ๋ฑ์Šค์˜ ๊ฐœ์ˆ˜, ํฌ๊ธฐ์— ๋งž๊ฒŒ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ValueError๊ฐ€ ์ผ์–ด๋‚จ

import numpy as np

arr = np.arange(12)
print(arr, "\n")

# resize: 3 x 4 # resize ํ–ˆ์„ ๊ฒฝ์šฐ
resized_arr = np.resize(arr, (3,4))
print(resized_arr, "\n")

# reshape: 3 x 4 # reshape ํ–ˆ์„ ๊ฒฝ์šฐ
arr_rs = arr.reshape(3, 4)
print(arr_rs, "\n")

# resize: 5 x 3 # ํฌ๊ธฐ ํ™•์žฅ ์‹œ
resized_arr = np.resize(arr, (5,3))
print(resized_arr, "\n")

# resize: 5 x 2 # ๋ฐ์ดํ„ฐ ์œ ์‹ค
resized_arr = np.resize(arr, (5,2))
print(resized_arr, "\n")

์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๊ธฐ ํ•ด์„ , resize๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.
resize : ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝ, ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
ํฌ๊ธฐ ์กฐ์ • ์ค‘ ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ๋ฐœ์ƒ ๊ฐ€๋Šฅ

arr_rs = arr.reshape(2, -1)
print(arr_rs, "\n")

arr_rs = arr.reshape(4, -1)
print(arr_rs, "\n")

arr_rs = arr.reshape(-1, 6)
print(arr_rs, "\n")
  • ๋งˆ์ด๋„ˆ์Šค์˜ ์˜๋ฏธ : ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ์•„๋‹Œ ํ–‰๊ณผ ์—ด์˜ ๊ฐ’์„ ๊ณ ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
    -1, 6 ์—ด์ด 6๊ฐœ์ด๊ณ  ์ž๋™์œผ๋กœ 6๊ฐœ์˜ ์›์†Œ๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ๋‚จ์€๊ฒƒ๋“ค์„ ํ–‰์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

flatten() : n์ฐจ์›์˜ ๋ฐฐ์—ด์„ 1์ฐจ์›์˜ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

# Create an array: 3 x 3
arr = np.arange(1,10).reshape(3,3)
print(arr, "\n")

# flatten the array
print(arr.flatten(), "\n")

# flatten the array
print(arr.reshape(-1), "\n")

๋ฐฐ์—ด ๋ณ‘ํ•ฉ
tack() ์ข…๋ฅ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์“ฐ๋ฉด, arr1,arr2 ํ•ฉ์ณ์คŒ ์–ด๋–ป๊ฒŒ ๋งž์ถœ๊ฒƒ์ธ๊ฐ€?

hstack,vstack,dstack ์€ array size ๊ฐ™์•„์•ผํ•จ
hstack, vstack์€ ๋ฐฐ์—ด๋“ค์˜ shape์ด ์ „๋ถ€ ๋™์ผํ•ด์•ผํ•œ๋‹ค.
hstack() : ๋ฐฐ์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜ํ‰์ ์œผ๋กœ ๋งž์ถ˜๋‹ค.(column wise)
๋Œ€์•ˆ : concatenate((arr1,arr2), axis = 1) axis = 1 -> ํ–‰์œผ๋กœ

vstack() : ๋ฐฐ์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์ง์œผ๋กœ ๋งž์ถ˜๋‹ค. (row wise)
๋Œ€์•ˆ: concatenate((arr1,arr2) axis = 0) axis = 0 -> ์—ด์œผ๋กœ

dstack() : ํ•˜๋‚˜์˜ ์—ด์— 2๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ 1ํ–‰์€ [1 13]

๋ฐฐ์—ด ๋‚˜๋ˆ„๊ธฐ
array๊ฐ€ ๊ฐ™์€ ์‚ฌ์ด์ฆˆ๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ˆ˜ํ‰์ ์œผ๋กœ ํ˜น์€ ์ˆ˜์ง์ ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
hsplit() : axis = 1 : ํ•œ ํ–‰์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ”
vsplit() : axis = 0 : ํ•œ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
split -> axis ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ”

Copy vs view
view๋Š” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์“ด๋‹ค. shallow copy
copy๋Š” ๋‹ค๋ฅธ ์œ„์น˜์— ๋ฐฐ์—ด์„ ์ €์žฅํ•œ๋‹ค. deep copy
๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด view์— ์˜ํ–ฅ์ด ๋ฏธ์นœ๋‹ค.
view๋Š” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉ : copy๋Š” ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๊ณ 
view๋ณด๋‹ค ๋А๋ฆผ

arr.view()
arr.copy()

๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ numpy array๋Š” sclicing์„ ํ•  ์ˆ˜ ์žˆ์Œ
์Œ์ˆ˜ ์ธ๋ฑ์‹ฑ ๋˜ํ•œ ์ง€์›ํ•œ๋‹ค.
๋น„๊ต ์ธ๋ฑ์‹ฑ
์ฐธ์ธ์ง€ ๊ฑฐ์ง“์ด์ง€ ๋ฆฌํ„ด๊ฐ’์— ๋”ฐ๋ผ ํ‘œํ˜„์ด ๋œ๋‹ค.
if๋ฌธ๊ณผ ์œ ์‚ฌ

import numpy as np
arr = np.arange(21,41,2)
print(arr[arr>30])
#์ด๋Ÿฌ๋ฉด arr>30ใ…‚๋‹ค ํฐ ์ธ๋ฑ์Šค๋งŒ ์ถœ๋ ฅ๋Œ

fancy indexing
์ •์ˆ˜ ๋ฐฐ์—ด์„ indexer๋กœ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์ฐจ์› ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ indexing

# select 2nd and 3rd row
indices = [1, 2]
print(arr[indices, :], "\n")

# select 1st and 2nd col
indices = [0, 1]
print(arr[:, indices], "\n")

list๋Š” ๋ฒกํ„ฐ ๋ผ๋ฆฌ ์—ฐ์‚ฐ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ, ์›์†Œ ๋”ํ•˜๊ธฐ๊ฐ€ ์•„๋‹Œ
์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ
Broadcasting Arrays

numpy๋Š” ๋น ๋ฅธ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค

profile
์ปดํ“จํ„ฐ ๊ณตํ•™๊ณผ ์ด๋ฐฉ์ธ

0๊ฐœ์˜ ๋Œ“๊ธ€