Numpy: NEP-18 ๊ตฌํ˜„์„์œ„ํ•œ ์ถ”์  ๋ฌธ์ œ (__array_function__)

์— ๋งŒ๋“  2018๋…„ 09์›” 25์ผ  ยท  54์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

  • [x] ์žฌ์ •์˜ ์ง€์›์„์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ :

    • [x] ์ˆœ์ˆ˜ Python์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„ (# 12005)

    • [x] array_function_dispatch (https://github.com/numpy/numpy/pull/12099)์—์„œ ๋””์ŠคํŒจ์ฒ˜ ํ•จ์ˆ˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ



      • NumPy๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์„ ๋•Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋น„ํ™œ์„ฑํ™” (๊ฐ€์ ธ ์˜ค๊ธฐ ์‹œ๊ฐ„์— ์ธก์ • ๊ฐ€๋Šฅํ•œ ์˜ํ–ฅ์ด์žˆ๋Š” ๊ฒฝ์šฐ) (๋ถˆํ•„์š”)



    • [x] __array_function__ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ๋„๋ก .__skip_array_function__ ํ•จ์ˆ˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (https://github.com/numpy/numpy/pull/13389)

  • [x] ์†๋„๋ฅผ ์œ„ํ•ด C์—์„œ numpy/core/overrides.py ์ผ๋ถ€๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค (https://github.com/numpy/numpy/issues/12028) :

    • [x] get_overloaded_types_and_args

    • [x] array_function_implementation_or_override

    • [x] ndarray.__array_function__ ?

    • [x] array_function_dispatch ?

  • [x] ๋ชจ๋“  ๊ณต์šฉ NumPy ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์žฌ์ •์˜ ์ง€์›

    • [x] numpy.core



      • [x] ์‰ฌ์šด ๋ถ€๋ถ„ (https://github.com/numpy/numpy/pull/12115)


      • [x] np.core.defchararray (# 12154)


      • [x] np.einsum ๋ฐ np.block (https://github.com/numpy/numpy/pull/12163)



    • [x] numpy.lib



      • [x] ํŒŒํŠธ 1 (https://github.com/numpy/numpy/pull/12116)


      • [x] 2 ๋ถ€ (# 12119)



    • [x] numpy.fft / numpy.linalg (https://github.com/numpy/numpy/pull/12117)

    • [x] ํ˜„์žฌ ์™„์ „ํžˆ C๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜ : empty_like, concatenate, inner, where, lexsort, can_cast, min_scalar_type, result_type, dot, vdot, is_busday, busday_offset, busday_count, datetime_as_string (https://github.com/numpy/numpy/ ๋‹น๊ธฐ๊ธฐ / 12175)

    • [x] linspace

    • [] [ arange? ] (https://github.com/numpy/numpy/issues/12379)

  • [x] ์‚ฌ์šฉ์„ฑ ๊ฐœ์„ 

    • [x] [๋” ๋‚˜์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€] (https://github.com/numpy/numpy/issues/12213) ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜ (https://github.com/numpy/numpy/pull/12251)

    • [x] ndarray.__repr__ ๋Š” __array_function__ (https://github.com/numpy/numpy/pull/12212)์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

    • [x] ๋ž˜ํ•‘ ๋œ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ stacklevel ๋ฅผ 1 ์”ฉ ๋Š˜๋ ค์•ผํ•˜๋ฏ€๋กœ ํŠธ๋ ˆ์ด์Šค ๋ฐฑ์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค (gh-13329).

  • [x] ์•Œ๋ ค์ง„ ๋ชจ๋“  ๋ฒ„๊ทธ / ๋‹ค์šด ์ŠคํŠธ๋ฆผ ํ…Œ์ŠคํŠธ ์‹คํŒจ ์ˆ˜์ •
  • [] ๋ฌธ์„œ

    • [x] ์ถœ์‹œ ์ •๋ณด (# 12028)

    • [x] ์„ค๋ช… ๋ฌธ์„œ

    • [] ์˜ค๋ฒ„๋กœ๋“œ ๋œ ์ธ์ˆ˜๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ • ๋œ ๋… ์ŠคํŠธ๋ง?

__array_function__

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

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด np.array ํŒŒ๊ฒฌ ์ง€์›์ด ์ •๋ง ํž˜๋“ค์–ด์„œ 100 % ์ง€์›์„๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”?

NEP 22 ์—๋Š” ์—ฌ๊ธฐ์—์„œ ์˜ต์…˜์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. numpy.ndarray ๊ฐ์ฒด ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด np.asarray() ์˜ ์˜๋ฏธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์ด๋ฅผ ์œ„ํ•ด ์ƒˆ ํ”„๋กœํ† ์ฝœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š”์ด๋‹ค np.asarray() ํ˜„์žฌ ์šฉ๋„๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ ํ•  ์ˆ˜์žˆ๋Š” NumPy์™€ ๋ฐฐ์—ด ๊ฐ์ฒด์— ์บ์ŠคํŒ…์˜ ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค numpy.ndarray ์•„๋ž˜๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด,.

์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด ์•„๋‹Œ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์ง€๋งŒ์ด ๋™์ž‘์„ ์ „ํ™˜ํ•˜๋ฉด ๋งŽ์€ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜๋ฏ€๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์šด ์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ๋Š” ์ตœ์†Œํ•œ ๋ฐฐ์—ด ๋• ํƒ€์ดํ•‘์˜ ์ด๋Ÿฌํ•œ ์ธก๋ฉด์„ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์„ฑ๋Šฅ / ๋ณต์žก์„ฑ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์žˆ์Œ์„ ์ดํ•ดํ•˜๊ณ  ์ด๊ฒƒ์ด์ด๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ข‹์€ ์ด์œ  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์œ ์—ฐ์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ. NEP 18์€ ๋“œ๋กญ ์ธ NumPy ๋Œ€์•ˆ์„์œ„ํ•œ ์™„์ „ํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

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

์ผ๋ถ€ ์ฃผ์š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์˜ˆ๋น„ "๋ชจ๋“  ๊ณต์šฉ NumPy ๊ธฐ๋Šฅ์„ @array_function_dispatch๋กœ ์žฅ์‹"์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ํ”„๋กœํ† ์ฝœ์˜ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์†Œ๋น„์ž์—๊ฒŒ ์‹œ๋„ํ•ด ๋ณด๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/pull/12099 ๋ณ‘ํ•ฉํ•˜๋ฉด numpy.core ๋Œ€๋ถ€๋ถ„์— ๋””์ŠคํŒจ์น˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ๋˜ ๋‹ค๋ฅธ PR์ด ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ๋งˆ์น˜๋Š” ๊ฒƒ์€ ๊ฝค ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ์‹œ๊ฐ„๋„ ์ฑ„ ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

cc @ eric-wieser @mrocklin @mhvk @hameerabbasi

Python ๋ž˜ํผ๋กœ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ชจ๋“  "์‰ฌ์šด"์žฌ์ •์˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‚ด ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด์„œ๋Š” https://github.com/shoyer/numpy/tree/array-function-easy-impl ์„ ์ฐธ์กฐ np.block , np.einsum ๋ฐ ์™„์ „ํžˆ C๋กœ ์ž‘์„ฑ๋œ ์†Œ์ˆ˜์˜ ๋‹ค์ค‘ ๋ฐฐ์—ด ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค (์˜ˆ : np.concatenate ). # 12099๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์ด๊ฒƒ์„ ์—ฌ๋Ÿฌ PR๋กœ ๋‚˜๋ˆŒ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ ๊ฐœ๋ณ„ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์žฌ์ •์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (์˜ˆ : ์ ์šฉ๋œ ๋ชจ๋“  ์ž‘์—…์„ ๊ธฐ๋กํ•˜๋Š” duck ๋ฐฐ์—ด)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ฐ ๊ฐœ๋ณ„ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋””์ŠคํŒจ์น˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ƒ์‚ฐ์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. # 12099์˜ ๊ฒ€์‚ฌ๋Š” ๋””์ŠคํŒจ์ฒ˜์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•ด์•ผํ•˜๋ฉฐ ๋””์ŠคํŒจ์ฒ˜ ํ•จ์ˆ˜์˜ ๋ชจ๋“  ์ฝ”๋“œ ํ–‰์€ ๊ธฐ์กด ํ…Œ์ŠคํŠธ์— ์˜ํ•ด ์‹คํ–‰๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@shoyer- ํ…Œ์ŠคํŠธ์—์„œ ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํŠนํžˆ ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  numpy ๋‚ด์—์„œ MaskedArray ์—์„œ ๋น„๊ต์  ๋น ๋ฅด๊ฒŒ ์žฌ์ •์˜ ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mhvk ๋Š” ๋‚˜์—๊ฒŒ MaskedArray ๋ฅผ ์‚ฌ์šฉ / ์•„๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ฃผ๋„๊ถŒ์„ ๊ฐ–๋„๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/pull/12115 , https://github.com/numpy/numpy/pull/12116 , # 12119 ๋ฐ https://github.com/numpy/numpy/pull/ ์ฐธ์กฐ Python์— ์ •์˜ ๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด __array_function__ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” PR์˜ ๊ฒฝ์šฐ 12117 .

@shoyer- ๊ตฌํ˜„ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณด๋ฉด ๋‘ ๊ฐ€์ง€ ๊ฑฑ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • reshape ์™€ ๊ฐ™์€ ์ผ๋ถ€ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์›๋ž˜ ๊ธฐ๋Šฅ์€ reshape ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ์ด๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด๋ฏธ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” __array_function__ ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์— ๋Œ€ํ•ด์ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • np.median ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ np.asanyarray ๋ฐ ufuncs๋ฅผ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๋” ์ด์ƒ ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ˆœ์ˆ˜์— ์ตœ์ ํ™” ๋œ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์ด๋Ÿฌํ•œ ๋‘ ๊ฐ€์ง€, ์•„๋งˆ ์ด์  ์ƒ๊ฐ ndarray , ํ›„์ž๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€๋งŒ - ndarray.__array_function__ ๋“ฑ, ๋ชฉ๋ก์„ ๋ณ€ํ™˜ ์ธ์ˆ˜ํ•œ๋‹ค ๊ตฌํ˜„์‹œ ํ•ด๋‹น ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ๋„๋ก ndarray ). ๊ทธ๋ž˜๋„ ์ž‘์—…๋Ÿ‰๊ณผ ์„ฑ๋Šฅ ์ €ํ•˜ ์ธก๋ฉด์—์„œ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค Quantity ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋‘๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋ชฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ›„์ž๋Š” ndarray .__ array_function__์ด ๋ชฉ๋ก ๋“ฑ์„ ndarray๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ตฌํ˜„์ด ํ•ด๋‹น ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ๋„๋ก ์ธ๊ณ„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.)

๋‚ด๊ฐ€ ์—ฌ๊ธฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ reshape ๋ฐ mean ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ์ด์ „ ๋ฐฉ์‹์„ ํšจ๊ณผ์ ์œผ๋กœ ํ๊ธฐํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ด์ „ ๋ฐฉ์‹์€ ์—ฌ์ „ํžˆ โ€‹โ€‹NumPy API์˜ ๋ถˆ์™„์ „ํ•œ ๊ตฌํ˜„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์—ฌ๊ธฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋‹จ์ผ ํ•จ์ˆ˜์— ๋Œ€ํ•ด __array_function__ ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์ด์ „ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์™„์ „ํžˆ ์ค‘๋‹จ๋˜๊ณ  ์žฅ์•  ์กฐ์น˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” NotImplementedButCoercible ์ œ์•ˆ์„ ๋‹ค์‹œ ๊ฒ€ํ†  ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@hameerabbasi- ๋„ค, ๊ทธ๊ฒŒ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์€ ๋•ํŠธ ํ…Œ์ดํ”„ ์†”๋ฃจ์…˜์— ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ฒŒ ์˜์กด ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์ด ์ œ๊ฐ€ ์œ„์—์„œ "๋ฌธ์ œ"๊ฐ€ ์‹ค์ œ๋กœ ์ด์ต์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์“ด ์ด์œ ์ž…๋‹ˆ๋‹ค ...) . 1.16์—์„œ์™€ ๊ฐ™์ด ์‹œ๋„ํ•œ ๋‹ค์Œ "์ด ์‚ฌ๋ก€์— ๋Œ€ํ•ด __array_function__ ๋ฌด์‹œ"์˜ ๋Œ€์ฒด๋ฅผ ์ œ๊ณตํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์‹ค์ œ ๊ฒฝํ—˜์œผ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Re : ๋””์ŠคํŒจ์ฒ˜ ์Šคํƒ€์ผ๋ง : ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ์„ ํ˜ธ๋„๋Š” ๋ฉ”๋ชจ๋ฆฌ / ๊ฐ€์ ธ ์˜ค๊ธฐ ์‹œ๊ฐ„ ๊ณ ๋ ค ์‚ฌํ•ญ ๋ฐ ์ž์„ธํ•œ ์ •๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์„œ๋ช…์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๋””์ŠคํŒจ์ฒ˜๋ฅผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ตœ์†Œํ•œ์˜ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์บ์‹œ ์ ์ค‘๋„ ๋” ๋†’์•„์ง‘๋‹ˆ๋‹ค.

์ฆ‰, ๋‚˜๋Š” ๋žŒ๋‹ค ์Šคํƒ€์ผ์— ๋„ˆ๋ฌด ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋””์ŠคํŒจ์ฒ˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์Šคํƒ€์ผ์€ ์ด์ œ ๋ช‡ ๊ฐ€์ง€ PR์—์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. NumPy์—์„œ ์ผ๊ด€๋œ ์„ ํƒ์„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.


์˜ต์…˜ 1 : ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋””์ŠคํŒจ์ฒ˜๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ :

def _sin_dispatcher(a):
    return (a,)


@array_function_dispatch(_sin_dispatcher)
def sin(a):
     ...


def _cos_dispatcher(a):
    return (a,)


@array_function_dispatch(_cos_dispatcher)
def cos(a):
    ...

์žฅ์  :

  • ๋งค์šฐ ๊ฐ€๋…์„ฑ
  • ๋””์ŠคํŒจ์ฒ˜ ๊ธฐ๋Šฅ์˜ ์ •์˜๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž˜๋ชป๋œ ์ธ์ˆ˜ (์˜ˆ : sin(x=1) -> TypeError: _sin_dispatcher() got an unexpected keyword argument 'x' ๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€ ์›๋‹ˆ๋‹ค.

๋‹จ์  :

  • ๋ชจ๋“ˆ์˜ ๋งŽ์€ ํ•จ์ˆ˜๊ฐ€ ๋˜‘๊ฐ™์€ ์„œ๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ๋งŽ์€ ๋ฐ˜๋ณต.

์˜ต์…˜ 2 : ๋ชจ๋“ˆ ๋‚ด์—์„œ ๋””์ŠคํŒจ์ฒ˜ ๊ธฐ๋Šฅ ์žฌ์‚ฌ์šฉ, ์˜ˆ :

def _unary_dispatcher(a):
    return (a,)


@array_function_dispatch(_unary_dispatcher)
def sin(a):
     ...


@array_function_dispatch(_unary_dispatcher)
def cos(a):
    ...

์žฅ์  :

  • ๋œ ๋ฐ˜๋ณต
  • ์ฝ๊ธฐ ๊ฐ€๋Šฅ

๋‹จ์  :

  • ๋””์ŠคํŒจ์ฒ˜ ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž˜๋ชป๋œ ์ธ์ˆ˜์— ๋Œ€ํ•œ ์•ฝ๊ฐ„ ๋œ ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ (์˜ˆ : sin(x=1) -> TypeError: _unary_dispatcher() got an unexpected keyword argument 'x'

์˜ต์…˜ 3 : ๋””์ŠคํŒจ์ฒ˜ ์ •์˜๊ฐ€ ํ•œ ์ค„์— ๋งž์„ ๋•Œ lambda ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ :

# inline style (shorter)
@array_function_dispatch(lambda a: (a,))
def sin(a):
     ...


@array_function_dispatch(lambda a, n=None, axis=None, norm=None: (a,))
def fft(a, n=None, axis=-1, norm=None):
     ...
# multiline style (more readable?)
@array_function_dispatch(
    lambda a: (a,)
)
def sin(a):
     ...


@array_function_dispatch(
    lambda a, n=None, axis=None, norm=None: (a,)
)
def fft(a, n=None, axis=-1, norm=None):
     ...

์žฅ์  :

  • ๋””์ŠคํŒจ์ฒ˜ ์ •์˜๋ฅผ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๊ฑฐ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ์ ์€ ์ˆ˜์˜ ๋ฌธ์ž ๋ฐ ์ฝ”๋“œ ์ค„.
  • ์งง์€ ๊ฒฝ์šฐ (์˜ˆ : ํ•˜๋‚˜์˜ ์ธ์ˆ˜), ํŠนํžˆ ๋žŒ๋‹ค๊ฐ€ ํ•จ์ˆ˜ ์ด๋ฆ„๋ณด๋‹ค ์งง์„ ๋•Œ ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹จ์  :

  • ์˜ต์…˜ 2๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฐ˜๋ณต ์ฝ”๋“œ.
  • ์ธ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ๋งค์šฐ ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ๋œ ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ( TypeError: <lambda>() got an unexpected keyword argument 'x' ).

@shoyer : "์ฝ”๋“œ ์ค„"์ธก๋ฉด์„๋ณด๋‹ค ์‚ฌ์‹ค์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 2 ์ค„ PEP8 ๊ฐ„๊ฒฉ์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ํŽธ์ง‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ฌธ์ œ๋Š” ์ฝ”๋“œ ๊ฐ์ฒด ๋ฅผ @nschloe ์˜ ์ฐธ์น˜๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ๋ถ„์„ ํ•  ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ชจ๋“ˆ์€ ํ•จ์ˆ˜ ์ •์˜ ์ƒ์„ฑ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ฝ”๋“œ ์ƒ์„ฑ์— ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ exec() ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ namedtuple๊ณผ ์กฐ๊ธˆ ๋” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค).

์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ํ•œ ๋ช…ํ™•ํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋””์ŠคํŒจ์ฒ˜๋กœ ์˜ต์…˜์„ ๊ณ ์ˆ˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ ์ด์œ ๋กœ ๋””์ŠคํŒจ์ฒ˜๋ฅผ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ๋ฌถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (2), ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋งค์šฐ ์—ผ๋‘์—๋‘๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋””์ŠคํŒจ์ฒ˜๋ฅผ _dispatch_on_x ์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ƒํ™ฉ์ด ๋ฐ”๋€๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•˜๊ณ  <lambda> ๋ฅผ ์˜ˆ์™ธ ํ…์ŠคํŠธ์˜ ํ•จ์ˆ˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พผ ๋‹ค์Œ ๋‹ค์‹œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๋งŒ ํผ ๊ฐ„๋‹จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์•„๋‹ˆ๋ฉด ์š”์ฆ˜ ๊ทธ ์ฒด์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?)

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ช…ํ™•ํ•ด์•ผํ•˜๋ฉฐ ์ด์ƒ์ ์œผ๋กœ๋Š” ์ „ํ˜€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ์ง€๊ธˆ์€ ์ฝ”๋“œ ์ƒ์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ•œ lambda ์‚ฌ์šฉ์„ ๋ณด๋ฅ˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/pull/12175 ๋Š” Python ๋ž˜ํผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์ค‘ ๋ฐฐ์—ด ํ•จ์ˆ˜ (C๋กœ ์ž‘์„ฑ)์— ๋Œ€ํ•œ ์žฌ์ •์˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ดˆ์•ˆ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@mattip matmul ๋ฅผ ufunc๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ? __array_function__ ์žฌ์ •์˜๋ฅผ ๋ชจ๋‘ ์™„๋ฃŒํ•˜๋ฉด NumPy์˜ ๊ณต์šฉ API๋ฅผ ์™„์ „ํžˆ ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋งˆ์ง€๋ง‰ ์ž‘์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. NumPy 1.16์„ ์œ„ํ•ด ๋ชจ๋“  ์ค€๋น„๊ฐ€๋˜์–ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

NEP 20์„ ๊ตฌํ˜„ํ•˜๋Š” PR # 11175๋Š” ์ฒœ์ฒœํžˆ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. matmul ๋ฃจํ”„ ์ฝ”๋“œ๊ฐ€์žˆ๋Š” PR # 11133์˜ ์ฐจ๋‹จ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๊ฐ€ ์ด์ „ ์ฝ”๋“œ๋ณด๋‹ค ๋Š๋ฆฌ์ง€ ์•Š์Œ์„ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ์žฌ์ •์˜ ์„ธํŠธ๋ฅผ ์™„๋ฃŒํ•ด์•ผํ•˜๋Š” ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด 4 ๊ฐœ์˜ PR์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ข… ๊ฒ€ํ†  / ์‚ฌ์ธ ์˜คํ”„ / ํ•ฉ๋ณ‘์„ ์ฃผ์‹œ๋ฉด ๋ณธ๊ฒฉ์ ์œผ๋กœ __array_function__ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! https://github.com/numpy/numpy/pull/12154 , https://github.com/numpy/numpy/pull/12163 , https://github.com/numpy/numpy/pull/12119 , https : //github.com/numpy/numpy/pull/12175

np.core ์— ์žฌ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ Pandas ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค (https://github.com/pandas-dev/pandas/issues/23172). ์•„์ง ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ถœ์‹œํ•˜๊ธฐ ์ „์— ํ™•์‹คํžˆ ํŒŒ์•…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด dask / pandas์—์„œ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ด์œ ๋ฅผ ๊ฐ€์žฅ ์ž˜ ์ถ”์ธก ํ•˜๋ ค๋ฉด https://github.com/numpy/numpy/issues/12225 ๋ฅผ ์ฐธ์กฐ

์ˆ˜์ž… ์‹œ๊ฐ„์˜ ์ผ๋ถ€ ๋ฒค์น˜ ๋งˆํฌ (์†”๋ฆฌ๋“œ ์Šคํ…Œ์ดํŠธ ๋“œ๋ผ์ด๋ธŒ๊ฐ€์žˆ๋Š” MacBook Pro์—์„œ) :

  • NumPy 1.15.2 : 152.451ms
  • NumPy ๋งˆ์Šคํ„ฐ : 156.5745ms
  • decorator.decorate (# 12226) : 183.694ms

๋‚ด ๋ฒค์น˜ ๋งˆํฌ ์Šคํฌ๋ฆฝํŠธ

import numpy as np
import subprocess

times = []
for _ in range(100):
    result = subprocess.run("python -X importtime -c 'import numpy'",
                            shell=True, capture_output=True)
    last_line = result.stderr.rstrip().split(b'\n')[-1]
    time = float(last_line.decode('ascii')[-15:-7].strip().rstrip())
    times.append(time)

print(np.median(times) / 1e3)

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ (์ „ / ํ›„)์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Š” ํŠนํžˆ IoT ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์•ˆ์ •์ ์œผ๋กœ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
2018 ๋…„ 10 ์›” 20 ์ผ ํ† ์š”์ผ ์˜ค์ „ 6:56 Hameer Abbasi [email protected]
์ผ๋‹ค :

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ (์ „ / ํ›„)์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค
ํŠนํžˆ IoT ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/12028#issuecomment-431584123 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์‹ค
https://github.com/notifications/unsubscribe-auth/ABKS1k_IkrJ2YmYReaDrnkNvcH2X0-ZCks5umyuogaJpZM4W3kSC
.

import numpy as np ํฌํ•จํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  sleep ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://superuser.com/questions/581108/how-can-i-track-and-log-cpu-and-memory-usage-on-a-mac

๋‹ค๋ฅธ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๋Š” https://github.com/numpy/numpy/pull/12163 ์—์„œ ๋น ๋ฅด๊ฒŒ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค (์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค!) array_function_dispatch ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋งˆ์ง€๋ง‰ PR์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ __array_function__ ๋น„ํ™œ์„ฑํ™” ํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

       before           after         ratio
     [45718fd7]       [4e5aa2cd]
     <master>         <disable-array-function>
+        72.5ยฑ2ms         132ยฑ20ms     1.82  bench_io.LoadtxtCSVdtypes.time_loadtxt_dtypes_csv('complex128', 10000)
-        44.9ยฑ2ฮผs       40.8ยฑ0.6ฮผs     0.91  bench_ma.Concatenate.time_it('ndarray', 2)
-      15.3ยฑ0.3ฮผs       13.3ยฑ0.7ฮผs     0.87  bench_core.CountNonzero.time_count_nonzero_multi_axis(2, 100, <type 'object'>)
-        38.4ยฑ1ฮผs         32.7ยฑ2ฮผs     0.85  bench_linalg.Linalg.time_op('norm', 'longfloat')
-        68.7ยฑ3ฮผs         56.5ยฑ3ฮผs     0.82  bench_linalg.Linalg.time_op('norm', 'complex256')
-        80.6ยฑ4ฮผs         65.9ยฑ1ฮผs     0.82  bench_function_base.Median.time_even
-        82.4ยฑ2ฮผs         66.8ยฑ3ฮผs     0.81  bench_shape_base.Block.time_no_lists(100)
-        73.5ยฑ3ฮผs         59.3ยฑ3ฮผs     0.81  bench_function_base.Median.time_even_inplace
-      15.2ยฑ0.3ฮผs       12.2ยฑ0.6ฮผs     0.80  bench_core.CountNonzero.time_count_nonzero_multi_axis(3, 100, <type 'str'>)
-      2.20ยฑ0.1ms      1.76ยฑ0.04ms     0.80  bench_shape_base.Block2D.time_block2d((1024, 1024), 'uint64', (4, 4))
-        388ยฑ20ฮผs         310ยฑ10ฮผs     0.80  bench_lib.Pad.time_pad((10, 10, 10), 3, 'linear_ramp')
-        659ยฑ20ฮผs         524ยฑ20ฮผs     0.80  bench_linalg.Linalg.time_op('det', 'float32')
-      22.9ยฑ0.7ฮผs       18.2ยฑ0.8ฮผs     0.79  bench_function_base.Where.time_1
-        980ยฑ50ฮผs         775ยฑ20ฮผs     0.79  bench_shape_base.Block2D.time_block2d((1024, 1024), 'uint32', (4, 4))
-        36.6ยฑ1ฮผs         29.0ยฑ1ฮผs     0.79  bench_ma.Concatenate.time_it('unmasked', 2)
-      16.4ยฑ0.7ฮผs       12.9ยฑ0.6ฮผs     0.79  bench_core.CountNonzero.time_count_nonzero_axis(3, 100, <type 'str'>)
-      16.4ยฑ0.5ฮผs       12.9ยฑ0.4ฮผs     0.79  bench_core.CountNonzero.time_count_nonzero_axis(2, 100, <type 'object'>)
-         141ยฑ5ฮผs          110ยฑ4ฮผs     0.78  bench_lib.Pad.time_pad((10, 100), (0, 5), 'linear_ramp')
-      18.0ยฑ0.6ฮผs       14.1ยฑ0.6ฮผs     0.78  bench_core.CountNonzero.time_count_nonzero_axis(3, 100, <type 'object'>)
-      11.9ยฑ0.6ฮผs       9.28ยฑ0.5ฮผs     0.78  bench_core.CountNonzero.time_count_nonzero_axis(1, 100, <type 'int'>)
-        54.6ยฑ3ฮผs         42.4ยฑ2ฮผs     0.78  bench_function_base.Median.time_odd_small
-        317ยฑ10ฮผs          246ยฑ7ฮผs     0.78  bench_lib.Pad.time_pad((10, 10, 10), 1, 'linear_ramp')
-      13.8ยฑ0.5ฮผs       10.7ยฑ0.7ฮผs     0.77  bench_reduce.MinMax.time_min(<type 'numpy.float64'>)
-        73.3ยฑ6ฮผs         56.6ยฑ4ฮผs     0.77  bench_lib.Pad.time_pad((1000,), (0, 5), 'mean')
-      14.7ยฑ0.7ฮผs       11.4ยฑ0.3ฮผs     0.77  bench_core.CountNonzero.time_count_nonzero_axis(2, 100, <type 'str'>)
-        21.5ยฑ2ฮผs       16.5ยฑ0.6ฮผs     0.77  bench_reduce.MinMax.time_min(<type 'numpy.int64'>)
-         117ยฑ4ฮผs         89.2ยฑ3ฮผs     0.76  bench_lib.Pad.time_pad((1000,), 3, 'linear_ramp')
-        43.7ยฑ1ฮผs         33.4ยฑ1ฮผs     0.76  bench_linalg.Linalg.time_op('norm', 'complex128')
-      12.6ยฑ0.6ฮผs       9.55ยฑ0.2ฮผs     0.76  bench_core.CountNonzero.time_count_nonzero_multi_axis(2, 100, <type 'int'>)
-        636ยฑ20ฮผs         482ยฑ20ฮผs     0.76  bench_ma.MA.time_masked_array_l100
-        86.6ยฑ4ฮผs         65.6ยฑ4ฮผs     0.76  bench_lib.Pad.time_pad((1000,), (0, 5), 'linear_ramp')
-         120ยฑ4ฮผs         90.4ยฑ2ฮผs     0.75  bench_lib.Pad.time_pad((1000,), 1, 'linear_ramp')
-         160ยฑ5ฮผs          119ยฑ8ฮผs     0.74  bench_ma.Concatenate.time_it('ndarray+masked', 100)
-      14.4ยฑ0.6ฮผs       10.7ยฑ0.3ฮผs     0.74  bench_core.CountNonzero.time_count_nonzero_multi_axis(1, 100, <type 'str'>)
-      15.7ยฑ0.4ฮผs       11.7ยฑ0.6ฮผs     0.74  bench_core.CountNonzero.time_count_nonzero_multi_axis(2, 100, <type 'str'>)
-        21.8ยฑ2ฮผs       16.1ยฑ0.7ฮผs     0.74  bench_reduce.MinMax.time_max(<type 'numpy.int64'>)
-      11.9ยฑ0.6ฮผs       8.79ยฑ0.3ฮผs     0.74  bench_core.CountNonzero.time_count_nonzero_axis(2, 100, <type 'bool'>)
-        53.8ยฑ3ฮผs         39.4ยฑ2ฮผs     0.73  bench_function_base.Median.time_even_small
-        106ยฑ20ฮผs         76.7ยฑ4ฮผs     0.73  bench_function_base.Select.time_select
-        168ยฑ10ฮผs          122ยฑ4ฮผs     0.72  bench_shape_base.Block2D.time_block2d((512, 512), 'uint32', (2, 2))
-      12.5ยฑ0.5ฮผs       8.96ยฑ0.4ฮผs     0.72  bench_core.CountNonzero.time_count_nonzero_multi_axis(1, 100, <type 'int'>)
-        162ยฑ10ฮผs          115ยฑ5ฮผs     0.71  bench_function_base.Percentile.time_percentile
-        12.9ยฑ1ฮผs       9.12ยฑ0.4ฮผs     0.71  bench_random.Random.time_rng('normal')
-      9.71ยฑ0.4ฮผs       6.88ยฑ0.3ฮผs     0.71  bench_core.CorrConv.time_convolve(1000, 10, 'full')
-      15.1ยฑ0.8ฮผs       10.7ยฑ0.4ฮผs     0.71  bench_reduce.MinMax.time_max(<type 'numpy.float64'>)
-         153ยฑ9ฮผs          108ยฑ7ฮผs     0.71  bench_shape_base.Block2D.time_block2d((1024, 1024), 'uint8', (2, 2))
-         109ยฑ5ฮผs         76.9ยฑ5ฮผs     0.71  bench_ma.Concatenate.time_it('ndarray+masked', 2)
-        34.3ยฑ1ฮผs       24.2ยฑ0.6ฮผs     0.71  bench_linalg.Linalg.time_op('norm', 'complex64')
-      9.80ยฑ0.2ฮผs       6.84ยฑ0.5ฮผs     0.70  bench_core.CorrConv.time_convolve(1000, 10, 'same')
-        27.4ยฑ6ฮผs         19.1ยฑ2ฮผs     0.70  bench_core.CountNonzero.time_count_nonzero_axis(1, 10000, <type 'bool'>)
-      9.35ยฑ0.4ฮผs       6.50ยฑ0.3ฮผs     0.70  bench_core.CorrConv.time_convolve(50, 100, 'full')
-        65.2ยฑ4ฮผs         45.2ยฑ1ฮผs     0.69  bench_shape_base.Block.time_block_simple_row_wise(100)
-        12.9ยฑ1ฮผs       8.89ยฑ0.3ฮผs     0.69  bench_core.CountNonzero.time_count_nonzero_axis(3, 100, <type 'bool'>)
-        19.6ยฑ3ฮผs       13.5ยฑ0.4ฮผs     0.69  bench_core.CountNonzero.time_count_nonzero_multi_axis(3, 100, <type 'object'>)
-        75.6ยฑ2ฮผs         52.1ยฑ3ฮผs     0.69  bench_lib.Pad.time_pad((10, 10, 10), (0, 5), 'reflect')
-        12.4ยฑ1ฮผs       8.51ยฑ0.4ฮผs     0.69  bench_core.CountNonzero.time_count_nonzero_multi_axis(3, 100, <type 'bool'>)
-        172ยฑ30ฮผs          117ยฑ4ฮผs     0.68  bench_ma.Concatenate.time_it('unmasked+masked', 100)
-      23.1ยฑ0.5ฮผs       15.8ยฑ0.9ฮผs     0.68  bench_linalg.Linalg.time_op('norm', 'int16')
-      8.18ยฑ0.9ฮผs       5.57ยฑ0.1ฮผs     0.68  bench_core.CorrConv.time_correlate(1000, 10, 'full')
-         153ยฑ5ฮผs          103ยฑ3ฮผs     0.68  bench_function_base.Percentile.time_quartile
-       758ยฑ100ฮผs         512ยฑ20ฮผs     0.68  bench_linalg.Linalg.time_op('det', 'int16')
-        55.4ยฑ6ฮผs         37.4ยฑ1ฮผs     0.68  bench_ma.Concatenate.time_it('masked', 2)
-        234ยฑ30ฮผs          157ยฑ5ฮผs     0.67  bench_shape_base.Block.time_nested(100)
-         103ยฑ4ฮผs         69.3ยฑ3ฮผs     0.67  bench_linalg.Eindot.time_dot_d_dot_b_c
-      19.2ยฑ0.4ฮผs       12.9ยฑ0.6ฮผs     0.67  bench_core.Core.time_tril_l10x10
-         122ยฑ7ฮผs         81.7ยฑ4ฮผs     0.67  bench_lib.Pad.time_pad((10, 10, 10), 3, 'edge')
-        22.9ยฑ1ฮผs       15.3ยฑ0.5ฮผs     0.67  bench_linalg.Linalg.time_op('norm', 'int32')
-        16.6ยฑ2ฮผs       11.0ยฑ0.3ฮผs     0.66  bench_core.CountNonzero.time_count_nonzero_multi_axis(1, 100, <type 'object'>)
-      9.98ยฑ0.3ฮผs       6.58ยฑ0.1ฮผs     0.66  bench_core.CorrConv.time_convolve(1000, 10, 'valid')
-         118ยฑ6ฮผs         77.9ยฑ4ฮผs     0.66  bench_shape_base.Block2D.time_block2d((512, 512), 'uint16', (2, 2))
-        212ยฑ50ฮผs          140ยฑ8ฮผs     0.66  bench_lib.Pad.time_pad((10, 10, 10), (0, 5), 'mean')
-      21.9ยฑ0.7ฮผs       14.4ยฑ0.5ฮผs     0.66  bench_linalg.Linalg.time_op('norm', 'int64')
-         131ยฑ5ฮผs         85.9ยฑ5ฮผs     0.65  bench_lib.Pad.time_pad((10, 10, 10), 3, 'constant')
-        56.8ยฑ2ฮผs         37.0ยฑ3ฮผs     0.65  bench_lib.Pad.time_pad((1000,), (0, 5), 'constant')
-        58.9ยฑ3ฮผs         38.1ยฑ1ฮผs     0.65  bench_lib.Pad.time_pad((10, 100), (0, 5), 'reflect')
-        72.1ยฑ2ฮผs         46.5ยฑ3ฮผs     0.64  bench_lib.Pad.time_pad((10, 100), (0, 5), 'constant')
-      8.66ยฑ0.3ฮผs       5.58ยฑ0.2ฮผs     0.64  bench_core.CorrConv.time_correlate(50, 100, 'full')
-        300ยฑ30ฮผs         193ยฑ10ฮผs     0.64  bench_shape_base.Block2D.time_block2d((1024, 1024), 'uint8', (4, 4))
-        15.9ยฑ5ฮผs       10.2ยฑ0.3ฮผs     0.64  bench_core.CountNonzero.time_count_nonzero_axis(3, 100, <type 'int'>)
-      13.7ยฑ0.5ฮผs       8.80ยฑ0.1ฮผs     0.64  bench_random.Random.time_rng('uniform')
-      8.60ยฑ0.5ฮผs       5.50ยฑ0.2ฮผs     0.64  bench_core.CorrConv.time_correlate(1000, 10, 'same')
-        44.7ยฑ2ฮผs       28.5ยฑ0.7ฮผs     0.64  bench_lib.Pad.time_pad((1000,), 1, 'reflect')
-        72.7ยฑ3ฮผs         46.2ยฑ2ฮผs     0.64  bench_lib.Pad.time_pad((10, 10, 10), 3, 'wrap')
-        567ยฑ50ฮผs         360ยฑ40ฮผs     0.63  bench_shape_base.Block2D.time_block2d((512, 512), 'uint64', (2, 2))
-        58.0ยฑ3ฮผs         36.7ยฑ2ฮผs     0.63  bench_lib.Pad.time_pad((10, 100), 3, 'reflect')
-        219ยฑ30ฮผs          138ยฑ7ฮผs     0.63  bench_lib.Pad.time_pad((10, 100), 1, 'mean')
-        261ยฑ60ฮผs         164ยฑ10ฮผs     0.63  bench_lib.Pad.time_pad((10, 100), 1, 'linear_ramp')
-       825ยฑ100ฮผs         519ยฑ30ฮผs     0.63  bench_shape_base.Block2D.time_block2d((512, 512), 'uint64', (4, 4))
-         121ยฑ5ฮผs         75.7ยฑ2ฮผs     0.63  bench_lib.Pad.time_pad((10, 10, 10), 1, 'constant')
-      8.16ยฑ0.2ฮผs       5.08ยฑ0.4ฮผs     0.62  bench_core.CorrConv.time_convolve(50, 100, 'same')
-        66.6ยฑ3ฮผs         41.3ยฑ2ฮผs     0.62  bench_lib.Pad.time_pad((1000,), 3, 'constant')
-        53.1ยฑ3ฮผs       32.9ยฑ0.8ฮผs     0.62  bench_lib.Pad.time_pad((10, 100), 3, 'wrap')
-        285ยฑ60ฮผs         177ยฑ10ฮผs     0.62  bench_lib.Pad.time_pad((10, 10, 10), (0, 5), 'linear_ramp')
-      8.30ยฑ0.9ฮผs       5.14ยฑ0.1ฮผs     0.62  bench_core.CorrConv.time_correlate(1000, 10, 'valid')
-         115ยฑ3ฮผs         71.2ยฑ3ฮผs     0.62  bench_shape_base.Block2D.time_block2d((256, 256), 'uint64', (2, 2))
-      19.1ยฑ0.5ฮผs       11.8ยฑ0.6ฮผs     0.62  bench_linalg.Linalg.time_op('norm', 'float64')
-        95.3ยฑ5ฮผs         58.6ยฑ2ฮผs     0.62  bench_lib.Pad.time_pad((10, 100), 1, 'constant')
-        44.6ยฑ1ฮผs       27.2ยฑ0.9ฮผs     0.61  bench_lib.Pad.time_pad((1000,), (0, 5), 'edge')
-        447ยฑ20ฮผs         270ยฑ10ฮผs     0.61  bench_shape_base.Block2D.time_block2d((1024, 1024), 'uint16', (4, 4))
-        53.9ยฑ2ฮผs         32.6ยฑ2ฮผs     0.60  bench_lib.Pad.time_pad((10, 100), 1, 'wrap')
-        11.6ยฑ1ฮผs       6.97ยฑ0.4ฮผs     0.60  bench_reduce.MinMax.time_max(<type 'numpy.float32'>)
-        95.9ยฑ5ฮผs         57.7ยฑ2ฮผs     0.60  bench_lib.Pad.time_pad((10, 100), 3, 'constant')
-        47.2ยฑ2ฮผs         28.2ยฑ2ฮผs     0.60  bench_lib.Pad.time_pad((1000,), (0, 5), 'reflect')
-      5.51ยฑ0.2ฮผs      3.27ยฑ0.07ฮผs     0.59  bench_core.CountNonzero.time_count_nonzero(3, 100, <type 'object'>)
-        74.3ยฑ3ฮผs         44.0ยฑ2ฮผs     0.59  bench_lib.Pad.time_pad((10, 10, 10), (0, 5), 'wrap')
-        76.2ยฑ3ฮผs       45.0ยฑ0.8ฮผs     0.59  bench_lib.Pad.time_pad((10, 10, 10), 1, 'reflect')
-        57.1ยฑ1ฮผs         33.5ยฑ2ฮผs     0.59  bench_lib.Pad.time_pad((10, 100), (0, 5), 'wrap')
-        52.0ยฑ2ฮผs         30.4ยฑ1ฮผs     0.58  bench_lib.Pad.time_pad((1000,), 1, 'edge')
-        42.6ยฑ2ฮผs       24.9ยฑ0.9ฮผs     0.58  bench_lib.Pad.time_pad((1000,), 3, 'wrap')
-        15.0ยฑ3ฮผs       8.73ยฑ0.3ฮผs     0.58  bench_core.CountNonzero.time_count_nonzero_multi_axis(1, 100, <type 'bool'>)
-        16.0ยฑ3ฮผs       9.29ยฑ0.3ฮผs     0.58  bench_core.CountNonzero.time_count_nonzero_multi_axis(3, 100, <type 'int'>)
-        53.1ยฑ1ฮผs         30.9ยฑ2ฮผs     0.58  bench_lib.Pad.time_pad((1000,), 3, 'edge')
-        88.0ยฑ8ฮผs         51.1ยฑ3ฮผs     0.58  bench_lib.Pad.time_pad((10, 10, 10), 3, 'reflect')
-        44.6ยฑ2ฮผs         25.9ยฑ1ฮผs     0.58  bench_lib.Pad.time_pad((1000,), (0, 5), 'wrap')
-        90.3ยฑ5ฮผs         51.9ยฑ1ฮผs     0.57  bench_shape_base.Block2D.time_block2d((512, 512), 'uint8', (2, 2))
-      15.6ยฑ0.5ฮผs       8.93ยฑ0.3ฮผs     0.57  bench_linalg.Linalg.time_op('norm', 'float32')
-         102ยฑ6ฮผs       58.3ยฑ0.9ฮผs     0.57  bench_lib.Pad.time_pad((10, 10, 10), 1, 'edge')
-        80.1ยฑ4ฮผs         45.6ยฑ3ฮผs     0.57  bench_lib.Pad.time_pad((10, 100), 3, 'edge')
-        44.2ยฑ2ฮผs         24.9ยฑ1ฮผs     0.56  bench_lib.Pad.time_pad((1000,), 1, 'wrap')
-        71.6ยฑ8ฮผs         39.5ยฑ1ฮผs     0.55  bench_lib.Pad.time_pad((10, 10, 10), 1, 'wrap')
-       81.7ยฑ10ฮผs         44.8ยฑ2ฮผs     0.55  bench_lib.Pad.time_pad((10, 100), 1, 'edge')
-        420ยฑ90ฮผs         230ยฑ10ฮผs     0.55  bench_shape_base.Block.time_3d(10, 'block')
-        114ยฑ20ฮผs         62.3ยฑ2ฮผs     0.55  bench_lib.Pad.time_pad((10, 10, 10), (0, 5), 'constant')
-      5.76ยฑ0.1ฮผs      3.13ยฑ0.08ฮผs     0.54  bench_core.CorrConv.time_convolve(50, 10, 'same')
-      5.30ยฑ0.1ฮผs      2.84ยฑ0.08ฮผs     0.54  bench_core.CorrConv.time_correlate(50, 100, 'valid')
-        92.5ยฑ4ฮผs         49.3ยฑ1ฮผs     0.53  bench_shape_base.Block2D.time_block2d((256, 256), 'uint32', (2, 2))
-        13.5ยฑ3ฮผs       7.07ยฑ0.2ฮผs     0.52  bench_reduce.MinMax.time_min(<type 'numpy.float32'>)
-        7.66ยฑ1ฮผs       3.88ยฑ0.2ฮผs     0.51  bench_core.CorrConv.time_convolve(50, 100, 'valid')
-        29.0ยฑ3ฮผs       14.5ยฑ0.8ฮผs     0.50  bench_shape_base.Block.time_no_lists(10)
-      6.62ยฑ0.3ฮผs       3.30ยฑ0.2ฮผs     0.50  bench_core.CorrConv.time_convolve(1000, 1000, 'valid')
-        74.2ยฑ7ฮผs       36.2ยฑ0.9ฮผs     0.49  bench_shape_base.Block2D.time_block2d((256, 256), 'uint16', (2, 2))
-      5.55ยฑ0.3ฮผs       2.70ยฑ0.2ฮผs     0.49  bench_core.CorrConv.time_convolve(50, 10, 'valid')
-       73.9ยฑ20ฮผs         35.8ยฑ2ฮผs     0.48  bench_lib.Pad.time_pad((10, 100), 1, 'reflect')
-        224ยฑ20ฮผs          107ยฑ7ฮผs     0.48  bench_shape_base.Block2D.time_block2d((256, 256), 'uint64', (4, 4))
-      3.87ยฑ0.1ฮผs      1.83ยฑ0.06ฮผs     0.47  bench_core.CountNonzero.time_count_nonzero(2, 100, <type 'str'>)
-        109ยฑ30ฮผs         51.5ยฑ3ฮผs     0.47  bench_lib.Pad.time_pad((10, 10, 10), (0, 5), 'edge')
-        240ยฑ20ฮผs          112ยฑ4ฮผs     0.47  bench_shape_base.Block2D.time_block2d((512, 512), 'uint16', (4, 4))
-        337ยฑ40ฮผs          158ยฑ7ฮผs     0.47  bench_shape_base.Block2D.time_block2d((512, 512), 'uint32', (4, 4))
-         188ยฑ8ฮผs         88.0ยฑ2ฮผs     0.47  bench_shape_base.Block2D.time_block2d((512, 512), 'uint8', (4, 4))
-      4.39ยฑ0.2ฮผs      2.04ยฑ0.09ฮผs     0.47  bench_core.CountNonzero.time_count_nonzero(3, 10000, <type 'bool'>)
-        73.2ยฑ4ฮผs       33.9ยฑ0.5ฮผs     0.46  bench_shape_base.Block2D.time_block2d((128, 128), 'uint64', (2, 2))
-        5.48ยฑ1ฮผs       2.44ยฑ0.1ฮผs     0.45  bench_core.CountNonzero.time_count_nonzero(2, 100, <type 'object'>)
-      4.46ยฑ0.1ฮผs      1.97ยฑ0.08ฮผs     0.44  bench_core.CorrConv.time_correlate(50, 10, 'full')
-        30.4ยฑ9ฮผs       13.3ยฑ0.3ฮผs     0.44  bench_shape_base.Block.time_no_lists(1)
-      7.05ยฑ0.2ฮผs      3.05ยฑ0.06ฮผs     0.43  bench_reduce.SmallReduction.time_small
-        7.35ยฑ1ฮผs       3.12ยฑ0.2ฮผs     0.42  bench_core.CorrConv.time_convolve(50, 10, 'full')
-      4.36ยฑ0.1ฮผs      1.84ยฑ0.07ฮผs     0.42  bench_core.CorrConv.time_correlate(50, 10, 'same')
-      3.51ยฑ0.2ฮผs      1.46ยฑ0.05ฮผs     0.42  bench_core.CountNonzero.time_count_nonzero(1, 100, <type 'object'>)
-     4.03ยฑ0.05ฮผs       1.66ยฑ0.1ฮผs     0.41  bench_core.CorrConv.time_correlate(1000, 1000, 'valid')
-        199ยฑ10ฮผs         80.1ยฑ3ฮผs     0.40  bench_shape_base.Block2D.time_block2d((256, 256), 'uint32', (4, 4))
-      3.98ยฑ0.2ฮผs      1.60ยฑ0.08ฮผs     0.40  bench_core.CountNonzero.time_count_nonzero(2, 10000, <type 'bool'>)
-        61.8ยฑ2ฮผs         24.8ยฑ1ฮผs     0.40  bench_shape_base.Block2D.time_block2d((256, 256), 'uint8', (2, 2))
-      4.13ยฑ0.1ฮผs      1.62ยฑ0.05ฮผs     0.39  bench_core.CorrConv.time_correlate(50, 10, 'valid')
-        61.6ยฑ2ฮผs         23.9ยฑ1ฮผs     0.39  bench_shape_base.Block2D.time_block2d((128, 128), 'uint32', (2, 2))
-        184ยฑ10ฮผs         70.5ยฑ3ฮผs     0.38  bench_shape_base.Block2D.time_block2d((256, 256), 'uint16', (4, 4))
-        56.1ยฑ4ฮผs       21.0ยฑ0.9ฮผs     0.38  bench_shape_base.Block2D.time_block2d((64, 64), 'uint64', (2, 2))
-        40.0ยฑ2ฮผs       15.0ยฑ0.6ฮผs     0.37  bench_shape_base.Block.time_block_simple_column_wise(10)
-         121ยฑ2ฮผs         45.1ยฑ2ฮผs     0.37  bench_shape_base.Block.time_nested(1)
-         179ยฑ4ฮผs         66.1ยฑ4ฮผs     0.37  bench_shape_base.Block2D.time_block2d((128, 128), 'uint64', (4, 4))
-        59.8ยฑ2ฮผs         22.0ยฑ1ฮผs     0.37  bench_shape_base.Block2D.time_block2d((128, 128), 'uint16', (2, 2))
-     3.19ยฑ0.05ฮผs      1.17ยฑ0.02ฮผs     0.37  bench_core.CountNonzero.time_count_nonzero(1, 100, <type 'str'>)
-        54.0ยฑ3ฮผs         19.7ยฑ1ฮผs     0.37  bench_shape_base.Block2D.time_block2d((32, 32), 'uint64', (2, 2))
-        56.9ยฑ1ฮผs       20.7ยฑ0.7ฮผs     0.36  bench_shape_base.Block2D.time_block2d((64, 64), 'uint32', (2, 2))
-      3.14ยฑ0.1ฮผs      1.14ยฑ0.04ฮผs     0.36  bench_core.CountNonzero.time_count_nonzero(1, 10000, <type 'bool'>)
-        92.7ยฑ2ฮผs         33.7ยฑ2ฮผs     0.36  bench_shape_base.Block.time_block_complicated(1)
-         104ยฑ4ฮผs         37.8ยฑ1ฮผs     0.36  bench_shape_base.Block.time_block_complicated(10)
-         128ยฑ5ฮผs         45.5ยฑ2ฮผs     0.36  bench_shape_base.Block.time_nested(10)
-       196ยฑ100ฮผs         69.4ยฑ3ฮผs     0.35  bench_ma.Concatenate.time_it('unmasked+masked', 2)
-         153ยฑ5ฮผs         53.9ยฑ2ฮผs     0.35  bench_shape_base.Block2D.time_block2d((128, 128), 'uint16', (4, 4))
-        39.4ยฑ2ฮผs       13.8ยฑ0.5ฮผs     0.35  bench_shape_base.Block.time_block_simple_column_wise(1)
-        53.5ยฑ2ฮผs         18.7ยฑ1ฮผs     0.35  bench_shape_base.Block2D.time_block2d((32, 32), 'uint8', (2, 2))
-        55.2ยฑ2ฮผs       19.3ยฑ0.6ฮผs     0.35  bench_shape_base.Block2D.time_block2d((32, 32), 'uint16', (2, 2))
-        16.9ยฑ1ฮผs       5.89ยฑ0.5ฮผs     0.35  bench_core.Core.time_dstack_l
-        60.6ยฑ3ฮผs       21.1ยฑ0.6ฮผs     0.35  bench_shape_base.Block2D.time_block2d((128, 128), 'uint8', (2, 2))
-      25.5ยฑ0.2ฮผs       8.88ยฑ0.3ฮผs     0.35  bench_shape_base.Block.time_block_simple_row_wise(10)
-        54.6ยฑ3ฮผs       19.0ยฑ0.6ฮผs     0.35  bench_shape_base.Block2D.time_block2d((16, 16), 'uint64', (2, 2))
-        52.6ยฑ2ฮผs       18.2ยฑ0.7ฮผs     0.35  bench_shape_base.Block2D.time_block2d((16, 16), 'uint16', (2, 2))
-        6.57ยฑ2ฮผs      2.25ยฑ0.08ฮผs     0.34  bench_core.CountNonzero.time_count_nonzero(3, 100, <type 'str'>)
-        24.3ยฑ1ฮผs       8.30ยฑ0.6ฮผs     0.34  bench_shape_base.Block.time_block_simple_row_wise(1)
-         148ยฑ3ฮผs         50.0ยฑ3ฮผs     0.34  bench_shape_base.Block2D.time_block2d((16, 16), 'uint32', (4, 4))
-         171ยฑ8ฮผs         57.9ยฑ4ฮผs     0.34  bench_shape_base.Block2D.time_block2d((256, 256), 'uint8', (4, 4))
-         159ยฑ5ฮผs         53.8ยฑ1ฮผs     0.34  bench_shape_base.Block2D.time_block2d((64, 64), 'uint64', (4, 4))
-        171ยฑ20ฮผs         57.7ยฑ2ฮผs     0.34  bench_shape_base.Block2D.time_block2d((128, 128), 'uint32', (4, 4))
-      3.15ยฑ0.3ฮผs      1.06ยฑ0.03ฮผs     0.34  bench_core.CountNonzero.time_count_nonzero(3, 100, <type 'int'>)
-        55.7ยฑ5ฮผs       18.7ยฑ0.2ฮผs     0.34  bench_shape_base.Block2D.time_block2d((16, 16), 'uint8', (2, 2))
-         158ยฑ7ฮผs         52.6ยฑ3ฮผs     0.33  bench_shape_base.Block2D.time_block2d((128, 128), 'uint8', (4, 4))
-         153ยฑ4ฮผs         50.7ยฑ1ฮผs     0.33  bench_shape_base.Block2D.time_block2d((32, 32), 'uint64', (4, 4))
-         152ยฑ7ฮผs         50.3ยฑ1ฮผs     0.33  bench_shape_base.Block2D.time_block2d((16, 16), 'uint8', (4, 4))
-        53.6ยฑ3ฮผs       17.7ยฑ0.4ฮผs     0.33  bench_shape_base.Block2D.time_block2d((16, 16), 'uint32', (2, 2))
-         156ยฑ4ฮผs         51.4ยฑ3ฮผs     0.33  bench_shape_base.Block2D.time_block2d((64, 64), 'uint8', (4, 4))
-         148ยฑ3ฮผs         48.2ยฑ2ฮผs     0.33  bench_shape_base.Block2D.time_block2d((16, 16), 'uint16', (4, 4))
-        160ยฑ10ฮผs         52.0ยฑ1ฮผs     0.33  bench_shape_base.Block2D.time_block2d((64, 64), 'uint32', (4, 4))
-         159ยฑ8ฮผs         51.4ยฑ3ฮผs     0.32  bench_shape_base.Block2D.time_block2d((64, 64), 'uint16', (4, 4))
-        59.8ยฑ3ฮผs         19.3ยฑ1ฮผs     0.32  bench_shape_base.Block2D.time_block2d((32, 32), 'uint32', (2, 2))
-         153ยฑ4ฮผs         49.4ยฑ2ฮผs     0.32  bench_shape_base.Block2D.time_block2d((32, 32), 'uint32', (4, 4))
-      15.6ยฑ0.6ฮผs       5.03ยฑ0.3ฮผs     0.32  bench_core.Core.time_vstack_l
-         154ยฑ7ฮผs         49.7ยฑ2ฮผs     0.32  bench_shape_base.Block2D.time_block2d((32, 32), 'uint8', (4, 4))
-        59.6ยฑ6ฮผs       19.1ยฑ0.8ฮผs     0.32  bench_shape_base.Block2D.time_block2d((64, 64), 'uint8', (2, 2))
-      3.03ยฑ0.4ฮผs         969ยฑ30ns     0.32  bench_core.CountNonzero.time_count_nonzero(2, 100, <type 'int'>)
-        120ยฑ10ฮผs         38.4ยฑ2ฮผs     0.32  bench_shape_base.Block.time_3d(1, 'block')
-         156ยฑ5ฮผs         49.3ยฑ1ฮผs     0.32  bench_shape_base.Block2D.time_block2d((16, 16), 'uint64', (4, 4))
-        164ยฑ10ฮผs         49.3ยฑ2ฮผs     0.30  bench_shape_base.Block2D.time_block2d((32, 32), 'uint16', (4, 4))
-       65.7ยฑ10ฮผs       19.6ยฑ0.7ฮผs     0.30  bench_shape_base.Block2D.time_block2d((64, 64), 'uint16', (2, 2))
-     2.82ยฑ0.08ฮผs         732ยฑ30ns     0.26  bench_core.CountNonzero.time_count_nonzero(1, 100, <type 'int'>)
-     2.77ยฑ0.07ฮผs         664ยฑ30ns     0.24  bench_core.CountNonzero.time_count_nonzero(2, 100, <type 'bool'>)
-      2.61ยฑ0.1ฮผs         624ยฑ20ns     0.24  bench_core.CountNonzero.time_count_nonzero(1, 100, <type 'bool'>)
-        16.8ยฑ3ฮผs       3.97ยฑ0.2ฮผs     0.24  bench_core.Core.time_hstack_l
-      2.78ยฑ0.1ฮผs         637ยฑ20ns     0.23  bench_core.CountNonzero.time_count_nonzero(3, 100, <type 'bool'>)
-      2.36ยฑ0.2ฮผs          207ยฑ5ns     0.09  bench_overrides.ArrayFunction.time_mock_broadcast_to_numpy
-      2.68ยฑ0.1ฮผs          221ยฑ7ns     0.08  bench_overrides.ArrayFunction.time_mock_concatenate_numpy
-      2.58ยฑ0.1ฮผs         201ยฑ10ns     0.08  bench_overrides.ArrayFunction.time_mock_broadcast_to_duck
-      3.02ยฑ0.2ฮผs          222ยฑ6ns     0.07  bench_overrides.ArrayFunction.time_mock_concatenate_duck
-      4.29ยฑ0.3ฮผs          216ยฑ6ns     0.05  bench_overrides.ArrayFunction.time_mock_concatenate_mixed
-        142ยฑ20ฮผs          213ยฑ8ns     0.00  bench_overrides.ArrayFunction.time_mock_concatenate_many

SOME BENCHMARKS HAVE CHANGED SIGNIFICANTLY.

์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ๋Š” https://docs.google.com/spreadsheets/d/15-AFI_cmZqfkU6mo2p1znsQF2E52PEXpF68QqYqEar4/edit#gid = 0์„ ์ฐธ์กฐ

๋‹น์—ฐํžˆ ๊ฐ€์žฅ ํฐ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋‹ค๋ฅธ numpy ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ (์˜ˆ : np.block() ์ž…๋‹ˆ๋‹ค.

@shoyer- ๋‚˜๋Š” ์—ฌ๋ถ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ ๊ฒƒ์— ์•ฝ๊ฐ„ ๋‹นํ™ฉํ–ˆ๋‹ค ... ์•„๋งˆ, ์šฐ๋ฆฌ๋Š” ์ •๋ง๋กœ C ๊ตฌํ˜„์„ ๊ฐ€์ ธ์•ผํ–ˆ์ง€๋งŒ, ๊ทธ ๋™์•ˆ ๋‚˜๋Š” ๋‹จ์ง€ ํ•˜๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์„ ์‚ญ๊ฐํ•˜๋Š” ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์œผ๋กœ PR์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์œ ํ˜• ๋ฐ ์œ ์ผํ•œ ์œ ํ˜•์ด ndarray . # 12321์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@shoyer- ๋ฉ”์ผ ๋ง๋ฆฌ์ŠคํŠธ์—์„œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ๊ณ ์œ  ํ•œ ์œ ํ˜•์˜ ๋ฐฐ์—ด ์œ ์‚ฌ ์ธ์ˆ˜๊ฐ€ types ํ•ฉ๋‹ˆ๊นŒ? (๋‹จ์ง€ ์žฌ์ •์˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ธ์ˆ˜๋ณด๋‹ค๋Š”) ๊ตฌํ˜„์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (# 12327 ์ฐธ์กฐ).
  2. ndarray.__array_function__ ๊ตฌํ˜„์€ __array_function__ ๋ฅผ ์žฌ์ •์˜ํ•˜๋”๋ผ๋„ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ํ—ˆ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ Liskov ๋Œ€์ฒด ์›์น™์„ ๊ณ ๋ คํ•  ๋•Œ ํ•ฉ๋ฆฌ์ ์ด๋ฉฐ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ด๋ฏธ ๋ณด์„๊ธˆ์„ ๋‚ผ ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ndarray.__array_function__ ๋‚ด๋ถ€์˜ ๊ณต์šฉ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ตฌํ˜„์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  __array_ufunc__ ์—์„œ ๋น„์Šทํ•œ ๊ฒƒ ...) __array_function__ ์— ๋Œ€ํ•œ ํ‰๊ฐ€ํŒ์€ # 12328์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@shoyer- (1)์˜ ๋น ๋ฅธ ๊ตฌํ˜„์€ # 12327์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด NEP๋„ ์กฐ์ •ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  (2)์˜ ์žฌํŒ์— ๋Œ€ํ•œ # 12328, ์ฃผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๋‘ ๊ฐ€์ง€ ์ˆ˜์ • ๋ชจ๋‘์— +1์ž…๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ๋””์ŠคํŒจ์ฒ˜ ํ•จ์ˆ˜ ์ด๋ฆ„์ด https://github.com/numpy/numpy/pull/12789์— ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. TypeError: _pad_dispatcher missing 1 required positional argument ๋ฅผ๋ณด๊ณ  ๋†€๋ž€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์— ์„ค๋ช… ๋œ ๋Œ€์•ˆ https://github.com/numpy/numpy/issues/12028#issuecomment -429377396 (ํ˜„์žฌ 2 ๊ฐœ ์‚ฌ์šฉ) ์™ธ์— ๋„ค ๋ฒˆ์งธ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ 4 : ํ•จ์ˆ˜์™€ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋””์ŠคํŒจ์ฒ˜๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

def sin(a):
    return (a,)


@array_function_dispatch(sin)
def sin(a):
     ...


def cos(a):
    return (a,)


@array_function_dispatch(cos)
def cos(a):
    ...

์žฅ์  :

  • ์ด์ œ Python์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅธ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์  :

  • ๋” ๋งŽ์€ ์ฝ”๋“œ ๋ฐ˜๋ณต
  • ๋” ๋งŽ์€ ๊ฐ„์ ‘์ - ์–ด๋–ค ํ•จ์ˆ˜ ์ด๋ฆ„ pad ๊ฐ€ ์ž˜๋ชป๋œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•˜ ๋Š”์ง€ ๋” ์ด์ƒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๋™๊ธฐํ™” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค).

ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•˜๋ ค๋ฉด ์‹ค์ œ ๊ธฐ๋Šฅ์ด ๋””์ŠคํŒจ์ฒ˜ ์ดํ›„์— ์™€์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋””์ŠคํŒจ์ฒ˜์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””์ŠคํŒจ์ฒ˜ ์ด๋ฆ„์„ ๋ฎ์–ด ์”๋‹ˆ๋‹ค.

np.arange ๋˜๋Š” np.empty์™€ ๊ฐ™์€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐœ์†ก์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ NumPy๊ฐ€ ์Šค์นผ๋ผ์™€ ๋ฐฐ์—ด์„ ๋””์ŠคํŒจ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. NEP์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด ๋ณ€ํ™”๋กœ ์ธํ•ด ๊นจ์ง€๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

np.arange ์— ๋Œ€ํ•œ ํ† ๋ก ์€ https://github.com/numpy/numpy/issues/12379๋ฅผ ์ฐธ์กฐ

np.empty() ์ด ์–ด๋–ป๊ฒŒ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋””์ŠคํŒจ์น˜ ํ•  ๊ฒƒ์ด์—†๊ณ  ์…ฐ์ดํ”„์™€ dtype ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™•์‹คํžˆ np.empty_like() ๋ฎ์–ด ์“ฐ๊ธฐ ํ˜•ํƒœ๋กœ ํŒŒ๊ฒฌ ํ•  ์ˆ˜ - ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๊ทธ https://github.com/numpy/numpy/pull/13046๊ฐ€ ์ง€์›์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ต์…˜ 4 : ํ•จ์ˆ˜์™€ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋””์ŠคํŒจ์ฒ˜๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ต์…˜์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐ ์ด์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ๋ณด๋ฉด ์•„๋งˆ๋„ ๊ฐ€์žฅ ์นœ์ ˆํ•œ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

np.empty ()๊ฐ€ ์–ด๋–ป๊ฒŒ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค-๋””์ŠคํŒจ์น˜ ํ•  ๊ฒƒ์ด์—†๊ณ  ์…ฐ์ดํ”„์™€ dtype ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŒŒ๊ฒฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๊ธฐ์— ๋‹ค๋ฅด๊ฒŒ ์ „๋‹ฌํ•˜๊ณ ์žํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ชจ์–‘ ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Screen Shot 2019-04-03 at 1 06 46 PM

์ด ์˜ˆ์ œ๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๋ชจ์–‘์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ํ‘œํ˜„์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ์œผ๋ฅธ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class ExprShape:
    def __getitem__(self, i):
        return ('getitem', self, i)
    def __len__(self):
        return ('len', self)

numpy.empty(ExprShape())

ExprArray('empty', ExprShape()) ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์žฌ์ •์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์›์น™์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋ชจ์–‘๋„ ํŒŒ๊ฒฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœํ† ์ฝœ์— ์ถ”๊ฐ€์ ์ธ ๋ณต์žก์„ฑ / ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ (์˜ˆ empty_like ์™€ ํ•จ๊ป˜ shape empty_like shape )๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” np.random.RandomState ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ size ์ธ์ˆ˜์ด์ง€๋งŒ ํ˜„์žฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ „ํ˜€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. http://www.numpy.org/ ์ฐธ์กฐ neps / nep-0018-array-function-protocol.html # callable -objects-generated-at-runtime

๋ฐฐ์—ด์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ (์˜ˆ : empty_like with shape)๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

NumPy์— ์˜์กดํ•˜๋Š” ๊ธฐ์กด API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ์กด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ์—์„œ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋กํ•˜๋ ค๋Š” ๊ฒฝ์šฐ.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ๋Œ€์‹  ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„๋ฅผ ์ž‘์„ฑํ•˜๋Š” NP์™€ ๊ฐ™์€ ๋ฐฐ์—ด๋กœ scipy.optimize.differential_evolution ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ ํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ „๋‹ฌ ๋œ ์ž…๋ ฅ์ด ์‹ฌ๋ณผ๋ฆญ ์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ numpy ๋ฐฐ์—ด ๋Œ€์‹  ์‹ฌ๋ณผ๋ฆญ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด np.full ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NumPy์— ์˜์กดํ•˜๋Š” ๊ธฐ์กด API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ์กด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ์—์„œ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋กํ•˜๋ ค๋Š” ๊ฒฝ์šฐ.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. np.array() ์™€ ๊ฐ™์€ ๋ช…์‹œ ์  ๋ฐฐ์—ด ๊ตฌ์„ฑ์€ ํ™•์‹คํžˆ ๋• ํƒ€์ดํ•‘๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ energies = np.full(num_members, np.inf) ๋ฅผ energies = np.full_like(population, np.inf, shape=num_members) ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ๋ณ€๊ฒฝ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. np.array ()์™€ ๊ฐ™์€ ๋ช…์‹œ ์  ๋ฐฐ์—ด ๊ตฌ์„ฑ์€ ํ™•์‹คํžˆ ๋• ํƒ€์ดํ•‘๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด np.array ํŒŒ๊ฒฌ ์ง€์›์ด ์ •๋ง ํž˜๋“ค์–ด์„œ 100 % ์ง€์›์„๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”?

์ด ๊ฒฝ์šฐ energies = np.full (num_members, np.inf)๋ฅผ energies = np.full_like (population, np.inf, shape = num_members)๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ๋ณ€๊ฒฝ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ. ๊ทธ๋Ÿฌ๋‚˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์ด ์•Œ๊ณ  ์‚ฌ๋ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์‚ฌ์šฉ์ž๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • numpy์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ƒˆ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์Šค๋ฅผ ์กฐ์‚ฌํ•˜์—ฌ ๋™์ž‘์„ ์ดํ•ดํ•˜์‹ญ์‹œ์˜ค. ala numba ๋˜๋Š” tangent.

๋‘ ์˜ต์…˜ ๋ชจ๋‘ ํŠน์ • ๊ฒฝ์šฐ์— ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ (์˜ˆ : ์‚ฌ์šฉ์ž๊ฐ€ np.full ํ˜ธ์ถœํ•˜๊ณ  ํ˜„์žฌ ๊ธฐํ˜ธํ™” ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ—ˆ์šฉ), ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด NEP-18์˜ ๋ชฉํ‘œ๋Š” ์ด๋Ÿฌํ•œ ์˜ต์…˜์ด ํ•„์š”ํ•œ์‹œ๊ธฐ๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ฒฝ์šฐ์— ์‚ฌ๋žŒ๋“ค์ด ์›๋ž˜ NumPy๋ฅผ ์‚ฌ์šฉํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์„ฑ๋Šฅ / ๋ณต์žก์„ฑ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์žˆ์Œ์„ ์ดํ•ดํ•˜๊ณ  ์ด๊ฒƒ์ด์ด๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ข‹์€ ์ด์œ  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์œ ์—ฐ์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด np.array ํŒŒ๊ฒฌ ์ง€์›์ด ์ •๋ง ํž˜๋“ค์–ด์„œ 100 % ์ง€์›์„๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”?

NEP 22 ์—๋Š” ์—ฌ๊ธฐ์—์„œ ์˜ต์…˜์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. numpy.ndarray ๊ฐ์ฒด ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด np.asarray() ์˜ ์˜๋ฏธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์ด๋ฅผ ์œ„ํ•ด ์ƒˆ ํ”„๋กœํ† ์ฝœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š”์ด๋‹ค np.asarray() ํ˜„์žฌ ์šฉ๋„๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ ํ•  ์ˆ˜์žˆ๋Š” NumPy์™€ ๋ฐฐ์—ด ๊ฐ์ฒด์— ์บ์ŠคํŒ…์˜ ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค numpy.ndarray ์•„๋ž˜๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด,.

์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด ์•„๋‹Œ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์ง€๋งŒ์ด ๋™์ž‘์„ ์ „ํ™˜ํ•˜๋ฉด ๋งŽ์€ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜๋ฏ€๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์šด ์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ๋Š” ์ตœ์†Œํ•œ ๋ฐฐ์—ด ๋• ํƒ€์ดํ•‘์˜ ์ด๋Ÿฌํ•œ ์ธก๋ฉด์„ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์„ฑ๋Šฅ / ๋ณต์žก์„ฑ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์žˆ์Œ์„ ์ดํ•ดํ•˜๊ณ  ์ด๊ฒƒ์ด์ด๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ข‹์€ ์ด์œ  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์œ ์—ฐ์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ. NEP 18์€ ๋“œ๋กญ ์ธ NumPy ๋Œ€์•ˆ์„์œ„ํ•œ ์™„์ „ํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

__numpy_implementation__ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด NEP-18์— ๋Œ€ํ•œ ๊ฐœ์ • ๋ณธ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/numpy/numpy/pull/13305

์šฐ๋ฆฌ๊ฐ€ numpy.testing ์˜ ํ•จ์ˆ˜๋ฅผ ์™œ๊ณกํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค : https://github.com/numpy/numpy/issues/13588

์ž ์‹œ๋งŒ ์š” ...

NEP์— ๋Œ€ํ•ด๋ณด๊ณ  ์‹ถ์€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ NEP-18์ด ํ•˜์œ„ ํด๋ž˜์Šค ์ž‘์„ฑ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๋‚ด์šฉ์„ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด https://github.com/numpy/numpy/pull/13633

gh-13329๊ฐ€ ์ˆ˜์ • ๋œ ์ดํ›„๋กœ ์‚ฌ์šฉ์„ฑ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 1.17์ด ์ถœ์‹œ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฌธ์„œ ๊ฐœ์„  ๋ฐ arange gh-12379๊ฐ€ ์—ฌ์ „ํžˆ 1.17์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ # 13728- histogram[2d]d ์— ๋Œ€ํ•œ ๋””์ŠคํŒจ์ฒ˜์˜ ๋ฒ„๊ทธ

์ด๋กœ ์ธํ•ด ๋ฌธ์„œ ๊ฐœ์„  ๋ฐ ๋ฒ”์œ„ gh-12379๊ฐ€ ์—ฌ์ „ํžˆ 1.17์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์–ด์„œ gh-13844๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์„œ๊ฐ€ arange ๊ณต๊ฐœ ๋ฌธ์ œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@shoyer ์ด๊ฑฐ ๋‹ซ์•„๋„ ๋ ๊นŒ์š”?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰