web-dev-qa-db-ja.com

numpy配列のリストを単一のnumpy配列に変換するにはどうすればよいですか?

私が持っていると仮定します。

LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays

私は変換しようとします。

array([[1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5])

私は今vstackで繰り返して解決していますが、特に大きなLISTの場合は本当に遅いです

最も効率的な方法のために何を提案しますか?

57
erogol

一般に、任意の軸に沿って配列のシーケンス全体を連結できます。

numpy.concatenate( LIST, axis=0 )

しかし、doリスト内の各配列の形状と次元について心配する必要があります(2次元の3x5出力の場合、すべてが2次元のn行5列の配列であることを確認する必要があります既に)。 1次元配列を2次元出力の行として連結する場合は、それらの次元を拡張する必要があります。

Jorgeの答えが指摘するように、numpy 1.10で導入された関数stackもあります。

numpy.stack( LIST, axis=0 )

これは補完的なアプローチを取ります:連結する前に、各入力配列の新しいビューを作成し、追加の次元(この場合は左側に追加するため、各n- element 1D配列は1行n 2D配列になります)。すべての入力配列の形状が連結軸に沿っていても同じ場合にのみ機能します。

vstack(または同等のrow_stack)は、1次元および/または2次元の配列のシーケンスを取り、必要な場合にのみ、必要な場合にのみ自動的に次元を拡張するため、使いやすいソリューションです。リスト全体を一緒に。新しいディメンションが必要な場合は、左側に追加されます。繰り返しますが、反復する必要なしにリスト全体を一度に連結できます。

numpy.vstack( LIST )

この柔軟な動作は、構文ショートカットnumpy.r_[ array1, ...., arrayN ](角括弧に注意)によっても示されます。これは、いくつかの明示的に名前が付けられた配列を連結するのには適していますが、この構文はLISTのような配列のシーケンスを受け入れないため、状況には適していません。

また、同様の関数column_stackとショートカットc_[...]があり、水平(列方向)スタッキングに加えて、almost-analogous function hstack—何らかの理由で後者は柔軟性が低くなります(入力配列の次元についてより厳密であり、1次元配列を列として扱うのではなく、端から端まで連結しようとします)。

最後に、1次元配列の垂直スタッキングの特定のケースでは、以下も機能します。

numpy.array( LIST )

...配列は他の配列のシーケンスから構築できるため、新しい次元が先頭に追加されます。

83
jez

NumPyバージョン1.10以降では、メソッド stack があります。任意の次元(すべて等しい)の配列をスタックできます。

# List of arrays.
L = [np.random.randn(5,4,2,5,1,2) for i in range(10)]

# Stack them using axis=0.
M = np.stack(L)
M.shape # == (10,5,4,2,5,1,2)
np.all(M == L) # == True

M = np.stack(L, axis=1)
M.shape # == (5,10,4,2,5,1,2)
np.all(M == L) # == False (Don't Panic)

# This are all true    
np.all(M[:,0,:] == L[0]) # == True
all(np.all(M[:,i,:] == L[i]) for i in range(10)) # == True

楽しい、

3