F37.101 ์ปดํจํ ๊ธฐ์ด: ์ฒ์ ๋ง๋๋ ์ปดํจํ (First Adventures in Computing)
Chapter 10. Numpy#
ํ์ต๋ชฉํ์ ๊ธฐ๋ํจ๊ณผ
ํ์ต๋ชฉํ
๋ฐฐ์ด์ ์์ฑํด๋ณด๊ณ ๋ค๋ค๋ณด์.
๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ์ ์ฐจ์ด๋ฅผ ์์๋ณด์.
Shallow copy์ Deep Copy๋ฅผ ์ดํดํ์.
๊ธฐ๋ํจ๊ณผ
๋ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ ์ ํ ์๋ฃํ์ ์ ํํ ์ ์๊ณ ๋ค๋ฃฐ ์ ์๋ค.
๋ฐฐ์ด(Array)#
numpy๋ Number์ python์ ํฉ์ฑ์ด์ด๋ค.
ํ๋ ฌ์ด๋ ๋๊ท๋ชจ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ, ๊ฐ๋จํ ๊ธฐ๋ฅ๋ถํฐ ๊ณ์ฐ๊ณผํ ๋ถ์ผ์ ๋ณต์กํ ์ฐ์ฐ์ ์ง์ํ๊ธฐ ์ํ ๊ธฐ๋ฅ๋ค๊น์ง ํฌํจ๋์ด ์๋ค.
numpy์ ๋ฐฐ์ด์๋ ๋ชจ๋ ๋์ผํ ์๋ฃํ๋ง ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค.
numpy๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ import๋ก ๋ชจ๋์ ๋ถ๋ฌ์์ผํ๋ค.
๊ณต๊ณต์ฐํ ์ฝ์์ฒ๋ผ numpy ๋ชจ๋์ ๋ณดํต np๋ผ๋ ๋ณ์นญ์ผ๋ก ๋ถ๋ฆฌ์ด๋ค.
๋ณ์นญ์ as๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ๋ค.
import numpy as np
1-D array(๋ฒกํฐ) ์์ฑํ๊ธฐ#
1์ฐจ์ ๋ฐฐ์ด๋ถํฐ ๋ง๋ค์ด๋ณด์.
numpy๋ชจ๋์์๋ ๋ฐฐ์ด์ ์์ฑํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ง์ํ๋ค.
numpy ๋ชจ๋์
array()๋ฅผ ํตํด ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.numpy ๋ชจ๋์
arange()๋ฅผ ํตํด ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.
np.array(๋ฆฌ์คํธ or range())
np.arange(start, end, step)
ar1 = np.array([10,25,36,41,59])
ar11 = np.array(range(10))
ar111 = np.arange(1,6)
2-D array(๋งคํธ๋ฆญ์ค, ํ๋ ฌ) ์์ฑํ๊ธฐ#
2์ฐจ์ ๋ฐฐ์ด์ ํ(Row)๊ณผ ์ด(Column)๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์๋ ๊ทธ๋ฆผ์ ์์ ๋๋ ์คํ๋ ๋ ์ํธ์์์ ํ๊ณผ ์ด์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.

ํ์ ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก ์ค์ ์ธ์ด ๊ฒ์ด๋ฉฐ, ์ด์ ์ธ๋ก ๋ฐฉํฅ์ผ๋ก ์ค์ ์ธ์ด ๊ฒ์ด๋ค.
์ ๊ทธ๋ฆผ์์๋ ํ์ ์ซ์1๋ถํฐ, ์ด์ ์ํ๋ฒณ A๋ถํฐ ์์ํ๊ณ ์์ผ๋ numpy ๋ฐฐ์ด์์ ํ๋ ฌ์ ํญ์ 0๋ถํฐ ์์ํ๋ค.
2์ฐจ์ ๋ฐฐ์ด์ array()์ ์ค์ฒฉ ๋ฆฌ์คํธ๋ฅผ ๋ฃ์ด์ฃผ๊ฑฐ๋, arange()๋ก 1์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ ํ ๋ฐฐ์ด๋ชจ์์ ๋ฐ๊ฟ์ฃผ๋ reshape()์ ํตํด์ 2์ฐจ์ ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค.
np.array([๋ฆฌ์คํธ of ๋ฆฌ์คํธ])
np.arange(start,end,step).reshape(row, column)
์ฌ๊ธฐ์ row๋ ํ์ ๊ฐ์, column์ ์ด์ ๊ฐ์์ด๋ค.
ar2 = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
ar22 = np.arange(1,13).reshape(4,3)
์ด๋ column์ -1๋ก ์จ์ฃผ๋ฉด ๊ฐ ํ์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ๋๊ฐ์ด ์ ์ฉํด์ค๋ค. ์ด๋ฅผ ์ํด์๋ ๋ฐฐ์ด ์์์ ๊ฐ์์ row*column์ ๊ฐ์๊ฐ ๊ฐ์์ผ ํ๋ค.
ar222 = ar2.reshape(3,-1)
3-D array(ํ ์) ์์ฑํ๊ธฐ#
3์ฐจ์ ๋ฐฐ์ด์ ๋ฉด(page), ํ, ์ด์ ๊ฐ์ง๋ค.
์์ฑํ๋ ๋ฐฉ๋ฒ์ 2์ฐจ์ ๋ฐฐ์ด๊ณผ ์ ์ฌํ์ง๋ง ๋ฆฌ์คํธ๊ฐ 3๋ฒ ์ค์ฒฉ๋๋ค.
np.array([๋ฆฌ์คํธ of ๋ฆฌ์คํธ of ๋ฆฌ์คํธ])
np.arange(start,end,step).reshape(page, row, column)
ar3 = np.array([[[1,2,3], [4,5,6]],
[[7,8,9], [10,11,12]]])
ar33 = np.arange(1,13).reshape(2,2,3)
๐3์ฐจ์ ๋ฐฐ์ด ์์ฑํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ ์์ฑํ์์ค.
[[[100 90 80]
[ 70 60 50]]
[[ 15 25 35]
[ 45 55 65]]
[[ 11 22 33]
[ 44 55 66]]]
๋ฐฐ์ด์ ๊ตฌ์ฑ, ์ฐจ์ ๋ฑ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ณ์๋ฅผ ์ธ ์ ์๋ค.
๋ฐฐ์ด๋ช
.ndim
๋ฐฐ์ด๋ช
.shape
๋ฐฐ์ด๋ช
.size
ndim: ๋ฐฐ์ด์ ์ถ ๋๋ ์ฐจ์์ ๊ฐ์
shape: ๋ฐฐ์ด์ ๋ชจ์์ด๋ฉฐ, (m,n)ํ์์ผ๋ก ๋ํ๋๋ค.
size: ๋ฐฐ์ด ์์์ ๊ฐ์. shape๋ด์ ์์์ ํฌ๊ธฐ์ ๊ณฑ๊ณผ ๊ฐ๋ค. ์ฆ shape์ m*n์ size์ ๊ฐ๋ค.
print(ar3.ndim)
print(ar3.shape)
print(ar3.size)
3
(2, 2, 3)
12
Numpy์ ์์ฉ#
numpy๋ก ๋ง๋ ๋ฐฐ์ด์ ๋ค์ํ ๋ชฉ์ ์ ์ํด ์ฌ์ฉ๋์ง๋ง ์ ํ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด ๋ฐฐ์ด์ ํ์ฉํ๋ ํ๋์ ์๋ฅผ ๋ณด๋๋ก ํ์.
๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํ ์์์ ๋ค์๊ณผ ๊ฐ๋ค.
\(y=2x^2-3x+1\)
ํ์ด์ฌ์ผ๋ก ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด์๋ matplotlib.pyplot ๋ชจ๋์ ๋ถ๋ฌ์์ผ ํ๋ค.
matplotlib.pyplot ๋ชจ๋์ ๋ณดํต plt๋ผ๋ ๋ณ์นญ์ผ๋ก ๋ถ๋ฆฌ์ด๋ค.
plt์ plot()์ ์ ํ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ํจ์์ด๋ค.
ํ์ด์ฌ์์๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ธ๋ค๊ณ ํด์ ํ๋ฉด์ ๋ฐ๋ก ๋ณด์ฌ์ฃผ์ง ์๋๋ค. plt.show()๋ ๊ทธ๋ํ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ํจ์์ด๋ค.
plt.plot(x์ถ ๋ฐ์ดํฐ, y์ถ ๋ฐ์ดํฐ)
import matplotlib.pyplot as plt
x = np.arange(0, 5, 0.1)
y = 2*(x**2)-3*x+1
plt.plot(x, y)
plt.show()
<Figure size 640x480 with 1 Axes>
Vectorization operation#
1์ฐจ์์ผ๋ก ๋ฌถ์ ์๋ฅผ ์ํ์์ ๋ฒกํฐ(vector)๋ผ๊ณ ํ๋ค. ๋ฒกํฐ์ฐ์ฐ์ ๋ฒกํฐ์ ๋์ผ ์ธ๋ฑ์ค์ ์์นํ ์์๋ค๋ผ๋ฆฌ ์ฐ์ฐ์ ์ํํ๋ ๊ธฐ๋ฅ์ด๋ค. numpy์์๋ ์ฌ์น์ฐ์ฐ, ๋ ผ๋ฆฌ์ฐ์ฐ, ๋น๊ต์ฐ์ฐ์ ๋ํด ๋ชจ๋ ๋ฒกํฐ์ฐ์ฐ์ ์ง์ํ๋ค.
๋ชจ๋ ์ฌ์น์ฐ์ฐ์ ๋ํด ๋ฒกํฐ์ฐ์ฐ์ ํ๋ค.
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
[5 7 9]
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4 0.5 ]
ํ๋ ฌ๋ผ๋ฆฌ ์ฐ์ฐํ ๋ ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ์ด๋ฅผ ์๋์ผ๋ก ํ๋ํด ์ฃผ๋ ๊ธฐ๋ฅ์ ๋ธ๋ก๋์บ์คํ ์ด๋ผ๊ณ ํ๋ค.
์ฆ, ๋ ๋ฐฐ์ด์ ๋ชจ์์ด ๋ค๋ฅผ ๋, ์์ ๋ฐฐ์ด์ ์ฐจ์์ ์๋์ผ๋ก ๋๋ ค์ ํฐ ๋ฐฐ์ด๊ณผ ๋ง์ถ ๋ค ์ฐ์ฐํด์ค๋ค.

ar0 = np.arange(12).reshape(4, 3)
ar1 = np.arange(3)
ar2 = np.arange(4).reshape(4, 1)
print(ar0, '\n\n', ar1, '\n\n', ar2)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[0 1 2]
[[0]
[1]
[2]
[3]]
ar0 + ar1
array([[ 0, 2, 4],
[ 3, 5, 7],
[ 6, 8, 10],
[ 9, 11, 13]])
ar0 + ar2
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]])
๋ชจ๋ ๋น๊ต์ฐ์ฐ์ ๋ํด ๋ฒกํฐ์ฐ์ฐ์ ํ๋ค.
print(b>10)
print((b%2)==1)
[False False False]
[False True False]
๋ชจ๋ ๋ ผ๋ฆฌ์ฐ์ฐ์ ๋ํด ๋ฒกํฐ์ฐ์ฐ์ ํ๋ค. ๊ทธ๋ฌ๋ and, or, not ์ฐ์ฐ์ ๊ธฐํธ๋ฅผ ์ฐ์ง ์๋๋ค.
and๋
&,or๋
|,not์
~๋ก ์ด๋ค.
๊ธฐํธ ์ด์ธ์ ๋ณ๋์ ๋ ผ๋ฆฌ์ ์ธ ์ฐ์ฐ์ ํ ์ ์๋ ํจ์(logical_and(), logical_or(),logical_not()โฆ)๋ ์กด์ฌํ๋ค.
a = np.array([160,175,157])
c = np.array(['์ฌ','์ฌ','๋จ'])
print((a>162) | (c=='์ฌ'))
[ True True False]
๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ์ ๋น๊ต#
์ผํ ๋น์ทํด ๋ณด์ด์ง๋ง ์์ ํ ๊ธฐ๋ฅ์ด ๋ค๋ฅธ ๋ฆฌ์คํธ(list)์ ๋ฐฐ์ด(array)์ ์ฐจ์ด๋ฅผ ๊ฐ๋จํ ๋น๊ตํด๋ณด์.
๋ฆฌ์คํธ์ ๋ฐฐ์ด์ ์์ฑ์์,
๋ฆฌ์คํธ๋ ์ ์, ์ค์, ๋ฌธ์์ด, ๋ฆฌ์คํธ ๋ฑ ๋ค์ํ ์๋ฃํ์ ํ๋์ ๋ฆฌ์คํธ์ ๋ด์ ์ ์๋ค.
๋ฐฐ์ด์ ๋์ผํ ์๋ฃํ๋ง ํ๋์ ๋ฐฐ์ด์ ๋ด์ ์ ์๋ค.
ํ์ ์,
๋ฆฌ์คํธ๋ list ํ์ ์ด๋ค.
๋ฐฐ์ด์ numpy.ndarray ํ์ ์ด๋ค.
์ถ๋ ฅํํ
๋ฆฌ์คํธ๋ ๋๊ดํธ์์ ์ฝค๋ง(,)๋ก ์์ดํ ์ ๊ตฌ๋ถํ๋ค.
๋ฐฐ์ด์ ๋๊ดํธ์์ ๊ตฌ๋ถ๊ธฐํธ ์์ด ๊ณต๋ฐฑ์ผ๋ก๋ง ์์๋ฅผ ๊ตฌ๋ถํ๋ค.
its_list = ['๋ฐ๋๋', '๋ธ๊ธฐ', 100, 5.5,['BTS', '๋ธ๋ํํฌ']]
its_array = np.array([1, 2, 3.0])
its_array1 = np.array([1, 2, '3.0'])
its_array2 = np.array([1, 2, None])
print(its_list)
print(its_array)
print(its_array1)
print(its_array2)
print(type(its_list), type(its_array), type(its_array1), type(its_array2))
['๋ฐ๋๋', '๋ธ๊ธฐ', 100, 5.5, ['BTS', '๋ธ๋ํํฌ']]
[1. 2. 3.]
['1' '2' '3.0']
[1 2 None]
<class 'list'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>
๋ฆฌ์คํธ์ ๋ฐฐ์ด์ ๊ณฑ์ ์ฐ์ฐ์ ํด๋ณด์์ ๋,
๋ฆฌ์คํธ์์ ๊ณฑ์ ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ด ๋ถ์ด๋ concatenate์ด๋ค. ์ฆ, ๊ฐ ์์์ ๊ณฑ์ ์ ํ์ง ์๋๋ค.
๋ฐฐ์ด์ ๊ฐ ์์์ ๋ฒกํฐ์ฐ์ฐ์ ํ๋ค.
print(its_list*2)
print('========')
print(its_array*2)
['๋ฐ๋๋', '๋ธ๊ธฐ', 100, 5.5, ['BTS', '๋ธ๋ํํฌ'], '๋ฐ๋๋', '๋ธ๊ธฐ', 100, 5.5, ['BTS', '๋ธ๋ํํฌ']]
========
[2. 4. 6.]
๋ฆฌ์คํธ์ ๋ฐฐ์ด์ ๋ฉ์๋
๋ฆฌ์คํธ์ ๋ฐฐ์ด์ ์๋ฃํ์ด ๋ค๋ฅด๋ฏ๋ก ์ง์ํ๋ ๋ฉ์๋์ ์ข ๋ฅ๋ ๋ค๋ฅด๋ค.
์๋ฅผ ๋ค์ด, ๋ฆฌ์คํธ์์๋ mean, argmax, round ๋ฑ์ ๋ฉ์๋๋ฅผ ์ง์ํ์ง ์๋๋ค. ๊ทธ ์ด์ ๋ ๋ฆฌ์คํธ์๋ ๋ค์ํ ์๋ฃํ์ ์ ์ฅํ ์ ์๋๋ฐ ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด์ ํ๊ท , ์ต๋๊ฐ, ์์์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
mean: ํ๊ท
argmax: ์ต๋๊ฐ ์ธ๋ฑ์ค
round: ์ซ์๋ฅผ ์ง์ ํ ์๋ฆฌ์๋ก ๋ฐ์ฌ๋ฆผ
โฆ
๋ฆฌ์คํธ์ ๋ฐฐ์ด์ ์ฐ์ฐ์๋
๋ฆฌ์คํธ์ ๋ฐฐ์ด์ ์ฐ์ฐ์๋๋ฅผ ํ์ธํด๋ณด์.
์ต๊ฐ์ ์ซ์์ ๋ํด์ 2๋ฅผ ๊ณฑํ๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ฐฐ์ด(array)๊ฐ 10๋ฐฐ ์ด์ ๋น ๋ฅด๋ค.
๋ฐฐ์ด์ ๋์ผํ ์๋ฃํ๋ง ์ ์ฅํ๋ฏ๋ก ๋ฐ์ดํฐ ์ ์ฅ์ ํ์ํ ์ ์ฅ๊ณต๊ฐ์ด ์ผ์ ํ๋ฉฐ ์ฐ์์ ์ด๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ธก๋ฉด์์ ์ธ๋ฑ์ค๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
๋ฐ๋ฉด, ๋ฆฌ์คํธ๋ ๋ค์ํ ์๋ฃํ์ ์ ์ฅํ ์ ์์ด์ ํ์ํ ์ ์ฅ๊ณต๊ฐ์ด ์ผ์ ํ์ง ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ํ๋๊ณต๊ฐ๋ ์ฐ์์ ์ด์ง ์๋ค. ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋ง ์ด๋ ๋ช ๋ฒ์งธ ๋ฐ์ดํฐ์ธ๊ฐ ์ ๋๋ฅผ ์๋ฏธํ๋ค.
import time
a = list(range(10 ** 8))
start = time.time()
[i *2 for i in a]
end = time.time()
print(f'๋ฆฌ์คํธ ์คํ์๊ฐ: {end - start}')
a = np.array(range(10 ** 8))
start = time.time()
a * 2
end = time.time()
print(f'๋ฐฐ์ด ์คํ์๊ฐ: {end - start}')
์ธ๋ฑ์ฑ#
1์ฐจ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ฑํ๋ ๊ฒ์ ๋ฆฌ์คํธ์ ๋์ผํ๋ค.
ar=np.arange(12)
print(ar, '\n\n===๊ฒฐ๊ณผ===')
print(ar[5])
[ 0 1 2 3 4 5 6 7 8 9 10 11]
===๊ฒฐ๊ณผ===
5
2์ฐจ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋๊ดํธ๋ฅผ ์ฐ์ํ์ฌ ์ฐ๊ณ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ ๋ฃ๊ฑฐ๋ ํ๋์ ๋๊ดํธ์ ์ฝค๋ง๋ก ๊ตฌ๋ถํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋ฃ์ด์ค๋ค.
- ๋ฐฐ์ด๋ช
[ํ์ธ๋ฑ์ค][์ด์ธ๋ฑ์ค]
- ๋ฐฐ์ด๋ช
[ํ์ธ๋ฑ์ค,์ด์ธ๋ฑ์ค]
ar[1][2]์ ๊ฐ์ด ๋๊ดํธ๋ฅผ ์ฐ์ํ์ฌ ์ฐ๋ฉด ๊ฐ์ฅ ์ ๋๊ดํธ๋ถํฐ ์ธ๋ฑ์ฑ ํ์ฌ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ๋ค์ ๋๊ดํธ์ ์ธ๋ฑ์ฑ์ ์ฐจ๋ก๋๋ก ํ๋ค. ์ฆ, ์์ ๋๊ดํธ๋ฅผ ํตํด ๋์จ ๊ฒฐ๊ณผ๊ฐ ์์ ๋ฒ์์ ๋์์ด ๋๋ค.
ar[1,2]์ ๊ฐ์ด ํ๋์ ๋๊ดํธ์์ ํ๊ณผ ์ด์ ์ฝค๋ง๋ก ๊ตฌ๋ถํ๋ฉด ์์ ๋ฒ์๊ฐ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋์์ผ๋ก ํ๋ค.
ar=np.arange(12).reshape(4,3)
print(ar, '\n\n===๊ฒฐ๊ณผ===')
print(ar[1][2])
print(ar[1,2])
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
===๊ฒฐ๊ณผ===
5
5
์ฌ๋ผ์ด์ฑ#
์ฌ๋ผ์ด์ฑ์ ๊ฒฝ์ฐ์๋ ๋๊ดํธ๋ฅผ ์ฐ์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๊ณผ ํ๋์ ๋๊ดํธ์ ์ฝค๋ง๋ก ๋์ดํ๋ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ ์๋ ์๋ค.
ar=np.arange(12).reshape(3,4)
print(ar)
print('\n\n===์ฐ์๋ ๋๊ดํธ ๊ฒฐ๊ณผ===')
print(ar[1:][1:])
print('\n\n===ํ๋์ ๋๊ดํธ ๊ฒฐ๊ณผ===')
print(ar[1:, 1:])
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
===์ฐ์๋ ๋๊ดํธ ๊ฒฐ๊ณผ===
[[ 8 9 10 11]]
===ํ๋์ ๋๊ดํธ ๊ฒฐ๊ณผ===
[[ 5 6 7]
[ 9 10 11]]
์์ ์ฝ๋์์ ar[1:]์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
[[ 4 5 6 7]
[ 8 9 10 11]]
์ด ๊ฒฐ๊ณผ๋ฅผ ๋์์ผ๋ก ๋๋ฒ์งธ ๋๊ดํธ [1:]์ ์ฌ๋ผ์ด์ฑํ๋ค. ๊ฒฐ๊ณผ๋ [ 8 9 10 11]๊ฐ ์ฌ๋ผ์ด์ฑ ๋๋ค.
๋ฐ๋ฉด, ar[1:, 1:]๋ ar ์ ์ฒด๋ฅผ ๋์์ผ๋ก ์์ ํ๋ฏ๋ก ํ์ 1ํ๋ถํฐ ๋๊น์ง, ๊ทธ ๋ฒ์์์ ์ด์ด 1์ด๋ถํฐ ๋๊น์ง๋ฅผ ์ฌ๋ผ์ด์ฑํ๋ค.
๋ฐฐ์ด์ ์ ์ฉํ ํจ์๋คI#
๋ฐฐ์ด์ ์์ฑํ ๋ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ ์ฉํ ํจ์๋ฅผ ์ดํด๋ณธ๋ค.
zeros()
ones()
np.random
linspace()
transpose()
zeros()#
zeros(): 0์ผ๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ ์์ฑํ๋ค. ์ฃผ๋ก ๋ฐฐ์ด์ 0์ผ๋ก ์ด๊ธฐํํ ๋ ์ฌ์ฉํ๋ค.
ar_zero = np.zeros((3,6))
print(ar_zero)
[[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]]
ones()#
ones(): 1๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ ์์ฑํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฃผ๋ก ๋ฐฐ์ด์ 1๋ก ์ด๊ธฐํํ ๋ ์ฌ์ฉํ๋ค.
ar_one = np.ones((3,6))
print(ar_one)
[[1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1.]]
np.random#
0 โค ์ค์ < 1๋ก ์ฑ์ฐ๊ธฐ: np.random.random(๋ฐฐ์ด์ํฌ๊ธฐ)
a โค ์ค์ < b๋ก ์ฑ์ฐ๊ธฐ: np.random.uniform(a, b, ๋ฐฐ์ด์ํฌ๊ธฐ)
a โค ์ ์ < b๋ก ์ฑ์ฐ๊ธฐ: np.random.randint(a, b, ๋ฐฐ์ด์ํฌ๊ธฐ)
print(np.random.random((2,5)))
[[0.88890769 0.51143429 0.61791567 0.92002254 0.53936553]
[0.37061313 0.04275031 0.68025905 0.88263387 0.6792356 ]]
print(np.random.uniform(3.5, 4, (3,2)))
[[3.85264176 3.80483267]
[3.92970749 3.66426214]
[3.81421581 3.96043566]]
print(np.random.randint(-5, 5, (2,3,4)))
[[[ 0 -5 -2 -4]
[ 0 -1 3 -1]
[-5 -5 -4 -5]]
[[-3 -3 -1 -3]
[-1 -4 -3 3]
[ 3 4 2 1]]]
๋๋คํ๊ฒ ์์ฑํ ์๋ฅผ ๊ฐ์ง 2์ฐจ์ ๋ฐฐ์ด๋ก ์ฐํฌ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด์.
์ฐํฌ๋ ๊ทธ๋ํ๋ plt.scatter()๋ก ๊ทธ๋ฆด ์ ์๋ค.
๋๋ถ๋ถ์ ํจ์๋ค์ ๋ง์ ์ต์ ๋ค์ ๊ฐ์ง๊ณ ์๊ณ scatter()ํจ์ ๋ํ ์ต์ ์ด ๋ง๋ค.
help(plt.scatter)๋ก ์ต์ ์ ํ์ธํด๋ณด๊ธฐ ๋ฐ๋๋ค.
plt.scatter(x์ถ ์ขํ, y์ถ ์ขํ)
import matplotlib.pyplot as plt
rd_num = np.random.randint(0,100,(50,2))
plt.scatter(rd_num[:,0], rd_num[:, 1],s=100)
plt.show()
linspace()#
linspace(): ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ๋ฑ๋ถํ ๋ฐฐ์ด์ ์์ฑํ๋ค.
np.linspace(start,end,๊ฐ์)
print(np.linspace(0,15,4))
[ 0. 5. 10. 15.]
linspace()๋ก ์์ฑํ ๋ฐฐ์ด์ ์ ํ ๊ทธ๋ํ์ y์ถ์ ๊ฐ์ ์์ฑํ๋๋ฐ ์ฌ์ฉํด๋ณด์.
rd_num = np.random.randint(0,700000,(25,))
rd_num1 = np.random.randint(800,2000,(25,))
plt.scatter(rd_num, rd_num1,s=50)
x = np.linspace(100000, 700000, 100)
y = 0.0012*x+700
plt.plot(x, y, ls='dashed', color='g')
plt.show()
transpose()#
transpose(): ํ๊ณผ ์ด์ ๊ต์ฒดํ๋ค.
๋ฐฐ์ด๋ช .T๋ ๊ฐ๋ฅํ๋ค.
np.transpose(๋ฐฐ์ด๋ช
)
๋ฐฐ์ด๋ช
.T
ar= np.arange(10).reshape(2,5)
print(ar)
print('\n\n===๊ฒฐ๊ณผ===')
print(ar.T)
[[0 1 2 3 4]
[5 6 7 8 9]]
===๊ฒฐ๊ณผ===
[[0 5]
[1 6]
[2 7]
[3 8]
[4 9]]
๋ฐฐ์ด์ ์ ์ฉํ ํจ์๋คII#
๋ฐฐ์ด์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ ์ฉํ ํจ์๋ฅผ ์ดํด๋ณธ๋ค.
where()
max(), min()
argmax(), argmin()
sum(), mean(), median()
var(), std()
unique()
abs()
sin(), cos()
dot()
where()#
where(): ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๊ฑฐ๋, ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฐ์ ๋ค๋ฅด๊ฒ ์ ์ฉ์ํจ๋ค.
np.where(์กฐ๊ฑด, True์ผ๋ ์ ์ฉ๊ฐ, False์ผ๋ ์ ์ฉ๊ฐ)
# ๋ฌธ์์ด ๋ฐฐ์ด (์ฑ๋ณ ๋ฐ์ดํฐ)
gender = np.array(['๋จ์', '์ฌ์', '๋จ์', '์ฌ์', '๋จ์'])
print(gender)
print('\n\n===๊ฒฐ๊ณผ===')
gender_numeric = np.where(gender == '๋จ์', 0, 1)
print(gender_numeric)
['๋จ์' '์ฌ์' '๋จ์' '์ฌ์' '๋จ์']
===๊ฒฐ๊ณผ===
[0 1 0 1 0]
column_stack()#
np.column_stack(): 1์ฐจ์ ๋ฐฐ์ด ์ฌ๋ฌ ๊ฐ๋ฅผ ์ด ๋จ์๋ก ํฉ์ณ์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ์ค๋ค.
# ์ ์ ๋ฐฐ์ด (์: ์ํ ์ ์)
scores = np.array([85, 90, 78, 92, 88])
# ์ด ๋ฐฉํฅ์ผ๋ก ํฉ์น๊ธฐ (1์ฐจ์ โ 2์ฐจ์ ๋ณํ)
combined = np.column_stack((gender_numeric, scores))
print(combined)
[[ 0 85]
[ 1 90]
[ 0 78]
[ 1 92]
[ 0 88]]
min(), max()#
np.min(): ์ต์๊ฐ์ ๋ฐํํ๋ค.
np.max(): ์ต๋๊ฐ์ ๋ฐํํ๋ค.
# ์ต์๊ฐ, ์ต๋๊ฐ
print(combined)
print('\n\n===๊ฒฐ๊ณผ===')
print(np.min(combined[:, 1:]))
print('\n\n===๊ฒฐ๊ณผ===')
print(np.max(combined[:, 1:]))
[[ 0 85]
[ 1 90]
[ 0 78]
[ 1 92]
[ 0 88]]
===๊ฒฐ๊ณผ===
78
===๊ฒฐ๊ณผ===
92
argmin(), argmax()#
argmin(): ์ต์๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.
argmax(): ์ต๋๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.
print(np.argmin(combined[:, 1:]))
print(np.argmax(combined[:, 1:]))
2
3
sum(), mean(), median()#
np.sum(๋ฐฐ์ด๋ช ): ํฉ์ ๋ฐํํ๋ค.
np.mean(๋ฐฐ์ด๋ช ): ํ๊ท ์ ๋ฐํํ๋ค.
np.median(๋ฐฐ์ด๋ช ): ์ค๊ฐ๊ฐ์ ๋ฐํํ๋ค. ์ด ๋ ์ต์ axis๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๊ณ ์ ํ๋ ์ถ์ ๋ช ์ํด ์ค ์ ์๋ค.
axis=0: ํ์ ๋ฐ๋ผ ์ง๊ณ(์ธ๋ก ๋ฐฉํฅ)
axis=1: ์ด์ ๋ฐ๋ผ ์ง๊ณ(๊ฐ๋ก ๋ฐฉํฅ)
print(combined)
print('\n\n===๊ฒฐ๊ณผ===')
print(np.sum(combined[:, 1:]))
print(np.mean(combined[:, 1:]))
print(np.median(combined[:, 1:]))
[[ 0 85]
[ 1 90]
[ 0 78]
[ 1 92]
[ 0 88]]
===๊ฒฐ๊ณผ===
433
86.6
88.0
ar= np.arange(1,31,2).reshape(3,5)
print(ar)
print('\n\n===๊ฒฐ๊ณผ===')
print(np.sum(ar, axis=0))
print(np.sum(ar, axis=1))
[[ 1 3 5 7 9]
[11 13 15 17 19]
[21 23 25 27 29]]
===๊ฒฐ๊ณผ===
[33 39 45 51 57]
[ 25 75 125]
๐์๋ ๊ฐ๋ค์ ํ๊ท ์ ๋ฐฑ๋ถ์จ๋ก ์์์ 2์๋ฆฌ๊น์ง ๋ํ๋ด์์ค. ์์์ ์ ๊ตฌํ ๋๋ round()ํจ์๋ฅผ ์ฌ์ฉํ์ธ์.
np.array([0.83333333, 0.76404494, 0.85393258, 0.82022472, 0.86516854,0.80898876, 0.80898876, 0.7752809 , 0.84269663, 0.82022472])
๋ฐ์ดํฐ๋ฅผ ์์์ n์๋ฆฌ๊น์ง ๋ํ๋ด๋ ๋ฐฉ๋ฒ
๋ฐ์ดํฐ.round(n)
np.round(๋ฐ์ดํฐ,n)
var(), std()#
np.var(): ๋ถ์ฐ์ ๊ตฌํ๋ค.
np.std(): ํ์คํธ์ฐจ๋ฅผ ๊ตฌํ๋ค.
ar=np.random.uniform(1,100,80)
print(ar)
print('\n\n===๊ฒฐ๊ณผ===')
print(np.var(ar))
print(np.std(ar))
[61.15443276 5.1916588 2.69980104 57.36662744 98.28507116 16.32277576
92.23525961 57.97153464 13.54341839 88.36196388 24.23658132 73.37069464
14.89501213 78.42120069 70.1854252 89.92380907 68.28570372 22.4513462
58.2135244 51.05532001 32.46167077 86.26659832 81.24239442 55.93199192
79.91760531 56.88564624 14.45909547 96.32432359 79.29156732 73.33342076
38.50709661 97.3920509 10.50657443 46.36477415 59.29510415 31.5001885
76.51506906 43.87484924 29.3975596 94.18291917 56.3952613 67.87816564
24.79055244 79.3396185 80.78986427 35.85312994 73.98010667 3.97786957
68.32476898 98.91751437 49.05207953 95.65614865 88.60736896 53.8800092
94.59694038 36.97851437 44.10701109 40.93317322 72.20910665 20.76389662
64.89879313 23.84995655 66.16617994 77.20294221 8.85210127 87.61857474
9.80089984 61.77656335 56.11413921 24.98175278 98.52178736 37.96447809
88.98820493 94.86694728 76.85694418 54.74857887 69.60643049 80.87165221
73.21420396 12.57258197]
===๊ฒฐ๊ณผ===
796.1964635698172
28.21695347782636
unique()#
np.unique(): ์ค๋ณต๊ฐ์ ์ ๊ฑฐํ์ฌ 1์ฐจ์์ผ๋ก ๋ฐํํ๋ค.
ar = np.random.randint(-10, 10, (2,5))
print(ar)
print('\n\n===๊ฒฐ๊ณผ===')
print(np.unique(ar))
[[ -6 -6 -6 7 6]
[ 5 3 -10 9 -8]]
===๊ฒฐ๊ณผ===
[-10 -8 -6 3 5 6 7 9]
abs()#
np.abs(): ์ ๋๊ฐ์ ๊ตฌํ๋ค.
ar = np.random.randint(-10, 10, (2,5))
print(ar)
print('\n\n===๊ฒฐ๊ณผ===')
print(np.abs(ar))
[[ 1 2 -4 8 6]
[-9 9 -1 -7 0]]
===๊ฒฐ๊ณผ===
[[1 2 4 8 6]
[9 9 1 7 0]]
dot()#
np.dot(a, b): ํ๋ ฌ์ ๊ณฑ(๋ด์ )์ ๊ตฌํ๋ค.
a@b์ ๊ฐ์ด
@๊ธฐํธ๋ก ๋ํ๋ด๊ธฐ๋ ํ๋ค.
๋ ํ๋ ฌ A์ ์ด์ ๊ฐ์์ ํ๋ ฌ B์ ํ์ ๊ฐ์๊ฐ ๊ฐ์ ๋ ํ๋ ฌ A์ ์ iํ์ ๊ฐ ์์์ ํ๋ ฌ B์ ์ j์ด์ ๊ฐ ์์๋ฅผ ๊ทธ ์์๋๋ก ๊ณฑํ์ฌ ๋ํ ๊ฒ์ (i,j)์์๋ก ํ๋ ํ๋ ฌ์ ๋ ํ๋ ฌ A์ B์ ๊ณฑ์ด๋ผ๊ณ ํ๋ค.
===a===
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
===b===
[[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
[[1*3 + 2*5 + 3*7 + 4*9 + 5*11],
[1*4 + 2*6 + 3*8 + 4*10 + 5*12]
[6*3 + 7*5 + 8*7 + 9*9 +10*11],
[6*4 + 7*6 + 8*8 + 9*10 + 10*12]]
a = np.arange(1,11,1).reshape(2,5)
b = np.arange(3,13,1).reshape(5,2)
print('===a===')
print(a)
print('\n\n===b===')
print(b)
print('\n\n===๊ฒฐ๊ณผ===')
print(a@b)
===a===
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
===b===
[[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
===๊ฒฐ๊ณผ===
[[125 140]
[300 340]]

ํ์ผ์ ์ฅ savetxt() , ์ฝ์ด์ค๊ธฐ loadtxt#
np.savetxt(ํ์ผ๋ช , ๋ฐฐ์ด๋ช ): ๋ฐฐ์ด์ ํ ์คํธ ํ์ผ๋ก ์ ์ฅํ๋ค.
np.loadtxt(ํ์ผ๋ช ): ํ์ผ์ ๋ฐฐ์ด๋ก ๋ถ๋ฌ์จ๋ค.
np.savetxt('File123.txt', ar)
ar=np.loadtxt('File123.txt')
print(ar)
Shallow Copy vs. Deep Copy#
๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ, ์งํฉ, ๋ฐฐ์ด ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ ๋ณต์ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ํ๊ธฐ๋ฅผ ์ํ ๋๊ฐ ์๋ค. ์ด๋ค์ ๋ชจ๋ mutable ๋ฐ์ดํฐํ์ ์ด๊ณ , ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋์ ๋ฌธ์ ์ ๊ณผ ๋ฐฉ๋ฒ์ ์์๋ณด์.
๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์๋ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
์ผ๋ฐ๋ณต์ฌ: ์์กฐ๋ณ์์ ๋ณต์ฌ๋ณ์๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐ
Shallow Copy : ์์กฐ๋ณ์์ ๋ณต์ฌ๋ณ์๊ฐ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ 2์ฐจ์ ์ด์์ธ ๊ฒฝ์ฐ ๋์ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐ
Deep Copy : ๋ณต์ฌ๋ณ์๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ์์ฑ
์ผ๋ฐ๋ณต์ฌ#
cp_a = a์ ๊ฐ์ ๋ณต์ฌํ ์ ์๋ค.๊ทธ๋ฌ๋ ์ด์ ๊ฐ์ ๋ณต์ฌ์ ๋ฌธ์ ๋ ๋ณต์ฌ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ํ๋ฉด ์์กฐ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ ๋๊ฐ์ด ์์ ๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ ์ด์ ๋ ๋ณต์ฌ๋ณ์์ ์์กฐ๋ณ์๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ด๋ค.

๋ค์ ์ฝ๋๋ฅผ ํตํด ํ์ธํด๋ณด์.
๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ, ์งํฉ, ๋ฐฐ์ด ๊ฐ๊ฐ์ ๋ณ์ a, b, c, d๋ฅผ ์ ์ํ์๋ค.
a=[1,2,3,[10,20,30]] #๋ฆฌ์คํธ
b={'a':1, 'b':2, 'c':[10,20,30]} #๋์
๋๋ฆฌ
c={1,2,3,(10,20,30)} # ์งํฉ
d=np.array([[1,2,3],[10,20,30]])
print('Origin Data===================')
print(f'๋ฆฌ์คํธ: {a}')
print(f'๋์
๋๋ฆฌ: {b}')
print(f'์งํฉ: {c}')
print(f'๋ฐฐ์ด: {d}')
Origin Data===================
๋ฆฌ์คํธ: [1, 2, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 2, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 2 3]
[10 20 30]]
์์์ ์ ์ํ ๋ณ์ a, b, c, d๋ฅผ ๋ณ์ a1, b1, c1,d1์ ๊ฐ๊ฐ ๋ณต์ฌํ์๋ค.
a1=a
b1=b
c1=c
d1=d
print('Copy Data=============')
print(f'๋ฆฌ์คํธ: {a1}')
print(f'๋์
๋๋ฆฌ: {b1}')
print(f'์งํฉ: {c1}')
print(f'๋ฐฐ์ด: {d1}')
Copy Data=============
๋ฆฌ์คํธ: [1, 2, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 2, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 2 3]
[10 20 30]]
๋ณต์ฌํ ๋ณ์ a1, b1, c1, d1์ ๊ฐ์ ์ผ๋ถ๋ฅผ ์์ ํ์๋ค.
a1[1]=100
b1['b']=100
c1.update((5,6,7))
d1[0][1]=100
์์กฐ๋ณ์ a, b, c, d์ ๋ณต์ฌ๋ณ์ a1, b1, c1, d1์ ์ถ๋ ฅํด๋ณด๋ฉด,
์์กฐ๋ณ์์ ๊ฐ๊น์ง ์์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
print('Copy Data ์์ ํ origin data=============')
print(f'๋ฆฌ์คํธ: {a}')
print(f'๋์
๋๋ฆฌ: {b}')
print(f'์งํฉ: {c}')
print(f'๋ฐฐ์ด: {d}')
print('\nCopy Data ์์ ํ copy data=============')
print(f'๋ฆฌ์คํธ: {a1}')
print(f'๋์
๋๋ฆฌ: {b1}')
print(f'์งํฉ: {c1}')
print(f'๋ฐฐ์ด: {d1}')
Copy Data ์์ ํ origin data=============
๋ฆฌ์คํธ: [1, 100, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 100, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, 5, 6, 7, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 100 3]
[ 10 20 30]]
Copy Data ์์ ํ copy data=============
๋ฆฌ์คํธ: [1, 100, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 100, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, 5, 6, 7, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 100 3]
[ 10 20 30]]
์์กฐ๋ณ์์ ๋ณต์ฌ๋ณ์์ ID๊ฐ ๋์ผํ์ง ์์๋ณด๊ธฐ ์ํด is ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํด๋ณผ ์ ์๋ค.
is ์ฐ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ฆ ๊ฐ์ฒด์ ID๊ฐ ๋์ผํ์ง ํ์ธํ๋ ์ฐ์ฐ์์ด๋ค.
๊ฐ์ด ๋์ผํ์ง ํ์ธํ๋ ๊ฒ์
==๋ฅผ ์ฌ์ฉํ๊ณ , ID๊ฐ ๋์ผํ์ง ํ์ธํ๊ธฐ ์ํด์๋ is ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
print(a is a1)
print(b is b1)
print(c is c1)
print(d is d1)
True
True
True
True
copy() ๋ฉ์๋(shallow copy)#
์์กฐ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ copy() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ณด์.
๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ, ์งํฉ, ๋ฐฐ์ด ๊ฐ๊ฐ์ ๋ณ์ a, b, c, d๋ฅผ ์ ์ํ์๋ค.
a=[1,2,3,[10,20,30]] #๋ฆฌ์คํธ
b={'a':1, 'b':2, 'c':[10,20,30]} #๋์
๋๋ฆฌ
c={1,2,3,(10,20,30)} # ์งํฉ
d=np.array([[1,2,3],[10,20,30]])
print('Origin Data===================')
print(f'๋ฆฌ์คํธ: {a}')
print(f'๋์
๋๋ฆฌ: {b}')
print(f'์งํฉ: {c}')
print(f'๋ฐฐ์ด: {d}')
Origin Data===================
๋ฆฌ์คํธ: [1, 2, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 2, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 2 3]
[10 20 30]]
์ด๋ฒ์๋ copy() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์ฌํ์๋ค.
a1=a.copy()
b1=b.copy()
c1=c.copy()
d1=d.copy()
print('Copy Data=============')
print(f'๋ฆฌ์คํธ: {a1}')
print(f'๋์
๋๋ฆฌ: {b1}')
print(f'์งํฉ: {c1}')
print(f'๋ฐฐ์ด: {d1}')
Copy Data=============
๋ฆฌ์คํธ: [1, 2, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 2, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 2 3]
[10 20 30]]
๋ณต์ฌํ ๋ณ์ a1, b1, c1, d1์ ๊ฐ์ ์ผ๋ถ๋ฅผ ์์ ํ์๋ค.
a1[1]=100
b1['b']=100
c1.update((5,6,7))
d1[0][1]=100
์์กฐ๋ณ์ a, b, c, d์ ๋ณต์ฌ๋ณ์ a1, b1, c1, d1์ ์ถ๋ ฅํด๋ณด๋ฉด, ์์กฐ๋ณ์์ ๊ฐ์ ๊ทธ๋๋ก ์ ์ง๋๊ณ , ๋ณต์ฌ๋ณ์์ ๊ฐ๋ง ์์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
print('Copy Data ์์ ํ origin data=============')
print(f'๋ฆฌ์คํธ: {a}')
print(f'๋์
๋๋ฆฌ: {b}')
print(f'์งํฉ: {c}')
print(f'๋ฐฐ์ด: {d}')
print('\nCopy Data ์์ ํ copy data=============')
print(f'๋ฆฌ์คํธ: {a1}')
print(f'๋์
๋๋ฆฌ: {b1}')
print(f'์งํฉ: {c1}')
print(f'๋ฐฐ์ด: {d1}')
Copy Data ์์ ํ origin data=============
๋ฆฌ์คํธ: [1, 2, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 2, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 2 3]
[10 20 30]]
Copy Data ์์ ํ copy data=============
๋ฆฌ์คํธ: [1, 100, 3, [10, 20, 30]]
๋์
๋๋ฆฌ: {'a': 1, 'b': 100, 'c': [10, 20, 30]}
์งํฉ: {1, 2, 3, 5, 6, 7, (10, 20, 30)}
๋ฐฐ์ด: [[ 1 100 3]
[ 10 20 30]]
๋ํ ์์กฐ๋ณ์ a, b, c, d์ ๋ณต์ฌ๋ณ์ a1, b1, c1, d1๊ฐ ์๋ก ๋ค๋ฅธ ID๋ฅผ ๊ฐ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
print(a is a1)
print(b is b1)
print(c is c1)
print(d is d1)
False
False
False
False
ํ์ง๋ง ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ๋ฆฌ์คํธ์์ ๋ฆฌ์คํธ์ด๊ฑฐ๋, ๋์ ๋๋ฆฌ์์ ๋ฆฌ์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์์ ํ์ ๋ ์ฌ์ ํ ์์กฐ๋ณ์์ ๊ฐ์ด ๊ฐ์ด ์์ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
a=[1,2,3,[10,20,30]]
b={'a':1, 'b':2, 'c':[10,20,30]}
c=np.array([{'a':[1,2]},{'b':[1,2]},{'c':[1,2]}])
a[3]์ ๊ฐ์ด [10,20,30]๋ฆฌ์คํธ์ด๋ค.
b[โcโ]์ ๊ฐ์ด [10,20,30]๋ฆฌ์คํธ์ด๋ค.
c์ ๊ฐ ๊ฐ๋ค์ด ๋ฆฌ์คํธ์ด๋ค.
a=[1,2,3,[10,20,30]]
b={'a':1, 'b':2, 'c':[10,20,30]}
c=np.array([{'a':[1,2]},{'b':[1,2]},{'c':[1,2]}])
a1=a.copy()
b1=b.copy()
c1=c.copy()
a1[3][0]='here'
b1['c'][0]='here'
c1[0]['a'][0]=100

์๋ณธ ๋ฐ์ดํฐ์ ๋ณต์ฌ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
print(a, a1)
print(b, b1)
print(c, c1)
[1, 2, 3, ['here', 20, 30]] [1, 2, 3, ['here', 20, 30]]
{'a': 1, 'b': 2, 'c': ['here', 20, 30]} {'a': 1, 'b': 2, 'c': ['here', 20, 30]}
[{'a': [100, 2]} {'b': [1, 2]} {'c': [1, 2]}] [{'a': [100, 2]} {'b': [1, 2]} {'c': [1, 2]}]
Deepcopy()#
Deep copy๋ ๋ณต์ฌ๋ณ์์ ๊ฐ์ ์์ (์์ , ์ญ์ , ์ถ๊ฐ ๋ฑ)ํด๋ ์๋ณธ๋ณ์์ ๊ฐ์ด ์์ ๋์ง ์๋๋ค.
import copy
a=[1,2,3,[10,20,30]]
b=copy.deepcopy(a)
b[3][0] = 100
print(a)
print(b)
[1, 2, 3, [10, 20, 30]]
[1, 2, 3, [100, 20, 30]]
๋ง๋ฌด๋ฆฌ#
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋์๋ ์ด๋ ํ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํ ๊ฒ์ธ์ง๋ฅผ ๋จผ์ ์๊ฐํด์ผ ํ๋ค.
์๋ฃ๊ตฌ์กฐ์๋ ๋ฐ์ดํฐ์ ์์ , ์ฝ์ , ์ถ๊ฐ, ์ญ์ ๊ฐ ์์ ๋ก์ด ๊ฐ๋ณ ๋ฐ์ดํฐ ํ์ ๊ณผ ํ๋ฒ ๋ง๋ค๊ณ ๋๋ฉด ์์ , ์ฝ์ , ์ถ๊ฐ, ์ญ์ ํ ์ ์๋ ๋ถ๋ณ ๋ฐ์ดํฐ ํ์ ์ด ์๋ค.
๋ชจ๋ numpy๋ ๋๊ท๋ชจ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
NumPy๋ ์๋ ํจ์๊ฐ ๋ง๊ณ ๊ธฐ๋ฅ์ด ๊น์ด์, 2์๊ฐ ์์ ๋ง์ผ๋ก ์ ๋ถ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๋ค. ์ค๋ ๋ฐฐ์ด ๋ฐฐ์ด ์์ฑ, ์ฐ์ฐ, ์ ์ฉํ ํจ์ ์ ๋๋ง ์ตํ๋ ๋ฐ์ดํฐ ๋ค๋ฃจ๋ ๊ฐ์ ์ก์ ์ ์๋ค. ์ดํ์ ํ์ํ ๋ ํ๋์ฉ ์ฐพ์์ ์ตํ๋ฉด ์ถฉ๋ถํ๋ค.
numpy ๋ชจ๋์ ๋ฐฐ์ด(array)๊ณผ ๋ฆฌ์คํธ๋ ๋ฒกํฐ์ฐ์ฐ ์ ๊ณต ์ฌ๋ถ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๋ ์ธก๋ฉด์์ ๋ง์ ์ฐจ์ด๊ฐ ์๋ค.
shallow copy(์์ ๋ณต์ฌ)์ deep copy(๊น์ ๋ณต์ฌ)์ ์ฐจ์ด๋ฅผ ์ดํดํ๊ณ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ๋ค.
F37.101 ์ปดํจํ ๊ธฐ์ด: ์ฒ์ ๋ง๋๋ ์ปดํจํ (First Adventures in Computing) ์์ธ๋ํ๊ต ํ๋ถ๋ํ ๋ณํด์