2017-04-10 12 views
3

私は、長さ40のnumpy.arrayをより小さい等しいサイズのnumpy.arrayに分割しようとしています。この場合、より小さな配列の数がユーザーによって与えられます。小さな配列の重複のいくつかの形が与えられた分割によって分割されるだけの状況が発生する可能性があるので、小さな配列間でいくらかの重なりを持つことが許されます。配列を同じサイズのウィンドウに分割する

私は配列np.array([range(40)]) を持っていたし、私は37個のサブアレイに分割しなければならないとしたら、サブアレイのリストは、次のようにする必要があります:

[1, 2, 3], [3, 4, 5], [5, 6, 7], ... [38, 39, 40] 

私はnumpy.splitを使用してみましたが、長さがある場合にのみ動作しますサイズで割り切れます。numpy.array_splitは、サイズが不均一です。

numpy.split

>> import numpy as np 
>>> a = np.random.randint(6,size=(40)) 
>>> b = np.split(a,37) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/numpy/lib/shape_base.py", line 508, in split 
    'array split does not result in an equal division') 
ValueError: array split does not result in an equal division 

を使用してnumpy.array_split

>>> a = np.random.randint(5,size=(40)) 
>>> b = np.array_split(a,37) 
>>> print len(b) 
37 
>>> print b[0].shape 
(2,) 
>>> print b[3].shape 
(1,) 
>>> print b[5].shape 
(1,) 
>>> print b[6].shape 
(1,) 
>>> print b[30].shape 
(1,) 
>>> 

numpy.array_splitと同じようにそれらを分裂しません。

+1

それどころか、それらの機能はまったくあなたの言うこととまったく同じです。あなたが得る出力とあなたが望む出力を私たちに教えてください。 –

+0

に 'numpy.split'の例が追加されました – Somthin

+1

' array_split'のドキュメントでは、不均一な分割を処理すると書かれています。 'split'はエラーを投げるように設計されています。 –

答えて

2

あなたが説明していることは、分割ではなく(スライディング)ウィンドウと呼ばれます。

この回答を参照してください:あなたが欲しいhttps://stackoverflow.com/a/15722507/7802200

len(a) - n_splits + 1widthでも開発window_stack機能を使用することです。

+0

ああ。それは理にかなって..スライディングウィンドウ..私はちょうど私がストライドを決定することができる方法が必要です..サブアレイの数と一致するように私は – Somthin

+0

私は私の答えの最後の部分に対処すると思う。あなたの質問では、37のサブグループを持つ40の配列に3の幅を与えるべきですが、実際には4にする必要があります。これは 'len(a)-n_groups + 1'です。 –

0

numpy.split()は、関数の2番目の入力であるパラメータindices_or_sectionsで指定されたサイズとまったく同じサイズのサブ配列を生成する必要があります。 分割機能をどのように試しましたか? あなたはサイズ5の4個のサブアレイに配列arrを分割したい場合は、あなたの例が失敗した理由は、配列のサイズが希望のアレイの数で割り切れなければならないということである

numpy.split(arr,4) 

を使用しています。サブアレイの数で割った要素数を整数とすると、等しいサイズにしか分割できないため、意味があります。

質問を明確にしたので、私は単純な解決策はないと思います。配列を等しい大きさのグループに分割するのは簡単ですが、ユーザーが同じセットの40個の等しいサイズのグループをオーバーラップが許可されている場合は、これを行う方法は複数あります。あなたを助ける方法。あなたが探しているタスクのための簡単なnumpy関数はありません、あなたは37(または何が要求されている)等しいサイズのグループにセットを分割する方法を見つけるために検索アルゴリズム(DFS?)が必要になります。

+0

私は配列のサイズを指定したくありません。私はそれが私が望むサブ配列の数を提供したいだけです。 – Somthin

+0

分裂可能でないことについて。重複は許されます。だからそれは分割可能でなければならない。 – Somthin

+0

配列のサイズを指定する必要があるとは言いませんでした。そして、ここでオーバーラップについての部分を見て、このための検索アルゴリズムが必要だと思います。 –

関連する問題