2013-01-18 20 views
19

配列をチャンクに分割する場合は、How do you split a list into evenly sized chunks? があります。 Numpyを使っている巨大な配列に対してもっと効率的にこれを行う方法はありますか?NumpyのNチャンクへの並列配列

+0

私はまだ効率的な答えを探しています;)。今私はctypesが唯一の効率的な方法だと思っています。 –

+1

効率を定義します。いくつかのサンプルデータ、あなたの現在の方法、それがどれほど速く、どれくらい速く必要なのかを教えてください。 –

答えて

7

セクションの数でアレイのサイズを適切に分割する必要がない場合は、numpy.splitまたはおそらくnumpy.array_splitを探していると思います。

+0

Prashantに尋ねたのと同じ質問。どのようにして空の配列を取り除くことができますか? –

33

お試しnumpy.array_splitドキュメントから

>>> x = np.arange(8.0) 
>>> np.array_split(x, 3) 
    [array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7.])] 

numpy.splitと同じですが、グループが同じ長さでない場合は例外を発生しません。

チャンク> LEN(配列)の数は、あなたはそれに対処するために、内部にネストされた空白の配列を取得した場合 - あなたの分割配列がaに保存されている場合、あなたは、空の配列を削除することができます。

[x for x in a if x.size > 0] 

だけ保存あなたが望むならば、aに戻る。

+0

どうすれば空リストを削除できますか? –

+0

小さな例がありますか? –

+0

if#chunks> len(array)空の配列が内部にネストされます。 –

13

array_splitsplit, hsplit and vsplitの使用上のちょうどいくつかの例:

n [9]: a = np.random.randint(0,10,[4,4]) 

In [10]: a 
Out[10]: 
array([[2, 2, 7, 1], 
     [5, 0, 3, 1], 
     [2, 9, 8, 8], 
     [5, 7, 7, 6]]) 

array_splitを使用して上のいくつかの例:
あなたは2番目の引数として配列またはリストを与える場合は、基本的にインデックスを与える(前)」へカット '

# split rows into 0|1 2|3 
In [4]: np.array_split(a, [1,3]) 
Out[4]:                              
[array([[2, 2, 7, 1]]),                          
array([[5, 0, 3, 1],                           
     [2, 9, 8, 8]]),                           
array([[5, 7, 7, 6]])] 

# split columns into 0| 1 2 3 
In [5]: np.array_split(a, [1], axis=1)                       
Out[5]:                              
[array([[2],                             
     [5],                             
     [2],                             
     [5]]),                             
array([[2, 7, 1],                            
     [0, 3, 1], 
     [9, 8, 8], 
     [7, 7, 6]])] 

2番目の引数として整数。 等しいチャンクの数を指定します。

In [6]: np.array_split(a, 2, axis=1) 
Out[6]: 
[array([[2, 2], 
     [5, 0], 
     [2, 9], 
     [5, 7]]), 
array([[7, 1], 
     [3, 1], 
     [8, 8], 
     [7, 6]])] 

分割が同じに動作しますが、同等の分割は、あなたがvsplitとhsplitショートカットを使用することができますarray_splitに加えて

ことができない場合は、例外を発生させます。

In [11]: np.vsplit(a, 2) 
Out[11]: 
[array([[2, 2, 7, 1], 
     [5, 0, 3, 1]]), 
array([[2, 9, 8, 8], 
     [5, 7, 7, 6]])] 

In [12]: np.hsplit(a, 2) 
Out[12]: 
[array([[2, 2], 
     [5, 0], 
     [2, 9], 
     [5, 7]]), 
array([[7, 1], 
     [3, 1], 
     [8, 8], 
     [7, 6]])] 
+0

これは私の問題は、チャンク> len(配列)の場合、空のネストされた配列を取得する...あなたはどのようにそれを取り除くのですか? –

+0

良い例です、ありがとうございます。あなたの 'np.array_split(a、[1]、axis = 1)'の例では、最初の配列がすべての要素をネストしないようにする方法を知っていますか? – timgeb

4

ないかなりの答えが、他の(正しい)の回答にコードの素敵なフォーマットと長いコメント:
vsplitとhsplitはかなり自己explanatryです。以下を試してみると、コピーではなく元の配列のビューが表示されていることがわかります。リンクされた質問で受け入れられた回答の場合はそうではありません。起こり得る副作用に注意してください!

>>> x = np.arange(9.0) 
>>> a,b,c = np.split(x, 3) 
>>> a 
array([ 0., 1., 2.]) 
>>> a[1] = 8 
>>> a 
array([ 0., 8., 2.]) 
>>> x 
array([ 0., 8., 2., 3., 4., 5., 6., 7., 8.]) 
>>> def chunks(l, n): 
...  """ Yield successive n-sized chunks from l. 
...  """ 
...  for i in xrange(0, len(l), n): 
...   yield l[i:i+n] 
... 
>>> l = range(9) 
>>> a,b,c = chunks(l, 3) 
>>> a 
[0, 1, 2] 
>>> a[1] = 8 
>>> a 
[0, 8, 2] 
>>> l 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
+0

+1)これは考慮すべき点ですが、特定のmultidimを処理するためにソリューションをさらに拡張することができます。ケース –

+0

はい、私はそれを使用しています。私はnumpyを使ってそれを行うより良い方法が不思議でした。特にマルチダムで:( –

+0

これは大きなデータに関連しています。私は 'numpy.array_split'を使ってデータのコピーを作成していますが、それをあなたのマルチプロセッシングプールに渡すと、 – displayname