Numpy: Enh: ๊ฐ์ฒด ๋ฐฐ์—ด ์ƒ์„ฑ ๊ธฐ๋Šฅ

์— ๋งŒ๋“  2015๋…„ 06์›” 02์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

๋ฌธ์ œ #5303์—์„œ ๋…ผ์˜๋œ ๋ฐ”์™€ ๊ฐ™์ด, ์‹œํ€€์Šค๋Š” ์ž๋™์œผ๋กœ ๋ฐฐ์—ด ์š”์†Œ๋กœ ์ฝํ˜€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๊ธธ์ด์˜ ์‹œํ€€์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด dtype์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์— ๋Œ€ํ•ด์„œ๋งŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ผ๋Š” ์ œ์•ˆ์ด ์žˆ์ง€๋งŒ ์ด๋Š” ์ฃผ์š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ์ค‘๋‹จ์ด ๋˜๊ณ  ๊ธด ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ์ฒด dtype์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์„ "๊ฐ์ฒด ๋ฐฐ์—ด"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์‹œํ€€์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹œํ€€์Šค์˜ ๊ฐ ์š”์†Œ๋ฅผ 1D ๊ฐœ์ฒด ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜์—๋Š” ๋ฐฐ์—ด์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•˜๋Š” ์‹œํ€€์Šค ์ˆ˜์ค€์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์  "ndim" ๋˜๋Š” "๊นŠ์ด" ์ธ์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค(๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ์ˆ˜์ค€๋งŒ ๊ณ ๋ ค๋จ). ์น˜์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋Œ€์•ˆ๊ณผ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด์ง€ ์•Š์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์—†๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ndmax ์ธ์ˆ˜๋Š” ๋ณด๊ณ ๋œ ๋ฌธ์ œ("_๊ฐ™์€ ๊ธธ์ด์˜ ์‹œํ€€์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด dtype์˜ ๋ฐฐ์—ด ์ƒ์„ฑ_")๋ฅผ ํ•ด๊ฒฐํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ๊ฐœ์ฒด๊ฐ€ ๋ชฉ๋ก์ด ์•„๋‹Œ ๊ฒฝ์šฐ(๋˜๋Š” ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ๋ชฉ๋ก์ธ ๊ฒฝ์šฐ). ๋˜ํ•œ ์ด ์งˆ๋ฌธ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

๋™์ผํ•œ ํฌ๊ธฐ์˜ ๋ชฉ๋ก์„ ๊ฐ์ฒด ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋‘ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

objectarray ์˜ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ํ˜„์žฌ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ์•„์ด๋””์–ด.

์ด ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด array ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž๋™ ๋ณ€ํ™˜์„ ๋ฌด์‹œํ•˜๊ณ  ์ž์ฒด์ ์œผ๋กœ ndarray ์ƒ์„ฑ์ž๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์—†๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ndmax ์ธ์ˆ˜๋Š” ๋ณด๊ณ ๋œ ๋ฌธ์ œ("_๊ฐ™์€ ๊ธธ์ด์˜ ์‹œํ€€์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด dtype์˜ ๋ฐฐ์—ด ์ƒ์„ฑ_")๋ฅผ ํ•ด๊ฒฐํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ๊ฐœ์ฒด๊ฐ€ ๋ชฉ๋ก์ด ์•„๋‹Œ ๊ฒฝ์šฐ(๋˜๋Š” ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ๋ชฉ๋ก์ธ ๊ฒฝ์šฐ). ๋˜ํ•œ ์ด ์งˆ๋ฌธ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ndmax ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์ด๋‚˜ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ์ผ:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰