2016-03-15 30 views
9

numpyで、結果の配列の寸法は実行時に異なります。 1dの配列と1dの配列の間に混乱が生じることがよくあります。 あるケースでは、列を繰り返し処理できますが、他のケースでは処理できません。Numpy reshape 1列の1次元配列から2次元配列

どのように問題をエレガントに解決していますか?次元をチェックif文、私はこの機能を使用して自分のコードをポイ捨て避けるために :

def reshape_to_vect(ar): 
    if len(ar.shape) == 1: 
     return ar.reshape(ar.shape[0],1) 
    return ar 

しかし、これは洗練と高価な感じ。より良い解決策はありますか?

+0

'dtype'とは何ですか?構造化されたように見える。 – hpaulj

+0

1dまたは2d配列にどうやって終わるかの例として、これを使用しました。私の質問はエレガントに1dを2d配列に体系的に変換する方法です。 – DevShark

答えて

7

あなたは何ができる -

ar.reshape(ar.shape[0],-1) 

reshapeへの第2の入力こと:-1は、第2の軸のための要素の数の世話をします。したがって、2D入力の場合、変更はありません。 1D入力の場合は、要素の総数であるar.shape[0]のため、すべての要素が最初の軸に「プッシュ」された2D配列が作成されます。

In [87]: ar 
Out[87]: array([ 0.80203158, 0.25762844, 0.67039516, 0.31021513, 0.80701097]) 

In [88]: ar.reshape(ar.shape[0],-1) 
Out[88]: 
array([[ 0.80203158], 
     [ 0.25762844], 
     [ 0.67039516], 
     [ 0.31021513], 
     [ 0.80701097]]) 

2Dケース:

サンプルが

1Dケース走る

In [82]: ar 
Out[82]: 
array([[ 0.37684126, 0.16973899, 0.82157815, 0.38958523], 
     [ 0.39728524, 0.03952238, 0.04153052, 0.82009233], 
     [ 0.38748174, 0.51377738, 0.40365096, 0.74823535]]) 

In [83]: ar.reshape(ar.shape[0],-1) 
Out[83]: 
array([[ 0.37684126, 0.16973899, 0.82157815, 0.38958523], 
     [ 0.39728524, 0.03952238, 0.04153052, 0.82009233], 
     [ 0.38748174, 0.51377738, 0.40365096, 0.74823535]]) 
+1

この回答の変形は次のとおりです: 'x = np.reshape(x、(len(x)、 - 1))'、入力が1dまたは2dのリストの場合も扱います。 –

+0

@LucaCitiはこれを別の答えにするので、私はそれを投票することができます。 –

+0

完了。あなたのお勧めをありがとう。 –

0

をあなたの例では、不可解されているため、私は約dtypeを尋ねました。

私は3つの要素(1D)と3つのフィールドを持つ構造化された配列にすることができます:私は名前で一つのフィールドにアクセスすることができます

In [1]: A = np.ones((3,), dtype='i,i,i') 
In [2]: A 
Out[2]: 
array([(1, 1, 1), (1, 1, 1), (1, 1, 1)], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')]) 

In [3]: A['f0'].shape 
Out[3]: (3,) 

(追加ブラケットは、物事を変更しません)私は2つのフィールドにアクセスする場合は、私はまだ1次元配列

In [4]: A[['f0','f1']].shape 
Out[4]: (3,) 
In [5]: A[['f0','f1']] 
Out[5]: 
array([(1, 1), (1, 1), (1, 1)], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 

を取得し、私はトイレ場合は実際にそれらの余分ブラケットは、重要ではありません配列は、単純な2Dのものであれば、私はまだ

In [24]: A=np.ones((3,3),int) 
In [25]: A[0].shape 
Out[25]: (3,) 
In [26]: A[[0]].shape 
Out[26]: (1, 3) 
In [27]: A[[0,1]].shape 
Out[27]: (2, 3) 

しかし、配列に関係なくかどうかの、2Dであることを確認することの質問に対するとしてあなた形状を得ることはありません値

In [22]: A['f0'] 
Out[22]: array([1, 1, 1], dtype=int32) 
In [23]: A[['f0']] 
Out[23]: 
array([(1,), (1,), (1,)], 
     dtype=[('f0', '<i4')]) 

でのkインデックスは、1Dを返すか、2、あなたの関数は、あなたがar.ndim代わりのlen(ar.shape)をテストすることができ、基本的

def reshape_to_vect(ar): 
    if len(ar.shape) == 1: 
     return ar.reshape(ar.shape[0],1) 
    return ar 

okです。しかし、いずれの方法でもコストがかからず、実行時間が最小限に抑えられます。大規模な配列操作はありません。 reshapeはデータをコピーしません(ストライドが奇妙な場合を除きます)。共有データポインタを使用して新しい配列オブジェクトを作成するのは単なるコストです。

np.atleast_2dのコードを見てください。 0dと1dをテストします。 1dの場合はresult = ary[newaxis,:]を返します。余分な軸を最初に追加すると、軸を追加するための位置がより自然なnumpyになります。最後に追加します。

ar.reshape(ar.shape[0],-1)は、ifテストを迂回する巧妙な方法です。小さなタイミングでテストする方が高速ですが、関数呼び出し層の効果であるマイクロ秒について話しています。

np.column_stackは、必要に応じて列配列を作成する別の関数です。これは、使用しています:

if arr.ndim < 2: 
     arr = array(arr, copy=False, subok=True, ndmin=2).T 
+0

いいえ、私は例を削除しました。私は具体的な例を挙げようとしていましたが、混乱している場合は、それを持たないほうがいいです。 – DevShark

0

、最初の場所で再構築する必要性を避けるために、あなたがリストと行/列、または「実行中」のスライスをスライスした場合、あなたは一つの行/列に2次元配列を取得します

あなたが行/列を選択するための、単一の番号を使用している場合、それはあなたの問題の根本的な原因である1次元配列になります代わりに
import numpy as np 
x = np.array(np.random.normal(size=(4,4))) 
print x, '\n' 

Result: 
[[ 0.01360395 1.12130368 0.95429414 0.56827029] 
[-0.66592215 1.04852182 0.20588886 0.37623406] 
[ 0.9440652 0.69157556 0.8252977 -0.53993904] 
[ 0.6437994 0.32704783 0.52523173 0.8320762 ]] 

y = x[:,[0]] 
print y, 'col vector \n' 
Result: 
[[ 0.01360395] 
[-0.66592215] 
[ 0.9440652 ] 
[ 0.6437994 ]] col vector 


y = x[[0],:] 
print y, 'row vector \n' 

Result: 
[[ 0.01360395 1.12130368 0.95429414 0.56827029]] row vector 

# Slice with "running" index on a column 
y = x[:,0:1] 
print y, '\n' 

Result: 
[[ 0.01360395] 
[-0.66592215] 
[ 0.9440652 ] 
[ 0.6437994 ]] 

y = x[:,0] 
print y, '\n' 

Result: 
[ 0.01360395 -0.66592215 0.9440652 0.6437994 ] 
4

最も簡単な方法:

ar.reshape(-1, 1) 
2

divakarの回答の変形は:x = np.reshape(x, (len(x),-1))です。これは、入力が1dまたは2dのリストである場合も扱います。

関連する問題