Numpy: ENH: 'axis' ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” 'random.shuffle'์˜ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2014๋…„ 10์›” 11์ผ  ยท  35์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

axis ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  numpy.random.shuffle ๋Œ€ํ•œ ๋Œ€์•ˆ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ disarrange ๋ผ๊ณ  ํ•˜๋Š” ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€๋งŒ ๋” ํšจ์œจ์ ์ธ C ๊ตฌํ˜„์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

def disarrange(a, axis=-1):
    """
    Shuffle `a` in-place along the given axis.

    Apply numpy.random.shuffle to the given axis of `a`.
    Each one-dimensional slice is shuffled independently.
    """
    b = a.swapaxes(axis, -1)
    # Shuffle `b` in-place along the last axis.  `b` is a view of `a`,
    # so `a` is shuffled in place, too.
    shp = b.shape[:-1]
    for ndx in np.ndindex(shp):
        np.random.shuffle(b[ndx])
    return

์˜ˆ์‹œ:

In [156]: a = np.arange(20).reshape(4,5)

In [157]: a
Out[157]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In [158]: disarrange(a, axis=-1)

In [159]: a
Out[159]: 
array([[ 2,  0,  4,  3,  1],
       [ 8,  6,  7,  9,  5],
       [11, 14, 13, 10, 12],
       [19, 18, 16, 17, 15]])

In [160]: a = np.arange(20).reshape(4,5)

In [161]: disarrange(a, axis=0)

In [162]: a
Out[162]: 
array([[ 5, 11,  7, 13, 14],
       [ 0,  6,  2,  3,  4],
       [10,  1, 17, 18, 19],
       [15, 16, 12,  8,  9]])

์ด ์š”์ฒญ์€ stackoverflow: http://stackoverflow.com/questions/26310346/quickly-calculate-randomized-3d-numpy-array-from-2d-numpy-array/ ์— ๋Œ€ํ•œ ์ด ์งˆ๋ฌธ์— ์˜ํ•ด ๋™๊ธฐ๊ฐ€ ๋ถ€์—ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

01 - Enhancement numpy.random

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

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ np.random.permutation ์™€ ํ•จ๊ป˜ np.apply_along_axis ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ๋Œ€์•ˆ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
์…”ํ”Œ ์ถ• ์ธ์ˆ˜? ๊ธฐ๋ณธ๊ฐ’์€ np.sum๊ณผ ๊ฐ™์ด None์ž…๋‹ˆ๋‹ค.

2014๋…„ 10์›” 11์ผ ํ† ์š”์ผ ์˜คํ›„ 9์‹œ 36๋ถ„, Warren Weckesser [email protected]
์ผ๋‹ค:

numpy.random.shuffle์— ๋Œ€ํ•œ ๋Œ€์•ˆ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ถ• ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์…”ํ”Œํ•ฉ๋‹ˆ๋‹ค.
1์ฐจ์› ์กฐ๊ฐ. ์—ฌ๊ธฐ ๋‚ด๊ฐ€ disarrange๋ผ๊ณ  ๋ถ€๋ฅผ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ž‘๋™ํ•˜์ง€๋งŒ ๋” ํšจ์œจ์ ์ธ C ๊ตฌํ˜„์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

def disarrange(a, axis=-1):
""
์ฃผ์–ด์ง„ ์ถ•์„ ๋”ฐ๋ผ ์ œ์ž๋ฆฌ์—์„œ a ๋ฅผ ์„ž์Šต๋‹ˆ๋‹ค.

Apply numpy.random.shuffle to the given axis of `a`.
Each one-dimensional slice is shuffled independently.
"""
b = a.swapaxes(axis, -1)
# Shuffle `b` in-place along the last axis.  `b` is a view of `a`,
# so `a` is shuffled in place, too.
shp = b.shape[:-1]
for ndx in np.ndindex(shp):
    np.random.shuffle(b[ndx])
return

์˜ˆ์‹œ:

[156]์—์„œ: a = np.arange(20).reshape(4,5)

[157]์—์„œ:
์•„์›ƒ[157]:
๋ฐฐ์—ด([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])

[158]์—์„œ: disarrange(a, axis=-1)

[159]์—์„œ:
์•„์›ƒ[159]:
๋ฐฐ์—ด([[ 2, 0, 4, 3, 1],
[ 8, 6, 7, 9, 5],
[11, 14, 13, 10, 12],
[19, 18, 16, 17, 15]])

[160]์—์„œ: a = np.arange(20).reshape(4,5)

[161]์—์„œ: disarrange(a, axis=0)

[162]์—์„œ:
์•„์›ƒ[162]:
๋ฐฐ์—ด([[ 5, 11, 7, 13, 14],
[ 0, 6, 2, 3, 4],
[10, 1, 17, 18, 19],
[15, 16, 12, 8, 9]])

์ด ์š”์ฒญ์€ stackoverflow์— ๋Œ€ํ•œ ๋‹ค์Œ ์งˆ๋ฌธ์— ์˜ํ•ด ๋™๊ธฐ๊ฐ€ ๋ถ€์—ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
http://stackoverflow.com/questions/26310346/quickly-calculate-randomized-3d-numpy-array-from-2d-numpy-array/

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/5173.

๋‚˜๋‹ค๋‹ˆ์—˜ J. ์Šค๋ฏธ์Šค
๋ฐ•์‚ฌํ›„ ์—ฐ๊ตฌ์› - ์ •๋ณดํ•™ - University of Edinburgh
http://vorpus.org

shuffle ์˜ ํ˜„์žฌ ๋™์ž‘์€ ์‹ค์ œ๋กœ axis=None . ์ธ์ˆ˜๋ฅผ 1์ฐจ์› ์‹œํ€€์Šค๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

In [181]: a = np.arange(20).reshape(4,5)

In [182]: np.random.shuffle(a)

In [183]: a
Out[183]: 
array([[ 0,  1,  2,  3,  4],
       [15, 16, 17, 18, 19],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

axis=0 ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์€ 1D ์Šฌ๋ผ์ด์Šค์˜ ๋…๋ฆฝ์ ์ธ ์…”ํ”Œ๋ง์ž…๋‹ˆ๋‹ค.

2์ฐจ์› ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ a.T ๋ฅผ ์„ž์–ด์„œ axis=1 ๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋…๋ฆฝ์ ์ธ ์…”ํ”Œ๋ง์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

In [184]: a = np.arange(20).reshape(4,5)

In [185]: np.random.shuffle(a.T)

In [186]: a
Out[186]: 
array([[ 4,  1,  0,  3,  2],
       [ 9,  6,  5,  8,  7],
       [14, 11, 10, 13, 12],
       [19, 16, 15, 18, 17]])

disarrange ์—์„œ axis=None ๊ฐ€ np.random.shuffle(a.flat) ์ฒ˜๋Ÿผ ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์ ์ ˆํ•œ ์ธ์ˆ˜๋ฅผ shuffle ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋Œ€์ฒด ์…”ํ”Œ๋ง์„ ๊ตฌํ˜„ํ•˜๋ฉด ๊ดœ์ฐฎ๊ฒ ์ง€๋งŒ ํ•ด๋‹น API์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์—†์Šต๋‹ˆ๋‹ค.

shuffle axis ๋ฐ independent (๋˜๋Š” ํ•ด๋‹น ํ–‰์— ๋”ฐ๋ผ)์˜ ๋‘ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์„œ๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

def shuffle(a, independent=False, axis=0)

independent ์ด False ์ด๋ฉด ํ˜„์žฌ shuffle ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. True์ด๋ฉด disarrange ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์˜ค, uh, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์œ ์‚ฌํ•œ ๊ฒƒ๊ณผ ๋” ์ผ์น˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
sort :-(์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜
shuffling-of-slice๋Š” idx = arange(...)์™€ ๊ฐ™์ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์…”ํ”Œ(idx);
multi_dim_array[idx, ...]; ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๋„ ๋‚˜์—๊ฒŒ ๋ฌป์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค :-)

์ผ์น˜ํ•˜๋Š” ํ˜ธ์ถœ ๊ทœ์น™์ด ์žˆ๋Š” ์…”ํ”Œ ๋ฒ„์ „์—์„œ +1์ž…๋‹ˆ๋‹ค.
np.sort, ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชฉ๋ก์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์ตœ๊ณ ์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ๋„ :-)

(์•„๋งˆ๋„ "์Šคํฌ๋žจ๋ธ”"?)

2014๋…„ 10์›” 11์ผ ํ† ์š”์ผ ์˜คํ›„ 10์‹œ 31๋ถ„, Warren Weckesser < ์•Œ๋ฆผ @github.com

์ผ๋‹ค:

์…”ํ”Œ์˜ ํ˜„์žฌ ๋™์ž‘์€ ์‹ค์ œ๋กœ axis=None๊ณผ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ทจ๊ธ‰ํ•œ๋‹ค
1์ฐจ์› ์‹œํ€€์Šค๋กœ์„œ์˜ ์ธ์ˆ˜.

[181]์—์„œ: a = np.arange(20).reshape(4,5)

[182]์—์„œ: np.random.shuffle(a)

[183]์—์„œ:
์•„์›ƒ[183]:
๋ฐฐ์—ด([[ 0, 1, 2, 3, 4],
[15, 16, 17, 18, 19],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])

์ถ•=0์ธ ๊ฒƒ์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์€
1์ฐจ์› ์Šฌ๋ผ์ด์Šค์˜ ๋…๋ฆฝ์ ์ธ ์…”ํ”Œ๋ง.

2์ฐจ์› ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ aT๋ฅผ ์„ž์–ด์„œ axis=1์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€
๋‹น์‹ ์—๊ฒŒ ๋…๋ฆฝ์ ์ธ ์…”ํ”Œ์„ ์–ป์œผ์‹ญ์‹œ์˜ค:

[184]์—์„œ: a = np.arange(20).reshape(4,5)

[185]์—์„œ: np.random.shuffle(aT)

[186]์—์„œ:
์•„์›ƒ[186]:
๋ฐฐ์—ด([[ 4, 1, 0, 3, 2],
[ 9, 6, 5, 8, 7],
[14, 11, 10, 13, 12],
[19, 16, 15, 18, 17]])

์ •๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด axis=None์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
np.random.shuffle(a.flat).

๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋Œ€์ฒด ์…”ํ”Œ๋ง์„ ๊ตฌํ˜„ํ•˜๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ž‘๋™ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์…”ํ”Œ์— ์ ์ ˆํ•œ ์ธ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ
ํ•ด๋‹น API์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/5173#issuecomment -58765220.

๋‚˜๋‹ค๋‹ˆ์—˜ J. ์Šค๋ฏธ์Šค
๋ฐ•์‚ฌํ›„ ์—ฐ๊ตฌ์› - ์ •๋ณดํ•™ - University of Edinburgh
http://vorpus.org

์•„, ์›ํ•˜๋Š” ๋™์ž‘์„ sort ์˜ ์œ ์‚ฌ์ฒด๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

์˜ค, ์–ด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด sort์™€ ๊ฐ™์€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ๊ณผ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

2014๋…„ 10์›” 11์ผ ํ† ์š”์ผ ์˜คํ›„ 11:00 Warren Weckesser < [email protected]

์ผ๋‹ค:

์˜ค, uh, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์œ ์‚ฌํ•œ ๊ฒƒ๊ณผ ๋” ์ผ์น˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ •๋ ฌ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ

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

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/5173#issuecomment -58766099.

๋‚˜๋‹ค๋‹ˆ์—˜ J. ์Šค๋ฏธ์Šค
๋ฐ•์‚ฌํ›„ ์—ฐ๊ตฌ์› - ์ •๋ณดํ•™ - University of Edinburgh
http://vorpus.org

๊ทธ๋“ค์€ ์ตœ๊ณ ์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Sue๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

sort(axis=N)๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ด ๊ธฐ๋Šฅ์ด ์กด์žฌํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์„ +1ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ๊ฒฐ์ •์ด ์žˆ์—ˆ๋‚˜์š”?

๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
http://thread.gmane.org/gmane.comp.python.numeric.general/59014

์ด๊ฒƒ์€ ์ •๋ง ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๊ฒƒ์„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

https://stackoverflow.com/a/35647011/3401634 ์— ๋”ฐ๋ฅด๋ฉด ๋‹ค์ฐจ์› ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ X

np.random.shuffle(X)

์™€ ๊ฐ™๋‹ค

np.take(X, np.random.permutation(X.shape[0]), axis=0, out=X)

๊ทธ๋ž˜์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

np.random.shuffle(X, axis=axis)

~์ฒ˜๋Ÿผ

np.take(X, np.random.permutation(X.shape[axis]), axis=axis, out=X)

๊ธฐ๋ณธ axis=0 ?

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ np.random.permutation ์™€ ํ•จ๊ป˜ np.apply_along_axis ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

#13829 ๋•Œ๋ฌธ์— ์ง€๊ธˆ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

(์—ฌ๊ธฐ์„œ ์˜ˆ์ œ๋ฅผ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ์ƒˆ ์…”ํ”Œ ์ฝ”๋“œ์—์„œ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‚ด์šฉ์—์„œ๋Š” https://github.com/numpy/numpy/pull/14662์—์„œ ์ œ์•ˆ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

@wkschwartz , #13829์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์œ ์šฉํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์š”์ฒญํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์€ ์•„๋‹™๋‹ˆ๋‹ค. #13829์— ์ถ”๊ฐ€๋œ ์ถ•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฐฐ์—ด์„ ์„ž์„ 1์ฐจ์› ์‹œํ€€์Šค๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ axis ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ 1์ฐจ์› ์ถ•์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ์ถ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ถ• ๋‚ด์—์„œ ๋…๋ฆฝ์ ์ธ ์…”ํ”Œ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

In [1]: import numpy as np                                                      

In [2]: rng = np.random.default_rng()                                           

In [3]: x = np.arange(20).reshape(2, 10)                                        

In [4]: x                                                                       
Out[4]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

In [5]: rng.shuffle(x, axis=1)                                                  

In [6]: x                                                                       
Out[6]: 
array([[ 5,  9,  6,  4,  7,  0,  3,  2,  1,  8],
       [15, 19, 16, 14, 17, 10, 13, 12, 11, 18]])

ํ–‰์ด ๋…๋ฆฝ์ ์œผ๋กœ ์„ž์ด์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด์ด ์žฌ๋ฐฐ์—ด๋˜์—ˆ์ง€๋งŒ ๊ฐ ์—ด ๋‚ด์˜ ๊ฐ’์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

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

In [10]: x = np.arange(20).reshape(2, 10)                                       

In [11]: x                                                                      
Out[11]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

In [12]: disarrange(x, axis=1)                                                  

In [13]: x                                                                      
Out[13]: 
array([[ 4,  3,  7,  8,  0,  6,  5,  2,  9,  1],
       [12, 15, 19, 17, 18, 14, 10, 13, 11, 16]])

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋„์šฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ˆ˜์š”์ผ ํšŒ์˜๋ฅผ ์œ„ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋” ๋†’์€ ์ฐจ์›์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ choice ๋ฐ permutation ์™€ 1.18๋„ ์ถ• ์ธ์ˆ˜๋ฅผ (์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๋”ฐ๋ผ์„œ์ด๋‹ค).

์ด๋“ค ๋ชจ๋‘๋Š” ํ˜„์žฌ์˜ ์ž„์˜ ๋กœ์ง ์‚ฌ์šฉ shuffle the subarrays along this axis ๋Œ€์‹ ์—, shuffle along (individual) axis ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒํ•ด์•ผํ•˜๋Š”์ง€ ํ‹€๋ฆผ์—†์ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, "๋”ฐ๋ผ์„œ" ๋˜๋Š” ์ฃผ์–ด์ง„ ์ถ• ๋‚ด์—์„œ "์œ„์—์„œ" ์„ž์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— axis ๋Š” ์ด๋ฆ„์— "over"๊ฐ€ ์žˆ๋Š” apply_over_axes ์™€ ๊ฐ™์ด ๊ฑฐ์˜ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  NumPy์—์„œ ์ถ•์„ ๋”ฐ๋ผ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋Œ€๋‹ดํ•˜๊ฒŒ ๋…ผ์Ÿ์˜ ์ด๋ฆ„์„ over_axis=0 ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ํ˜ผ๋ž€์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ฃผ์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ํŠนํžˆ ์ž˜๋ชป๋œ ์…”ํ”Œ๋ง์„ ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š” ๋‚œ์ˆ˜์˜ ๊ฒฝ์šฐ.

์œ„์˜ github ์ƒํ˜ธ ์ฐธ์กฐ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด https://github.com/numpy/numpy/pull/15121์— ์ง„ํ–‰ ์ค‘์ธ PR์ด

๋” ์‹œ๊ธ‰ํžˆ์— ๋Œ€ํ•ด ์šฐ๋ ค ๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋ฉ‹์ง„ @WarrenWeckesser, ์šฐ๋ฆฌ๋Š” ๊ทธ์—์„œ ์ตœ๊ทผ ์ƒˆ๋กœ์šด API์˜ ์˜๋ฏธ์™€ ์œ„๋กœ๋ฅผ ํ™•์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ ์–ด๋„ axis ์ธ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ถ€๋ถ„์ ์œผ๋กœ ๋˜๋Œ๋ ค์„œ๋Š” ์•ˆ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ž ์‹œ ๋™์•ˆ ๋‹ค์‹œ ๋‹ค์ฐจ์›์  ํ–‰๋™์„ ์™„์ „ํžˆ ์—†์• ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜...

์ œ๊ฐ€ ์ง€๊ธˆ ๋„ˆ๋ฌด ๊ณผ๋ฏผ๋ฐ˜์‘์„ ํ•˜๊ณ  ์žˆ๋Š”๊ฑด์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ „์— ์ด๊ฑธ ๋†“์น˜๊ฑฐ๋‚˜ ๋๊นŒ์ง€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ๊ฒŒ ์กฐ๊ธˆ ์งœ์ฆ์ด ๋‚˜๋„ค์š”... ํ•˜์ง€๋งŒ ์†”์งํžˆ ํ˜„์žฌ์˜ ๋…ผ๋ฆฌ๋Š” ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Œ€์— ๋ถ€์‘ ํ•˜๋Š” ์˜๋ฏธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋†“์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  np.sort ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@seberg , ์ด ๋ฌธ์ œ๋ฅผ axis ์˜ ๋‘ ๊ฐ€์ง€ ํ•ด์„์— ๋Œ€ํ•ด "over" ๋ฐ "along"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™์„ ๋”ฐ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ shuffle ๋ฐ permutation ๋Œ€ํ•œ shuffle axis ์˜ ๊ธฐ์กด "๋™ํ–‰" ํ•ด์„์„ โ€‹โ€‹์™„์ „ํžˆ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์ง€๋ฉด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

๋ช‡ ๋…„ ์ „ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ํ† ๋ก ์˜ ๋์—์„œ ๋‚˜๋Š” ํ•ด๊ฒฐ์ฑ…์ด shuffle ๋ฐ permutation ์˜ API๋ฅผ ๋ณ€๊ฒฝ ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ถ•์„ ๋”ฐ๋ผ ๋ฌด์ž‘์œ„ํ™”๋œ ๋‘ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์—. ํ•œ ๋ฐฉ๋ฒ•์€ ์ œ์ž๋ฆฌ์—์„œ ์ž‘๋™ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹œ ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์ด๋ฆ„์€ permute ์™€ permuted ์˜€์ง€๋งŒ, ๊ทธ ์ด๋ฆ„์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ๋ฐ˜๋Œ€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋…„ 12์›”์˜ PR์—์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ randomly_permute ๋ฐ randomly_permuted ๋ผ๊ณ  ๋ถˆ๋ €์ง€๋งŒ ๊ทธ ์ด๋ฆ„์€ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ๋‘ ๊ฐœ์˜ ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ธ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด ์ œ์•ˆ๋œ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ permute ๋ฐ permuted ๋กœ ์ง€์นญํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒˆ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€๋ จ Generator ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

meaning    operate     return
of axis    in-place     copy
-------    --------  -----------
"over"     shuffle   permutation
"along"    permute   permuted

(์ถ• "์œ„์—์„œ" ์ž‘๋™ํ•˜๋Š” ๋ฉ”์„œ๋“œ shuffle ๋ฐ permutation ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.)

๋‘ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ• ๋Œ€์‹  ๋‚ด๋ถ€ ๋Œ€ ๋ณต์‚ฌ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์ œ์•ˆ์ด ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

(a) out ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ œ์ž๋ฆฌ์—์„œ ์ž‘์—…ํ•˜๋ ค๋ฉด ์ž…๋ ฅ ๋ฐฐ์—ด์„ out ๋กœ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค. out ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ์…”ํ”Œ๋œ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
(b) ์›ํ•˜๋Š” ๋™์ž‘์„ ์ง€์ •ํ•˜๋Š” copy ๋˜๋Š” inplace ์™€ ๊ฐ™์€ ๋ถ€์šธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ์ฃผ์š” ๋Œ€์•ˆ์€ axis ํ•ด์„ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ƒˆ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์กด ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‚˜์—ดํ•˜๊ธฐ ์ „์— ์ถ”๊ฐ€ ์ธ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ์Šค๋ ˆ๋“œ์—์„œ Robert Kern์ด ์ž‘์„ฑํ•œ ์˜๊ฒฌ์„ ๋ฐ˜๋ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์—์„œ ์•„๋ž˜ ํ‘œ์‹œ๋œ independent ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฐธ์กฐ).

๋Œ€์‹ ์— ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ข‹์€ ์ด์œ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ•˜๋‚˜. ๋ฆฌํ„ฐ๋Ÿด True ๋˜๋Š” False๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

( ์‚ฌ์„ค ํƒˆ์ฃผ : ์ด๋Ÿฐ ๋…ผ์˜์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์ด ๊ฒฝ์šฐ Generator ๋„ค์ž„์ŠคํŽ˜์ด์Šค)๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(๋•Œ๋กœ๋Š” "๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜ค์—ผ"์ด๋ผ๊ณ  ํ•จ). ๋„ค, ๋ชจ๋‘ ๋™์˜ํ•ฉ์‹œ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ™์œผ๋ฉด ๋” ์ž‘์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ API ์„ค๊ณ„ ๊ฒฐ์ •๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ˆ์ถฉ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋” ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋˜ ์–ด์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์Šน๋ฆฌํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.)

์ด ๋ชจ๋“  ๊ฒƒ์„ ๋งํ•˜๋ฉด์„œ ์ œ์•ˆ๋œ shuffle ์˜ ๊ธฐ์กด ์„œ๋ช…์— ๋‘ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(1) shuffle(x, axis=0, independent=False) : ๋ถ€์šธ ํ”Œ๋ž˜๊ทธ independent ๋Š” axis ๊ฐ€ ํ•ด์„๋˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค: False -> "over", True -> "along". ( independent ๋ณด๋‹ค ๋” ๋‚˜์€ ์ด๋ฆ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
(2) shuffle(x, axis=0, iaxis=???) : ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜ iaxis ๋Š” "๋™ํ–‰" ๋™์ž‘์— ๋Œ€ํ•œ ์ถ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ( axis ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ช…ํ™•ํ•œ ์‚ฌ์–‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. iaxis ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด axis ๊ฐ€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.)

์ €๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ๋‹ค์–‘ํ•œ API ์•„์ด๋””์–ด๋ฅผ ๋ชจ๋‘ ๋‹ค๋ค˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์—ฌ๊ธฐ์—์„œ API๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ด์•ผ ํ•  ๋งŽ์€ ์ด์œ ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ ์ง„ํ–‰ ์ค‘์ธ ์ผ์€ shuffle ๋ฐ permutation (์•„๋งˆ๋„ choice )๋ฅผ ์ธ๋ฑ์‹ฑ ์ž‘์—…(์˜ˆ: take )๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. axis ๋Œ€ํ•ด ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ด์ƒํ•œ ์กฐ๊ธˆ ๋Š๋ผ๋Š” ์ด์œ ๋Š”, ๊ทธ๊ฒƒ๋„ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์ž์ฒด๊ฐ€ํ•˜๋Š” ์ƒ‰์ธ (์ผ๋ฐ˜ ๋ฐฐ์—ด ์ธ์‹ ๊ธฐ๋Šฅ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ND์— ์ผ๋ฐ˜ํ™” ํ•  ์ˆ˜ ์—†๋‹ค๋Š”์ด ์ •์˜์˜ ๋‹จ์  ์•„๋งˆ๋„ arr[..., index] . ๊ทธ๊ฒŒ ๋‹ค์ž…๋‹ˆ๋‹ค ๋ฐฐ์—ด ์Šคํƒ์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•˜๊ณ  ๊ฐ ๊ฐœ๋ณ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์ด์ „๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰).
take_along_axis ๋Š” take ๊ฐ€ ND๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ (๋ณต์žกํ•ด ๋ณด์ผ์ง€๋ผ๋„) ND ์ผ๋ฐ˜ํ™” ๊ฐ€๋Šฅํ•œ "ํ•จ๊ป˜" ์˜๋ฏธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. apply_along_axis ๋ฐ apply_over_axis ๋Š” "over"๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋‹จ์–ด์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ "over"๋ฅผ ๊ฐ€์ ธ์˜จ ๊ณณ์ž…๋‹ˆ๋‹ค...

permutation (์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์ง€๋งŒ shuffled ์ด์–ด์•ผ ํ•จ)์ด ์—ฌ๊ธฐ์„œ ์‹ค์ œ ์ด์ƒ๊ฐ’์ž„์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. shuffle - shuffled , permute - permuted ๊ทธ๋Ÿฌ๋ฉด ์ƒํ™ฉ์ด ๊ฝค ๋ช…ํ™•ํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. shuffled ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  permutation ์— ๋Œ€ํ•œ ์ง€์› ์ค‘๋‹จ์„ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? permutation ๋„ itertools.permutations , FWIW์—์„œ ๋™์ž‘์ด ๋งค์šฐ ์ผ๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” permutation , permute , permuted ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํ–‰๋™์„ ๊ฐ€์ง„ ์œ ์‚ฌํ•˜๊ฒŒ ๋“ค๋ฆฌ๋Š” ์ด๋ฆ„์˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์„ธ ๊ฒน์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์žฅ๊ธฐ์ ์œผ๋กœ ๊ฐ€๋Šฅ).

๊ธฐ์กด API๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€๋งŒ, ๋™์ž‘์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” @rkern ์˜ ํฌ์ธํŠธ๊ฐ€ ์ตœ์„ ์˜ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ œ์ž๋ฆฌ ๋Œ€ ์ œ์ž๋ฆฌ ์•„๋‹˜์˜ ๊ฒฝ์šฐ NumPy์— ๋Œ€์ฒด out= ์ฒ ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ shuffle์ด ์ œ์ž๋ฆฌ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋ฉฐ shuffled๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. permuted ๋Œ€ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: permuted(arr, out=arr) ๋Š” permute(arr) ์™€ ๋™์ผํ•˜์ง€๋งŒ ์…”ํ”Œ๊ณผ ๋‹ฌ๋ฆฌ ndarray ๋กœ ๋ณ€ํ™˜๋จ).
์–ด๋–ค ๊ฒฝ์šฐ์—๋Š”, I ๋น„ํ•˜์˜ ๊ณ„ํš์ฒ˜๋Ÿผ permutation ์ฐฌ์„ฑ shuffled ์ƒˆ๋กœ์šด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ!

์ด ๋ฌธ์ œ(๋ฐ https://github.com/numpy/numpy/pull/15121์˜ ๊ด€๋ จ PR)๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์›๋ž˜ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ˜„์žฌ shuffle API์˜ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด axis ์ธ์ˆ˜๋ฅผ ์˜ˆ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. shuffle ์ค‘ sort ์˜ axis ์ธ์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. sort ์™€์˜ ๋น„์œ ๋Š” ๊ฝค ์ข‹์œผ๋ฏ€๋กœ ์ •๋ ฌ์„ ์œ„ํ•œ ๋ณต์‚ฌ์™€ ์ œ์ž๋ฆฌ ์ž‘์—…์˜ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. numpy.sort() ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•œ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์ •๋ ฌ๋œ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ndarray sort() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ndarray์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— in-place ์ž‘์—…์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. gh-15121์—์„œ ์ธ์ˆ˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋ฐ”๊พธ๋Š” in-place ํ•จ์ˆ˜์˜ ์ธ์ˆ˜ ๋Š” ndarray np.array ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋ชจ์–‘ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋œ ์ž…๋ ฅ๋„ ๊ฑฐ๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: [(1, 2, 3, 4), (5, 6, 7, 8)] ์˜ ์ œ์ž๋ฆฌ ์…”ํ”Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ).

์…”ํ”Œ๋œ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์™€ ์ œ์ž๋ฆฌ์—์„œ ์…”ํ”Œํ•˜๋Š” ndarray ๋ฉ”์„œ๋“œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ sort API๋ฅผ ์‹ค์ œ๋กœ ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๊ทธ๋Ÿฐ ์ถ”๊ฐ€๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ndarray ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋Š” ์Šน์ธ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ œ์ž๋ฆฌ์—์„œ ์„ž์ด๋Š” ndarray _method_ ํ•˜์ง€๋งŒ ndarray ํด๋ž˜์Šค์— ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์Šน์ธ๋  ๊ฐ€๋Šฅ์„ฑ์€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ฑ๊ธ€ํ†ค ์ƒ์„ฑ๊ธฐ๊ฐ€ ์—†์œผ๋ฉด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@bashtage๊ฐ€ ์ผ๋‹ค

permutation (์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์ง€๋งŒ shuffled ์ด์–ด์•ผ ํ•จ)์ด ์—ฌ๊ธฐ์„œ ์‹ค์ œ ์ด์ƒ๊ฐ’์ž„์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. [๋งŒ์•ฝ] shuffle-shuffled , permute-permuted ๊ทธ๋Ÿฌ๋ฉด ์ƒํ™ฉ์ด ๊ฝค ๋ช…ํ™•ํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. shuffled ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  permutation ์— ๋Œ€ํ•œ ์ง€์› ์ค‘๋‹จ์„ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ํ† ๋ก (์ผ์ข…์˜)์ด 2014๋…„์— ์ˆ˜๋ ด๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Nathaniels ์ œ์•ˆ์— ๋Œ€ํ•œ ๋งํฌ์ž…๋‹ˆ๋‹ค. https://mail.python.org/pipermail/numpy-discussion/2014-October/071364.html

๊ทธ์˜ scramble[d] ๋Š” ๋‚ด๊ฐ€ https://github.com/numpy/numpy/pull/15121 ์—์„œ randomly_permute[d] ๋ผ๊ณ  ๋ถˆ๋ €๋˜ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

permutation ๋Œ€์‹  shuffled ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ถ•์„ ๋”ฐ๋ผ ์ž‘๋™ํ•˜๋Š” ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด permute[d] ๊ด€๋ จ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

meaning    operate
of axis    in-place   return copy
-------    ---------  -----------
"over"     shuffle    shuffled
"along"    permute    permuted

์ผ๊ด€์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด API ๋ฒ„์ „์—์„œ๋Š” ์–ด๋–ค ๋ฉ”์„œ๋“œ์—๋„ out ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/pull/15121 ์—์„œ ์ตœ๊ทผ์— out ์ธ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๋ณด๊ธฐ ํ‰ํ•˜๊ณ  ๋ช…๋ฐฑํ•œ ์ž„์‹œ ์ด๋ฆ„ permuted_with_out ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋œ. out ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ์กด ๋ฉ”์†Œ๋“œ shuffle ๋ฐ permutation ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

meaning    operate
of axis    in-place                           return copy
-------    ---------------------------------  --------------------
"over"     shuffle(x, axis)                   permutation(x, axis)
"along"    permuted_with_out(x, axis, out=x)  permuted_with_out(x, axis)

๊ทธ๋Ÿฌ๋‚˜ out ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„์ž…ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ permutation ์—์„œ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  permutation ๋ฅผ shuffled ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด shuffled ๋ฉ”์†Œ๋“œ์—๋Š” ์ œ์ž๋ฆฌ ์—ฐ์‚ฐ์„ ํ—ˆ์šฉํ•˜๋Š” out ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ shuffle ๋Š” ์ค‘๋ณต๋˜์–ด permutation ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ shuffled ๋ฐ permuted ์˜ "์ข‹์€" ์ด๋ฆ„์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    meaning    operate
    of axis    in-place                  return copy
    -------    ------------------------  -----------------
    "over"     shuffled(x, axis, out=x)  shuffled(x, axis)
    "along"    permuted(x, axis, out=x)  permuted(x, axis)

out ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ œ์ž๋ฆฌ์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅ ๋ฐฐ์—ด์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž ์žฌ์ ์œผ๋กœ ์ž„์‹œ ๋ฐฐ์—ด ์ƒ์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ shuffle/shuffled/permute/permuted API์— ๋น„ํ•ด ์ด API์˜ ์žฅ์ ์ด์ง€๋งŒ ๊ทธ ์žฅ์ ์ด ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด API์˜ ๋‹จ์ ์€ shuffle ๋ฐ permutation ์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฆ‰๊ฐ์ ์ธ ์˜ํ–ฅ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ž ์‹œ ๋™์•ˆ "๋ถ€๋“œ๋Ÿฌ์šด" ์‚ฌ์šฉ ์ค‘๋‹จ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉ์„ ๊ฐ•์กฐํ•˜์ง€ ์•Š์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์ž ์‹œ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ).

์ด๊ฒƒ์ด ๋ณ€ํ™”์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ฒฝ์Ÿ์ž์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š”์ด shuffle/shuffled/permute/permuted ๋ฒ„์ „ ๋˜๋Š” ํ•จ๊ป˜ ๋ฒ„์ „ shuffled/permuted ์™€ out ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ. 2014๋…„์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋…ผ์˜๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋›ฐ์–ด๋“ค์—ˆ๋‹ค๋ฉด ์•„๋งˆ๋„ shuffle/shuffled/permute/permuted ๋ฒ„์ „์ด ์ด๋ฏธ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ out ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์—๋Š” ๋ช‡ ๊ฐ€์ง€(์ž‘์€? ์‚ฌ์†Œํ•œ?) ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์ด 4๊ฐœ๊ฐ€ ์•„๋‹Œ 2๊ฐœ์ด๊ณ  out ์‚ฌ์šฉํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์ ์€ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ท€ํ•˜๊ฐ€ ๋‚˜์—ดํ•œ ์„ธ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘ ์ˆœ์„œ๋Œ€๋กœ 1, 3, 2์— ํ›จ์”ฌ ๋ชป ๋ฏธ์น˜๋Š” ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š” 2๊ฐœ์˜ ์ˆœ์—ด์€ ํฐ ํ˜ผ๋ž€์˜ ์›์ธ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์€ ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด out์„ ์˜๋ฌด์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ out์„ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ ์„ ํƒ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ํ•™์ƒ๋“ค์—๊ฒŒ ๋‹จ์ง€ ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ€๋ฅด์น˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 3 x = shuffled(x, axis, out=x) ๊ฐ€ return x ์•„๋‹Œ return None ๊ฐ€ ์žˆ๋Š” ๋™์•ˆ x ๋๋‚  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. 3๋ฒˆ ๋“ฑ์žฅ.

๋‚ด ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์€ ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด out์„ ์˜๋ฌด์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ out์„ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ ์„ ํƒ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ œ์ž๋ฆฌ์—์„œ ์…”ํ”Œํ•˜๋Š” ๊ฒƒ์€ _์„ฑ๋Šฅ ์„ ํƒ์ž…๋‹ˆ๋‹ค, ๊ทธ๋ ‡์ฃ ?

๊ทธ๋Ÿฌ๋‚˜ ์ œ์ž๋ฆฌ์—์„œ ์…”ํ”Œํ•˜๋Š” ๊ฒƒ์€ _์„ฑ๋Šฅ ์„ ํƒ์ž…๋‹ˆ๋‹ค, ๊ทธ๋ ‡์ฃ ?

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ œ์ž๋ฆฌ์—์„œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ฐœ์ธ์ ์ธ ๊ฒฌํ•ด๋Š” f(x, out=x)๊ฐ€ ๋•Œ๋•Œ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋น ๋ฅด๊ฒŒ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์•ฝ๊ฐ„ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. f(x, inplace=True)๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋Š” ์•Š์ง€๋งŒ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„ ์ œ๊ฑฐ๋œ ์˜ค๋ž˜๋œ ํŒ๋‹ค ํŒจํ„ด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค).

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

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•ฝ๊ฐ„ ๋งˆ์ˆ ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์ธ์ •ํ•˜๊ณ  inplace= kwarg๋Š” ๋œ ๋งˆ์ˆ ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋œ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๋‚ด๋ถ€ ์…”ํ”Œ์ด ์—ฌ๊ธฐ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋Œ€๋ถ€๋ถ„์˜ ํ•™์ƒ๋“ค์—๊ฒŒ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ๊ฒฐ๊ตญ out= ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋žต ๋‹จ์ผ ์‚ฌ๋ณธ + ๊ด€๋ จ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์„ ๋ณดํ˜ธํ•˜๋ฉฐ ufuncs์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. (ufuncs out=input ๊ฒฝ์šฐ์—๋„ ์ถฉ๋ถ„ํžˆ ๊ณต์ •ํ•˜์ง€๋งŒ, ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ๋งˆ๋ฒ•์ด์ž ์•Œ๋ ค์ง„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.)

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

out ์‚ฌ์šฉ์„ ์˜นํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๊ฐ€์ƒ์˜ ์งˆ๋ฌธ: ๊ธฐ์กด ํ•จ์ˆ˜ numpy.sort ๋ฐ ndarray.sort ๊ฐ€ ์—†๊ณ  ์ง€๊ธˆ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์„ ํ˜ธํ•˜๋Š” API๋Š” numpy.sorted(a, axis=-1, kind=None, order=None, out=None) (๋‚ด๋ถ€ ์ •๋ ฌ์„ ์œ„ํ•ด ndarray.sort ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์Œ)?

ndarray.sort ๋Š” list.sort ๋ชจ๋ธ๋กœ ํ•˜๋ฏ€๋กœ ์ƒ๊ด€์—†์ด ํ•ฉ๋ฆฌ์ ์ธ API ์„ ํƒ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‚˜๋Š” np.sort ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  np.sorted(..., out=...) ๋ฅผ ์„ ํ˜ธํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, np.sort ์ด๋ฆ„์€ np.sorted ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ด์ฌ์˜ sorted() ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ). ๋ฉ”์„œ๋“œ์—๋งŒ ์ œ์ž๋ฆฌ ๋™์ž‘์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ฒŒ ์šฐ๋ คํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

" ndarray.sort ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Œ"์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ(๋˜๋Š” ์ œ์ž๋ฆฌ ๋™์ž‘)์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์šฐ๋ฆฌ๊ฐ€ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์†๊ธฐ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋Š๋ผ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.
์ œ์ž๋ฆฌ ๊ธฐ๋Šฅ ๋ฒ„์ „์„ ๊ฐ–๋Š” ๊ฒƒ์—๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ์ž๋ฆฌ์— ์—†๋Š” ๋ฒ„์ „์€ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ์ข‹์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ์ž˜ ์ œ๊ณต๋  ๋งŒํผ ์ผ๋ฐ˜์ ์ธ out= ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

"ndarray.sort ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Œ"์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ(๋˜๋Š” ์ œ์ž๋ฆฌ ๋™์ž‘)์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด API ์‚ฌ๊ณ  ์‹คํ—˜์˜ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด-๊ทธ๋ฆฌ๊ณ  ๋ชฉ๋ก์— ๋Œ€ํ•ด Python API๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฐ€์ •์ ์ธ ์ „์ œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค--๊ทธ๋Ÿฌ๋ฉด ์ •๋ ฌ์— ์„ ํ˜ธ๋˜๋Š” API๋Š” numpy.sorted(..., out=...) ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ, ๊ทธ๋ž˜์„œ ๊ฐ€์ƒํ•˜์ง€ : ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ out NumPy์™€ ์ „์—ญ API์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด, ๋‹ค์Œ, ์—ฌ๊ธฐ์— ๊ธฐ๋ณธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค, ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ ์ถ”๊ฐ€ ๊ณ„ํš์„ ์„ธ์›Œ์•ผ out ์— numpy.sort , numpy.partition , numpy.argsort , ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ ?

์˜ˆ, ์ œ ์ƒ๊ฐ์—๋Š” ufuncs์™€ ๋™์ผํ•œ ์˜๋ฏธ๋กœ out= kwarg๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ชจ๋“  NumPy API ๊ธฐ๋Šฅ์— ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. out ์ธ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์•ฝ๊ฐ„์˜ ๊ฐœ์„ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋“œ๋ฌธ ๊ฒฝ์šฐ์—๋Š” ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์ถ”๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

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