Python の numpy ライブラリによる派手なインデックス作成の「ベクトル化」は、予期しない結果をもたらすことがあります。例えば:
import numpy
a = numpy.zeros((1000,4), dtype='uint32')
b = numpy.zeros((1000,4), dtype='uint32')
i = numpy.random.random_integers(0,999,1000)
j = numpy.random.random_integers(0,3,1000)
a[i,j] += 1
for k in xrange(1000):
b[i[k],j[k]] += 1
配列 'a' と 'b' で異なる結果を返します (つまり、タプル (i,j) の出現は、繰り返しに関係なく 'a' では 1 として表示されますが、繰り返しは 'b' でカウントされます)。これは次のように簡単に確認できます。
numpy.sum(a)
883
numpy.sum(b)
1000
また、派手なインデックス作成バージョンは、for ループよりもほぼ 2 桁高速であることも注目に値します。私の質問は次のとおりです。