85

これがあります どのようにリストを均等なサイズのチャンクに分割しますか? 配列をチャンクに分割します。Numpyを使用して巨大な配列に対してこれをより効率的に行う方法はありますか?

4

6 に答える 6

128

試してみてください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(array) の場合、内部にネストされた空の配列が得られます。これに対処するために、分割配列が に保存されている場合は、次のa方法で空の配列を削除できます。

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

必要に応じて保存してaください。

于 2013-01-18T19:56:09.883 に答える
24

array_splitsplithsplitおよび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]])]

split同じように機能しますが、均等に分割できない場合は例外が発生します

さらに、array_splitショートカットvsplithsplit.
vsplitそしてhsplit、ほとんど自明です:

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]])]
于 2013-01-18T20:01:21.333 に答える
10

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

于 2013-01-18T19:55:28.777 に答える
9

完全な答えではありませんが、他の(正しい)答えに対するコードの書式設定が適切な長いコメントです。以下を試してみると、取得しているのはコピーではなく元の配列のビューであり、リンクした質問で受け入れられた回答には当てはまらないことがわかります。起こりうる副作用に注意!

>>> 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]
于 2013-01-18T20:43:58.877 に答える