๊ณ„๋ž€์†Œ๋…„ 2025. 1. 10. 17:49

์ž์„ธํ•œ ์ •๋ณด๋Š” ์•„๋ž˜ ์ฐธ๊ณ 

https://numpy.org/doc/

 

NumPy Documentation

 

numpy.org

 

NumPy๋ž€?

 

์•„๋ž˜๋Š” NumPy๋ฅผ์—ฐ์Šตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์ด๋‹ค.

https://www.w3schools.com/python/numpy/default.asp

 

NumPy ์ด๋ชจ์ €๋ชจ

 

  • ์šฐ๋ฆฌ ์ฃผ๋ณ€์— ๋งŽ์€๊ฒƒ๋“ค์ด ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋œ๋‹ค. ์‚ฌ์ง„, ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๋ชจ๋‘ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์ด๋•Œ NumPy๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.
  • NumPy์˜ ๋ฐฐ์—ด์ธ ndarray๋ฅผ ์ด์šฉํ•˜์—ฌ ํ–‰๋ ฌ ์—ฐ์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • NumPy๋Š” C ์–ธ์–ด๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด, Python๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋ฐฐ์—ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ndarray๋Š” ๊ฐ™์€ ์ž๋ฃŒํ˜•์„ ๊ฐ€์ง€๋Š” ์š”์†Œ๋งŒ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ํ˜•๋ณ€ํ™˜์„ ํ†ตํ•ด ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ํ˜•๋ณ€ํ™˜ ๊ฐ€๋Šฅ  ex) float ๋ฐฐ์—ด์— int ๋ฐฐ์—ด์„ ๋”ํ•˜๋ฉด, ๊ฒฐ๊ณผ๋Š” floatํ˜•์œผ๋กœ ํ˜•๋ณ€ํ™˜๋˜์–ด ๊ณ„์‚ฐ๋œ๋‹ค.
    • ํ˜•๋ณ€ํ™˜ ๋ถˆ๊ฐ€๋Šฅ  ex) ๋ฌธ์ž์—ด ๋ฐฐ์—ด๊ณผ ์ˆซ์ž ๋ฐฐ์—ด์„ ๋”ํ•  ์ˆ˜ ์—†๋‹ค.

 

๊ธฐ๋ณธ ๋ฐฐ์—ด

import numpy as np

# 1์ฐจ์› ๋ฐฐ์—ด
a = np.array([15, 20, 25, 30])
print(a)  # [15 20 25 30]

# ๋ฐฐ์—ด์˜ ํ‰๊ท 
print(a.mean())  # 22.5

# ๊ฐ ์›์†Œ์— 5๋ฅผ ๋”ํ•˜๊ธฐ
print(a + 5)  # [20 25 30 35]

a.append(30) -> ํ‹€๋ฆผ AttributeError: 'numpy.ndarray' object has no attribute 'append'

new_a = np.append(a, [9, 10])

print(new_a)  # [15 20 25 30  9 10]
print(a)      # [15 20 25 30] (์›๋ณธ ๋ฐฐ์—ด์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ)

 

์ƒ์„ฑ, ์†์„ฑ, ํ•จ์ˆ˜

๋„˜ํŒŒ์ด ๋ฐฐ์—ด์—๋Š” ๋ชจ๋‘ ๊ฐ™์€ ์ž๋ฃŒํ˜•์ด์–ด์•ผ ํ•˜๋ฉฐ, ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜•๋ณ€ํ™˜ ํ•œ๋‹ค.

# ๋ฆฌ์ŠคํŠธ์—์„œ numpy ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
test2 = np.array(['15', '20', '25', True])  # 'True'๊ฐ€ String์œผ๋กœ ํ˜•๋ณ€ํ™˜๋จ
print(test2)  # ['15' '20' '25' 'True']

# arange ํ•จ์ˆ˜: ์ˆซ์ž ๋ฒ”์œ„ ์ƒ์„ฑ
print(np.arange(0, 1, 0.1))  # [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

# ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์„ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ํ˜• ๋ณ€ํ™˜์— ์ฃผ์˜ ํ•„์š”
test3 = np.array([1, 2, 3, 4], dtype=bool)
print(test3)  # [ True  True  True  True]

# ์ž๋ฃŒํ˜•์ด ์ง€์ •๋œ ๋ฐฐ์—ด
test = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(test.dtype)  # int64
print(test.itemsize)  # 8 (๊ฐ ์›์†Œ์˜ ๋ฐ”์ดํŠธ ํฌ๊ธฐ)
print(test.ndim)  # 2 (์ฐจ์› ์ˆ˜)
print(test.size)  # 8 (์›์†Œ ๊ฐœ์ˆ˜)
print(test.shape)  # (2, 4) (ํ–‰๊ณผ ์—ด์˜ ๊ตฌ์กฐ)
print(test.strides)  # (32, 8) (๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ ์ฐจ์›์˜ ๊ฑฐ๋ฆฌ)

'''
32: ์ฒซ ๋ฒˆ์งธ ์ฐจ์›์˜ ๊ฐ ์š”์†Œ ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ฑฐ๋ฆฌ. ์ฒซ ๋ฒˆ์งธ ์ฐจ์›์„ ๋”ฐ๋ผ ํ•œ ํ–‰ ๋์—์„œ ๋‹ค์Œ ํ–‰ ์‹œ์ž‘ ๊ฐ„๊ฒฉ์ด 32byte
8: ๋‘ ๋ฒˆ์งธ ์ฐจ์›์˜ ๊ฐ ์š”์†Œ ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ฑฐ๋ฆฌ. ์—ด ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์š”์†Œ์—์„œ ๋‹ค์Œ ์š”์†Œ ๊ฑฐ๋ฆฌ๊ฐ€ 8byte
'''

# ๋‹ค์ฐจ์› ๋ฐฐ์—ด ๋ณ€ํ™˜
test = test.T  # ์ „์น˜ ํ–‰๋ ฌ
print(test)

test.argmax(axis=0)  # ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์žˆ๋Š” ๋ฐฉ๋ฒˆํ˜ธ array([1, 1, 1, 1])
test.argmax(axis=1)  # array([3, 3])

 

ํ–‰๋ ฌ ์—ฐ์‚ฐ

# ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ, axis๋Š” ์ฐจ์›์„ ์˜๋ฏธ
print(np.sum(test))  # ์ „์ฒด ํ•ฉ: 36
print(np.sum(test, axis=0))  # ๊ฐ ์—ด์˜ ํ•ฉ: [10 26]
print(np.sum(test, axis=1))  # ๊ฐ ํ–‰์˜ ํ•ฉ: [ 6  8 10 12]

#๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…
np + 5

np.append(test,[[10],[20]],axis=1)
# ๊ฒฐ๊ณผ
# array([[ 1,  2,  3,  4, 10],
#        [ 5,  6,  7,  8, 20]])


# ํ‰๊ท  ๊ณ„์‚ฐ
a = np.array([1, 2, 3, 4, 5])
print(np.mean(a))  # 3.0
print(np.average(a, weights=[2, 1, 1, 0, 0]))  # ๊ฐ€์ค‘ ํ‰๊ท : 1.75
#๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ 1์ด 2,3๋ณด๋‹ค 2๋ฐฐ ์ž์ฃผ ์„ ํƒ๋˜๋ฉฐ, 4์™€ 5๋Š” ์„ ํƒ๋˜์ง€ ์•Š์Œ
  • np.bool ๋Š” ๋…ผ๋ฆฌ ์ž๋ฃŒํ˜•์ด์ง€๋งŒ, ์ˆซ์ž ์—ฐ์‚ฐ ๊ฐ€๋Šฅํ•˜๋‹ค. {True:1, False:0}
  • uint๋Š” ๋ถ€ํ˜ธ์—†๋Š” ์ •์ˆ˜ํ˜•

 

๋ฐฐ์—ด ๋ณ€ํ˜•

newshape: ๋ฐฐ์—ด์˜ ์ƒˆ๋กœ์šด ํ˜•ํƒœ๋ฅผ ์ง€์ •ํ•˜๋Š” ํŠœํ”Œ (์ฐจ์› ๋ณ€๊ฒฝ)

ex) 2์ฐจ์› -> 3์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝ

๊ฐ ์ฐจ์›์˜ ํฌ๊ธฐ๋กœ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ, ์›๋ณธ ๋ฐฐ์—ด์˜ ์›์†Œ ์ˆ˜์™€ reshape์˜ ๊ณฑ์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

-1์€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ฐจ์› ํฌ๊ธฐ ๊ณ„์‚ฐ์œ„ํ•œ ํŠน์ˆ˜ ๊ฐ’์ด๋‹ค.

# reshape์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ํ˜•ํƒœ ๋ณ€ํ˜•
# ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์œ ์ง€ํ•œ ์ฑ„, ๋ฐฐ์—ด ์ฐจ์›๊ณผ ํฌ๊ธฐ๋งŒ ๋ณ€ํ˜• ๊ฐ€๋Šฅ / ๋ฐฐ์—ด ์›์†Œ ์ˆ˜ ๊ณ ์ •

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])

# 2x3 ๋ฐฐ์—ด๋กœ ๋ณ€ํ˜•
b = a.reshape((2, 3))
print(b)
# [[1 2 3]
# [4 5 6]]

#-1์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ์ฐจ์›์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐ, ์›์†Œ์ˆ˜๊ฐ€ 6์ด๋ฏ€๋กœ (1,2,3)์œผ๋กœ ๋ณ€ํ˜•๋จ
#์ฒซ ๋ฒˆ์งธ ์ฐจ์›์˜ ํฌ๊ธฐ 1์€ ๋‚˜๋จธ์ง€ ์ฐจ์›์— ๋งž์ถฐ ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋จ
a = a.reshape((-1, 2, 3))  # 3์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
print(a.shape)  # (1, 2, 3)

# ๋ฐฐ์—ด์„ 1์ฐจ์›์œผ๋กœ ๋ณ€ํ™˜
print(a.flatten())  # [10 20 30 40 50 60]

a.ndm # ์ฐจ์› ํ™•์ธ
a.shape # ํ–‰๋ ฌ ํ™•์ธ

 

NaN, Inf

# NaN์„ -1๋กœ ๋ณ€๊ฒฝ
test_ = np.array([[1., 2., 3., 4.], [5., 6., 7., np.nan]])
print(np.nan_to_num(test_, nan=-1))

# Inf๋ฅผ -2๋กœ ๋ณ€๊ฒฝ
test_ = np.array([[1., 2., 3., 4.], [5., 6., 7., np.inf]])
test_[test_ == np.inf] = -2
print(test_)

 

๋ณต์› ์ถ”์ถœ vs ๋น„๋ณต์› ์ถ”์ถœ

# ๋ณต์› ์ถ”์ถœ
a = [1, 2, 3, 4, 5]
print(np.random.choice(a, 3, replace=True))  
# ๋น„๋ณต์› ์ถ”์ถœ
print(np.random.choice(a, 3, replace=False))

 

๋‚œ์ˆ˜ ์ƒ์„ฑ

import random

random.seed(3)  # ๋‚œ์ˆ˜ ์‹œ๋“œ๋ฅผ ๊ณ ์ •
print(random.randint(1, 5))  # ํ•ญ์ƒ ๊ฐ™์€ ๋‚œ์ˆ˜ ๊ฐ’ ์ถœ๋ ฅ

 

์ •๋ ฌ

# ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
print(np.sort(x))  # [ 1  2  3  4  5  6  7  8]

# ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ •๋ ฌ (์›๋ณธ ๋ฐฐ์—ด ๋ณ€๊ฒฝ)
x.sort()
print(x)  # [1 2 3 4 5 6 7 8]

# ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
sorted_x_desc = np.sort(x)[::-1]
print(sorted_x_desc)  # [8 7 6 5 4 3 2 1]

 

 

์Šฌ๋ผ์ด์‹ฑ๊ณผ ์ธ๋ฑ์‹ฑ

 

1์ฐจ์› ๋ฐฐ์—ด

  • ์ธ๋ฑ์‹ฑ: ๋ฐฐ์—ด์—์„œ ํŠน์ •ํ•œ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์Šฌ๋ผ์ด์‹ฑ: ๋ฐฐ์—ด์˜ ํŠน์ • ๋ถ€๋ถ„์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•'start:stop:step'
  • ์ธ๋ฑ์‹ฑ ์ฐจ์› ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ , ์Šฌ๋ผ์ด์‹ฑ์€ ์›๋ž˜์˜ ์ฐจ์›์„ ์œ ์ง€
# [ 1  2  3  4  5  6  7  8]

# ์ธ๋ฑ์‹ฑ
print(x[x > 4])  # 4๋ณด๋‹ค ํฐ ๊ฐ’๋“ค๋งŒ ์ถœ๋ ฅ (5, 6, 7, 8) ๋ถˆ๋ฆฌ์–ธ ์ธ๋ฑ์‹ฑ

# ์Šฌ๋ผ์ด์‹ฑ
print(x[2:6])  # 3๋ฒˆ์งธ๋ถ€ํ„ฐ 6๋ฒˆ์งธ ์ „๊นŒ์ง€ (3, 4, 5, 6)
print(x[::2])  # 0๋ฒˆ์งธ๋ถ€ํ„ฐ ๋๊นŒ์ง€ 2์นธ์”ฉ ๊ฑด๋„ˆ๋›ฐ๊ธฐ (1, 3, 5, 7)
print(x[::-1])  # ๋ฐฐ์—ด์„ ๋’ค์ง‘๊ธฐ (8, 7, 6, 5, 4, 3, 2, 1)

 

2์ฐจ์› ๋ฐฐ์—ด

y = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# ์ธ๋ฑ์‹ฑ
print(y[0, 1])  # 0๋ฒˆ์งธ ํ–‰,1๋ฒˆ์งธ ์—ด ๊ฐ’ (2)
print(y[[0, 1]])  # 0๋ฒˆ์งธ ํ–‰๊ณผ, 1๋ฒˆ์งธ ์—ด [[1 2 3] [4 5 6]]

# ์Šฌ๋ผ์ด์‹ฑ
print(y[1:, :2])  # 2๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€, ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ์—ด๊นŒ์ง€ (4, 5), (7, 8)

 

3์ฐจ์› ๋ฐฐ์—ด

# 3x3x3 ํฌ๊ธฐ์˜ 3D ๋ฐฐ์—ด ์ƒ์„ฑ
x = np.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]]])

print(x)
'''
[[[ 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]]]
'''

#์ธ๋ฑ์‹ฑ
print(x[0, 1, 2])  # 6
print(x[1, 0, 2])  # 12
print(x[-1, -2, -3])  # ๋งˆ์ง€๋ง‰ 2D ๋ฐฐ์—ด์—์„œ ๋‘ ๋ฒˆ์งธ ํ–‰, ์„ธ ๋ฒˆ์งธ ์—ด, ์„ธ ๋ฒˆ์งธ ๊ฐ’
print(x[x > 10])  # 10๋ณด๋‹ค ํฐ ๋ชจ๋“  ๊ฐ’ ์ถœ๋ ฅ
print(x[[0, 2], [1, 2], [1, 0]])  # ์ฒซ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ 2D ๋ฐฐ์—ด์—์„œ (2,2)์™€ (3,1) ์œ„์น˜์˜ ๊ฐ’

#์Šฌ๋ผ์ด์‹ฑ
print(x[0, :, :])  # ์ฒซ ๋ฒˆ์งธ 2D ๋ฐฐ์—ด (์ „์ฒด ํ–‰, ์ „์ฒด ์—ด)
print(x[1, 0:2, 1:3])  # ๋‘ ๋ฒˆ์งธ 2D ๋ฐฐ์—ด์—์„œ ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ํ–‰, ๋‘ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์—ด
print(x[:, 1:, :])  # ๋ชจ๋“  2D ๋ฐฐ์—ด์—์„œ ๋‘ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€, ๋ชจ๋“  ์—ด
print(x[:, -2:, -2:])  # ๋ชจ๋“  2D ๋ฐฐ์—ด์—์„œ ๋‘ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€, ๋‘ ๋ฒˆ์งธ ์—ด๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์—ด๊นŒ์ง€

 

append(), extend(), insert()

Python

  • append(): ๋ฆฌ์ŠคํŠธ์˜ ๋์— ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
  • insert(): ๋ฆฌ์ŠคํŠธ์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค ์œ„์น˜์— ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์‚ฝ์ž…
  • extend(): ๋ฆฌ์ŠคํŠธ์— ๋‹ค๋ฅธ iterable์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ถ”๊ฐ€


NumPy 

  • numpy.append(): ๋ฐฐ์—ด์˜ ๋์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ 
  • numpy.insert(): ๋ฐฐ์—ด์˜ ํŠน์ • ์œ„์น˜์— ์š”์†Œ๋ฅผ ์‚ฝ์ž… 
  • numpy.concatenate(): ์—ฌ๋Ÿฌ ๋ฐฐ์—ด์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ

 

import numpy as np

# Python
my_list = [1, 2, 3, 4]

# 1. append() - ๋ฆฌ์ŠคํŠธ ๋์— ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
my_list.append(5)
print("List after append:", my_list)  # [1, 2, 3, 4, 5]

# 2. insert() - ์ง€์ •๋œ ์ธ๋ฑ์Šค(1)์— 4๋ฅผ ์‚ฝ์ž…
my_list.insert(1, 4)
print("List after insert:", my_list)  # [1, 4, 2, 3, 4, 5]

# 3. extend() - ๋‹ค๋ฅธ iterable์˜ ์š”์†Œ๋“ค์„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
my_list.extend([6, 7])
print("List after extend:", my_list)  # [1, 4, 2, 3, 4, 5, 6, 7]

# NumPy
arr = np.array([1, 2, 3, 4])

# 1. np.append() - ๋ฐฐ์—ด ๋์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
arr_appended = np.append(arr, 5)
print("Array after np.append:", arr_appended)  # [1 2 3 4 5]

# 2. np.insert() - ๋ฐฐ์—ด์˜ ํŠน์ • ์œ„์น˜(1)์— 4๋ฅผ ์‚ฝ์ž…
arr_inserted = np.insert(arr, 1, 4)
print("Array after np.insert:", arr_inserted)  # [1 4 2 3 4]

# 3. np.concatenate() - ์—ฌ๋Ÿฌ ๋ฐฐ์—ด์„ ๊ฒฐํ•ฉ
arr2 = np.array([5, 6, 7])
arr_concatenated = np.concatenate((arr, arr2))
print("Array after np.concatenate:", arr_concatenated)  # [1 2 3 4 5 6 7]

# ์ถœ๋ ฅ
List after append: [1, 2, 3, 4, 5]
List after insert: [1, 4, 2, 3, 4, 5]
List after extend: [1, 4, 2, 3, 4, 5, 6, 7]
Array after np.append: [1 2 3 4 5]
Array after np.insert: [1 4 2 3 4]
Array after np.concatenate: [1 2 3 4 5 6 7]