ジェネレーター オブジェクトから NumPy 配列を構築するにはどうすればよいですか?
問題を例証してみましょう:
>>> import numpy
>>> def gimme():
... for x in xrange(10):
... yield x
...
>>> gimme()
<generator object at 0x28a1758>
>>> list(gimme())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numpy.array(xrange(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.array(gimme())
array(<generator object at 0x28a1758>, dtype=object)
>>> numpy.array(list(gimme()))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
この例では、gimme()
は出力を配列に変換したいジェネレータです。ただし、配列コンストラクタはジェネレータを反復処理せず、ジェネレータ自体を単に格納します。私が望む動作は から ですnumpy.array(list(gimme()))
が、中間リストと最終配列を同時にメモリに保持することでメモリのオーバーヘッドを負担したくありません。よりスペース効率の良い方法はありますか?
ベストアンサー1
この StackOverflow の結果の背後に Google があることがわかりましたnumpy.fromiter(data, dtype, count)
。デフォルトでは、count=-1
反復可能オブジェクトからすべての要素を取得します。明示的に を設定する必要がありますdtype
。私の場合は、これが機能しました:
numpy.fromiter(something.generate(from_this_input), float)