1. ホーム
  2. python

[解決済み] numpy配列のリストを単一のnumpy配列に変換する方法は?

2022-04-26 21:46:12

質問

仮に、私が;

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では本当に遅いです。

最も効率的な方法は何でしょうか?

解決方法は?

一般に、配列の連続は、どの軸にも沿って連結することができます。

numpy.concatenate( LIST, axis=0 )

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

Jorgeさんの回答で指摘されているように、関数 stack numpy 1.10で導入されました。

numpy.stack( LIST, axis=0 )

これは補完的なアプローチで、各入力配列の新しいビューを作成し、余分な次元(この場合は左側)を追加します。 n -要素からなる1次元配列は、1×1=1,000,000の配列になります。 n 2次元配列)を連結する。これは、入力配列がすべて同じ形状である場合(連結の軸に沿った形状である場合)にのみ機能します。

vstack (または同等に row_stack なぜなら、1次元および/または2次元の配列のシーケンスを受け取り、必要なところだけ自動的に次元を拡張してから、リスト全体を連結するからです。新しい次元が必要な場合は、左側に追加されます。この場合も、繰り返し処理をすることなく、リスト全体を一度に連結することができます。

numpy.vstack( LIST )

この柔軟な動作は、構文上のショートカットである numpy.r_[ array1, ...., arrayN ] (角括弧に注意)。 この構文は、明示的に名前を指定した配列をいくつか連結するのには適していますが、今回のような状況には適していません。 LIST .

また、類似の関数として column_stack とショートカット c_[...] また,水平方向(列方向)に積み重ねるための ほとんど -類似の機能 hstack -しかし,後者の方が柔軟性に欠けます(入力配列の次元数についてより厳しく,1次元配列を列として扱うのではなく,端から端まで連結しようとします).

最後に、1次元配列の垂直方向の積み重ねという特殊なケースでは、以下の方法も有効である。

numpy.array( LIST )

...なぜなら、配列は他の配列のシーケンスから構築することができ、最初に新しい次元を追加することができるからです。