これは物事をよりよく理解するためです。私が修正する必要があるのは実際の問題ではありません。cstringIO
オブジェクトは、文字列、ファイル、および行の反復子をエミュレートすることになっています。バッファもエミュレートしますか? いずれにせよ、理想的には、次のようにnumpy配列を構築できるはずです
import numpy as np
import cstringIO
c = cStringIO.StringIO('\x01\x00\x00\x00\x01\x00\x00\x00')
#Trying the iterartor abstraction
b = np.fromiter(c,int)
# The above fails with: ValueError: setting an array element with a sequence.
#Trying the file abstraction
b = np.fromfile(c,int)
# The above fails with: IOError: first argument must be an open file
#Trying the sequence abstraction
b = np.array(c, int)
# The above fails with: TypeError: long() argument must be a string or a number
#Trying the string abstraction
b = np.fromstring(c)
#The above fails with: TypeError: argument 1 must be string or read-only buffer
b = np.fromstring(c.getvalue(), int) # does work
私の質問は、なぜこのように振る舞うかということです。
これが発生した実際の問題は次のとおりです。タプルを生成するイテレータがあります。タプルのコンポーネントの1つから、コピーと複製をできるだけ少なくしてnumpy配列を作成することに興味があります。私の最初のカットは、生成されたタプルの興味深いコンポーネントを StringIO オブジェクトに書き込み続け、そのメモリ バッファーを配列に使用することでした。もちろん使用できますgetvalue()
が、コピーを作成して返します。余分なコピーを避ける良い方法は何でしょうか。