NumPy 割り当てにおける重複インデックスの処理 質問する

NumPy 割り当てにおける重複インデックスの処理 質問する

2D 配列内の複数の要素の値を設定していますが、データには特定のインデックスに対して複数の値が含まれることがあります。

「後で」の値が常に割り当てられているようですが (以下の例を参照)、この動作は保証されていますか、それとも一貫性のない結果になる可能性はありますか? ベクトル化された割り当てで「後で」を希望どおりに解釈できることをどうすればわかりますか?

つまり、最初の例ではa必ず含まれ4、2 番目の例では印刷されるでしょうかvalues[0]?

非常に簡単な例:

import numpy as np
indices = np.zeros(5,dtype=np.int)
a[indices] = np.arange(5)
a # array([4])

もう一つの例

import numpy as np

grid = np.zeros((1000, 800))

# generate indices and values
xs = np.random.randint(0, grid.shape[0], 100)
ys = np.random.randint(0, grid.shape[1], 100)
values = np.random.rand(100)

# make sure we have a duplicate index
print values[0], values[5]
xs[0] = xs[5]
ys[0] = ys[5]

grid[xs, ys] = values

print "output value is", grid[xs[0], ys[0]]
# always prints value of values[5]

ベストアンサー1

NumPy 1.9 以降では、これは一般的には明確に定義されません。

現在の実装では、別々のイテレータを使用して、すべての(ブロードキャストされた)ファンシーインデックス(および割り当て配列)を同時に反復処理します。これらのイテレータはすべてCオーダーを使用します。言い換えると、現在のところ、はい、可能です。より正確に知りたいかもしれませんので。これらのことを処理するNumPyと比較すると、 を使用していることmapping.cがわかります。PyArray_ITER_NEXT文書化されたC オーダーになります。

将来的には、別の方法で図を描くつもりです。新しい反復子を使用して、すべてのインデックスと割り当て配列を一緒に反復処理するのが良いと思います。これを実行すると、反復子が最速の方法を決定するために順序をオープンにしておくことができます。反復子に対してオープンにしておくと、何が起こるかはわかりませんが、例が機能するかどうかはわかりません (おそらく 1 次元の場合はまだ機能しますが...)。

したがって、私の知る限りでは、現在は動作していますが、文書化されていません (私の知る限り)。したがって、実際にこれを保証する必要があると考える場合は、ロビー活動を行う必要があり、保証できることを確認するためのテストをいくつか記述するのが最善です。少なくとも、次のように言いたくなります。「処理が速くなるのであれば、C 順序を保証する必要はありませんが、もちろん、どこかに正当な理由が隠されているかもしれません...」

ここでの本当の質問は、「そもそもなぜそれが欲しいのか?」ということです。

おすすめ記事