A A
[Data Mining] Introduction to Numpy part.1

Introduction to Numpy

 

Numpy๋Š” numberal Python์˜ ์•ฝ์ž๋กœ, ์ˆ˜์น˜ ๊ณ„์‚ฐ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€ ์ž…๋‹ˆ๋‹ค.
  • Numpy์—์„œ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ndarray๋ผ๋Š” ๋‹ค์ฐจ์› ๋ฐฐ์—ด ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • Numpy๋Š” ndarray์˜ ์š”์†Œ๋“ค์„ ํšจ์œจ์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ จ์˜ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ค๋ช…์„œ๋ฅผ ๋ณด๋ ค๋ฉด ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 

NumPy documentation — NumPy v2.0 Manual

The reference guide contains a detailed description of the functions, modules, and objects included in NumPy. The reference describes how the methods work and which parameters can be used. It assumes that you have an understanding of the key concepts.

numpy.org

  • ๊ธ€๋ฉด ํ•œ๋ฒˆ 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)

 

  1. np.array([1]).shape: ๋ฐฐ์—ด [1]์€ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์ธ 1์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ shape๋Š” (1,)์ž…๋‹ˆ๋‹ค.
  2. np.array([1,2]).shape: ๋ฐฐ์—ด [1,2]์€ ์š”์†Œ๊ฐ€ ๋‘ ๊ฐœ์ธ 1์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ shape๋Š” (2,)์ž…๋‹ˆ๋‹ค.
  3. np.array([[1],[2]]).shape: ๋ฐฐ์—ด [[1], [2]]์€ ๋‘ ๊ฐœ์˜ ์š”์†Œ๊ฐ€ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ๋“ค์–ด์žˆ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ shape๋Š” (2,1)์ž…๋‹ˆ๋‹ค.
  4. np.array([[[1,2,3],[1,2,3]]]).shape:
    • ๋ฐฐ์—ด [[[1,2,3], [1,2,3]]]์€ 1์ฐจ์› ์š”์†Œ(๋ฆฌ์ŠคํŠธ)๊ฐ€ 2๊ฐœ์˜ ํ•˜์œ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ ํ•˜์œ„ ๋ฆฌ์ŠคํŠธ๋Š” 3๊ฐœ์˜ ์š”์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ shape๋Š” (1,2,3)์ž…๋‹ˆ๋‹ค.
  5. 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][:]์€ ์„ธ ๋ฒˆ์งธ ํ–‰์˜ ๋ชจ๋“  ์—ด์„ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
[[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