2017-11-18 5 views
1

このスレッドから、リスト内包からタプルへの複数の戻り値をアンパックする方法がわかります。numpy配列への複数の戻り関数のためのpythonリストの理解

def f(x): 
    return 2*x, x*x 

x = range(1, 4) 
xlist, ylist = zip(*[f(value) for value in x]) 

これをnumpy配列に直接行う方法はありますか?またはこれを使用する唯一の解決策は次のとおりです。

xlist = np.asarray(xlist) 

答えて

1

xlist,ylist = np.fromiter(
     itertools.chain.from_iterable(f(value) for value in x), 
     dtype=np.int_, 
     count=len(x)*2 
    ).reshape((-1,2)).T 

または

xlist,ylist = np.array([f(value) for value in x]).T 

しかし、他の回答で提案されているように、配列に直接取り組むアプローチは、より読みやすくなり、高速化する可能性もあります。

+0

最初のソリューションはなぜ2倍の速さですか? – Peterhack

+0

@Peterhackちょうど確かに、私が提案した他のソリューションよりも速いのですか?おそらくそれは中間リストを作成しないため、出力配列は 'count'引数を使用して事前に割り当てられ、ジェネレータからの値を使用して直接入力されます(最初の解決策にはリスト理解は含まれません。ジェネレータ式)。 – lukas

2

numpy.arrayでこれを行うには、単に配列自体として引数を渡します。関数の動作は、配列引数にマッピング取得し、2つの配列の組が返される:

>>> xlist, ylist = f(np.asarray(x)) 
>>> xlist 
array([2, 4, 6]) 
>>> ylist 
array([1, 4, 9]) 
+0

私はこれを認識していますが、これは基本的な例ではありませんでした。だから私はまだそのような解決策に興味があります。例えば。最後の結果を次の反復の入力にしたい場合はどうなりますか? のt + = I y.append(T):のような:J、I列挙内の(x)のための 'インポートNP X = np.arange(10、14)のようにnumpyの Y = [] T = 0 ' – Peterhack

+0

@Peterhack、あなたは間違った質問をしました。 –

+0

それは私がそれを求めなかった理由です。関数が配列を処理できるかどうかにかかわらず、これがどのように機能するかを知りたいだけでした。それを明確にしないと申し訳ありません。 – Peterhack

1

zipまたはリスト内包の必要はありません。また、あなたのf機能を変更する必要はありません。

>>> import numpy as np 
>>> x = np.arange(1, 4) 
>>> array1, array2 = f(x) 
>>> array1 
array([2, 4, 6]) 
>>> array2 
array([1, 4, 9]) 

xが配列、2 * xxの各要素は2で乗算されることを意味している場合:

あなたが使用すること
>>> 2 * x 
array([2, 4, 6]) 
+0

配列を扱うことができない関数の間に何かがあると仮定すると、リストの理解は得られる方法でしょうか?だから私はそれを鋭く探していたのです。 – Peterhack

関連する問題