Python 2.7で次の例を考えてみましょう。 2つの1次元numpy配列を返す任意の関数f()
があります。一般に、f()
は異なるサイズの配列を返すことがあり、サイズは入力に依存する可能性があることに注意してください。ジェネレータから2つの連結配列を作成する
f()
にmap
を呼び出し、結果を2つの別々の新しい配列に連結したいとします。
import numpy as np
def f(x):
return np.arange(x),np.ones(x,dtype=int)
inputs = np.arange(1,10)
result = map(f,inputs)
x = np.concatenate([i[0] for i in result])
y = np.concatenate([i[1] for i in result])
これは、意図した結果を示します。しかし、結果が多くのメモリを消費することがあるので、map
の代わりにを呼び出すことによってジェネレータを使用することが望ましい場合があります。
from itertools import imap
result = imap(f,inputs)
x = np.concatenate([i[0] for i in result])
y = np.concatenate([i[1] for i in result])
ジェネレータは、我々はy
を計算する時点で空であるため、これはエラーになります。
ジェネレータを一度しか使用せず、これらの2つの連結配列を作成する方法はありますか?私はforループを持たないソリューションを探しています。なぜなら、配列を繰り返し連結/追加するのはむしろ非効率的だからです。
ありがとうございます。
あなたは '私は[0]' 'と私は[1]'異なる形状を持つことができることを意味していますか? –
@ SergeiLebedev一般的には、はい。私の例では、彼らは同じ形をしています。 – Forzaa
'result'にジェネレータを使用するメリットはありません。あなたは 'np.concatenate'呼び出しの' result'と同じサイズの2つのリストを作ります。したがって、2つのリストを持つことができれば、for-loopで 'result'を繰り返し実行し、同時にリストを更新することができます。 –