これがあります どのようにリストを均等なサイズのチャンクに分割しますか? 配列をチャンクに分割します。Numpyを使用して巨大な配列に対してこれをより効率的に行う方法はありますか?
6 に答える
試してみてください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
ください。
array_split
、split
、hsplit
および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
ショートカットvsplit
とhsplit
.
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]])]
セクションの数が配列のサイズを適切に分割する必要がない場合、numpy.split
またはおそらく探していると思います。numpy.array_split
完全な答えではありませんが、他の(正しい)答えに対するコードの書式設定が適切な長いコメントです。以下を試してみると、取得しているのはコピーではなく元の配列のビューであり、リンクした質問で受け入れられた回答には当てはまらないことがわかります。起こりうる副作用に注意!
>>> 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]