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/ ์ ๋ํ ์ด ์ง๋ฌธ์ ์ํด ๋๊ธฐ๊ฐ ๋ถ์ฌ๋์์ต๋๋ค
์ด๊ฒ์ด ๋์์ด ํ์ํ ์ด์ ๋ฅผ ์์ง ๋ชปํฉ๋๋ค.
์
ํ ์ถ ์ธ์? ๊ธฐ๋ณธ๊ฐ์ 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
์ธ์๊ฐ ๋ถ์กฑํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค(ํ์ง๋ง ์ค์ ๋ก๋ ์ฝ๊ฐ์ ๊ฐ์ ์ผ ์ ์์ผ๋ฉฐ ๋๋ฌธ ๊ฒฝ์ฐ์๋ ์ฝ๋ ๋ณต์ก์ฑ์ ๋๋ฌด ๋ง์ด ์ถ๊ฐํ ๊ฐ์น๊ฐ ์์ ์๋ ์์ต๋๋ค).
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ํ ์์์ด ์์ต๋๊น? ์ด ๊ธฐ๋ฅ์ด ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋์ต๋๋ค. ์ง๊ธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก
np.random.permutation
์ ํจ๊ปnp.apply_along_axis
์ฌ์ฉํ๊ณ ์์ต๋๋ค.