๋ชฉ์ฐจ
๋ฐ์ํ
Introduction to Numpy
Numpy๋ numberal Python์ ์ฝ์๋ก, ์์น ๊ณ์ฐ์ ์ง์ํ๊ธฐ ์ํ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง ์ ๋๋ค.
- Numpy์์ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ndarray๋ผ๋ ๋ค์ฐจ์ ๋ฐฐ์ด ๊ฐ์ฒด์ ๋๋ค.
- Numpy๋ ndarray์ ์์๋ค์ ํจ์จ์ ์ผ๋ก ์กฐ์ํ ์ ์๋ ์ผ๋ จ์ ํจ์๋ค์ ์ ๊ณตํ๋ค๋ ํน์ง์ด ์์ต๋๋ค.
- ์ค๋ช ์๋ฅผ ๋ณด๋ ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ๊ธ๋ฉด ํ๋ฒ Numpy์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
- ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ํญ์ ๊ตฌ๊ธ๋ง์ ์๋ํ๊ฑฐ๋ help()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Creating ndarray
ndarray๋ list ๋๋ tuple ๊ฐ์ฒด์์ ์์ฑํ ์ ์์ต๋๋ค.
- numpy.array๋ ์์ฑ ๋ฐ ๋ฐฐ์ด์ ์ํ ํธ์ ๊ธฐ๋ฅ์ผ ๋ฟ ์ ๋๋ค.
- numpy.ndarray๋ ํด๋์ค์ ๋๋ค.
Tensor๋ ๋ค์ฐจ์ ๋ฐฐ์ด๋ก ํํํ ์ ์๋ "์ด๋ค ๊ฒ"์ ๋๋ค.
Tensorflow๋ ๋ฅ๋ฌ๋์ ์ํ ๊ตฌ๊ธ ์ ํ์ ๋๋ค.
Tensorflow ์ฝ๋ฉ์ ๊ฒฝ์ฐ, numpy ์ฐจ์ ๋ฐฐ์ด์ ๋งค์ฐ ๋ฅ์ํด์ผ ํฉ๋๋ค.
import numpy
import numpy as np
oneDim = np.array([1.0,2,3,4,5]) # a 1-dimensional array (vector)
print(oneDim)
print("#Dimensions =", oneDim.ndim)
print("Dimension =", oneDim.shape)
print("Size =", oneDim.size)
print("Array type =", oneDim.dtype)
[1. 2. 3. 4. 5.]
#Dimensions = 1
Dimension = (5,)
Size = 5
Array type = float64
- ์๋ ์์๋ฅผ ๋ณด๋ฉด Numpy Element์ C ๋ฐฐ์ด๊ณผ ๊ฐ์ ์ ํ์ด ํ๋๋ง ์กด์ฌํฉ๋๋ค.
twoDim = np.array([[1,2],[3,4],[5,6],[7,8]]) # a two-dimensional array (matrix)
print(twoDim)
print("#Dimensions =", twoDim.ndim)
print("Dimension =", twoDim.shape)
print("Size =", twoDim.size)
print("Array type =", twoDim.dtype)
[[1 2]
[3 4]
[5 6]
[7 8]]
#Dimensions = 2
Dimension = (4, 2)
Size = 8
Array type = int32
arrFromTuple = np.array([(1,'a',3.0),(2,'b',3.5)]) # create ndarray from tuple
print(arrFromTuple)
print("#Dimensions =", arrFromTuple.ndim)
print("Dimension =", arrFromTuple.shape)
print("Size =", arrFromTuple.size)
print("Array type =", arrFromTuple.dtype)
[['1' 'a' '3.0']
['2' 'b' '3.5']]
#Dimensions = 2
Dimension = (2, 3)
Size = 6
Array type = <U11
# Guess what is printed
print(np.array([1]).shape)
print(np.array([1,2]).shape)
print(np.array([[1],[2]]).shape)
print(np.array([[[1,2,3],[1,2,3]]]).shape)
print(np.array([[[[]]]]).shape)
(1,)
(2,)
(2, 1)
(1, 2, 3)
(1, 1, 1, 0)
- np.array([1]).shape: ๋ฐฐ์ด [1]์ ์์๊ฐ ํ๋์ธ 1์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ๋ฐ๋ผ์ shape๋ (1,)์ ๋๋ค.
- np.array([1,2]).shape: ๋ฐฐ์ด [1,2]์ ์์๊ฐ ๋ ๊ฐ์ธ 1์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ๋ฐ๋ผ์ shape๋ (2,)์ ๋๋ค.
- np.array([[1],[2]]).shape: ๋ฐฐ์ด [[1], [2]]์ ๋ ๊ฐ์ ์์๊ฐ ๊ฐ๊ฐ ํ๋์ฉ ๋ค์ด์๋ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ๋ฐ๋ผ์ shape๋ (2,1)์ ๋๋ค.
- np.array([[[1,2,3],[1,2,3]]]).shape:
- ๋ฐฐ์ด [[[1,2,3], [1,2,3]]]์ 1์ฐจ์ ์์(๋ฆฌ์คํธ)๊ฐ 2๊ฐ์ ํ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๊ฐ ํ์ ๋ฆฌ์คํธ๋ 3๊ฐ์ ์์๋ฅผ ํฌํจํฉ๋๋ค. ๋ฐ๋ผ์ shape๋ (1,2,3)์ ๋๋ค.
- np.array([[[[]]]]).shape:
- ๋ฐฐ์ด [[[]]]์ 4์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. 1๊ฐ์ ์์(๋ฆฌ์คํธ)๊ฐ ์๊ณ , ๊ทธ ์์ ๋ค์ 1๊ฐ์ ๋ฆฌ์คํธ๊ฐ ํฌํจ๋๋ฉฐ, ๊ทธ ์์ 1๊ฐ์ ๋น ๋ฆฌ์คํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ฐ๋ผ์ shape๋ ๊ฐ์ฅ ๊น์ ์ฐจ์๊น์ง ๊ฐ ์ฐจ์์์ ํ๋์ ์์๋ฅผ ๊ฐ์ง๋ฏ๋ก (1,1,1,0)์ ๋๋ค.
- Numpy์๋ ๋ฐฐ์ด์ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
print(np.random.rand(5)) # [0,1] ์ฌ์ด์ ๊ท ๋ฑ ๋ถํฌ์์ ๋ฌด์์ ์ซ์ ์์ฑ
print(np.random.randn(5)) # ํ๊ท 0, ํ์ค ํธ์ฐจ 1์ ์ ๊ท ๋ถํฌ์์ ๋ฌด์์ ์ซ์ ์์ฑ
print(np.arange(-10,10,2)) # range์ ๋น์ทํ์ง๋ง ๋ฆฌ์คํธ ๋์ ndarray ๋ฐํ (๋ฒ์ ์ง์ )
print(np.arange(12).reshape(3,4)) # ๋ฐฐ์ด์ 3ํ 4์ด ํ๋ ฌ๋ก ์ฌ๊ตฌ์ฑ
print(np.linspace(0,1,10)) # [0,1] ๊ตฌ๊ฐ์ 10๊ฐ์ ๊ท ๋ฑํ๊ฒ ๋๋ ๊ฐ์ผ๋ก ๋ถํ
print(np.logspace(-3,3,7)) # 10^-3์์ 10^3๊น์ง ๋ก๊ทธ ์ค์ผ์ผ๋ก ๊ท ๋ฑํ๊ฒ ๋ถํ ๋ ์ซ์ ์์ฑ
# logspace๋ ๋ก๊ทธ ์ค์ผ์ผ์์ ๊ท ๋ฑํ๊ฒ ๊ฐ๊ฒฉ์ ๋ ์ซ์๋ฅผ ๋ฐํํฉ๋๋ค.
[0.39549071 0.83200035 0.21630632 0.92803293 0.71053543]
[0.89132678 0.0393841 0.36250086 0.04464502 1.31660902]
[-10 -8 -6 -4 -2 0 2 4 6 8]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
0.66666667 0.77777778 0.88888889 1. ]
[1.e-03 1.e-02 1.e-01 1.e+00 1.e+01 1.e+02 1.e+03]
print(np.zeros((2,3))) # 2 x 3 ํฌ๊ธฐ์ ์ํ๋ ฌ
print(np.ones((3,2))) # 3 x 2 ํฌ๊ธฐ์ ์ผํ๋ ฌ
print(np.eye(3)) # 3 x 3 ๋จ์ํ๋ ฌ
[[0. 0. 0.]
[0. 0. 0.]]
[[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
์์๋ณ ์์
ndarray์ ๊ฐ ์์์ ๋ง์ , ๊ณฑ์ ๋ฑ์ ํ์ค ์ฐ์ฐ์๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
x = np.array([1,2,3,4,5])
print(x + 1) # ๋ง์
print(x - 1) # ๋บ์
print(x * 2) # ๊ณฑ์
print(x // 2) # ์ ์ ๋๋์
print(x ** 2) # ์ ๊ณฑ
print(x % 2) # ๋๋จธ์ง
print(1 / x) # ๋๋์
[2 3 4 5 6]
[0 1 2 3 4]
[ 2 4 6 8 10]
[0 1 1 2 2]
[ 1 4 9 16 25]
[1 0 1 0 1]
[1. 0.5 0.33333333 0.25 0.2 ]
Why Numpy?
import time
start = time.time() # ์์ ์๊ฐ ์ธก์
# ๋ฐ๋ณต์ ์ธ ํฉ ๊ณ์ฐ
total = 0
# 1.5๋ฐฑ๋ง ๊ฐ์ ์ซ์๋ฅผ ๋ฐ๋ณตํ์ฌ ํฉ ๊ณ์ฐ
for item in range(0, 1500000):
total = total + item
print('sum is: ' + str(total)) # ํฉ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
sum is: 1124999250000
0.1862163543701172
x = np.array([2,4,6,8,10])
y = np.array([1,2,3,4,5])
print(x + y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๋ง์
print(x - y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๋บ์
print(x * y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๊ณฑ์
print(x / y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๋๋์
print(x // y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ์ ์ ๋๋์
print(x ** y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๊ฑฐ๋ญ์ ๊ณฑ ๊ณ์ฐ
[ 3 6 9 12 15]
[1 2 3 4 5]
[ 2 8 18 32 50]
[2. 2. 2. 2. 2.]
[2 2 2 2 2]
[ 2 16 216 4096 100000]
import numpy as np # numpy ๋ชจ๋ ์ํฌํธ
start = time.time() # ์์ ์๊ฐ ์ธก์
# ๋ฒกํฐํ๋ ํฉ ๊ณ์ฐ - ๋ฒกํฐํ๋ฅผ ์ํด numpy ์ฌ์ฉ
# np.arange๋ 0๋ถํฐ 1499999๊น์ง์ ์ซ์ ์ํ์ค๋ฅผ ์์ฑ
print(np.sum(np.arange(1500000)))
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
-282181552
0.005002021789550781
import numpy as np # numpy ๋ชจ๋ ์ํฌํธ
import pandas as pd # pandas ๋ชจ๋ ์ํฌํธ
# 0์์ 50 ์ฌ์ด์ ์ ์๋ก ์ด๋ฃจ์ด์ง 5,000,000 x 4 ํฌ๊ธฐ์ ๋ฐฐ์ด ์์ฑ
# ๋ฐฐ์ด์ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ๋ณํํ๊ณ ์ด ์ด๋ฆ์ 'a', 'b', 'c', 'd'๋ก ์ค์
df = pd.DataFrame(np.random.randint(0, 50, size=(5000000, 4)), columns=('a','b', 'c', 'd'))
# df.shape: ๋ฐ์ดํฐ ํ๋ ์์ ํฌ๊ธฐ (ํํ)๋ฅผ ํ์ธ
# ์ฃผ์์๋ df.shape๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ ํ๋ ์์ ๋ชจ์์ ํ์ธํ ์ ์๋ค๋ ์์๊ฐ ์์ง๋ง,
# ์ฝ๋๋ df.shape๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค.
# ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ ๋ช ํ์ ์ถ๋ ฅ
df.head()
a | b | c | d | |
0 | 33 | 31 | 6 | 23 |
1 | 40 | 30 | 35 | 17 |
2 | 42 | 25 | 10 | 45 |
3 | 10 | 36 | 15 | 45 |
4 | 5 | 28 | 23 | 39 |
import time
start = time.time() # ์์ ์๊ฐ ์ธก์
# DataFrame์ iterrows()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต
for idx, row in df.iterrows():
# ์๋ก์ด ์ด ์์ฑ
# ๊ฐ ํ์ ๋ํด 'd' ์ด์ 'c' ์ด๋ก ๋๋๊ณ 100์ ๊ณฑํ์ฌ 'ratio' ์ด์ ์ ์ฅ
df.at[idx, 'ratio'] = 100 * (row["d"] / row["c"])
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
<ipython-input-3-ebe2cacf263b>:7: RuntimeWarning: divide by zero encountered in scalar divide
df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])
<ipython-input-3-ebe2cacf263b>:7: RuntimeWarning: invalid value encountered in scalar divide
df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])
387.2491133213043
import time
start = time.time() # ์์ ์๊ฐ ์ธก์
# ๋ฒกํฐํ๋ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ 'ratio' ์ด ์์ฑ
# 'd' ์ด์ 'c' ์ด๋ก ๋๋๊ณ 100์ ๊ณฑํ์ฌ 'ratio' ์ด์ ์ ์ฅ
df['ratio'] = 100 * (df['d'] / df['c'])
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
0.12962055206298828
Indexing & Slicing
๋ฐฐ์ด์ด ์๋ ํน์ ์์๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํฉ๋๋ค.
x = np.arange(-5, 5) # -5๋ถํฐ 4๊น์ง์ ์ซ์๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด ์์ฑ
print(x) # ๋ฐฐ์ด x ์ถ๋ ฅ
y = x[3:5] # y๋ ๋ฐฐ์ด x์ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ํ ์ฌ๋ผ์ด์ค(ํฌ์ธํฐ)์
๋๋ค.
print(y) # y ์ถ๋ ฅ
y[:] = 1000 # y์ ๊ฐ์ ์์ ํ๋ฉด ๋ฐฐ์ด x๋ ๋ณ๊ฒฝ๋ฉ๋๋ค.
print(y) # ์์ ๋ y ์ถ๋ ฅ
print(x) # y์ ์์ ์ ํตํด ๋ณ๊ฒฝ๋ ๋ฐฐ์ด x ์ถ๋ ฅ
z = x[3:5].copy() # ๋ถ๋ถ ๋ฐฐ์ด์ ๋ณต์ฌํ์ฌ z๋ฅผ ๋ง๋ญ๋๋ค.
print(z) # z ์ถ๋ ฅ
z[:] = 500 # z์ ๊ฐ์ ์์ ํด๋ ๋ฐฐ์ด x์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
print(z) # ์์ ๋ z ์ถ๋ ฅ
print(x) # ๋ฐฐ์ด x ์ถ๋ ฅ (y์ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋ ํ์ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค)
์ฃผ๋ชฉํ ์ ์ y๋ x์ ์ฌ๋ผ์ด์ค๋ก, y์ ๋ณ๊ฒฝ์ด x์๋ ์ํฅ์ ์ค๋ค๋ ์ ์ ๋๋ค. ๋ฐ๋ฉด, z๋ x์ ์ฌ๋ผ์ด์ค๋ฅผ ๋ณต์ฌํ ๊ฒ์ด๋ฏ๋ก z์ ๋ณ๊ฒฝ์ x์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
[-5 -4 -3 -2 -1 0 1 2 3 4]
[-2 -1]
[1000 1000]
[ -5 -4 -3 1000 1000 0 1 2 3 4]
[1000 1000]
[500 500]
[ -5 -4 -3 1000 1000 0 1 2 3 4]
๋น๊ณ : List๋ฅผ ์ฌ๋ผ์ด์ฑํ๋ฉด ํ์ List(sublist)์ ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง๋ง Numpy ๋ฐฐ์ด์ ์ฌ๋ผ์ด์ฑํ๋ฉด ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง ์์ต๋๋ค.
x = list(range(-5,5))
print(x)
y = x[3:5] # y is a slice, i.e., not a pointer to a list in x
print(y)
y[1] = 1000 # modifying the value of y does not change x
print(y)
print(x)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
[-2, -1]
[-2, 1000]
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
my2dlist = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] # 2์ฐจ์ ๋ฆฌ์คํธ
print(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ ์ถ๋ ฅ
print(my2dlist[2]) # ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ ๊ทผ
# `my2dlist[:][2]`๋ ๊ฐ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ ๊ทผํ๋ ค๊ณ ํ์ง๋ง, ์ ๋๋ก ๋ ์๋์ ํ์ง ์์ต๋๋ค.
# ๋์ my2dlist[2][2]๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
my2darr = np.array(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print(my2darr[2][:]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ
print(my2darr[2, :]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ (์์ ๋์ผํ ๋ฐฉ๋ฒ)
print(my2darr[:][2]) # ์๋ชป๋ ๋ฐฉ์; ๊ฐ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์๊ฐ ์๋๋ผ ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผํจ
print(my2darr[:, 2]) # ์ธ ๋ฒ์งธ ์ด์ ์ ๊ทผ
print(my2darr[:2, 2:]) # ์ฒซ ๋ ํ๊ณผ ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
print(my2darr[::2, 2:]) # ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
- my2darr[2][:]์ my2darr ๋ฐฐ์ด์ ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผํ๋ ์ฐ์ฐ.
- my2darr[2]: my2darr ๋ฐฐ์ด์์ ์ธ ๋ฒ์งธ ํ(์ธ๋ฑ์ค 2)์ ์ ํํฉ๋๋ค.
- ์ธ๋ฑ์ฑ์ 0๋ถํฐ ์์ํ๋ฏ๋ก my2darr[2]๋ ์ธ ๋ฒ์งธ ํ์ ์ ํํ๋ ๊ฒ์ ๋๋ค.
- [:]: ์ด ๋ถ๋ถ์ ์ฌ๋ผ์ด์ค ์ฐ์ฐ์๋ก, ํด๋น ํ์ ๋ชจ๋ ์ด์ ์ ํํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, my2darr[2][:]์ ์ธ ๋ฒ์งธ ํ์ ๋ชจ๋ ์ด์ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
- my2darr[2]: my2darr ๋ฐฐ์ด์์ ์ธ ๋ฒ์งธ ํ(์ธ๋ฑ์ค 2)์ ์ ํํฉ๋๋ค.
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[9, 10, 11, 12]
[9, 10, 11, 12]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[ 9 10 11 12]
[ 9 10 11 12]
[ 9 10 11 12]
[ 3 7 11]
[[3 4]
[7 8]]
[[ 3 4]
[11 12]]
- Remark again: It's indexing, not copying (๋ณต์ฌ๊ฐ ์๋๋ผ ์ธ๋ฑ์ฑ์ ๋๋ค)
my2darr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print()
sliced = my2darr[::2, 2:] # ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ฌ๋ผ์ด์ค
print(sliced) # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด ์ถ๋ ฅ
print(type(sliced)) # ์ฌ๋ผ์ด์ค์ ํ์
์ถ๋ ฅ (NumPy ๋ฐฐ์ด์)
print()
sliced[:,:] = 1000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋จ์ ํ์ธ (์ฌ๋ผ์ด์ค๋ ์๋ณธ ๋ฐฐ์ด์ ๋ทฐ์ด๋ฏ๋ก)
print()
sliced[0,0] = 2000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ ์ฒซ ๋ฒ์งธ ์ด ์์๋ฅผ 2000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋จ์ ํ์ธ (์ฌ๋ผ์ด์ค๋ ์๋ณธ ๋ฐฐ์ด์ ๋ทฐ์ด๋ฏ๋ก)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 3 4]
[11 12]]
<class 'numpy.ndarray'>
[[ 1 2 1000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
[[ 1 2 2000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
๋น๊ณ : list์ ์ฌ๋ผ์ด์ฑํ๋ฉด ํ์ ๋ชฉ๋ก์ ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง๋ง Numpy array๋ฅผ ์ฌ๋ผ์ด์ฑํ๋ฉด ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง ์์ต๋๋ค.
# ์ฃผ: ๋ฆฌ์คํธ ์ฌ๋ผ์ด์ฑ์ ํ์ ๋ฆฌ์คํธ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ญ๋๋ค.
x = list(range(-5, 5)) # -5๋ถํฐ 4๊น์ง์ ์ ์๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์คํธ ์์ฑ
print(x) # ๋ฆฌ์คํธ x ์ถ๋ ฅ
y = x[3:5] # y๋ ๋ฆฌ์คํธ x์ ํ์ ๋ฆฌ์คํธ์ ๋ํ ์ฌ๋ผ์ด์ค(๋ณต์ฌ๋ณธ)์
๋๋ค.
print(y) # y ์ถ๋ ฅ
y[1] = 1000 # y์ ๋ ๋ฒ์งธ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(y) # ์์ ๋ y ์ถ๋ ฅ
print(x) # ๋ฆฌ์คํธ x ์ถ๋ ฅ (y์ ์์ ์ ํตํด ๋ณ๊ฒฝ๋์ง ์์)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
[-2, -1]
[-2, 1000]
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
my2dlist = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] # 2์ฐจ์ ๋ฆฌ์คํธ
print(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ ์ถ๋ ฅ
print(my2dlist[2]) # ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ ๊ทผ
# `my2dlist[:][2]`๋ ํ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ์ง๋ง, ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ์ง ๋ชปํฉ๋๋ค.
# ๋์ , `my2dlist[2][2]`๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
# `my2dlist[:, 2]`๋ ํ์ด์ฌ์ ๋ฆฌ์คํธ์์๋ ์ฌ์ฉํ ์ ์๋ ๊ตฌ๋ฌธ์
๋๋ค.
my2darr = np.array(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print(my2darr[2][:]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ (๋ชจ๋ ์ด ์ ํ)
print(my2darr[2, :]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ (์์ ๋์ผํ ๋ฐฉ๋ฒ)
print(my2darr[:][2]) # ์ด ์ฝ๋๋ NumPy ๋ฐฐ์ด์์๋ ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผํฉ๋๋ค.
# ํ์ง๋ง ํ์ด์ฌ์ 2์ฐจ์ ๋ฆฌ์คํธ์์๋ ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ์์
๋๋ค.
print(my2darr[:, 2]) # ์ธ ๋ฒ์งธ ์ด์ ์ ๊ทผ
print(my2darr[:2, 2:]) # ์ฒซ ๋ ํ๊ณผ ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
print(my2darr[::2, 2:]) # ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
[ , , ] โ ์ด๋ฐ ํ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[9, 10, 11, 12]
[9, 10, 11, 12]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[ 9 10 11 12]
[ 9 10 11 12]
[ 9 10 11 12]
[ 3 7 11]
[[3 4]
[7 8]]
[[ 3 4]
[11 12]]
- Remark again: It's indexing, not copying.
my2darr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print()
sliced = my2darr[::2, 2:] # ํ์ ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ฌ๋ผ์ด์ค
print(sliced) # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด ์ถ๋ ฅ
print(type(sliced)) # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ํ์
์ถ๋ ฅ (NumPy ๋ฐฐ์ด์)
print()
sliced[:,:] = 1000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ณธ ๋ฐฐ์ด ์ถ๋ ฅ (์ฌ๋ผ์ด์ค๋ ์๋ณธ ๋ฐฐ์ด์ ๋ทฐ์ด๋ฏ๋ก ๋ณ๊ฒฝ๋จ)
print()
sliced[0,0] = 2000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ ์ฒซ ๋ฒ์งธ ์ด ์์๋ฅผ 2000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ณธ ๋ฐฐ์ด ์ถ๋ ฅ (์ฌ๋ผ์ด์ค์ ๋ณ๊ฒฝ์ด ์๋ณธ ๋ฐฐ์ด์๋ ์ํฅ์ ๋ฏธ์นจ)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 3 4]
[11 12]]
<class 'numpy.ndarray'>
[[ 1 2 1000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
[[ 1 2 2000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
- ndarray๋ ๋ถ์ธ ์ธ๋ฑ์ฑ(๋ง์คํน์ด๋ผ๊ณ ๋ ํจ)๋ ์ง์ํฉ๋๋ค.
x = np.array([1, 2, 3]) # 1, 2, 3์ผ๋ก ์ด๋ฃจ์ด์ง NumPy ๋ฐฐ์ด
print(x[1:]) # ์ฌ๋ผ์ด์ฑ: ์ธ๋ฑ์ค 1๋ถํฐ ๋ฐฐ์ด์ ๋๊น์ง ๋ฐํ
print(x[1:][0]) # ์ฌ๋ผ์ด์ฑ ํ ์ฒซ ๋ฒ์งธ ์์ ๋ฐํ
print()
print(x[[True, False, True]]) # ๋ถ๋ฆฌ์ธ ๋ง์คํน: True ๊ฐ์ด ์๋ ์ธ๋ฑ์ค์ ์์๋ง ๋ฐํ
print()
print(x[[2, 1]]) # ์ ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ: ์ธ๋ฑ์ค 2์ 1์ ์์๋ฅผ ๋ฐํ
print(x[[2, 1, 1, 1, 0]]) # ์ ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ: ์ธ๋ฑ์ค 2, 1, 1, 1, 0์ ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ฐํ
print()
x[[2, 1, 1, 1, 0]] = 0 # ์ ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ค 2, 1, 1, 1, 0์ ์์๋ฅผ 0์ผ๋ก ๋ณ๊ฒฝ
print(x) # ์์ ๋ NumPy ๋ฐฐ์ด ์ถ๋ ฅ
๊ฒฐ๊ณผ์ ์ผ๋ก x ๋ฐฐ์ด์ ์ธ๋ฑ์ฑ์ ํตํด ์ผ๋ถ ์์๋ฅผ 0์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋ฉ๋๋ค.
[2 3]
2
[1 3]
[3 2]
[3 2 2 2 1]
[0 0 0]
y = np.arange(35).reshape(5, 7) # 0๋ถํฐ 34๊น์ง์ ์ซ์๋ฅผ 5x7 ํํ์ NumPy ๋ฐฐ์ด๋ก ์์ฑ
b = y > 20 # y ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ 20๋ณด๋ค ํฐ์ง ๋น๊ตํ์ฌ ๋ถ๋ฆฌ์ธ ๋ฐฐ์ด ์์ฑ
print(b) # ๋ถ๋ฆฌ์ธ ๋ฐฐ์ด ์ถ๋ ฅ
print()
t = y[b] # ๋ถ๋ฆฌ์ธ ๋ง์คํน์ ์ฌ์ฉํ์ฌ y ๋ฐฐ์ด์์ 20๋ณด๋ค ํฐ ์์๋ฅผ ํํฐ๋ง
# ํํฐ๋ง ๊ฒฐ๊ณผ๋ ํญ์ 1์ฐจ์ ๋ฐฐ์ด์ด๋ฉฐ, ๋ณต์ฌ๋ณธ์ด ์์ฑ๋ฉ๋๋ค. ์ธ๋ฑ์ฑ์ ์๋๋๋ค.
print(t) # ํํฐ๋ง ๊ฒฐ๊ณผ ์ถ๋ ฅ
print()
t[:3] = 1000 # ํํฐ๋ง๋ ๋ฐฐ์ด์ ์ฒซ ์ธ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(t) # ์์ ๋ ํํฐ๋ง ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(y) # ์๋ณธ ๋ฐฐ์ด y ์ถ๋ ฅ
ํํฐ๋ง๋ ๋ฐฐ์ด t๋ y์ ๋ณต์ฌ๋ณธ์ด๋ฏ๋ก, t์ ์์ ์ y์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
[[False False False False False False False]
[False False False False False False False]
[False False False False False False False]
[ True True True True True True True]
[ True True True True True True True]]
[21 22 23 24 25 26 27 28 29 30 31 32 33 34]
[1000 1000 1000 24 25 26 27 28 29 30 31 32 33 34]
[[ 0 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]]
- LAB: ๊ฐ์ด 2-d ๋ฐฐ์ด์ ์ง์์ธ ๊ฒฝ์ฐ 0์ผ๋ก ์ค์ ํฉ๋๋ค.
import numpy as np
M = np.arange(35).reshape(5,7)
M
array([[ 0, 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]])
M[M % 2 == 0] = 0
M
array([[ 0, 1, 0, 3, 0, 5, 0],
[ 7, 0, 9, 0, 11, 0, 13],
[ 0, 15, 0, 17, 0, 19, 0],
[21, 0, 23, 0, 25, 0, 27],
[ 0, 29, 0, 31, 0, 33, 0]])
# First Boolean masking
np.where(M % 2 == 0, M, -M)
array([[ 0, -1, 0, -3, 0, -5, 0],
[ -7, 0, -9, 0, -11, 0, -13],
[ 0, -15, 0, -17, 0, -19, 0],
[-21, 0, -23, 0, -25, 0, -27],
[ 0, -29, 0, -31, 0, -33, 0]])
- More indexing examples: Integer array indexing
my2darr = np.arange(1, 13, 1).reshape(4, 3) # 1๋ถํฐ 12๊น์ง์ ์ซ์๋ฅผ 4x3 ํํ์ NumPy ๋ฐฐ์ด๋ก ์์ฑ
print(my2darr) # ๋ฐฐ์ด ์ถ๋ ฅ
indices = [2, 1, 0, 3] # ์ ํํ ํ ์ธ๋ฑ์ค
print(my2darr[indices, :]) # ์ ํํ ํ ์ธ๋ฑ์ค์ ๋ฐ๋ผ ์ ์ฒด ์ด์ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํ
rowIndex = [0, 0, 1, 2, 3] # my2darr์ ๋ํ ํ ์ธ๋ฑ์ค ๋ฐฐ์ด
columnIndex = [0, 2, 0, 1, 2] # my2darr์ ๋ํ ์ด ์ธ๋ฑ์ค ๋ฐฐ์ด
print(my2darr[rowIndex, columnIndex]) # ์์๋ณ๋ก ์ธ๋ฑ์ฑํ์ฌ ๋ฐฐ์ด ์์ ์ถ๋ ฅ
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 7 8 9]
[ 4 5 6]
[ 1 2 3]
[10 11 12]]
[ 1 3 4 8 12]
Numpy ์ฐ์ ๋ฐ ํต๊ณ ํจ์
nd-array์ ์์๋ฅผ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ง์ ์ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
y = np.array([-1.4, 0.4, -3.2, 2.5, 3.4]) # ๋ฌด์์๋ก ์์ฑ๋ ๋ฒกํฐ
print(y) # ๋ฐฐ์ด ์ถ๋ ฅ
print()
print(np.abs(y)) # ๊ฐ ์์๋ฅผ ์ ๋๊ฐ์ผ๋ก ๋ณํ
print(np.sqrt(np.abs(y))) # ๊ฐ ์์์ ์ ๋๊ฐ์ ๋ํ ์ ๊ณฑ๊ทผ ์ ์ฉ
print(np.sign(y)) # ๊ฐ ์์์ ๋ถํธ ๊ตฌํ๊ธฐ
print(np.exp(y)) # ๊ฐ ์์์ ๋ํ ์ง์ํจ์(e^y) ์ ์ฉ
print(np.sort(y)) # ๋ฐฐ์ด ์ ๋ ฌ; ๋ฐฐ์ด์ ์ ๋ ฌ๋ ๋ณต์ฌ๋ณธ ๋ฐํ
print(y) # ์๋ณธ ๋ฐฐ์ด y ์ถ๋ ฅ; ์๋ณธ ๋ฐฐ์ด์ ๋ณํ์ง ์์
[-1.4 0.4 -3.2 2.5 3.4]
[1.4 0.4 3.2 2.5 3.4]
[1.18321596 0.63245553 1.78885438 1.58113883 1.84390889]
[-1. 1. -1. 1. 1.]
[ 0.24659696 1.4918247 0.0407622 12.18249396 29.96410005]
[-3.2 -1.4 0.4 2.5 3.4]
[-1.4 0.4 -3.2 2.5 3.4]
x = np.arange(-2, 3) # -2๋ถํฐ 2๊น์ง์ ์ ์ ๋ฐฐ์ด ์์ฑ
y = np.random.randn(5) # 5๊ฐ์ ์์์ ํ์ค ์ ๊ท๋ถํฌ ๊ฐ ๋ฐฐ์ด ์์ฑ
print(x) # ๋ฐฐ์ด x ์ถ๋ ฅ
print(y) # ๋ฐฐ์ด y ์ถ๋ ฅ
print(np.add(x, y)) # ์์๋ณ ๋ง์
: x + y
print(np.subtract(x, y)) # ์์๋ณ ๋บ์
: x - y
print(np.multiply(x, y)) # ์์๋ณ ๊ณฑ์
: x * y
print(np.divide(x, y)) # ์์๋ณ ๋๋์
: x / y
print(np.maximum(x, y)) # ์์๋ณ ์ต๋๊ฐ: max(x, y)
[-2 -1 0 1 2]
[-0.5915882 0.86652443 -0.76206247 -0.18749133 -0.65986152]
[-2.5915882 -0.13347557 -0.76206247 0.81250867 1.34013848]
[-1.4084118 -1.86652443 0.76206247 1.18749133 2.65986152]
[ 1.1831764 -0.86652443 -0. -0.18749133 -1.31972304]
[ 3.38073005 -1.15403555 -0. -5.33357984 -3.03093897]
[-0.5915882 0.86652443 0. 1. 2. ]
y = np.array([-3.2, -1.4, 0.4, 2.5, 3.4]) # ๋ฌด์์๋ก ์์ฑ๋ ๋ฒกํฐ
print(y) # ๋ฐฐ์ด y ์ถ๋ ฅ
print("Min =", np.min(y)) # ๋ฐฐ์ด์ ์ต์๊ฐ
print("Max =", np.max(y)) # ๋ฐฐ์ด์ ์ต๋๊ฐ
print("Average =", np.mean(y)) # ๋ฐฐ์ด์ ํ๊ท /ํ๊ท ๊ฐ
print("Std deviation =", np.std(y)) # ๋ฐฐ์ด์ ํ์คํธ์ฐจ
print("Sum =", np.sum(y)) # ๋ฐฐ์ด์ ํฉ๊ณ
[-3.2 -1.4 0.4 2.5 3.4]
Min = -3.2
Max = 3.4
Average = 0.34000000000000014
Std deviation = 2.432776191925595
Sum = 1.7000000000000006
More on filtering
M = np.arange(25).reshape(5, 5) # 0๋ถํฐ 24๊น์ง์ ์ซ์๋ฅผ 5x5 ํํ์ ๋ฐฐ์ด๋ก ์์ฑ
print(M) # ๋ฐฐ์ด M ์ถ๋ ฅ
print(M[M % 2 == 1]) # ์ผ๋ฐ์ ์ธ ํํฐ๋ง: M ๋ฐฐ์ด์ ์์ ์ค ํ์(์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์)๋ง ํํฐ๋งํ์ฌ ๋ฐํ
print(np.argwhere(M >= 20)) # ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์์ ์ธ๋ฑ์ค ๋ฐํ
print(np.where(M % 2 == 1, M, 0)) # ์กฐ๊ฑด์ ๋ฐ๋ผ M ์์๋ ๊ทธ๋๋ก, ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด 0์ผ๋ก ๋์ฒด
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
[ 1 3 5 7 9 11 13 15 17 19 21 23]
[[4 0]
[4 1]
[4 2]
[4 3]
[4 4]]
[[ 0 1 0 3 0]
[ 5 0 7 0 9]
[ 0 11 0 13 0]
[15 0 17 0 19]
[ 0 21 0 23 0]]
New axis
- ๊ธฐ์กด ๋ฐฐ์ด์ ์ฐจ์์ ํ ์ฐจ์ ๋ ๋๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค
- ๋ชจ์ ๋ณ๊ฒฝ ์: n x (์ ์ถ) x m โ n x 1 x m
t = np.array([1,2,3]) # 1์ฐจ์ ๋ฐฐ์ด ์์ฑ
print(t.shape) # ๋ฐฐ์ด t์ ํ์(์ฐจ์) ์ถ๋ ฅ
x = t[:, np.newaxis] # np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ์ ํ์ฅ (x 1)
print(x.shape) # ๋ฐฐ์ด x์ ํ์ ์ถ๋ ฅ
y = t[np.newaxis, :] # np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ์ ํ์ฅ
print(y.shape) # ๋ฐฐ์ด y์ ํ์ ์ถ๋ ฅ
- t.shape๋ ๋ฐฐ์ด t์ ํ์์ ์ถ๋ ฅํฉ๋๋ค. t๋ 1์ฐจ์ ๋ฐฐ์ด์ด๋ฏ๋ก ํ์์ (3,)์ ๋๋ค.
- x = t[:, np.newaxis]๋ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ t ๋ฐฐ์ด์ ์ฐจ์์ ํ์ฅํฉ๋๋ค. ๊ธฐ์กด์ 1์ฐจ์ ๋ฐฐ์ด t๊ฐ (3,)์์ (3,1)์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํ์ฅ๋ฉ๋๋ค. ์ด ๋ : ๋ ์ ์ฒด ๋ฐฐ์ด์ ์ ํํ๊ณ , np.newaxis๋ ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํฉ๋๋ค.
- y = t[np.newaxis, :]๋ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ t ๋ฐฐ์ด์ ์ฐจ์์ ํ์ฅํฉ๋๋ค. ๊ธฐ์กด์ 1์ฐจ์ ๋ฐฐ์ด t๊ฐ (3,)์์ (1,3)์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํ์ฅ๋ฉ๋๋ค. ์ด ๋ np.newaxis๋ ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํ๊ณ , :๋ ์ ์ฒด ๋ฐฐ์ด์ ์ ํํฉ๋๋ค.
(3,)
(3, 1)
(1, 3)
print(t)
print(x)
print(y)
[1 2 3]
[[1]
[2]
[3]]
[[1 2 3]]
t ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด๋ก, [1, 2, 3]์ ๊ฐ์ ๊ฐ์ต๋๋ค.
x ๋ฐฐ์ด์ t ๋ฐฐ์ด์ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ฐจ์์ ์ถ๊ฐํ ๊ฒฐ๊ณผ๋ก, (3, 1)์ 2์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๊ฐ ์์๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ํ ์ค์ ์์นํ ์ด ํํ์ 2์ฐจ์ ๋ฐฐ์ด [[1], [2], [3]]์ด ๋ฉ๋๋ค.
y ๋ฐฐ์ด์ t ๋ฐฐ์ด์ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ฐจ์์ ์ถ๊ฐํ ๊ฒฐ๊ณผ๋ก, (1, 3)์ 2์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ t ๋ฐฐ์ด์ ์์๋ค์ด ํ ํ์ ์์นํ ํํ์ 2์ฐจ์ ๋ฐฐ์ด [[1, 2, 3]]์ด ๋ฉ๋๋ค.
- x and y are broadcasted (it is explained below)
x + y
# Result
array([[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
- ์์น์ ๋ฐ๋ผ Dimension ์์น๊ฐ ๋ฌ๋ผ์ง๋์ง?
t = np.array([[1,2,3],[4,5,6]]) # 2์ฐจ์ ๋ฐฐ์ด ์์ฑ (2, 3)
# 1. ์ฐจ์์ ํ์ฅํ์ฌ ๊ฒฐ๊ณผ์ ํ์์ ํ์ธํฉ๋๋ค.
print(t[:, :, np.newaxis].shape) # (2, 3, 1) ๋ชจ์์ 3์ฐจ์ ๋ฐฐ์ด
print(t[:, :, np.newaxis]) # ์ฐจ์์ ํ์ฅํ ๋ฐฐ์ด ์ถ๋ ฅ
print()
# 2. ์ฐจ์์ ํ์ฅํ์ฌ ๊ฒฐ๊ณผ์ ํ์์ ํ์ธํฉ๋๋ค.
print(t[np.newaxis, :, :].shape) # (1, 2, 3) ๋ชจ์์ 3์ฐจ์ ๋ฐฐ์ด
print(t[np.newaxis, :, :]) # ์ฐจ์์ ํ์ฅํ ๋ฐฐ์ด ์ถ๋ ฅ
print()
# 3. ํ ์ฐจ์์ ํ์ฅํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
print(t[:, np.newaxis, :])
1. t[:, :, np.newaxis]
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ํ๊ณผ ์ด์ ์ ํํฉ๋๋ค.
- np.newaxis๋ ์ด ์ฐจ์์ ํ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ (2, 3, 1) ํ์์ 3์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค.
2. t[np.newaxis, :, :]
- np.newaxis**๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ฐจ์์ ํ์ฅํฉ๋๋ค.
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ๋ฐฐ์ด์ ์ ํํฉ๋๋ค.
๊ฒฐ๊ณผ๋ (1, 2, 3) ํ์์ 3์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค.
3. t[:, np.newaxis, :]
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ํ์ ์ ํํฉ๋๋ค.
- np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ถ์ ์ถ๊ฐํฉ๋๋ค.
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ์ด์ ์ ํํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ np.array([[1,2,3],[4,5,6]])์ 3์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค.
(2, 3, 1)
[[[1]
[2]
[3]]
[[4]
[5]
[6]]]
(1, 2, 3)
[[[1 2 3]
[4 5 6]]]
[[[1 2 3]]
[[4 5 6]]]
N-d array axis view
๋ฐ์ํ
'๐ Data Mining' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Mining] Linear Algebra (์ ํ๋์) (0) | 2024.07.09 |
---|---|
[Data Mining] Introduction to Numpy part.2 (0) | 2024.07.05 |
[Data Mining] Visualizing Data (0) | 2024.06.25 |
[Data Mining] Crash_Course in Python Part.2 (0) | 2024.06.25 |
[Data Mining] Crash_Course in Python Part.1 (0) | 2024.06.25 |
๋ฐ์ํ
Introduction to Numpy
Numpy๋ numberal Python์ ์ฝ์๋ก, ์์น ๊ณ์ฐ์ ์ง์ํ๊ธฐ ์ํ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง ์ ๋๋ค.
- Numpy์์ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ndarray๋ผ๋ ๋ค์ฐจ์ ๋ฐฐ์ด ๊ฐ์ฒด์ ๋๋ค.
- Numpy๋ ndarray์ ์์๋ค์ ํจ์จ์ ์ผ๋ก ์กฐ์ํ ์ ์๋ ์ผ๋ จ์ ํจ์๋ค์ ์ ๊ณตํ๋ค๋ ํน์ง์ด ์์ต๋๋ค.
- ์ค๋ช ์๋ฅผ ๋ณด๋ ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ๊ธ๋ฉด ํ๋ฒ Numpy์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
- ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ํญ์ ๊ตฌ๊ธ๋ง์ ์๋ํ๊ฑฐ๋ help()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Creating ndarray
ndarray๋ list ๋๋ tuple ๊ฐ์ฒด์์ ์์ฑํ ์ ์์ต๋๋ค.
- numpy.array๋ ์์ฑ ๋ฐ ๋ฐฐ์ด์ ์ํ ํธ์ ๊ธฐ๋ฅ์ผ ๋ฟ ์ ๋๋ค.
- numpy.ndarray๋ ํด๋์ค์ ๋๋ค.
Tensor๋ ๋ค์ฐจ์ ๋ฐฐ์ด๋ก ํํํ ์ ์๋ "์ด๋ค ๊ฒ"์ ๋๋ค.
Tensorflow๋ ๋ฅ๋ฌ๋์ ์ํ ๊ตฌ๊ธ ์ ํ์ ๋๋ค.
Tensorflow ์ฝ๋ฉ์ ๊ฒฝ์ฐ, numpy ์ฐจ์ ๋ฐฐ์ด์ ๋งค์ฐ ๋ฅ์ํด์ผ ํฉ๋๋ค.
import numpy
import numpy as np
oneDim = np.array([1.0,2,3,4,5]) # a 1-dimensional array (vector)
print(oneDim)
print("#Dimensions =", oneDim.ndim)
print("Dimension =", oneDim.shape)
print("Size =", oneDim.size)
print("Array type =", oneDim.dtype)
[1. 2. 3. 4. 5.]
#Dimensions = 1
Dimension = (5,)
Size = 5
Array type = float64
- ์๋ ์์๋ฅผ ๋ณด๋ฉด Numpy Element์ C ๋ฐฐ์ด๊ณผ ๊ฐ์ ์ ํ์ด ํ๋๋ง ์กด์ฌํฉ๋๋ค.
twoDim = np.array([[1,2],[3,4],[5,6],[7,8]]) # a two-dimensional array (matrix)
print(twoDim)
print("#Dimensions =", twoDim.ndim)
print("Dimension =", twoDim.shape)
print("Size =", twoDim.size)
print("Array type =", twoDim.dtype)
[[1 2]
[3 4]
[5 6]
[7 8]]
#Dimensions = 2
Dimension = (4, 2)
Size = 8
Array type = int32
arrFromTuple = np.array([(1,'a',3.0),(2,'b',3.5)]) # create ndarray from tuple
print(arrFromTuple)
print("#Dimensions =", arrFromTuple.ndim)
print("Dimension =", arrFromTuple.shape)
print("Size =", arrFromTuple.size)
print("Array type =", arrFromTuple.dtype)
[['1' 'a' '3.0']
['2' 'b' '3.5']]
#Dimensions = 2
Dimension = (2, 3)
Size = 6
Array type = <U11
# Guess what is printed
print(np.array([1]).shape)
print(np.array([1,2]).shape)
print(np.array([[1],[2]]).shape)
print(np.array([[[1,2,3],[1,2,3]]]).shape)
print(np.array([[[[]]]]).shape)
(1,)
(2,)
(2, 1)
(1, 2, 3)
(1, 1, 1, 0)
- np.array([1]).shape: ๋ฐฐ์ด [1]์ ์์๊ฐ ํ๋์ธ 1์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ๋ฐ๋ผ์ shape๋ (1,)์ ๋๋ค.
- np.array([1,2]).shape: ๋ฐฐ์ด [1,2]์ ์์๊ฐ ๋ ๊ฐ์ธ 1์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ๋ฐ๋ผ์ shape๋ (2,)์ ๋๋ค.
- np.array([[1],[2]]).shape: ๋ฐฐ์ด [[1], [2]]์ ๋ ๊ฐ์ ์์๊ฐ ๊ฐ๊ฐ ํ๋์ฉ ๋ค์ด์๋ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ๋ฐ๋ผ์ shape๋ (2,1)์ ๋๋ค.
- np.array([[[1,2,3],[1,2,3]]]).shape:
- ๋ฐฐ์ด [[[1,2,3], [1,2,3]]]์ 1์ฐจ์ ์์(๋ฆฌ์คํธ)๊ฐ 2๊ฐ์ ํ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๊ฐ ํ์ ๋ฆฌ์คํธ๋ 3๊ฐ์ ์์๋ฅผ ํฌํจํฉ๋๋ค. ๋ฐ๋ผ์ shape๋ (1,2,3)์ ๋๋ค.
- np.array([[[[]]]]).shape:
- ๋ฐฐ์ด [[[]]]์ 4์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. 1๊ฐ์ ์์(๋ฆฌ์คํธ)๊ฐ ์๊ณ , ๊ทธ ์์ ๋ค์ 1๊ฐ์ ๋ฆฌ์คํธ๊ฐ ํฌํจ๋๋ฉฐ, ๊ทธ ์์ 1๊ฐ์ ๋น ๋ฆฌ์คํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ฐ๋ผ์ shape๋ ๊ฐ์ฅ ๊น์ ์ฐจ์๊น์ง ๊ฐ ์ฐจ์์์ ํ๋์ ์์๋ฅผ ๊ฐ์ง๋ฏ๋ก (1,1,1,0)์ ๋๋ค.
- Numpy์๋ ๋ฐฐ์ด์ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
print(np.random.rand(5)) # [0,1] ์ฌ์ด์ ๊ท ๋ฑ ๋ถํฌ์์ ๋ฌด์์ ์ซ์ ์์ฑ
print(np.random.randn(5)) # ํ๊ท 0, ํ์ค ํธ์ฐจ 1์ ์ ๊ท ๋ถํฌ์์ ๋ฌด์์ ์ซ์ ์์ฑ
print(np.arange(-10,10,2)) # range์ ๋น์ทํ์ง๋ง ๋ฆฌ์คํธ ๋์ ndarray ๋ฐํ (๋ฒ์ ์ง์ )
print(np.arange(12).reshape(3,4)) # ๋ฐฐ์ด์ 3ํ 4์ด ํ๋ ฌ๋ก ์ฌ๊ตฌ์ฑ
print(np.linspace(0,1,10)) # [0,1] ๊ตฌ๊ฐ์ 10๊ฐ์ ๊ท ๋ฑํ๊ฒ ๋๋ ๊ฐ์ผ๋ก ๋ถํ
print(np.logspace(-3,3,7)) # 10^-3์์ 10^3๊น์ง ๋ก๊ทธ ์ค์ผ์ผ๋ก ๊ท ๋ฑํ๊ฒ ๋ถํ ๋ ์ซ์ ์์ฑ
# logspace๋ ๋ก๊ทธ ์ค์ผ์ผ์์ ๊ท ๋ฑํ๊ฒ ๊ฐ๊ฒฉ์ ๋ ์ซ์๋ฅผ ๋ฐํํฉ๋๋ค.
[0.39549071 0.83200035 0.21630632 0.92803293 0.71053543]
[0.89132678 0.0393841 0.36250086 0.04464502 1.31660902]
[-10 -8 -6 -4 -2 0 2 4 6 8]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
0.66666667 0.77777778 0.88888889 1. ]
[1.e-03 1.e-02 1.e-01 1.e+00 1.e+01 1.e+02 1.e+03]
print(np.zeros((2,3))) # 2 x 3 ํฌ๊ธฐ์ ์ํ๋ ฌ
print(np.ones((3,2))) # 3 x 2 ํฌ๊ธฐ์ ์ผํ๋ ฌ
print(np.eye(3)) # 3 x 3 ๋จ์ํ๋ ฌ
[[0. 0. 0.]
[0. 0. 0.]]
[[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
์์๋ณ ์์
ndarray์ ๊ฐ ์์์ ๋ง์ , ๊ณฑ์ ๋ฑ์ ํ์ค ์ฐ์ฐ์๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
x = np.array([1,2,3,4,5])
print(x + 1) # ๋ง์
print(x - 1) # ๋บ์
print(x * 2) # ๊ณฑ์
print(x // 2) # ์ ์ ๋๋์
print(x ** 2) # ์ ๊ณฑ
print(x % 2) # ๋๋จธ์ง
print(1 / x) # ๋๋์
[2 3 4 5 6]
[0 1 2 3 4]
[ 2 4 6 8 10]
[0 1 1 2 2]
[ 1 4 9 16 25]
[1 0 1 0 1]
[1. 0.5 0.33333333 0.25 0.2 ]
Why Numpy?
import time
start = time.time() # ์์ ์๊ฐ ์ธก์
# ๋ฐ๋ณต์ ์ธ ํฉ ๊ณ์ฐ
total = 0
# 1.5๋ฐฑ๋ง ๊ฐ์ ์ซ์๋ฅผ ๋ฐ๋ณตํ์ฌ ํฉ ๊ณ์ฐ
for item in range(0, 1500000):
total = total + item
print('sum is: ' + str(total)) # ํฉ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
sum is: 1124999250000
0.1862163543701172
x = np.array([2,4,6,8,10])
y = np.array([1,2,3,4,5])
print(x + y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๋ง์
print(x - y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๋บ์
print(x * y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๊ณฑ์
print(x / y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๋๋์
print(x // y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ์ ์ ๋๋์
print(x ** y) # ๋ฐฐ์ด x์ ๋ฐฐ์ด y์ ๊ฐ ์์์ ๋ํ ๊ฑฐ๋ญ์ ๊ณฑ ๊ณ์ฐ
[ 3 6 9 12 15]
[1 2 3 4 5]
[ 2 8 18 32 50]
[2. 2. 2. 2. 2.]
[2 2 2 2 2]
[ 2 16 216 4096 100000]
import numpy as np # numpy ๋ชจ๋ ์ํฌํธ
start = time.time() # ์์ ์๊ฐ ์ธก์
# ๋ฒกํฐํ๋ ํฉ ๊ณ์ฐ - ๋ฒกํฐํ๋ฅผ ์ํด numpy ์ฌ์ฉ
# np.arange๋ 0๋ถํฐ 1499999๊น์ง์ ์ซ์ ์ํ์ค๋ฅผ ์์ฑ
print(np.sum(np.arange(1500000)))
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
-282181552
0.005002021789550781
import numpy as np # numpy ๋ชจ๋ ์ํฌํธ
import pandas as pd # pandas ๋ชจ๋ ์ํฌํธ
# 0์์ 50 ์ฌ์ด์ ์ ์๋ก ์ด๋ฃจ์ด์ง 5,000,000 x 4 ํฌ๊ธฐ์ ๋ฐฐ์ด ์์ฑ
# ๋ฐฐ์ด์ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ๋ณํํ๊ณ ์ด ์ด๋ฆ์ 'a', 'b', 'c', 'd'๋ก ์ค์
df = pd.DataFrame(np.random.randint(0, 50, size=(5000000, 4)), columns=('a','b', 'c', 'd'))
# df.shape: ๋ฐ์ดํฐ ํ๋ ์์ ํฌ๊ธฐ (ํํ)๋ฅผ ํ์ธ
# ์ฃผ์์๋ df.shape๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ ํ๋ ์์ ๋ชจ์์ ํ์ธํ ์ ์๋ค๋ ์์๊ฐ ์์ง๋ง,
# ์ฝ๋๋ df.shape๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค.
# ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ ๋ช ํ์ ์ถ๋ ฅ
df.head()
a | b | c | d | |
0 | 33 | 31 | 6 | 23 |
1 | 40 | 30 | 35 | 17 |
2 | 42 | 25 | 10 | 45 |
3 | 10 | 36 | 15 | 45 |
4 | 5 | 28 | 23 | 39 |
import time
start = time.time() # ์์ ์๊ฐ ์ธก์
# DataFrame์ iterrows()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต
for idx, row in df.iterrows():
# ์๋ก์ด ์ด ์์ฑ
# ๊ฐ ํ์ ๋ํด 'd' ์ด์ 'c' ์ด๋ก ๋๋๊ณ 100์ ๊ณฑํ์ฌ 'ratio' ์ด์ ์ ์ฅ
df.at[idx, 'ratio'] = 100 * (row["d"] / row["c"])
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
<ipython-input-3-ebe2cacf263b>:7: RuntimeWarning: divide by zero encountered in scalar divide
df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])
<ipython-input-3-ebe2cacf263b>:7: RuntimeWarning: invalid value encountered in scalar divide
df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])
387.2491133213043
import time
start = time.time() # ์์ ์๊ฐ ์ธก์
# ๋ฒกํฐํ๋ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ 'ratio' ์ด ์์ฑ
# 'd' ์ด์ 'c' ์ด๋ก ๋๋๊ณ 100์ ๊ณฑํ์ฌ 'ratio' ์ด์ ์ ์ฅ
df['ratio'] = 100 * (df['d'] / df['c'])
end = time.time() # ์ข
๋ฃ ์๊ฐ ์ธก์
print(end - start) # ์คํ ์๊ฐ ์ถ๋ ฅ
0.12962055206298828
Indexing & Slicing
๋ฐฐ์ด์ด ์๋ ํน์ ์์๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํฉ๋๋ค.
x = np.arange(-5, 5) # -5๋ถํฐ 4๊น์ง์ ์ซ์๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด ์์ฑ
print(x) # ๋ฐฐ์ด x ์ถ๋ ฅ
y = x[3:5] # y๋ ๋ฐฐ์ด x์ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ํ ์ฌ๋ผ์ด์ค(ํฌ์ธํฐ)์
๋๋ค.
print(y) # y ์ถ๋ ฅ
y[:] = 1000 # y์ ๊ฐ์ ์์ ํ๋ฉด ๋ฐฐ์ด x๋ ๋ณ๊ฒฝ๋ฉ๋๋ค.
print(y) # ์์ ๋ y ์ถ๋ ฅ
print(x) # y์ ์์ ์ ํตํด ๋ณ๊ฒฝ๋ ๋ฐฐ์ด x ์ถ๋ ฅ
z = x[3:5].copy() # ๋ถ๋ถ ๋ฐฐ์ด์ ๋ณต์ฌํ์ฌ z๋ฅผ ๋ง๋ญ๋๋ค.
print(z) # z ์ถ๋ ฅ
z[:] = 500 # z์ ๊ฐ์ ์์ ํด๋ ๋ฐฐ์ด x์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
print(z) # ์์ ๋ z ์ถ๋ ฅ
print(x) # ๋ฐฐ์ด x ์ถ๋ ฅ (y์ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋ ํ์ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค)
์ฃผ๋ชฉํ ์ ์ y๋ x์ ์ฌ๋ผ์ด์ค๋ก, y์ ๋ณ๊ฒฝ์ด x์๋ ์ํฅ์ ์ค๋ค๋ ์ ์ ๋๋ค. ๋ฐ๋ฉด, z๋ x์ ์ฌ๋ผ์ด์ค๋ฅผ ๋ณต์ฌํ ๊ฒ์ด๋ฏ๋ก z์ ๋ณ๊ฒฝ์ x์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
[-5 -4 -3 -2 -1 0 1 2 3 4]
[-2 -1]
[1000 1000]
[ -5 -4 -3 1000 1000 0 1 2 3 4]
[1000 1000]
[500 500]
[ -5 -4 -3 1000 1000 0 1 2 3 4]
๋น๊ณ : List๋ฅผ ์ฌ๋ผ์ด์ฑํ๋ฉด ํ์ List(sublist)์ ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง๋ง Numpy ๋ฐฐ์ด์ ์ฌ๋ผ์ด์ฑํ๋ฉด ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง ์์ต๋๋ค.
x = list(range(-5,5))
print(x)
y = x[3:5] # y is a slice, i.e., not a pointer to a list in x
print(y)
y[1] = 1000 # modifying the value of y does not change x
print(y)
print(x)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
[-2, -1]
[-2, 1000]
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
my2dlist = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] # 2์ฐจ์ ๋ฆฌ์คํธ
print(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ ์ถ๋ ฅ
print(my2dlist[2]) # ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ ๊ทผ
# `my2dlist[:][2]`๋ ๊ฐ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ ๊ทผํ๋ ค๊ณ ํ์ง๋ง, ์ ๋๋ก ๋ ์๋์ ํ์ง ์์ต๋๋ค.
# ๋์ my2dlist[2][2]๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
my2darr = np.array(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print(my2darr[2][:]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ
print(my2darr[2, :]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ (์์ ๋์ผํ ๋ฐฉ๋ฒ)
print(my2darr[:][2]) # ์๋ชป๋ ๋ฐฉ์; ๊ฐ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์๊ฐ ์๋๋ผ ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผํจ
print(my2darr[:, 2]) # ์ธ ๋ฒ์งธ ์ด์ ์ ๊ทผ
print(my2darr[:2, 2:]) # ์ฒซ ๋ ํ๊ณผ ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
print(my2darr[::2, 2:]) # ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
- my2darr[2][:]์ my2darr ๋ฐฐ์ด์ ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผํ๋ ์ฐ์ฐ.
- my2darr[2]: my2darr ๋ฐฐ์ด์์ ์ธ ๋ฒ์งธ ํ(์ธ๋ฑ์ค 2)์ ์ ํํฉ๋๋ค.
- ์ธ๋ฑ์ฑ์ 0๋ถํฐ ์์ํ๋ฏ๋ก my2darr[2]๋ ์ธ ๋ฒ์งธ ํ์ ์ ํํ๋ ๊ฒ์ ๋๋ค.
- [:]: ์ด ๋ถ๋ถ์ ์ฌ๋ผ์ด์ค ์ฐ์ฐ์๋ก, ํด๋น ํ์ ๋ชจ๋ ์ด์ ์ ํํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, my2darr[2][:]์ ์ธ ๋ฒ์งธ ํ์ ๋ชจ๋ ์ด์ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
- my2darr[2]: my2darr ๋ฐฐ์ด์์ ์ธ ๋ฒ์งธ ํ(์ธ๋ฑ์ค 2)์ ์ ํํฉ๋๋ค.
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[9, 10, 11, 12]
[9, 10, 11, 12]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[ 9 10 11 12]
[ 9 10 11 12]
[ 9 10 11 12]
[ 3 7 11]
[[3 4]
[7 8]]
[[ 3 4]
[11 12]]
- Remark again: It's indexing, not copying (๋ณต์ฌ๊ฐ ์๋๋ผ ์ธ๋ฑ์ฑ์ ๋๋ค)
my2darr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print()
sliced = my2darr[::2, 2:] # ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ฌ๋ผ์ด์ค
print(sliced) # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด ์ถ๋ ฅ
print(type(sliced)) # ์ฌ๋ผ์ด์ค์ ํ์
์ถ๋ ฅ (NumPy ๋ฐฐ์ด์)
print()
sliced[:,:] = 1000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋จ์ ํ์ธ (์ฌ๋ผ์ด์ค๋ ์๋ณธ ๋ฐฐ์ด์ ๋ทฐ์ด๋ฏ๋ก)
print()
sliced[0,0] = 2000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ ์ฒซ ๋ฒ์งธ ์ด ์์๋ฅผ 2000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋จ์ ํ์ธ (์ฌ๋ผ์ด์ค๋ ์๋ณธ ๋ฐฐ์ด์ ๋ทฐ์ด๋ฏ๋ก)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 3 4]
[11 12]]
<class 'numpy.ndarray'>
[[ 1 2 1000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
[[ 1 2 2000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
๋น๊ณ : list์ ์ฌ๋ผ์ด์ฑํ๋ฉด ํ์ ๋ชฉ๋ก์ ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง๋ง Numpy array๋ฅผ ์ฌ๋ผ์ด์ฑํ๋ฉด ๋ณต์ฌ๋ณธ์ด ์์ฑ๋์ง ์์ต๋๋ค.
# ์ฃผ: ๋ฆฌ์คํธ ์ฌ๋ผ์ด์ฑ์ ํ์ ๋ฆฌ์คํธ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ญ๋๋ค.
x = list(range(-5, 5)) # -5๋ถํฐ 4๊น์ง์ ์ ์๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์คํธ ์์ฑ
print(x) # ๋ฆฌ์คํธ x ์ถ๋ ฅ
y = x[3:5] # y๋ ๋ฆฌ์คํธ x์ ํ์ ๋ฆฌ์คํธ์ ๋ํ ์ฌ๋ผ์ด์ค(๋ณต์ฌ๋ณธ)์
๋๋ค.
print(y) # y ์ถ๋ ฅ
y[1] = 1000 # y์ ๋ ๋ฒ์งธ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(y) # ์์ ๋ y ์ถ๋ ฅ
print(x) # ๋ฆฌ์คํธ x ์ถ๋ ฅ (y์ ์์ ์ ํตํด ๋ณ๊ฒฝ๋์ง ์์)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
[-2, -1]
[-2, 1000]
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
my2dlist = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] # 2์ฐจ์ ๋ฆฌ์คํธ
print(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ ์ถ๋ ฅ
print(my2dlist[2]) # ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ ๊ทผ
# `my2dlist[:][2]`๋ ํ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ์ง๋ง, ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ์ง ๋ชปํฉ๋๋ค.
# ๋์ , `my2dlist[2][2]`๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๋ฒ์งธ ํ์ ๋ฆฌ์คํธ์ ์ธ ๋ฒ์งธ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
# `my2dlist[:, 2]`๋ ํ์ด์ฌ์ ๋ฆฌ์คํธ์์๋ ์ฌ์ฉํ ์ ์๋ ๊ตฌ๋ฌธ์
๋๋ค.
my2darr = np.array(my2dlist) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print(my2darr[2][:]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ (๋ชจ๋ ์ด ์ ํ)
print(my2darr[2, :]) # ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผ (์์ ๋์ผํ ๋ฐฉ๋ฒ)
print(my2darr[:][2]) # ์ด ์ฝ๋๋ NumPy ๋ฐฐ์ด์์๋ ์ธ ๋ฒ์งธ ํ์ ์ ๊ทผํฉ๋๋ค.
# ํ์ง๋ง ํ์ด์ฌ์ 2์ฐจ์ ๋ฆฌ์คํธ์์๋ ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ์์
๋๋ค.
print(my2darr[:, 2]) # ์ธ ๋ฒ์งธ ์ด์ ์ ๊ทผ
print(my2darr[:2, 2:]) # ์ฒซ ๋ ํ๊ณผ ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
print(my2darr[::2, 2:]) # ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ ๊ทผ
[ , , ] โ ์ด๋ฐ ํ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[9, 10, 11, 12]
[9, 10, 11, 12]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[ 9 10 11 12]
[ 9 10 11 12]
[ 9 10 11 12]
[ 3 7 11]
[[3 4]
[7 8]]
[[ 3 4]
[11 12]]
- Remark again: It's indexing, not copying.
my2darr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํ
print(my2darr) # NumPy ๋ฐฐ์ด ์ถ๋ ฅ
print()
sliced = my2darr[::2, 2:] # ํ์ ๋ ํ์ฉ ๊ฑด๋๋ฐ์ด ๋ง์ง๋ง ๋ ์ด์ ์ฌ๋ผ์ด์ค
print(sliced) # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด ์ถ๋ ฅ
print(type(sliced)) # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ํ์
์ถ๋ ฅ (NumPy ๋ฐฐ์ด์)
print()
sliced[:,:] = 1000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ณธ ๋ฐฐ์ด ์ถ๋ ฅ (์ฌ๋ผ์ด์ค๋ ์๋ณธ ๋ฐฐ์ด์ ๋ทฐ์ด๋ฏ๋ก ๋ณ๊ฒฝ๋จ)
print()
sliced[0,0] = 2000 # ์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ ์ฒซ ๋ฒ์งธ ์ด ์์๋ฅผ 2000์ผ๋ก ๋ณ๊ฒฝ
print(my2darr) # ์๋ณธ ๋ฐฐ์ด ์ถ๋ ฅ (์ฌ๋ผ์ด์ค์ ๋ณ๊ฒฝ์ด ์๋ณธ ๋ฐฐ์ด์๋ ์ํฅ์ ๋ฏธ์นจ)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 3 4]
[11 12]]
<class 'numpy.ndarray'>
[[ 1 2 1000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
[[ 1 2 2000 1000]
[ 5 6 7 8]
[ 9 10 1000 1000]]
- ndarray๋ ๋ถ์ธ ์ธ๋ฑ์ฑ(๋ง์คํน์ด๋ผ๊ณ ๋ ํจ)๋ ์ง์ํฉ๋๋ค.
x = np.array([1, 2, 3]) # 1, 2, 3์ผ๋ก ์ด๋ฃจ์ด์ง NumPy ๋ฐฐ์ด
print(x[1:]) # ์ฌ๋ผ์ด์ฑ: ์ธ๋ฑ์ค 1๋ถํฐ ๋ฐฐ์ด์ ๋๊น์ง ๋ฐํ
print(x[1:][0]) # ์ฌ๋ผ์ด์ฑ ํ ์ฒซ ๋ฒ์งธ ์์ ๋ฐํ
print()
print(x[[True, False, True]]) # ๋ถ๋ฆฌ์ธ ๋ง์คํน: True ๊ฐ์ด ์๋ ์ธ๋ฑ์ค์ ์์๋ง ๋ฐํ
print()
print(x[[2, 1]]) # ์ ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ: ์ธ๋ฑ์ค 2์ 1์ ์์๋ฅผ ๋ฐํ
print(x[[2, 1, 1, 1, 0]]) # ์ ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ: ์ธ๋ฑ์ค 2, 1, 1, 1, 0์ ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ฐํ
print()
x[[2, 1, 1, 1, 0]] = 0 # ์ ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ค 2, 1, 1, 1, 0์ ์์๋ฅผ 0์ผ๋ก ๋ณ๊ฒฝ
print(x) # ์์ ๋ NumPy ๋ฐฐ์ด ์ถ๋ ฅ
๊ฒฐ๊ณผ์ ์ผ๋ก x ๋ฐฐ์ด์ ์ธ๋ฑ์ฑ์ ํตํด ์ผ๋ถ ์์๋ฅผ 0์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋ฉ๋๋ค.
[2 3]
2
[1 3]
[3 2]
[3 2 2 2 1]
[0 0 0]
y = np.arange(35).reshape(5, 7) # 0๋ถํฐ 34๊น์ง์ ์ซ์๋ฅผ 5x7 ํํ์ NumPy ๋ฐฐ์ด๋ก ์์ฑ
b = y > 20 # y ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ 20๋ณด๋ค ํฐ์ง ๋น๊ตํ์ฌ ๋ถ๋ฆฌ์ธ ๋ฐฐ์ด ์์ฑ
print(b) # ๋ถ๋ฆฌ์ธ ๋ฐฐ์ด ์ถ๋ ฅ
print()
t = y[b] # ๋ถ๋ฆฌ์ธ ๋ง์คํน์ ์ฌ์ฉํ์ฌ y ๋ฐฐ์ด์์ 20๋ณด๋ค ํฐ ์์๋ฅผ ํํฐ๋ง
# ํํฐ๋ง ๊ฒฐ๊ณผ๋ ํญ์ 1์ฐจ์ ๋ฐฐ์ด์ด๋ฉฐ, ๋ณต์ฌ๋ณธ์ด ์์ฑ๋ฉ๋๋ค. ์ธ๋ฑ์ฑ์ ์๋๋๋ค.
print(t) # ํํฐ๋ง ๊ฒฐ๊ณผ ์ถ๋ ฅ
print()
t[:3] = 1000 # ํํฐ๋ง๋ ๋ฐฐ์ด์ ์ฒซ ์ธ ์์๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝ
print(t) # ์์ ๋ ํํฐ๋ง ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(y) # ์๋ณธ ๋ฐฐ์ด y ์ถ๋ ฅ
ํํฐ๋ง๋ ๋ฐฐ์ด t๋ y์ ๋ณต์ฌ๋ณธ์ด๋ฏ๋ก, t์ ์์ ์ y์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
[[False False False False False False False]
[False False False False False False False]
[False False False False False False False]
[ True True True True True True True]
[ True True True True True True True]]
[21 22 23 24 25 26 27 28 29 30 31 32 33 34]
[1000 1000 1000 24 25 26 27 28 29 30 31 32 33 34]
[[ 0 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]]
- LAB: ๊ฐ์ด 2-d ๋ฐฐ์ด์ ์ง์์ธ ๊ฒฝ์ฐ 0์ผ๋ก ์ค์ ํฉ๋๋ค.
import numpy as np
M = np.arange(35).reshape(5,7)
M
array([[ 0, 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]])
M[M % 2 == 0] = 0
M
array([[ 0, 1, 0, 3, 0, 5, 0],
[ 7, 0, 9, 0, 11, 0, 13],
[ 0, 15, 0, 17, 0, 19, 0],
[21, 0, 23, 0, 25, 0, 27],
[ 0, 29, 0, 31, 0, 33, 0]])
# First Boolean masking
np.where(M % 2 == 0, M, -M)
array([[ 0, -1, 0, -3, 0, -5, 0],
[ -7, 0, -9, 0, -11, 0, -13],
[ 0, -15, 0, -17, 0, -19, 0],
[-21, 0, -23, 0, -25, 0, -27],
[ 0, -29, 0, -31, 0, -33, 0]])
- More indexing examples: Integer array indexing
my2darr = np.arange(1, 13, 1).reshape(4, 3) # 1๋ถํฐ 12๊น์ง์ ์ซ์๋ฅผ 4x3 ํํ์ NumPy ๋ฐฐ์ด๋ก ์์ฑ
print(my2darr) # ๋ฐฐ์ด ์ถ๋ ฅ
indices = [2, 1, 0, 3] # ์ ํํ ํ ์ธ๋ฑ์ค
print(my2darr[indices, :]) # ์ ํํ ํ ์ธ๋ฑ์ค์ ๋ฐ๋ผ ์ ์ฒด ์ด์ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํ
rowIndex = [0, 0, 1, 2, 3] # my2darr์ ๋ํ ํ ์ธ๋ฑ์ค ๋ฐฐ์ด
columnIndex = [0, 2, 0, 1, 2] # my2darr์ ๋ํ ์ด ์ธ๋ฑ์ค ๋ฐฐ์ด
print(my2darr[rowIndex, columnIndex]) # ์์๋ณ๋ก ์ธ๋ฑ์ฑํ์ฌ ๋ฐฐ์ด ์์ ์ถ๋ ฅ
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 7 8 9]
[ 4 5 6]
[ 1 2 3]
[10 11 12]]
[ 1 3 4 8 12]
Numpy ์ฐ์ ๋ฐ ํต๊ณ ํจ์
nd-array์ ์์๋ฅผ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ง์ ์ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
y = np.array([-1.4, 0.4, -3.2, 2.5, 3.4]) # ๋ฌด์์๋ก ์์ฑ๋ ๋ฒกํฐ
print(y) # ๋ฐฐ์ด ์ถ๋ ฅ
print()
print(np.abs(y)) # ๊ฐ ์์๋ฅผ ์ ๋๊ฐ์ผ๋ก ๋ณํ
print(np.sqrt(np.abs(y))) # ๊ฐ ์์์ ์ ๋๊ฐ์ ๋ํ ์ ๊ณฑ๊ทผ ์ ์ฉ
print(np.sign(y)) # ๊ฐ ์์์ ๋ถํธ ๊ตฌํ๊ธฐ
print(np.exp(y)) # ๊ฐ ์์์ ๋ํ ์ง์ํจ์(e^y) ์ ์ฉ
print(np.sort(y)) # ๋ฐฐ์ด ์ ๋ ฌ; ๋ฐฐ์ด์ ์ ๋ ฌ๋ ๋ณต์ฌ๋ณธ ๋ฐํ
print(y) # ์๋ณธ ๋ฐฐ์ด y ์ถ๋ ฅ; ์๋ณธ ๋ฐฐ์ด์ ๋ณํ์ง ์์
[-1.4 0.4 -3.2 2.5 3.4]
[1.4 0.4 3.2 2.5 3.4]
[1.18321596 0.63245553 1.78885438 1.58113883 1.84390889]
[-1. 1. -1. 1. 1.]
[ 0.24659696 1.4918247 0.0407622 12.18249396 29.96410005]
[-3.2 -1.4 0.4 2.5 3.4]
[-1.4 0.4 -3.2 2.5 3.4]
x = np.arange(-2, 3) # -2๋ถํฐ 2๊น์ง์ ์ ์ ๋ฐฐ์ด ์์ฑ
y = np.random.randn(5) # 5๊ฐ์ ์์์ ํ์ค ์ ๊ท๋ถํฌ ๊ฐ ๋ฐฐ์ด ์์ฑ
print(x) # ๋ฐฐ์ด x ์ถ๋ ฅ
print(y) # ๋ฐฐ์ด y ์ถ๋ ฅ
print(np.add(x, y)) # ์์๋ณ ๋ง์
: x + y
print(np.subtract(x, y)) # ์์๋ณ ๋บ์
: x - y
print(np.multiply(x, y)) # ์์๋ณ ๊ณฑ์
: x * y
print(np.divide(x, y)) # ์์๋ณ ๋๋์
: x / y
print(np.maximum(x, y)) # ์์๋ณ ์ต๋๊ฐ: max(x, y)
[-2 -1 0 1 2]
[-0.5915882 0.86652443 -0.76206247 -0.18749133 -0.65986152]
[-2.5915882 -0.13347557 -0.76206247 0.81250867 1.34013848]
[-1.4084118 -1.86652443 0.76206247 1.18749133 2.65986152]
[ 1.1831764 -0.86652443 -0. -0.18749133 -1.31972304]
[ 3.38073005 -1.15403555 -0. -5.33357984 -3.03093897]
[-0.5915882 0.86652443 0. 1. 2. ]
y = np.array([-3.2, -1.4, 0.4, 2.5, 3.4]) # ๋ฌด์์๋ก ์์ฑ๋ ๋ฒกํฐ
print(y) # ๋ฐฐ์ด y ์ถ๋ ฅ
print("Min =", np.min(y)) # ๋ฐฐ์ด์ ์ต์๊ฐ
print("Max =", np.max(y)) # ๋ฐฐ์ด์ ์ต๋๊ฐ
print("Average =", np.mean(y)) # ๋ฐฐ์ด์ ํ๊ท /ํ๊ท ๊ฐ
print("Std deviation =", np.std(y)) # ๋ฐฐ์ด์ ํ์คํธ์ฐจ
print("Sum =", np.sum(y)) # ๋ฐฐ์ด์ ํฉ๊ณ
[-3.2 -1.4 0.4 2.5 3.4]
Min = -3.2
Max = 3.4
Average = 0.34000000000000014
Std deviation = 2.432776191925595
Sum = 1.7000000000000006
More on filtering
M = np.arange(25).reshape(5, 5) # 0๋ถํฐ 24๊น์ง์ ์ซ์๋ฅผ 5x5 ํํ์ ๋ฐฐ์ด๋ก ์์ฑ
print(M) # ๋ฐฐ์ด M ์ถ๋ ฅ
print(M[M % 2 == 1]) # ์ผ๋ฐ์ ์ธ ํํฐ๋ง: M ๋ฐฐ์ด์ ์์ ์ค ํ์(์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์)๋ง ํํฐ๋งํ์ฌ ๋ฐํ
print(np.argwhere(M >= 20)) # ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์์ ์ธ๋ฑ์ค ๋ฐํ
print(np.where(M % 2 == 1, M, 0)) # ์กฐ๊ฑด์ ๋ฐ๋ผ M ์์๋ ๊ทธ๋๋ก, ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด 0์ผ๋ก ๋์ฒด
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
[ 1 3 5 7 9 11 13 15 17 19 21 23]
[[4 0]
[4 1]
[4 2]
[4 3]
[4 4]]
[[ 0 1 0 3 0]
[ 5 0 7 0 9]
[ 0 11 0 13 0]
[15 0 17 0 19]
[ 0 21 0 23 0]]
New axis
- ๊ธฐ์กด ๋ฐฐ์ด์ ์ฐจ์์ ํ ์ฐจ์ ๋ ๋๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค
- ๋ชจ์ ๋ณ๊ฒฝ ์: n x (์ ์ถ) x m โ n x 1 x m
t = np.array([1,2,3]) # 1์ฐจ์ ๋ฐฐ์ด ์์ฑ
print(t.shape) # ๋ฐฐ์ด t์ ํ์(์ฐจ์) ์ถ๋ ฅ
x = t[:, np.newaxis] # np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ์ ํ์ฅ (x 1)
print(x.shape) # ๋ฐฐ์ด x์ ํ์ ์ถ๋ ฅ
y = t[np.newaxis, :] # np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ์ ํ์ฅ
print(y.shape) # ๋ฐฐ์ด y์ ํ์ ์ถ๋ ฅ
- t.shape๋ ๋ฐฐ์ด t์ ํ์์ ์ถ๋ ฅํฉ๋๋ค. t๋ 1์ฐจ์ ๋ฐฐ์ด์ด๋ฏ๋ก ํ์์ (3,)์ ๋๋ค.
- x = t[:, np.newaxis]๋ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ t ๋ฐฐ์ด์ ์ฐจ์์ ํ์ฅํฉ๋๋ค. ๊ธฐ์กด์ 1์ฐจ์ ๋ฐฐ์ด t๊ฐ (3,)์์ (3,1)์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํ์ฅ๋ฉ๋๋ค. ์ด ๋ : ๋ ์ ์ฒด ๋ฐฐ์ด์ ์ ํํ๊ณ , np.newaxis๋ ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํฉ๋๋ค.
- y = t[np.newaxis, :]๋ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ t ๋ฐฐ์ด์ ์ฐจ์์ ํ์ฅํฉ๋๋ค. ๊ธฐ์กด์ 1์ฐจ์ ๋ฐฐ์ด t๊ฐ (3,)์์ (1,3)์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํ์ฅ๋ฉ๋๋ค. ์ด ๋ np.newaxis๋ ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํ๊ณ , :๋ ์ ์ฒด ๋ฐฐ์ด์ ์ ํํฉ๋๋ค.
(3,)
(3, 1)
(1, 3)
print(t)
print(x)
print(y)
[1 2 3]
[[1]
[2]
[3]]
[[1 2 3]]
t ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด๋ก, [1, 2, 3]์ ๊ฐ์ ๊ฐ์ต๋๋ค.
x ๋ฐฐ์ด์ t ๋ฐฐ์ด์ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ฐจ์์ ์ถ๊ฐํ ๊ฒฐ๊ณผ๋ก, (3, 1)์ 2์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๊ฐ ์์๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ํ ์ค์ ์์นํ ์ด ํํ์ 2์ฐจ์ ๋ฐฐ์ด [[1], [2], [3]]์ด ๋ฉ๋๋ค.
y ๋ฐฐ์ด์ t ๋ฐฐ์ด์ np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ฐจ์์ ์ถ๊ฐํ ๊ฒฐ๊ณผ๋ก, (1, 3)์ 2์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ t ๋ฐฐ์ด์ ์์๋ค์ด ํ ํ์ ์์นํ ํํ์ 2์ฐจ์ ๋ฐฐ์ด [[1, 2, 3]]์ด ๋ฉ๋๋ค.
- x and y are broadcasted (it is explained below)
x + y
# Result
array([[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
- ์์น์ ๋ฐ๋ผ Dimension ์์น๊ฐ ๋ฌ๋ผ์ง๋์ง?
t = np.array([[1,2,3],[4,5,6]]) # 2์ฐจ์ ๋ฐฐ์ด ์์ฑ (2, 3)
# 1. ์ฐจ์์ ํ์ฅํ์ฌ ๊ฒฐ๊ณผ์ ํ์์ ํ์ธํฉ๋๋ค.
print(t[:, :, np.newaxis].shape) # (2, 3, 1) ๋ชจ์์ 3์ฐจ์ ๋ฐฐ์ด
print(t[:, :, np.newaxis]) # ์ฐจ์์ ํ์ฅํ ๋ฐฐ์ด ์ถ๋ ฅ
print()
# 2. ์ฐจ์์ ํ์ฅํ์ฌ ๊ฒฐ๊ณผ์ ํ์์ ํ์ธํฉ๋๋ค.
print(t[np.newaxis, :, :].shape) # (1, 2, 3) ๋ชจ์์ 3์ฐจ์ ๋ฐฐ์ด
print(t[np.newaxis, :, :]) # ์ฐจ์์ ํ์ฅํ ๋ฐฐ์ด ์ถ๋ ฅ
print()
# 3. ํ ์ฐจ์์ ํ์ฅํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
print(t[:, np.newaxis, :])
1. t[:, :, np.newaxis]
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ํ๊ณผ ์ด์ ์ ํํฉ๋๋ค.
- np.newaxis๋ ์ด ์ฐจ์์ ํ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ (2, 3, 1) ํ์์ 3์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค.
2. t[np.newaxis, :, :]
- np.newaxis**๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ฐจ์์ ํ์ฅํฉ๋๋ค.
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ๋ฐฐ์ด์ ์ ํํฉ๋๋ค.
๊ฒฐ๊ณผ๋ (1, 2, 3) ํ์์ 3์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค.
3. t[:, np.newaxis, :]
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ํ์ ์ ํํฉ๋๋ค.
- np.newaxis๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ถ์ ์ถ๊ฐํฉ๋๋ค.
- : ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ์ด์ ์ ํํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ np.array([[1,2,3],[4,5,6]])์ 3์ฐจ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค.
(2, 3, 1)
[[[1]
[2]
[3]]
[[4]
[5]
[6]]]
(1, 2, 3)
[[[1 2 3]
[4 5 6]]]
[[[1 2 3]]
[[4 5 6]]]
N-d array axis view
๋ฐ์ํ
'๐ Data Mining' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Mining] Linear Algebra (์ ํ๋์) (0) | 2024.07.09 |
---|---|
[Data Mining] Introduction to Numpy part.2 (0) | 2024.07.05 |
[Data Mining] Visualizing Data (0) | 2024.06.25 |
[Data Mining] Crash_Course in Python Part.2 (0) | 2024.06.25 |
[Data Mining] Crash_Course in Python Part.1 (0) | 2024.06.25 |