๊ฐœ๋ฐœ ํƒ€์ž„์บก์А/Python

[Python] Numpy - ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ(Array Indexing)

๐ŸฅญMango 2020. 9. 19. 04:41

์ •์ˆ˜ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ

๋ฐฐ์—ด์—์„œ ํ•˜๋‚˜์˜ ๋‹จ์ผํ•œ ์›์†Œ๋ฅผ ์—‘์„ธ์Šค ํ•  ๊ฒฝ์šฐ tuple๋กœ ์ธ๋ฑ์‹ฑ

์ด๊ฒƒ์˜ ๋ชฉ์ ์€ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ํ•œ๊บผ๋ฒˆ์— ๋ฝ‘์•„๋‚ด์„œ ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋ ค๋Š” ๊ฒƒ์ด๋‹ค.

์Šฌ๋ผ์ด์‹ฑ์„ ํ•˜๋ฉด ์›๋ณธ ๋ฐฐ์—ด์˜ ์—ฐ์†์ ์ธ ๋ฐฐ์—ด์ด๊ฑฐ๋‚˜, ํ˜น์€ ์ผ์ •ํ•œ ๊ทœ์น™์„ ๋”ฐ๋ผ์„œ ์ž˜๋ผ๋‚ธ ํ˜•ํƒœ์ง€๋งŒ,

์ •์ˆ˜ ๋ฐฐ์—ด ์ธ๋ฑ์‹ค์€ ๋ถˆ๊ทœ์น™์ ์œผ๋กœ ์›๋ณธ ๋ฐฐ์—ด์˜ ์ผ๋ถ€๋ฅผ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค.

 

*์Šฌ๋ผ์ด์‹ฑ์€ ๋‹จ์ง€ ์›๋ณธ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด View๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ์— ์ง€๋‚˜์ง€ ์•Š์ง€๋งŒ, ์ •์ˆ˜๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

1์ฐจ์› ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ •์ˆ˜ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ

์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋œ ๋ฐฐ์—ด์˜ ๊ฐ ๊ฐ’์€ ๊ทธ ์ž๋ฆฌ์— ์˜ฌ ์›๋ž˜ ๋ฐฐ์—ด์˜ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

x = np.arange(10, 1, -1)
print(x) #[10  9  8  7  6  5  4  3  2]

print(x[np.array([3, 3, 1, 8])])
#[7 7 9 2]

print(x[[3, 3, 1, 8]]) #๋ฆฌ์ŠคํŠธ๋Š” ๋ฐฐ์—ด๋กœ ์•”๋ฌต์ ์œผ๋กœ ๋ณ€ํ™˜๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰ ๋™์ผํ•˜๋‹ค.
#[7 7 9 2]

 

print(x[np.array([3, 3, -3, 8])])
#[7 7 4 2]

๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ ์Œ์ˆ˜ ์ธ๋ฑ์Šค๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

print(x[np.array([[1, 1], [2, 3]])])

#[[9 9]
#[8 7]]

1์ฐจ์› ๋ฐฐ์—ด์„ ๋‹ค์ฐจ์› ๋ฐฐ์—ด๋กœ  ์ธ๋ฑ์‹ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฆฌํ„ด๋˜๋Š” ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ์ธ๋ฑ์Šค ๋ฐฐ์—ด๊ณผ ๋™์ผํ•œ shape์˜ ๋ฐฐ์—ด์ด๊ณ ,

๊ฐ’์€ ์ธ๋ฑ์Šค ๋ฐฐ์—ด์— ์˜ํ•ด์„œ ์ง€์ •ํ•œ ๊ฐ’๋“ค์ด๋‹ค.

 

๋‹ค์ฐจ์› ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ •์ˆ˜ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ

y = np.arange(35).reshape(5, 7)
print(y)

#[[ 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]]

#1
print(y[np.array([0, 2, 4]), np.array([0, 1, 2])])
#print(y[[0, 2, 4], [0, 1, 2]])

#[ 0 15 30]

#2
print(y[np.array([[0, 1], [2, 3]]), np.array([[4, 5], [2, 3]])])

#[[ 4 12]
#[16 24]]

๋‹ค์ฐจ์› ๋ฐฐ์—ด์ด ๋ฐฐ์—ด๋กœ ์ธ๋ฑ์‹ฑ ๋  ๊ฒฝ์šฐ์—๋Š” ๊ทœ์น™์ด ์ข€๋” ๋ณต์žกํ•ด์ง„๋‹ค.  

์šฐ์„  ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋Š” rank๊ฐœ์˜ ์ธ๋ฑ์Šค ๋ฐฐ์—ด๋กœ ์ œ๊ณต๋˜๊ณ , ๋ชจ๋“  ์ธ๋ฑ์Šค ๋ฐฐ์—ด๋“ค์ด ๋™์ผํ•œ shape์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

์ด ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ๋ฐฐ์—ด๊ณผ ๋™์ผํ•œ shape๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ , ๋ฐฐ์—ด์˜ ๊ฐ’์€ ๊ฐ๊ฐ์˜ ์ฐจ์›์— ๋Œ€ํ•ด ๊ทธ ์ฐจ์›์— ๋Œ€์‘ํ•˜๋Š” ์ธ๋ฑ์Šค ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ

ํ•˜๋Š” ๊ฐ’์ด๋‹ค.

 

์ฐธ๊ณ 

#1 -> 0ํ–‰ 0์—ด / 2ํ–‰ 1์—ด / 4ํ–‰ 2์—ด

#2 -> 0ํ–‰ 4์—ด / 1ํ–‰ 5์—ด / 2ํ–‰ 2์—ด / 3ํ–‰ 3์—ด

 

์ธ๋ฑ์Šค ๋ฐฐ์—ด๋“ค์ด ์„œ๋กœ ๋™์ผํ•œ shape์ด ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” ๋™์ผํ•œ shape์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด broadcast๋ฅผ ์‹œ๋„ํ•˜๋Š”๋ฐ...

์•„์ง ๋ฐฐ์šฐ์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ƒ๋žตํ•œ๋‹ค.

 

์›๋ž˜ ๋ฐฐ์—ด์˜ rank๋ณด๋‹ค ์ ์€ ๊ฐœ์ˆ˜์˜ ์ธ๋ฑ์Šค ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

print(y[np.array([0, 1, 4])])

#[[ 0  1  2  3  4  5  6]
#[ 7  8  9 10 11 12 13]
#[28 29 30 31 32 33 34]]

์ด ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ํ–‰๋“ค์„ ์„ ํƒํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๋ถˆ๋ฆฌ์–ธ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ(Boolean array indexing)

๋ถˆ๋ฆฌ์–ธ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ์€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ฒŒ ํ•˜๋Š” ์š”์†Œ๋งŒ ์„ ํƒํ•˜๊ณ ์ž ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค.

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

bool_idx = (a > 2)
print(a[bool_idx])

#[3 4 5 6]
print(a[a > 2])

#[3 4 5 6]

์œ„ ์ฝ”๋“œ์™€ ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.