2016-06-20 25 views
2

さんが言ってみましょう私は、次のしているnumpyの配列:不均一numpy配列のリストを格納するには?

import numpy as np 
a = np.array([1, 2]) 
b = np.array([1]) 
c = np.array([1, 4, 8, 10]) 

どのように私はエラーなしnp.vstack((a, b, c))ような何かを行うことができますか?私は純粋なpythonの方法があることを知っていますl = [a, b, c]しかしそれは十分に効率的ではありません。私はそれをnumpyメソッドで実装したいと思います。あなたは何か考えていますか?前もって感謝します!

+1

リストメソッドが十分に効率的でないことをどのように知っていますか? – cxrodgers

+0

パンダのデータフレームはいかがですか? –

+0

どのような意味でリストは効率的ではないでしょうか。記憶?いくつかの配列間の計算?オブジェクトのdtype配列はそれらを保存できますが、リストと基本的に同じ制限があります。 'np.array([a、b、c])'を見てください – hpaulj

答えて

1
In [863]: a = np.array([1, 2]) 
In [864]: b = np.array([1]) 
In [865]: c = np.array([1, 4, 8, 10]) 

これら3列のリスト:このリストから作ら

In [866]: ll=[a,b,c] 

オブジェクトDTYPE配列:

In [867]: A=np.array(ll) 

In [868]: A 
Out[868]: array([array([1, 2]), array([1]), array([ 1, 4, 8, 10])], dtype=object) 

Aに、ll他の場所のメモリ内のデータ・オブジェクトへのポインタを含むように。メモリ使用量に関しても同様に効率的です。

In [870]: id(A[1]),id(b) 
Out[870]: (3032501768, 3032501768) 

あなたが例えば付加は1が

In [871]: A+3 
Out[871]: array([array([4, 5]), array([4]), array([ 4, 7, 11, 13])], dtype=object) 

を期待するかもしれないとして動作しますが、例えば、無速度の利点に少しあります、Aの要素に数学、限られた数の操作を行うことができます

In [876]: timeit [x+3 for x in ll] 
100000 loops, best of 3: 9.52 µs per loop 

In [877]: timeit A+3 
100000 loops, best of 3: 14.6 µs per loop 

などnp.maxのようなものは動作しません。あなたはこのケースをケースごとにテストする必要があります。

詳細:Maintaining numpy subclass inside a container after applying ufuncおよびその他のオブジェクト配列の質問。

0

numpyの速度を得るには、ベクトルを配列に取り込む必要があります。 2Dアレイまたは1Dアレイのいずれかが機能する可能性があります。すべての値を保持するのに十分な大きさの0の配列を作ることができます。次に、その配列にベクトルを配置します。または、大きな1次元配列を作成し、ベクトルの端と端を連結することもできます。

import numpy as np 
a = np.array([1, 2]) 
b = np.array([1]) 
c = np.array([1, 4, 8, 10]) 

# Imbed the vectors in a 2D array 
A = np.zeros((3, max(a.size, b.size, c.size))) 
A[0, :a.size] = a 
A[1, :b.size] = b 
A[2, :c.size] = c 

# 1D array imbedding 
B = np.zeros(a.size + b.size + c.size) 
B[:a.size] = a 
B[a.size:(a.size+b.size)] = b 
B[(a.size+b.size):] = c 

%timeit A+3 

1000000 loops, best of 3: 780 ns per loop 

%timeit B+3 

1000000 loops, best of 3: 764 ns per loop 

これはnumpyの速度の利点があります。しかし、より多くのコーディング作業が必要になり、配列の値を解釈するのが簡単ではありません。

また、1Dまたは2Dソリューションが優れているかどうかを判断するには、アレイの使い方を考えるのが理にかなっています。例えば、値がフーリエ級数の係数である場合、2Dアレイがおそらくより良好であろう。 2D配列を使用すると、ベクトルの特定の要素を整列させることができます。

しかし、ベクトルを連結して単一の1D配列にするのがより理にかなっているアプリケーションも想像することができます。私はこれが助けになることを望みます。

関連する問題