2016-03-27 24 views
4

私はnumpyベクトル(1-D配列)またはスカラー(すなわち、単に数字)のリストを持っています。すべてのベクトルは同じ長さですが、私はそれが何であるか分かりません。私はvstackスカラーが各位置にスカラーを持つベクトルとして扱われるように1つの行列(2-D配列)を作成するためのすべての要素にする必要があります。配列とスカラーをnumpyで積み重ねる方法は?

ケース1:

>>> np.vstack([np.array([1, 2, 3]), np.array([3, 2, 1])]) 
array([[1, 2, 3], 
     [3, 2, 1]]) 

ケース2:

>>> np.vstack([1, 2]) 
array([[1], 
     [2]]) 

ケース3:

>>> np.vstack([np.array([1, 2, 3]), 0, np.array([3, 2, 1])]) 
np.array([[1, 2, 3], 
      [0, 0, 0], 
      [3, 2, 1]]) 

ケース1と2の作業アウト

例は、最高の説明です-of-the-box。しかし、ケース3では、vstackがすべての要素を同じ長さの配列にする必要がないため、

これを実現する良い方法がありますか?

答えて

7

あなたはcreate broadcast object可能性があり、その上np.column_stackを呼び出します。その後、

In [158]: np.broadcast_arrays([1, 2, 3], [3, 2, 1], 0) 
Out[158]: [array([1, 2, 3]), array([3, 2, 1]), array([0, 0, 0])] 

vstackまたはrow_stackを呼び出します。また

In [175]: np.column_stack(np.broadcast([1, 2, 3], 0, [3, 2, 1])) 
Out[175]: 
array([[1, 2, 3], 
     [0, 0, 0], 
     [3, 2, 1]]) 

、あなたはliterally broadcastにアイテムへの互換性型の配列をnumpyのを求めることができますその上に:

In [176]: np.row_stack(np.broadcast_arrays([1, 2, 3], 0, [3, 2, 1])) 
Out[176]: 
array([[1, 2, 3], 
     [0, 0, 0], 
     [3, 2, 1]]) 

ブロードキャストされたサブアレイ を実際にインスタンス化する必要がないため、これらの2つのオプション(np.broadcastまたはnp.broadcast_arraysを使用)のうち、 np.broadcastが高速です。

しかし、np.broadcastの1つの制限は、最大で32個の 引数を受け入れることができるということです。その場合は、np.broadcast_arraysを使用してください。

+0

はい、それは私が探しているものです。ちょっとした質問(ちょっと好奇心から):最初のケース( '' broadcast'')では、なぜ '' column_stack''が要素を列の代わりに列に入れたのですか?スカラがなく、 '' broadcast''を省略すると、ベクトルは行ではなく列になります。それは結果を転置する "放送"のようなものです。 – zegkljan

+1

@zegkljan: 'np.broadcast'はイテレータを返します。そのイテレータは、元の配列(またはスカラー)のそれぞれからの 値からなるタプルを返します。これらの値は、要素ごとの操作のためにまとめて です。 'list(np.broadcast(np.arange(24).reshape(2,3,4)、np.arange(3 * 4).reshape(3,4)))'が返すものを見てください。 2タプルの24要素リストです。 'np.broadcast_arrays'のようにブロードキャストされた個々の配列は表示されません。それは要素ごとのペアリングを示しています。 'np.broadcast'によって返されるイテレータの性質を考えると、所望の配列を形成するためには' np.column_stack'が必要です。 – unutbu

+0

'np.array(list(np.broadcast(....))'は 'np.vstack(np.broadcast(...))'より高速です。 .atleast_2d'。 – hpaulj

1

ここでの問題は、読み取り可能なPythonの世界と効率的なnumpyの世界とのギャップを埋めることです。

実験的には、このタスクでは、Pythonは逆説的にそのnumpyよりも優れていることがよくあります。 l=[ randint(10) if n%2 else randint(0,10,100) for n in range(32)]

In [11]: %timeit array([x if type(x) is ndarray else [x]*100 for x in l]) 
1000 loops, best of 3: 655 µs per loop 

In [12]: %timeit column_stack(broadcast(*l)) 
100 loops, best of 3: 3.77 ms per loop 

さらにブロードキャストは32要素に制限されています。

0

ライナーは1つではありませんが、空の配列にスカラーを記入することはできます。

>>> a = np.empty(4, dtype=int) 
>>> a.fill(2) 
>>> print(a) 
[2 2 2 2] 
関連する問題