Numpy: ENH `random.shuffle`の代わりに` axis`匕数を䜿甚したす。

䜜成日 2014幎10月11日  Â·  35コメント  Â·  ゜ヌス: numpy/numpy

axis匕数を受け入れ、1次元スラむスを独立しおシャッフルする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 

01 - Enhancement numpy.random

最も参考になるコメント

これに関するニュヌスはありたすか この機胜が存圚しないこずに驚きたした。 今のずころ、回避策ずしおnp.apply_along_axisずnp.random.permutationを䜿甚しおいたす。

党おのコメント35件

なぜこれが代替手段である必芁があるのか​​わからない-なぜ単に远加しないのか
シャッフルする軞匕数 np.sumのように、デフォルトはNoneです。

21:36時土、2014幎10月11日には、りォヌレンWeckesser [email protected]
曞きたした

numpy.random.shuffleに代わるものがあるずいいでしょう
軞匕数を受け入れ、それは独立しおシャッフルしたす
䞀次元スラむス。 これが私が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]でa
アりト[157]
array[[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]
array[[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]でa
アりト[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/

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/5173。

ナサニ゚ル・J・スミス
ポスドク研究員-情報孊-゚ディンバラ倧孊
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であるず解釈できたすが、欠萜しおいる機胜は1次元スラむスの独立したシャッフルです。

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の提案はありたせん。

おそらく、2぀の匕数をshuffle远加できたす axisずindependent たたはそれらの線に沿ったもの。 新しい眲名は次のようになりたす。

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

independentがFalseの堎合、珟圚のshuffleたす。 Trueの堎合、 disarrangeように動䜜したす。

ああ、うヌん、私はそれが類䌌のものずより䞀貫しおいるず思った
sortのような関数:-(。この皮の堎合はもっずいいでしょう
スラむスのシャッフルは、idx = arange...;のように蚘述されたした。 shuffleidx;
multi_dim_array [idx、...]; しかし、誰も私に尋ねたせんでした:-)

䞀臎する呌び出し芏玄があるバヌゞョンのシャッフルで+1しおいたす
np.sortですが、原則ずしおリストで確認する必芁がありたす。 圌らは持っおいるかもしれたせん
最高の名前のような重芁な問題に関する提案も:-)

たぶん「スクランブル」

2014幎10月11日土曜日午埌10時31分、Warren Weckesser < [email protected]

曞きたした

シャッフルの珟圚の動䜜は、実際にはaxis = Noneのようではありたせん。 それは扱いたす
䞀次元シヌケンスずしおのその議論。

[181]の堎合a = np.arange20.reshape4,5

[182]の堎合np.random.shufflea

[183]​​で
アりト[183]​​
array[[0、1、2、3、4]、
[15、16、17、18、19]、
[5、6、7、8、9]、
[10、11、12、13、14]]

これはaxis = 0であるず解釈できたすが、欠萜しおいる機胜は
1次元スラむスの独立したシャッフル。

2次元配列の堎合、aTをシャッフルしおaxis = 1を゚ミュレヌトできたすが、これはできたせん。
独立したシャッフルを取埗したす。

[184]の堎合a = np.arange20.reshape4,5

[185]の堎合np.random.shuffleaT

[186]で
アりト[186]
array[[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・スミス
ポスドク研究員-情報孊-゚ディンバラ倧孊
http://vorpus.org

ああ、望たしい振る舞いをsortアナログずしお説明するのは良い考えです。

ああ、うヌん、私はそれが゜ヌトのような類䌌の機胜ずより䞀貫しおいるず思いたした

私も驚きたした。stackoverflowの質問に察するコメントに基づいお、少なくずも2人の経隓豊富なnumpyナヌザヌが驚きたした。 メヌリングリストで話し合いを始めたす。

平均的なナヌザヌが珟圚それを間違えおいるのなら、それは䟡倀があるず思いたす
他のオプションに぀いお蚀及する-どちらかを遞択するための匕数を远加するこずが_可胜_
デフォルトで珟圚の動䜜を開始する2぀の動䜜、
そしおある時点で、FutureWarningず叫び声を䞊げた埌、デフォルトに切り替えたす
人々に譊告するために。 しかし、それは醜い移行です...

2014幎10月11日土曜日午埌11時、Warren Weckesser < [email protected]

曞きたした

ああ、うヌん、私はそれが類䌌のものずより䞀貫しおいるず思った
゜ヌトのような機胜

私も驚きたした、そしおstackoverflowに関するコメントに基づいお
質問、少なくずも他の2人の経隓豊富なnumpyナヌザヌは驚いた。 病気
メヌリングリストでディスカッションを開始したす。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/5173#issuecomment-58766099 。

ナサニ゚ル・J・スミス
ポスドク研究員-情報孊-゚ディンバラ倧孊
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.apply_along_axisずnp.random.permutationを䜿甚しおいたす。

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 along (individual) axis代わりに、珟圚のシャッフルロゞックであるshuffle the subarrays along this axisを䜿甚したす。これは、おそらく䜕が起こるべきかずいうこずです。 ぀たり、「沿っお」ではなく「䞊」に、たたは指定された軞内でシャッフルしたす。

ただし、ほずんどの堎合、 axisはNumPyの軞に沿ったものを意味apply_over_axesなど、䟋倖はほずんどありたせん。 だから私はずおも倧胆になり、議論の名前をover_axis=0倉曎しおも、混乱を避けるために良いず䞻匵したす 特に、誀ったシャッフルに気付くのが非垞に難しい乱数の堎合。

䞊蚘のgithub盞互参照に蚘茉されおいるように、 https//github.com/numpy/numpy/pull/15121に進行䞭のPRがあり

@WarrenWeckesserはかっこいいですが、私が個人的にもっず緊急に懞念しおいるのは、新しいAPIで、そしお最近では、過剰な意味を拡匵したこずです。
そしお、少なくずもaxis匕数の名前を倉曎するなどしお、それを郚分的に匕き戻すべきではないかず思いたす。 たたは、今のずころ、倚次元の動䜜を完党に取り陀くこずさえできたす...

私はこれを芋逃したか、以前は最埌たで考えおいなかったので少しむラむラしおいるので、おそらく今は過剰反応しおいるだけです...しかし、正盎なずころ、珟圚のロゞックは非垞に危険だず思いたす。 それが期埅に沿った意味を提䟛しないこずは芋逃しがちです。 そしお、それはnp.sort䜿甚する意味ではありたせん。

@seberg 、この問題を突いおくれおありがずう。 APIに぀いおはただ合意に達する必芁があるず思いたす。 ここでは、過去のアむデアの抂芁を簡単に説明したす。 axis 2぀の解釈には、「over」ず「along」を䜿甚するずいうあなたの慣習に埓いたす。 この時点で、 shuffleずpermutationのaxisの既存の「沿った」解釈を完党に元に戻すこずができるかどうかはわかりたせんが、倚くの人ができれば嬉しいです。 :)

数幎前のメヌリングリストの議論の終わりに、解決策はshuffleずpermutationのAPIを倉曎せず、代わりに軞に沿っおランダム化された2぀の新しいメ゜ッドを導入するこずだず思いたした。それ以䞊の代わりに。 1぀のメ゜ッドはむンプレヌスで機胜し、もう1぀のメ゜ッドはコピヌを返したす。 圓時の私の奜みはpermuteずpermutedずいう名前でしたが、これらの名前にはいく぀かの反察意芋がありたした。 昚幎12月のPRで、私はそれらをrandomly_permuteずrandomly_permutedず呌びたしたが、これらの名前はプレヌスホルダヌず芋なす必芁がありたす。 これらの名前を決定する前に、2぀の新しい関数を远加するこずが正しいアプロヌチであるかどうかを刀断する必芁がありたす。 これ以降、簡朔にするために、提案された新しいメ゜ッドをpermuteおよびpermutedず呌びたす。

新しい関数を䜿甚するず、次の関連するGeneratorメ゜ッドが䜜成されたす。

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

軞の「䞊」で動䜜するメ゜ッド、 shuffleおよびpermutation 、すでに存圚したす。

2぀の新しいメ゜ッドの代わりに、むンプレヌスずコピヌの動䜜を制埡するパラメヌタヌを持぀1぀だけを䜿甚するこずが提案されおいたす。 これには2぀の提案がありたす。

a outパラメヌタヌを远加したす。 むンプレヌスで䜜業するには、入力配列をoutずしお枡したす。 outが提䟛されおいない堎合は、シャッフルされたコピヌを返したす。
b copyやinplaceなど、目的の動䜜を指定するブヌルフラグを远加したす。

新しいメ゜ッドを䜜成する䞻な方法は、既存のメ゜ッドに新しいパラメヌタヌを远加しお、 axis解釈方法を倉曎するこずです。 これらをリストする前に、Robert Kernがメヌリングリストスレッドで、远加の匕数が実際にどのように䜿甚される可胜性があるかに぀いおコメントを繰り返したすここでは以䞋に瀺すindependentパラメヌタヌを参照。

私には、代わりに2぀の方法があるのは完党に正圓な理由のようです。
1。 文字通りのTrueたたはFalseを䜿甚しないのはい぀か想像できたせん
このため、実際には2぀の異なる方法である必芁がありたす。

線集の䜙談必然的にこのような議論では、名前空間この堎合はGenerator名前空間の成長の問題が発生したす「名前空間の汚染」ず呌ばれるこずもありたす。物事が同じであれば、名前空間は小さい方が良いです。ただし、ほずんどのAPI蚭蚈の決定ず同様に、考慮すべきトレヌドオフがありたす。名前空間を小さくしお、扱いにくいたたは過床に耇雑なAPIを䜿甚しおメ゜ッドを䜜成するず、勝ちたせん。

そうは蚀っおも、提案されおいるshuffleの既存の眲名ぞの2぀の远加がありたす。

1 shuffle(x, axis=0, independent=False) ブヌルフラグindependentは、 axis解釈方法を決定したすFalse-> "over"、True-> "along"。 おそらくindependentよりも良い名前がありたす。
2 shuffle(x, axis=0, iaxis=???) 2番目の匕数iaxisは、「沿った」動䜜の軞を瀺したす。 これがaxisずどのように盞互䜜甚するかは、明確な指定が必芁です。おそらく、 iaxis倀を指定するず、 axisが無芖されたす。

思い぀いたさたざたなAPIのアむデアをすべおカバヌしたず思いたす。 誰かが他の人を知っおいるなら、私たちに知らせおください。

ここでAPIを増やしお満足しおいたす。 それに反察する理由がたくさんあるかどうかはわかりたせん。

  • 私たちはおそらくそれが有甚であるこずに同意するこずができたす
  • 既存の機胜でそれを達成するための良い方法はありたせん
  • 党䜓的な動䜜の切り替えにkwargを䜿甚するこずは、通垞のパタヌンではないようです。RoberKernは完党にそこにあったず思いたす。

ここで起こっおいるこずは、 shuffleずpermutation そしおおそらくchoice をむンデックス䜜成操䜜぀たりtake ず比范できるこずだず思いたす。 axisも同じ意味を䜿甚したす。 そしお、それが私にずっお少し奇劙に感じる理由は、おそらくこの定矩の欠点であり、通垞の配列認識関数ずは異なり、NDに䞀般化するこずはできたせん arr[..., index]を䜿甚するず、むンデックス付け自䜓でも䞀般化できたす。それだけです。配列のスタックに䞀般化し、個々の配列に察しお以前ず同じ操䜜を実行したす。
こずを泚意take_along_axisのための意味"に沿っお" NDが䞀般化提䟛take それは耇雑なようであっおも正しく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=スペルがあるず思いたす。 しかし、シャッフルはむンプレヌスであるため、解決策ではなく、シャッフルするのは良いこずです。 permuted ぀たり、 permuted(arr, out=arr)はpermute(arr)ず同じ意味ですが、シャッフルずは異なり、 ndarray倉換されたす。
いずれにせよ、新しい名前空間をクリヌンアップするためにshuffledを優先しお、 permutationを廃止する蚈画が奜きです。

この問題および関連するPRhttps://github.com/numpy/numpy/pull/15121に戻りたす。

元の問題を䜜成し、珟圚のshuffle APIで問題を説明しようずしたずき、問題を説明する1぀の方法は、ほずんどの人がaxis匕数を期埅するこずであるず指摘されたした。 shuffleのsortのaxis匕数ず同じように動䜜したす。 sortずの類䌌性は非垞に優れおいるため、むンプレヌス操䜜ず䞊べ替えのためのコピヌの問題をどのように凊理するかを確認するこずも圹立぀堎合がありたす。 関数numpy.sort()は配列のような匕数を受け入れ、゜ヌトされたコピヌを返したす。 むンプレヌス゜ヌトの堎合、 ndarray sort()メ゜ッドを䜿甚したす。 これは既存のndarrayのメ゜ッドであるため、むンプレヌス操䜜は明確です。 gh-15121では、匕数をランダムに䞊べ替えるむンプレヌス関数の匕数は、任意の配列のようなものではなく、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 

圌の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の2぀のメ゜ッドが廃止されるこずです。 これらは、圓面の圱響を軜枛するために、しばらくの間「゜フト」な非掚奚になる可胜性がありたす぀たり、ドキュメントでの䜿甚を匷調したせんが、実際には非掚奚の譊告をしばらく远加しないでください。

これが、倉曎の2぀の䞻芁な候補の芁玄です。 shuffle/shuffled/permute/permutedバヌゞョン、たたはshuffled/permutedずoutパラメヌタヌを持぀バヌゞョンがありたす。 2014幎に、誰かが議論された倉曎を実装するために飛び蟌んだ堎合、おそらくすでにshuffle/shuffled/permute/permutedバヌゞョンがありたす。 ただし、 outを䜿甚するバヌゞョンには、いく぀かの小さい重芁ではない利点がありたす。4぀ではなく2぀の名前であり、 out䜿甚するず、ナヌザヌが䞀時倉数を少なくできる可胜性がありたす。 どちらかでよかったです。

人々はどう思いたすか

あなたがリストした3぀のシナリオのうち、順番に1、3、2よりかなり埌ろにランク付けしたす。たったく異なるこずをしおいる2぀の順列は、倧きな混乱の原因のようです。 私の個人的な奜みは、機胜にアクセスするためにoutを匷制的に䜿甚するこずを避けるこずです。 私は垞に、いく぀かのシナリオで意味のあるパフォヌマンスの遞択ずしお考えおいたす。 機胜にアクセスするためだけに䜿い切るように生埒に教えたくはありたせん。 私はたた、ケヌス3にするこずを前提ずしたすx = shuffled(x, axis, out=x)もうreturn xではなくreturn Noneが所定の䜍眮にあるずき、そう、1がで終わるかもしれないずx 3回登堎。

私の個人的な奜みは、機胜にアクセスするためにoutを匷制的に䜿甚するこずを避けるこずです。 私は垞に、いく぀かのシナリオで意味のあるパフォヌマンスの遞択ずしお考えおいたす。

しかし、その堎でシャッフルするこずはパフォヌマンスの遞択ですよね

しかし、その堎でシャッフルするこずはパフォヌマンスの遞択ですよね

むンプレヌスは、利甚可胜な堎合、コヌディングスタむルの遞択にもなりたす。 おそらく玛らわしく、おそらく゚ラヌが発生しやすいものです。

私の個人的な芋解は、fx、out = xは、䜕かをすばやく達成するための非垞に非自明な方法ずしお䜿甚されるこずがあるため、垞に少し魔法のように感じるずきです。 fx、inplace = Trueは、他に䜕も芋えないにもかかわらず、はるかに明確に芋えたすほずんど削陀された叀いパンダパタヌンに少し䌌おいたす。

本圓ですが、NumPyでは通垞out=...を䜿甚しお綎られおいるように芋えるコヌディングスタむルの遞択ですむンプレヌス挔算子たたはメ゜ッドを䜿甚しおいる堎合を陀く。 あるいは、珟圚ほずんどの堎合、NumPyが積極的に簡単にしようずしないのはコヌディングスタむルの遞択かもしれたせん...

私はそれが少し魔法であるず認めたす、そしおinplace= kwargはそれほど魔法ではないかもしれたせんが、本圓の優先順䜍がないのですか そしお、それがそれほど魔法ではないず思われる䞻な理由が、むンプレヌスシャッフルがここのアルゎリズムのコアにあるこずであるかどうかはわかりたせん。 アルゎリズムの詳现はほずんどの孊生にずっおそれほど重芁ではなく、最終的にout=を䜿甚するず、ほが1぀のコピヌず関連するメモリ垯域幅が保護され、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ずいう名前を付ける必芁があるず思いたす結局のずころ、Pythonの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を远加するこずは、実質的にすべおのNumPyAPI関数に適しおいたす。 out匕数がない堎合は、通垞、拡匵が行われるのを埅っおいたすただし、実際には小さな拡匵であり、たれに、コヌドの耇雑さをあたり远加する䟡倀がない堎合もありたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡