-tuplesN
のジェネレーターから個別の配列を構築する方法を次に示します。N
import numpy as np
import itertools as IT
def gendata():
# You, of course, have a different gendata...
N = 100
for i in xrange(N):
yield (np.random.random(), str(i))
def fromiter(iterable, dtype, chunksize=7):
chunk = np.fromiter(IT.islice(iterable, chunksize), dtype=dtype)
result = [chunk[name].copy() for name in chunk.dtype.names]
size = len(chunk)
while True:
chunk = np.fromiter(IT.islice(iterable, chunksize), dtype=dtype)
N = len(chunk)
if N == 0:
break
newsize = size + N
for arr, name in zip(result, chunk.dtype.names):
col = chunk[name]
arr.resize(newsize, refcheck=0)
arr[size:] = col
size = newsize
return result
x, y = fromiter(gendata(), '<f8,|S20')
order = np.argsort(x)
x = x[order]
y = y[order]
# Some pseudo-random value in x
N = 10
val = x[N]
print(x[N], y[N])
# (0.049875262239617246, '46')
idx = x.searchsorted(val)
print(x[idx], y[idx])
# (0.049875262239617246, '46')
上記のfromiter
関数は、 iterable を ( size のchunksize
) チャンクで読み取ります。NumPy 配列メソッドresize
を呼び出して、結果の配列を必要に応じて拡張します。
chunksize
小さなデータでこのコードをテストしていたので、小さなデフォルトを使用しました。もちろん、デフォルトのチャンクサイズを変更するかchunksize
、より大きな値のパラメーターを渡す必要があります。