2016-07-11 14 views
4

私は形の行列4 x 129を持っています。私は、以下に示す例のように水平分割を行うことをしようとしています:Python:Numpy Matrix split

In [18]: x = np.arange(4*129) 

In [19]: x = x.reshape(4, 129) 

In [20]: x.shape 
Out[20]: (4, 129) 

In [21]: y = np.hsplit(x, 13) 

ValueError: array split does not result in an equal division 

私はそれが13に均等にそれを分割することができないことを理解し、私は13でゼロパッド1つの以上の列と除算を行うにはしたくありません

xマトリックスを13個の小さなマトリックスに分割したい場合は、各12個のスプリットは4 x 10のサイズで、最後のサイズは4 x 9でなければなりません。

このような方法はありますか?

答えて

5

あなたが分割のインデックスを渡すことができ、この場合、あなたは、単にnp.arange()を使用して作成することができます

>>> a = np.hsplit(x, np.arange(12, 129, 12)) 
>>> 
>>> a[0].shape 
(4, 12) 
>>> a[-1].shape 
(4, 9) 
+0

ありがとうございます@kasramvd – Rangooski

2

私は2番目のパラメータとしてint型でnp.hsplit使用してどのように行うのか分からないが、見回しながら、私はパラメータとして配列を使ってそれを行う方法を見つけました。で空の配列の生成を防止するために、アレイの作成中-1を追加:

temp_array = [(i+1)*10 for i in range((129-1)//10)] 
y = np.hsplit(x,temp_array) 

または一列に:

行うための方法、それは次のようになり

y = np.hsplit(x,[(i+1)*10 for i in range((129-1)//10)]) 

編集元の配列のサイズが、必要とするサブ配列のサイズの倍数であるときのxの終わり。

EDIT2:

y = np.hsplit(x,np.arange(10,129,10)) 

EDIT3:temp_arrayを作成するための別の方法は、1行ですべてを置く

temp_array = np.arange(10,129,10) 

あるのpython3(python2を使用してテストしていた)を使用して問題があった見つけました。 int除算の結果はfloatになります。説明:私は0とサイズの間に厳密にしたいサブ配列のサイズの倍数で配列( 'splitting_array')を作成します。元の配列の
次に、私は 'splitting_array'を使って元の配列を分割します。 numpy.splitのドキュメントによると、 'splitting_array'で指定されたインデックスでoriginal_arrayを水平軸に沿って分割します。
この場合、original_arrayは10の倍数のインデックスの前に分割されます。

+0

回答を確認してください。 'TypeError: 'float'オブジェクトを整数として解釈することはできません ' – Rangooski

+0

この問題は、私が基本的な除算を行っていたために、2つの要素がpython2.7のint型であればintを返しますが、float python3で。私の答えにint_divisionで置き換えました。 – HolyDanna

+0

それは素晴らしいHolyDanna :)です。 – Rangooski