Numpy: ์˜ค๋ฆฌ ๋ฐฐ์—ด ๊ฐ•์ œ ์ง€์›

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

@shoyer , @pentschev ๋ฐ @mrocklin ๋ฌธ์ œ (https://github.com/dask/dask/issues/4883)์™€ ์ด๊ฒƒ์€ NEP 22์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ž˜์„œ ๋‚˜๋Š” ํ† ๋ก ์„ ๊ฐฑ์‹ ํ•˜๊ณ  ๋‚ด ์ž์‹ ์˜ ์˜คํ•ด๋ฅผ ๋ฐ”๋กœ ์žก๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ์ฃผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์•„์ด๋””์–ด๋ฅผ ๋ชจ์œผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.).

๋‹ค์–‘ํ•œ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ๋ฐฐ์—ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ค๋ฆฌ ๋ฐฐ์—ด (์˜ˆ ndarray )์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ np.asanyarray ์™€ ๋‹ค์†Œ ์œ ์‚ฌํ•˜์ง€๋งŒ ์„œ๋ธŒ ํด๋ž˜ ์‹ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž์‹ ์˜ (์˜ค๋ฆฌ) ๋ฐฐ์—ด ์œ ํ˜• ์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์ ์ ˆํ•œ ๋ณ€ํ™˜์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ndarray ํ•˜์œ„ ํด๋ž˜์Šค, ndarray s ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ (์ค‘์ฒฉ ๋œ ๋ชฉ๋ก)์„ ndarray ๊ฐ•์ œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํด๋ฐฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cc @njsmith (NEP 22๋ฅผ ๊ณต๋™ ์ž‘์„ฑ)

01 - Enhancement numpy.core

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

์•„๋งˆ๋„ quack_array :)

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

์ œ์•ˆ ๋œ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import numpy as np

# hypothetical np.duckarray() function
def duckarray(array_like):
  if hasattr(array_like, '__duckarray__'):
    # return an object that can be substituted for np.ndarray
    return array_like.__duckarray__()
  return np.asarray(array_like)

์‚ฌ์šฉ ์˜ˆ :

class SparseArray:
  def __duckarray__(self):
    return self
  def __array__(self):
    raise TypeError

np.duckarray(SparseArray())  # returns a SparseArray object
np.array(SparseArray())  # raises TypeError

์—ฌ๊ธฐ์—์„œ๋Š” np.duckarray ๋ฐ __duckarray__ ๋ฅผ ์ž๋ฆฌ ํ‘œ์‹œ ์ž๋กœ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ด๋ฆ„์— ๋Œ€ํ•ด ๋” ์ž˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NEP 22์˜ ์šฉ์–ด ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

"Duck array"๋Š” ํ˜„์žฌ ์ž๋ฆฌ ํ‘œ์‹œ ์ž๋กœ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฝค ์ „๋ฌธ ์šฉ์–ด์ด๋ฉฐ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ํ˜ผ๋™ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ API ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ "๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•œ"์€ ์ด๋ฏธ "๋ฐฐ์—ด๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ ๋  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ"(์˜ˆ : ๋ชฉ๋ก ๊ฐ์ฒด ํฌํ•จ)์˜ ๊ฐœ๋…์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ์œผ๋ฉฐ "anyarray"๋Š” ์ด๋ฏธ "ndarray์˜ ๊ตฌํ˜„์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ"์˜ ๊ฐœ๋…์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ์ง€๋งŒ has different semanticsโ€๋Š” duck ๋ฐฐ์—ด์˜ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค (์˜ˆ : np.matrix๋Š”โ€œanyarrayโ€์ด์ง€๋งŒโ€œduck arrayโ€๋Š” ์•„๋‹˜). ์ด๊ฒƒ์€ ๊ณ ์ „์ ์ธ ์ž์ „๊ฑฐ ์ฐฝ๊ณ ์ด๋ฏ€๋กœ ์ง€๊ธˆ์€ "์˜ค๋ฆฌ ๋ฐฐ์—ด"์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์œผ๋กœ๋Š” arrayish, pseudoarray, nominalarray, ersatzarray, arraymimic,โ€ฆ

๋‹ค๋ฅธ ์ด๋ฆ„ ์•„์ด๋””์–ด : np.array_compatible() , np.array_api() ....

np.array_compatible ๋Š” ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ duckarray ๋ณด๋‹ค ์ข‹์€์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. np.array_api ์‹ซ์–ด์š”, ์ž˜๋ชป๋œ ์ƒ๊ฐ์„ ํ•ด์š” imho.

์˜ค๋žœ๋งŒ์— ๋” ๋‚˜์€ ์ด๋ฆ„์ด ๋‚˜์˜ค์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ "์˜ค๋ฆฌ ๋ฐฐ์—ด"์ด๋ผ๋Š” ์ด๋ฆ„์„ ์ถ•๋ณตํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

๋‚˜๋Š” ํ˜ธํ™˜๋˜๋Š” ๋‹จ์–ด๋ฅผ ์ข‹์•„ํ•œ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” as_compatible_array ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ณ€ํ˜• ๋œ ๊ฒƒ์„ ์ƒ๊ฐํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋‹ค. (๋‹ค์†Œ ํ˜ธํ™˜๋˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋ฐฐ์—ด์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค). as ์€ (๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ๋ชจ๋“  as ํ•จ์ˆ˜์— ๊ณต๋ฐฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—) ์„ฑ ๊ฐ€์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "duck"์€ ๋„์„œ๊ด€์—์„œ๋Š” ๋ฉ‹์ ธ ๋ณด์ด์ง€๋งŒ ๋ฌด์ž‘์œ„๋กœ ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์กฐ๊ธˆ ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ "duck"์„ ์‹ซ์–ดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ๋‚˜ ์ž์‹  / ์ž‘์€ ์‹คํ—˜์‹ค์„์œ„ํ•œ ์ž‘์€ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„).

์•„๋งˆ๋„ quack_array :)

์ฃผ์ œ๋ฅผ ์กฐ๊ธˆ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด np.duckarray ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. np.empty_like ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ ๊ธฐ์กด ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์œ ํ˜•์œผ๋กœ ์ƒˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

>>> import numpy as np, cupy as cp
>>> a  = cp.array([1, 2])
>>> b = np.ones_like(a)
>>> type(b)
<class 'cupy.core.core.ndarray'>

๋ฐ˜๋ฉด์— NumPy์˜ API๋ฅผ ํ†ตํ•ด CuPy ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋ ค๋Š” array_like ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

import numpy as np, cupy as cp
a  = cp.array([1, 2])
b = [1, 2]
c = np.asarray(b, like=a)

์ด๊ฒƒ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด / ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์–ด์ฉŒ๋ฉด np.copy_like? ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์†์„ฑ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
(์˜ˆ : dtype ํฌํ•จ ์—ฌ๋ถ€) ๋‹ค๋ฅธ ๋ฐฐ์—ด์—์„œ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 7 ์›” 1 ์ผ ์›”์š”์ผ ์˜ค์ „ 5:40 Peter Andreas Entschev <
[email protected]> ์ž‘์„ฑ :

์ฃผ์ œ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฃจ์ง€ ์•Š์€ ์‚ฌ๋ก€๊ฐ€ ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.
np.duckarray๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
np.empty_like์™€ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ์กด ์œ ํ˜•์—์„œ.
ํ˜„์žฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

numpy๋ฅผ np๋กœ, ํํ”ผ๋ฅผ cp๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ >>> a = cp.array ([1, 2]) >>> b = np.ones_like (a) >>> type (b)

๋ฐ˜๋ฉด์— ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ array_like๊ฐ€ ์žˆ๋‹ค๋ฉด
NumPy์˜ API๋ฅผ ํ†ตํ•œ CuPy ์–ด๋ ˆ์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

numpy๋ฅผ np๋กœ, cupy๋ฅผ cp๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ
a = cp.array ([1, 2])
b = [1, 2]
c = np.asarray (b, like = a)

์ด๊ฒƒ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด / ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13831?email_source=notifications&email_token=AAJJFVRCWDHRAXHHRDHXXM3P5H3LRA5CNFSM4H3HQWAKYY3PNVWWK3TUL52HS4DFWSVREXG43VMVORBW63LN5WWWY702 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAJJFVRSYHUYHMPWQTW2NLLP5H3LRANCNFSM4H3HQWAA
.

np.copy_like ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. dtype ๊ฐ™์€ ๊ฒƒ์„ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ดˆ๋ณด์ž์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. np.copy_like ์™€ ๊ฐ™์€ ๊ฒƒ์ด NEP-22์˜ ์ˆ˜์ •์•ˆ์ด์–ด์•ผํ•˜๋‚˜์š”? ๋ฉ”์ผ ๋ง๋ฆฌ์ŠคํŠธ์—์„œ ๋…ผ์˜ํ•ด์•ผํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๊ฐ€์žฅ ์ ์ ˆํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ np.copy_like ๋ฐ np.duckarray (๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ถ€๋ฅด๋Š” ๋ชจ๋“  ๊ฒƒ)๋ฅผ ์˜ค๋ฆฌ ๋ฐฐ์—ด์„ ๊ฐ•์ œ / ์ƒ์„ฑํ•˜๋Š” ์ƒˆ๋กœ์šด NEP์— ํ•จ๊ป˜ ๋„ฃ๋Š”์ชฝ์œผ๋กœ ๊ธฐ์šธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ NEP 22์™€ ๊ฐ™์€ "์ •๋ณด"๋ผ๊ธฐ๋ณด๋‹ค๋Š” NEP 18๊ณผ ๊ฐ™์€ ๊ทœ๋ฒ” ์ ์ž…๋‹ˆ๋‹ค. ๊ธธ์–ด์•ผ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋™๊ธฐ๋Š” NEP 18/22๋ฅผ ์ฐธ์กฐํ•จ์œผ๋กœ์จ ์ด๋ฏธ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

np.copy_like() ์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ : __array_function__ (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ)๋กœ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋ฏ€๋กœ np.copy_like(sparse_array, like=dask_array) ์™€ ๊ฐ™์€ ์ž‘์—…์€ ๋‘ ๋ฐฐ์—ด ์œ ํ˜• ์ค‘ ํ•˜๋‚˜์—์„œ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํŒŒ๊ฒฌ ์ œ์•ˆ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” np.duckarray ๋ฐ np.copy_like ๊ตฌํ˜„์„์œ„ํ•œ NEP ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด๋ฒˆ ์ฃผ์— PR ์ดˆ์•ˆ์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋‹จํ•ด, ๊ณ ๋งˆ์›Œ ํ”ผํ„ฐ!

2019 ๋…„ 7 ์›” 1 ์ผ ์›”์š”์ผ ์˜ค์ „ 9:29 Peter Andreas Entschev <
[email protected]> ์ž‘์„ฑ :

์ข‹์Šต๋‹ˆ๋‹ค. ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํŒŒ๊ฒฌ ์ œ์•ˆ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š”
NEP์—์„œ np.duckarray ๋ฐ
np.copy_like ๋ฐ ์ด๋ฒˆ ์ฃผ PR ์ดˆ์•ˆ์„ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13831?email_source=notifications&email_token=AAJJFVW2YUBNUCJZK6JWDBTP5IWHNA5CNFSM4H3HQWAKYY3PNVWWK3TUL52HS4DFWSVREXG43ZVMV3QW63LNMVXHJW63LNMVXHJW63LNMVXHJK
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAJJFVR2KTPAZ4JPWDYYMFLP5IWHNANCNFSM4H3HQWAA
.

์ด ์ž‘์—…์— ๋Œ€ํ•œ ์•„์ด๋””์–ด์™€ ์ง€์›์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

array_like ๋ฐ copy_like ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์žˆ๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ์ด์ƒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. cupy / dask / sparse / etc), ๋งž์Šต๋‹ˆ๊นŒ? ์žฌ์ •์˜ ๋œ ๊ฒฝ์šฐ์—๋งŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์—ฌ๊ธฐ์— ์ž„์˜์˜ ๋น„ numpy ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ?

์‚ฌ์‹ค, ์ด๊ฒƒ์€ ์˜ค๋ฆฌ ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‹ค์ œ๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™•์‹คํžˆ np.duckarray ๋ฐ np.copy_like ์ธ์ˆ˜๊ฐ€ NumPy ๋ฐฐ์—ด ์ธ ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. np.array / np.copy ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฐฐ์—ด ๊ตฌํ˜„์—๋Š” copy ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? copy_like ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

array_like ํ•„์š”์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋””์— ๋„ฃ์„์ง€ ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

np.duckarray ์ด (๊ฐ€) ์ดํ•ด๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” np.copy_like์™€ np.duckarray (๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ถ€๋ฅด๋Š” ๋ฌด์—‡์ด๋“ )๋ฅผ NEP 22์™€ ๊ฐ™์€ "Informational"์ด ์•„๋‹Œ NEP 18๊ณผ ๊ฐ™์€ ๊ทœ๋ฒ”์ ์ธ ์˜ค๋ฆฌ ๋ฐฐ์—ด์„ ๊ฐ•์ œ / ์ƒ์„ฑํ•˜๋Š” ์ƒˆ๋กœ์šด NEP์— ํ•จ๊ป˜ ๋„ฃ๋Š”์ชฝ์œผ๋กœ ๊ธฐ์šธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+1

array_like์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋””์— ๋„ฃ์„์ง€ ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ np.copy_like ์™€ ๊ฐ™์ด ๋‹ค๋ฃจ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋ฐฐ์—ด์ด NumPy๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ np.copy ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด np.array_like ํ•จ์ˆ˜๋„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? array_like -arrays์— ๋Œ€ํ•œ ๊ธฐ์กด์˜ ๋ชจ๋“  ์ฐธ์กฐ๊ฐ€ ํ˜ผ๋™ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜๋„์ ์œผ๋กœ ๊ทธ๋Ÿฌํ•œ ์ด๋ฆ„์„ ํ”ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋‚˜๋Š” ์ด์ œ ๊นจ๋‹ซ๋Š”๋‹ค np.copy_like ํ•„์š”ํ•œ ์‚ฌ๋ณธ์„ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์œ ์‚ฌํ•œ ํ–‰๋™ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ np.asarray ๊ฐ€ ์ด๋ฏธ NumPy์™€ ์•„๋‹ˆ๋ผ๋ฉด ๋ณต์‚ฌ ๋งŒ ๋ฐœ์ƒ, ์ •๋ ฌ. ์—ฌ๊ธฐ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ np.copy_like(a, like=b) ์™€ ๊ฐ™์€ ํ˜ธ์ถœ์—์„œ a ๊ฐ€ b ์™€ ๋™์ผํ•œ ์œ ํ˜•์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋ฐฐ์—ด์ด NumPy๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ np.copy ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

__array_function__ ์„ ์ง€์›ํ•˜๋„๋ก ์žฅ์‹๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด np.array_like ํ•จ์ˆ˜๋„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? array_like-arrays์— ๋Œ€ํ•œ ๊ธฐ์กด์˜ ๋ชจ๋“  ์ฐธ์กฐ์— ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜๋„์ ์œผ๋กœ ๊ทธ๋Ÿฌํ•œ ์ด๋ฆ„์„ ํ”ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ. ๊ทธ๋ฆฌ๊ณ  ๋„ค, ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ np.copy_like ๊ฐ€ ํ•„์š”ํ•œ ์‚ฌ๋ณธ์„ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๊ทธ ์ด๋ฆ„์€ ๋ฐ์ดํ„ฐ ์‚ฌ๋ณธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์‚ฌ๋ณธ์„ ์•”์‹œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ np.asarray ์™€ ์œ ์‚ฌํ•œ ๋™์ž‘์„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด np.duckarray ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ Peter์˜ ์˜ˆ๊ฐ€ ์ด๊ฒƒ์„ ๋ช…ํ™•ํžˆํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด ์•„๋ž˜์—์„œ ๋ณต์‚ฌํ•˜๊ณ  np.copy_like ์— ์ž๋ง‰์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

import numpy as np, cupy as cp
a  = cp.array([1, 2])
b = [1, 2]
c = np.copy_like(b, like=a)

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด np.duckarray๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ np.duckarray ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  (์žฌ์ •์˜ ๋œ ๊ฒฝ์šฐ) ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด np.asarray ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค (NumPy ๋ฐฐ์—ด๋กœ ์ด์–ด์ง). ์˜ˆ๋ฅผ ๋“ค์–ด Python ๋ชฉ๋ก์—์„œ CuPy ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. array_like ๋Œ€ํ•ด CuPy (๋˜๋Š” ๋‹ค๋ฅธ like= ๋ฐฐ์—ด)๋กœ ์ „๋‹ฌํ•  ์ˆ˜์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๋œ ์˜ˆ์ œ์— ๋Œ€ํ•ด @jakirkham ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

c = np.copy_like(b, like=a)

๊ทธ๋Ÿฌ๋ฉด a.__array_function__ ๋ฅผ ํ†ตํ•ด CuPy๋กœ ์ „๋‹ฌ๋˜๊ณ  ํ•ด๋‹น ์†์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๊นŒ (์˜ˆ : a=<scipy.sparse matrix> ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)? ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋˜๋Š” ์ƒˆ๋กœ์šด ์ƒํ˜ธ ์šด์šฉ์„ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š”๋ณด๋‹ค ์™„์ „ํ•œ ๊ธฐ๋Šฅ์˜ ๋ฏธ๋ž˜ ๋””์ŠคํŒจ์น˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋งก๊ธฐ์‹ญ์‹œ์˜ค.

with cupy_backend:
   np.array(b)

NumPy ์ž์ฒด๊ฐ€ __array_function__ ์˜ ์ œํ•œ์„ ์šฐํšŒํ•˜๋Š” ์ž‘์—…์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฉ”์ธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋น„์ •์ƒ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ....

๊ทธ๋Ÿฌ๋ฉด a.__array_function__ ๋ฅผ ํ†ตํ•ด CuPy๋กœ ์ „๋‹ฌ๋˜๊ณ  ํ•ด๋‹น ์†์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๊นŒ (์˜ˆ : a=<scipy.sparse matrix> ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)?

๋ฐ˜๋“œ์‹œ ์‹คํŒจํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธ์ ์œผ๋กœ NumPy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” ์ „ํ˜€ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Œ).

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋˜๋Š” ์ƒˆ๋กœ์šด ์ƒํ˜ธ ์šด์šฉ์„ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋” ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋ฏธ๋ž˜ ๋””์ŠคํŒจ์น˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋งก๊ธฐ์‹ญ์‹œ์˜ค.

ํ™•์‹คํžˆ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋””์ŠคํŒจ์น˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์ง€ ๋งŒ, ๋ณต์žก์„ฑ๊ณผ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ด์ „์— ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ† ๋ก ์ด ์ผ์–ด ๋‚ฌ์„ ๋•Œ ์ฃผ๋ณ€์— ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ธก ๋งŒํ–ˆ์Šต๋‹ˆ๋‹ค.

NumPy ์ž์ฒด๊ฐ€ __array_function__์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฉ”์ธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋น„์ •์ƒ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ....

๋‚˜๋Š” ๋‹น์‹ ์˜ ์š”์ ์„ ํ™•์‹คํžˆ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๋ฉ”์ธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ์˜ฎ๊ธฐ๋ฉด ์‚ฌ์šฉ์ž๋“ค์ด ๊ฒ์„ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์ด๊ฒƒ์€ ๋‹จ์ง€ ์ธ์ƒ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , ๋‚˜๋Š” NumPy์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์„ ์ „ํ˜€ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์ง€๋งŒ NumPy๋ฅผ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

NumPy ์ž์ฒด๊ฐ€ __array_function__์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฉ”์ธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋น„์ •์ƒ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ....

์‹ค์ œ๋กœ ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ np.duckarray ๋ฉ”์ธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ np.duckarray ๋ฉ”์ธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•˜๋‚˜๊ฐ€ ๋” ๋ฐฉ์–ด ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ( asarray ์™€ ์œ ์‚ฌํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ "์ด๊ฒƒ์€ ndarray์™€ ์œ ์‚ฌํ•œ ์˜ค๋ฆฌ ์œ ํ˜•์˜ ์ •์˜๋ฅผ ์ถฉ์กฑํ•ฉ๋‹ˆ๊นŒ"). ์šฐ๋ฆฌ๊ฐ€ array_function_dispatch ๋„ ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ๊ณ  np.lib.mixins.NDArrayOperatorsMixin ์žˆ๊ณ  ๋” ๋งŽ์€ ๋ฏน์Šค ์ธ์„ ์ž‘์„ฑํ•  ๊ณ„ํš์ด๋ผ๋ฉด ์ƒํ˜ธ ์šด์šฉ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„์œ„ํ•œ ํ˜„๋ช…ํ•œ ์ƒˆ ํ•˜์œ„ ๋ชจ๋“ˆ์ด ํ•ฉ๋ฆฌ์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋””์ŠคํŒจ์น˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์ง€ ๋งŒ, ๋ณต์žก์„ฑ๊ณผ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ด์ „์— ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ† ๋ก ์ด ์ผ์–ด ๋‚ฌ์„ ๋•Œ ์ฃผ๋ณ€์— ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ธก ๋งŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. __array_function__ ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋ฏ€๋กœ ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค. 6 ๊ฐœ์›” ์ด๋‚ด์— ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ 

์ƒํ˜ธ ์šด์šฉ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„์œ„ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์ƒˆ ํ•˜์œ„ ๋ชจ๋“ˆ์ด ์˜๋ฏธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ง„์งœ ์ด์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ฐ๋„์—†๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์–ด๋”˜๊ฐ€์— ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. __array_function__์€ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋ฏ€๋กœ ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค. 6 ๊ฐœ์›” ์ด๋‚ด์— ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ 

๊ทธ๋Ÿฌ๋‚˜ __array_function__ ๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋ ค๋ฉด np.duckarray ๋ฐ np.copy_like (๋˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅด๊ธฐ๋กœ ๊ฒฐ์ •)๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ชจ๋“  ๋Œ€์•ˆ์— ๊ฐœ๋ฐฉ์ ์ด์ง€๋งŒ, ๋‹น์žฅ์€ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋””์ŠคํŒจ์น˜ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  __array_function__ ์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋‹น์žฅ์€ ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค

๊ทธ๋Ÿฌ๋‚˜ __array_function__ ๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋ ค๋ฉด np.duckarray ๋ฐ np.copy_like (๋˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅด๊ธฐ๋กœ ๊ฒฐ์ •)๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ 80 % ์ด์ƒ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ์ด์™€ ๊ฐ™์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋Šฅ ์„ธํŠธ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ฃผ์œ„์— ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์–ด์ˆ˜์„ ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋” ๋‚˜์€ ์žฅ์†Œ๋ฅผ ์ฐพ์„ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ๋Œ€์•ˆ์— ๊ฐœ๋ฐฉ์ ์ด์ง€๋งŒ, ๋‹น์žฅ์€ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋””์ŠคํŒจ์น˜ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  __array_function__ ์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋‹น์žฅ์€ ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค

๋‚ด ๋ง์€, ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ฐฑํ•œ ๊ตฌ๋ฉ์„ ๋ง‰๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? "๋” ๋ณต์žกํ•œ ๊ฒฝ์šฐ"๋ฅผ ๋ชจ๋‘ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. np.errstate ๋˜๋Š” np.dtype ๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์•ˆ์œผ๋กœ, uarray ๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ NumPy์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋‚ฎ์•„์งˆ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ, ์ ์  ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์žˆ์œผ๋ฉฐ scipy.fft ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค https://github.com/Quansight-Labs/uarray/tree/master/unumpy

uarray๋ฅผ ์‚ฌ์šฉํ•œ ํŒŒ๊ฒฌ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ™•์‹คํžˆ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€ ์–ด๋ ˆ์ด (Dask, xarray ๋“ฑ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ์„ค๋ช… ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๋ญ”๊ฐ€ ๋†“์นœ ๊ฒฝ์šฐ ์ˆ˜์ • ํ•ด์ฃผ์„ธ์š”). ์ €๋Š” SciPy์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ํ•ด์‹œํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€์ด ์„ค๋ช…์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๋ญ”๊ฐ€ ๋†“์นœ ๊ฒฝ์šฐ ์ˆ˜์ • ํ•ด์ฃผ์„ธ์š”).

์ง€๋‚œ์ฃผ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋Š” SciPy์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ํ•ด์‹œํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์žˆ์„ ๊ฒŒ, ์ง์ ‘ ๋งŒ๋‚˜์„œ ๋ฐ˜๊ฐ€์›Œ์š”.

np.coerce_like() ๋˜๋Š” np.cast_like() ๊ฐ€ copy_like ๋ณด๋‹ค ๋” ๋‚˜์€ ์ด๋ฆ„ ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณต์‚ฌ๋ณธ์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ .cast() ๋ฉ”์„œ๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋ฐฐ์—ด ์œ ํ˜•๊ณผ dtype์„ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹Œ ํ•จ์ˆ˜ ์—ฌ์•ผํ•˜๋ฏ€๋กœ ๋‘ ์ธ์ˆ˜๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

uarray๋ฅผ ์‚ฌ์šฉํ•œ ํŒŒ๊ฒฌ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ™•์‹คํžˆ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€ ์–ด๋ ˆ์ด (Dask, xarray ๋“ฑ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

uarray ์€ (๋Š”) ์—ฌ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

with ua.set_backend(inner_array_backend), ua.set_backend(outer_array_backend):
  s = unumpy.sum(meta_array)

์ด๋Š” ๊ตฌํ˜„ ๋‚ด์—์„œ ๋ฉ”ํƒ€ ๋ฐฐ์—ด์ด ua.skip_backend ํ˜ธ์ถœํ•˜๋„๋กํ•˜๊ฑฐ๋‚˜ ๋ฉ”ํƒ€ ๋ฐฐ์—ด์˜ ๋ฐฑ์—”๋“œ๊ฐ€ ์œ ํ˜• ๋ถˆ์ผ์น˜์‹œ NotImplemented ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ : @hameerabbasi

์ด์— ๋Œ€ํ•ด ํ™•์žฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ dask.array ๊ฒฝ์šฐ da ์ด์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์€ skip_backend์—†์ด ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. NumPy๊ฐ€์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ skip_backend๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” da ์–ธ์ œ๋“ ์ง€ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๊ฑด๋„ˆ ๋›ฐ๊ณ  ์ง์ ‘ ๊ตฌํ˜„์„ ํ˜ธ์ถœํ•˜๊ณ  skip_backend(dask.array) ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ones , cast ์™€ ๊ฐ™์ด ๋ฐฐ์—ด์ด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋ฅผ ๋””์ŠคํŒจ์น˜ํ•˜๋ ค๋ฉด ๋ฐฑ์—”๋“œ๋ฅผ ์„ค์ •ํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. np.errstate ๋ฐ np.dtype ํ•ฉ๋‹ˆ๋‹ค. np.ufunc ์—์„œ unumpy np.ufunc ๋ฅผ ๋‹ค๋ฃจ๋Š” ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜ ๋ฌธ์ œ์— ๊ด€ํ•ด์„œ๋Š” uarray ์—์„œ __ua_convert__ ํ”„๋กœํ† ์ฝœ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์•ˆ์€ ๋ฐฑ์—”๋“œ๊ฐ€ asarray ์ง์ ‘ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

uarray , @rgommers , @ peterbell10 , @hameerabbasi์— ๋Œ€ํ•ด ์•Œ๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ณ„์‚ฐ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ ์ ˆํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? __array_function__ ์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” Dask๊ฐ€ CuPy์˜ ์กด์žฌ๋ฅผ ์•Œ ํ•„์š”๊ฐ€์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์™„์ „ํžˆ ๋ฌด๊ด€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@pentschev ์ด๊ฒƒ์€ ๋ฐฑ์—”๋“œ๋ฅผ "๋“ฑ๋ก"ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•œ ์ตœ๊ทผ๊นŒ์ง€์˜ ๊ฒฝ์šฐ ์˜€์ง€๋งŒ NumPy (๋˜๋Š” ์ฐธ์กฐ ๊ตฌํ˜„) ๋งŒ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Dask๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜์˜ set_backend ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€, ๋‚ด๊ฐ€์ด ์–ธ๊ธ‰ @rgommers ๋ฌด์—‡์„ ์ถ”์ธก์žˆ์–ด https://github.com/numpy/numpy/issues/13831#issuecomment , -507432311์˜ ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” https://github.com/Quansight-Labs/uarray / tree / master / unumpy.

๋„ˆ๋ฌด ๋งŽ์€ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ฐ€์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด NumPy ๋ฐ Sparse์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋”ฐ๋ผ ๋ชจ๋“  ๊ฒƒ์ด NumPy ์ „์šฉ, Sparse ์ „์šฉ ๋˜๋Š” ๋‘˜ ๋‹ค ํ˜ผํ•ฉ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @ peterbell10 ์€ ์—ฌ๋Ÿฌ ๋ฐฑ์—”๋“œ๊ฐ€ ์ง€์› https://github.com/numpy/numpy/issues/13831#issuecomment -507458331 ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฑ์—”๋“œ ์„ ํƒ์„ ์ž๋™์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ์ด ๊ฒฝ์šฐ ์ด์ƒ์ ์œผ๋กœ๋Š” NumPy๋ฅผ ๋“ฑ๋กํ•˜๊ณ  Sparse ์šฉ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ ์ ˆํ•œ ๊ฒฝ์šฐ sparse์—์„œ NotImplemented ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด NumPy๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

SciPy์—์„œ @rgommers , @danielballan , ๊ทธ๋ฆฌ๊ณ  ๋‚˜ ์ž์‹ ์ด์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. duckarray (ํ•ด๋‹น ์ด๋ฆ„ ์‚ฌ์šฉ)์„ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๊ฒฐ๋ก ์ง€์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ 1.18๋กœ ์˜ˆ์ •๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•˜๋ฉด ๋‚˜๋ฅผ ๋ฐ”๋กœ ์žก์•„์ฃผ์„ธ์š”. ์ด๊ฒƒ์„ ๊ฐ์•ˆํ•  ๋•Œ PR์„ ์‹œ์ž‘ํ•ด๋„ ๊ดœ์ฐฎ์„๊นŒ์š”?

duckarray (ํ•ด๋‹น ์ด๋ฆ„ ์‚ฌ์šฉ)์„ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๊ฒฐ๋ก ์ง€์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ 1.18๋กœ ์˜ˆ์ •๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•˜๋ฉด ๋‚˜๋ฅผ ๋ฐ”๋กœ ์žก์•„์ฃผ์„ธ์š”. ์ด๊ฒƒ์„ ๊ฐ์•ˆํ•  ๋•Œ PR์„ ์‹œ์ž‘ํ•ด๋„ ๊ดœ์ฐฎ์„๊นŒ์š”?

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‚˜์—๊ฒŒ๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ ์ •ํ™•ํ•œ ์ œ์•ˆ์„ ์„ค๋ช…ํ•˜๋Š” ์งง์€ NEP๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://github.com/numpy/numpy/issues/13831#issuecomment -507334210 ์ฐธ์กฐ

๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™‚

์ด์ „์— ์ œ๊ธฐ ๋œ ์นดํ”ผ ์š”์ ์€ ๊ธฐ์กด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ์ด ๋ผ์ธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

a2 = np.empty_like(a1)
a2[...] = a1[...]

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์„ ํ•œ ์ค„๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๋ฏธ ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ๋˜๋Š” ๋ˆ„๋ฝ ๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” (ํ•ด๋‹น ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ) duckarray๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฒฐ๋ก ์ง€์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‚˜์—๊ฒŒ๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ ์ •ํ™•ํ•œ ์ œ์•ˆ์„ ์„ค๋ช…ํ•˜๋Š” ์งง์€ NEP๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. # 13831 (์ฝ”๋ฉ˜ํŠธ) ์ฐธ์กฐ

๋‚˜๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์•„์ง ์™„๋ฃŒํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค (๋‚˜์˜ ๋‚˜์œ ๊ณ„ํš https://github.com/numpy/numpy/issues/13831#issuecomment-507336302์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค).

์ด์ „์— ์ œ๊ธฐ ๋œ ์นดํ”ผ ์š”์ ์€ ๊ธฐ์กด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ์ด ๋ผ์ธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

a2 = np.empty_like(a1)
a2[...] = a1[...]

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์„ ํ•œ ์ค„๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๋ฏธ ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ๋˜๋Š” ๋ˆ„๋ฝ ๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํŠน์ˆ˜ํ•œ ๋ณต์‚ฌ ๋กœ์ง์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : CuPy https://github.com/cupy/cupy/pull/2079).

์ฆ‰, ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋กํ•˜๋ ค๋ฉด ๋ณต์‚ฌ ๊ธฐ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ด๊ฒƒ์€ asarray ๋Œ€ํ•œ ์ผ์ข…์˜ ๋Œ€์ฒด๋ฌผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ copy_like ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋Œ€์‹  NEP-18์—์„œ ์ œ์•ˆํ•œ ์•„์ด๋””์–ด ๋ฅผ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜๊ณ  ์‹ถ์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์ž์ฒด ํ”„๋กœํ† ์ฝœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
...
array์™€ asarray๋Š” ์‹ค์ œ numpy.ndarray ๊ฐ์ฒด๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด, ์ œ์•ˆ, ์ด์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์œ„์˜ ์˜๊ฒฌ์„ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์ด ์ข‹์€ ์•„์ด๋””์–ด์ธ์ง€ (์•„๋งˆ๋„ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋งŽ์€ ์„ฑ๊ฐ€์‹  ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€) ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜๊ณ  ๋…ผ์˜ํ•ด์•ผํ•˜๋Š” ์•„์ด๋””์–ด์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. .

SciPy'19์˜ ๊ฐœ๋ฐœ ํšŒ์˜ ๋ฐ ์Šคํ”„๋ฆฐํŠธ์˜ ํ•ฉ์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— 1.17.0์„ ๋ฌธ ๋ฐ–์œผ๋กœ ๊บผ๋‚ด ์‹ค์ œ ๊ฒฝํ—˜์„ ์–ป์œผ์‹ญ์‹œ์˜ค.

๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์žฌ๊ฒ€ํ† ํ•˜๊ณ  ๋…ผ์˜ํ•ด์•ผํ•˜๋Š” ์•„์ด๋””์–ด์ธ์ง€ ์ •๋ง๋กœ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์˜ˆ,ํ•˜์ง€๋งŒ ๋ช‡ ๋‹ฌ ํ›„์—.

์•„๋งˆ๋„ ์˜ˆ,ํ•˜์ง€๋งŒ ๋ช‡ ๋‹ฌ ํ›„์—.

์ข‹์•„, ๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด์ „์— ์ œ๊ธฐ ๋œ ์นดํ”ผ ์š”์ ์€ ๊ธฐ์กด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ์ด ๋ผ์ธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

a2 = np.empty_like(a1)
a2[...] = a1[...]

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์„ ํ•œ ์ค„๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๋ฏธ ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ๋˜๋Š” ๋ˆ„๋ฝ ๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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

์ด์ „์— ์ œ๊ธฐ ๋œ ์นดํ”ผ ์š”์ ์€ ๊ธฐ์กด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ์ด ๋ผ์ธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

a2 = np.empty_like(a1)
a2[...] = a1[...]

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์„ ํ•œ ์ค„๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๋ฏธ ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ๋˜๋Š” ๋ˆ„๋ฝ ๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํŠน๋ณ„ํ•œ ๋ณต์‚ฌ ๋…ผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : CuPy cupy / cupy # 2079 ).

์ฆ‰, ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋กํ•˜๋ ค๋ฉด ๋ณต์‚ฌ ๊ธฐ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ด๊ฒƒ์€ asarray ๋Œ€ํ•œ ์ผ์ข…์˜ ๋Œ€์ฒด๋ฌผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ copy_like ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋Œ€์‹  NEP-18์—์„œ ์ œ์•ˆํ•œ ์•„์ด๋””์–ด ๋ฅผ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜๊ณ  ์‹ถ์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์ž์ฒด ํ”„๋กœํ† ์ฝœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
...
array์™€ asarray๋Š” ์‹ค์ œ numpy.ndarray ๊ฐ์ฒด๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด, ์ œ์•ˆ, ์ด์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒˆ ํ”„๋กœํ† ์ฝœ๋กœ np.array ๋˜๋Š” np.asarray ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ํ™•๋ฆฝ ๋œ ์˜๋ฏธ๋Š” NumPy ๋ฐฐ์—ด๋กœ ์บ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ np.duckarray ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, duckarray like ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์‚ฌ์šฉํ•˜๋Š” - ์ฆ‰, ์œ„์˜ ๋‹จ์ˆœํ™” ์ œ์•ˆ์—์„œ ํ”„๋กœํ† ์ฝœ์„ ๋ณ€๊ฒฝ ํ•„์š” __array_function__ ๋Œ€์‹  ๊ฐ™์€ ์ „์šฉ ํ”„๋กœํ† ์ฝœ __duckarray__ ? ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ •๋ง๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.

์ด์ „์— ์ œ๊ธฐ ๋œ ์นดํ”ผ ์š”์ ์€ ๊ธฐ์กด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ์ด ๋ผ์ธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

a2 = np.empty_like(a1)
a2[...] = a1[...]

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์„ ํ•œ ์ค„๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๋ฏธ ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ๋˜๋Š” ๋ˆ„๋ฝ ๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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

๊ณต์ • ํ•ด. ์‚ฌ์‹ค ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ผ์„ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚  CuPy ๋ฐ Sparse์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

a2 = np.copy(a1)

๊ณต์ • ํ•ด. ์‚ฌ์‹ค ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ผ์„ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚  CuPy ๋ฐ Sparse์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

a2 = np.copy(a1)

์˜ˆ,ํ•˜์ง€๋งŒ "์ด ๋• ์–ด๋ ˆ์ด๋ฅผ ๋‹ค๋ฅธ ๋• ์–ด๋ ˆ์ด ์œ ํ˜•์— ๋ณต์‚ฌ"ํ•˜๋Š” ๊ฒƒ๋„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ํ”„๋กœํ† ์ฝœ๋กœ np.array ๋˜๋Š” np.asarray ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ํ™•๋ฆฝ ๋œ ์˜๋ฏธ๋Š” NumPy ๋ฐฐ์—ด๋กœ ์บ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ np.duckarray ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋„ ์ด๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹ ์ด์—†๊ณ ,์ด ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ๊บผ๋ คํ–ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์˜ค๋Š˜๊นŒ์ง€ํ•˜์ง€ ์•Š์€ ์ด์œ ์ด๋‹ค.

์ฆ‰, duckarray์— like ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‹จ์ˆœํ™” ๋œ ์ œ์•ˆ์—์„œ ํ”„๋กœํ† ์ฝœ์„ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. __duckarray__์™€ ๊ฐ™์€ ์ „์šฉ ํ”„๋กœํ† ์ฝœ ๋Œ€์‹  __array_function__์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ •๋ง๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.

๊ทธ๊ฒƒ๊ณผ ํ•ฉ๋ณ‘์ฆ์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ์กฐ์‹ฌํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ €๋Š”์ด ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์—์„œ ์ค‘๋ณต ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ like ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  duckarray ๋ฐ duckarray_like ?

์˜ˆ,ํ•˜์ง€๋งŒ "์ด ๋• ์–ด๋ ˆ์ด๋ฅผ ๋‹ค๋ฅธ ๋• ์–ด๋ ˆ์ด ์œ ํ˜•์— ๋ณต์‚ฌ"ํ•˜๋Š” ๊ฒƒ๋„ ์›ํ•ฉ๋‹ˆ๋‹ค.

np.copyto ์–ด๋–จ๊นŒ์š”?

np.copyto ์–ด๋–จ๊นŒ์š”?

๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ์ •์ •ํ•˜์‹ญ์‹œ์˜ค.ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

np.copyto(cupy_array, numpy_array)

NumPy๊ฐ€ ํ˜„์žฌ ๋™์ž‘์„ ๊ธฐ๊บผ์ด ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด asarray ํ•ญ์ƒ ๋Œ€์ƒ์ด NumPy ๋ฐฐ์—ด์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. copyto ๋Š” ๋™์ผํ•œ ๊ฐ€์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

np.copyto ์ด๋ฏธ __array_function__ ์‚ฌ์šฉํ•œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ง€์›ํ•˜์ง€๋งŒ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

def copyto(dst, src):
    dst[...] = src

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

def copylike(src, like):
    dst = np.empty_like(like)
    dst[...] = src
    return dst

np.copyto ์ด๋ฏธ __array_function__ ์‚ฌ์šฉํ•œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ง€์›ํ•˜์ง€๋งŒ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

def copyto(dst, src):
    dst[...] = src

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

def copylike(src, like):
    dst = np.empty_like(like)
    dst[...] = src
    return dst

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

copyto ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์—ฌ์ „ํžˆ ์˜๋ฏธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

np.copyto(cp.ndarray, np.random.random((3,)))

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ํ• ๋‹น ๋ฐ ๋ณต์‚ฌ์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. dst (์ด ๊ฒฝ์šฐ cp.ndarray ์ฃผ์œ„๋ฅผ ๋””์ŠคํŒจ์น˜ํ•˜๋ฉด ๋ถˆ๋ณ€ ๋ฐฐ์—ด์ด์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„์ด๋ฅผ ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ NumPy๊ฐ€ ๋‹จ์ˆœํžˆ ์ œ๊ณตํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด API๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„๋ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ ์ €์—๊ฒŒ ๋– ์˜ค๋ฅธ ๋˜ ๋‹ค๋ฅธ ์ƒ๊ฐ์„ ํ‘œ๋ฉดํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ API๊ฐ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ„์˜ ๋‹ค์šด ์ŠคํŠธ๋ฆผ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ƒ๊ฐํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : Dask์™€ Xarray์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋ฐฉ์‹).

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