アプリケーションの高速化に使用できるように、 nditerを学習しようとしています。ここでは、サイズ 20 の配列を取り、それを 5x4 の配列に変形する面白い変形プログラムを作成しようとしています。
myArray = np.arange(20)
def fi_by_fo_100(array):
offset = np.array([0, 4, 8, 12, 16])
it = np.nditer([offset, None],
flags=['reduce_ok'],
op_flags=[['readonly'],
['readwrite','allocate']],
op_axes=[None, [0,1,-1]],
itershape=(-1, 4, offset.size))
while not it.finished:
indices = np.arange(it[0],(it[0]+4), dtype=int)
info = array.take(indices)
'''Just for fun, we'll perform an operation on data.\
Let's shift it to 100'''
info = info + 81
it.operands[1][...]=info
it.iternext()
return it.operands[1]
test = fi_by_fo_100(myArray)
>>> test
array([[ 97, 98, 99, 100]])
明らかに、プログラムは各結果を 1 つの行に上書きしています。だから私は nditer のインデックス作成機能を使用しようとしましたが、まだサイコロはありません。
flags=['reduce_ok','c_iter']
--> it.operands[1][it.index][...]=info
=
IndexError: index out of bounds
flags=['reduce_ok','c_iter']
--> it.operands[1][it.iterindex][...]=info
=
IndexError: index out of bounds
flags=['reduce_ok','multi_iter']
--> it.operands[1][it.multi_index][...]=info
=
IndexError: index out of bounds
it[0][it.multi_index[1]][...]=info
=
IndexError: 0-d arrays can't be indexed
...等々。私は何が欠けていますか?前もって感謝します。
ボーナス質問
たまたまnditer に関するこの素敵な記事に出くわしました。私は Numpy に慣れていないかもしれませんが、Numpy の速度ベンチマークがこれほど遅れているのを見たのはこれが初めてです。人々が数値的な速度と能力のために Numpy を選ぶのは私の理解ですが、反復はその一部ですよね? それがとても遅い場合、nditerのポイントは何ですか?