2012-02-24 8 views
12

通常、numpyは割り当ての左右を一致させるため、たとえばa[:] = bを実行すると、bは同じ形状になるか、aと同じ形にブロードキャストする必要があります。しかし、そこにそのルールの例外のようだ:ナンシー・ファンシー・インデックス付けと割り当て

>>> a = np.arange(10) 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b = a.copy() 
>>> a[[0,1,2]] = b[::2] 
>>> a 
array([0, 2, 4, 3, 4, 5, 6, 7, 8, 9]) 
>>> a[np.arange(10)] = b[:2] 
>>> a 
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1]) 

唯一の1D配列でのみ代入の左辺の空想のインデックスがある場合に動作しているようですが、私は見つけることができませんでしたどこでもこの動作のドキュメント。この動作は文書化されていますか?どこにいるのでしょうか、また誰かが有用な場合の例を挙げることができますか?

更新:

numpyのflatiterタイプがflatiter、私は知りませんファンシーインデックスの間にいくつかの接続があり、あまりにもこのように動作しているようですか?

>>> a.flat = [10,11] 
>>> a 
array([10, 11, 10, 11, 10, 11, 10, 11, 10, 11]) 
>>> a.flat[:] = [2,3,4] 
>>> a 
array([2, 3, 4, 2, 3, 4, 2, 3, 4, 2]) 
>>> a.flat = range(100) 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
+3

この機能は正しく記述されています。これは、1次元配列の高度な索引付けと組み合わせて割り当てを行う場合にのみ許可されています。私はドキュメントでこれについて読んでいると確信していますが、私は現時点でリンクを見つけることができません。私はこの機能が今や有用であることを発見しました。しかし、これが専用の機能によってサポートされていて、通常の割り当てが依然としてエラーを出すなら、それがより良いと思うでしょう。 –

+0

私はすぐに放送しているとすぐに考えましたが、実際には放送の要件を満たしていないことがわかりました。奇妙な! – wim

+0

それは機能かバグかどうかわかりません...少なくともhttp://docs.scipy.org/doc/numpy/reference/internals.code-explanations.html#getting-or-settingはそうではないようですこれを特別なケースとして言及する。 – Tanriol

答えて

1

この動作はRとその祖先S/S-plusでモデル化されていると思います。これは、リスト割り当て(「ベクトル」割り当て)がそこでどのように機能し、「リサイクル」と呼ばれるかです。 Rプロジェクトのウェブサイトではそれについて語っていますが、私はthis linkにもっと明るい説明があります。 Rでは、ベクトルは測定値の集まりなので、それをパッドやトリムするのが理にかなっています。このロジックのどれくらいがそれに気をつけているのですか、そしてなぜ、それはまだまだ良い質問です。

関連する問題