2016-07-02 3 views
0

3つのnumpy.ndarrayベクトル、X、Y、および強度があります。私はnumpyの配列でそれを混ぜて、3番目の列(または最初の列)でソートしたいと思います。 ValueError:軸(= 2)境界のうちその後、私はエラーを持っ3つのベクトルをnumpyの配列で混合し、ソートします。

m=np.column_stack((X,Y)) 
m=np.column_stack((m,intensity)) 
m=np.sort(m,axis=2) 

:私は、次のコードを試してみました。

私はMを印刷するとき、私が取得:

array([[ 109430, 285103,  121], 
    [ 134497, 284907,  134], 
    [ 160038, 285321,  132], 
    ..., 
    [12374406, 2742429,  148], 
    [12371858, 2741994,  148], 
    [12372221, 2742017,  161]]) 

は、私はそれを修正するにはどうすればよいです。つまり、ソートされた配列を取得しますか?

+0

あなたが何であるか、自分自身に考えました軸= 2? )0 =行1 =列( 'r'oman' c'atholic - 'R'ow' C'olumnと考える) – Merlin

答えて

0

は、列インデックスを参照するのではなく、配列の次元を参照します。つまり、numpyはデータ内の3番目のディメンションを検索し、3番目のディメンションで最小から最大までソートします。最初の次元(axis = 0)で最小値から最大値にソートすると、すべての行の値が最小値から最大値になります。 2番目の次元(axis = 1)で最小値から最大値にソートすると、すべての列の値が最小値から最大値になります。以下にその例を示します。

さらに、ソートはベース配列によって異なるように動作します。 2つの配列が考えられます。非構造化と構造化。列のいずれかに連結されないfieldsが存在しないので、非構造化

X = np.nrandn(10) 
X = np.nrandn(10) 
intensity = np.nrandn(10) 
m=np.column_stack((X,Y)) 
m=np.column_stack((m,intensity)) 

mが構造化されていない配列として扱われている

。つまり、mnp.sort()を呼び出すと、axis=0の場合は、小さい順に並べ替えられます。axis=1の場合は、左から右に並べ替えられます。行は保持されません。

Original

[[ 1.20122251 1.41451461 -1.66427245] 
[ 1.3657312 -0.2318793 -0.23870104] 
[-0.30280613 0.79123814 -1.64082042]] 
Axis=1

[[-1.66427245 1.20122251 1.41451461] 
[-0.23870104 -0.2318793 1.3657312 ] 
[-1.64082042 -0.30280613 0.79123814]] 

Axis = 0

[[-0.30280613 -0.2318793 -1.66427245] 
[ 1.20122251 0.79123814 -1.64082042] 
[ 1.3657312 1.41451461 -0.23870104]] 

構造

ご覧のとおり、行内のデータ構造は保持されません。行順を保持したい場合は、をdatatypesに追加し、これで配列を作成する必要があります。 order = label_nameで他の列で並べ替えることができます。

dtype = [("a",float),("b",float),("c",float)] 
m = [tuple(x) for x in m] 
labelled_arr = np.array(m,dtype) 
print np.sort(labelled_arr,order="a") 

これは、取得します。これを行うための

[(-0.30280612629541204, 0.7912381363389004, -1.640820419927318) 
(1.2012225144719493, 1.4145146097431947, -1.6642724545574712) 
(1.3657312047892836, -0.23187929505306418, -0.2387010374198555)] 

別のより便利な方法は、自動的に0からn-1に列名を作成pandasデータフレームにデータを渡すことになります。次にsort_valuesメソッドを呼び出して、numpyのように上から下にソートする場合は、希望の列インデックスを渡してaxis=0に従ってください。

例:

pd.DataFrame(m).sort_values(0,axis = 0) 

出力:

  0   1   2 
2 -0.302806 0.791238 -1.640820 
0 1.201223 1.414515 -1.664272 
1 1.365731 -0.231879 -0.238701 
+0

Yamspinner、tks。私はあなたのヒントが間違っていると思う:それはない:pd.DataFrame(m).sort_values(0、axis = 0)、pd.DataFrame(m).sort(0、axis = 0) –

+0

問題はありません。 'sort_values'は実際には廃止された' sort'の新しいバージョンです。 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort.htmlで確認できます。 – Yarnspinner

0

あなたは2のインデックスとの軸を持っていないので、あなたはそのエラーを取得しています。軸はゼロインデックス付けされています。いずれにしても、np.sortは、列ごとに、または行ごとにを並べ替えます。 docsから考えてみましょう:

order : str or list of str, optional When a is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.

例えば:

だから、
In [28]: a 
Out[28]: 
array([[0, 0, 1], 
     [1, 2, 3], 
     [3, 1, 8]]) 

In [29]: np.sort(a, axis = 0) 
Out[29]: 
array([[0, 0, 1], 
     [1, 1, 3], 
     [3, 2, 8]]) 

In [30]: np.sort(a, axis = 1) 
Out[30]: 
array([[0, 0, 1], 
     [1, 2, 3], 
     [1, 3, 8]]) 

、私はあなたが本当にしたいことは、この小ぎれいなイディオムだと思う:

In [32]: a[a[:,2].argsort()] 
Out[32]: 
array([[0, 0, 1], 
     [1, 2, 3], 
     [3, 1, 8]]) 
関連する問題