2016-03-28 8 views
0

この配列の列の1つでソートできるようにdtypeを設定しようとしています。たとえば、配列に[1 2]という行があるとします。 dtypeを見た後は[(1,1),(2,2)]になります。たとえば、これは実行しようとしているコードです。numpyでdtypeを設定すると、各値がタプルになるようです

print "original shape \n",b.shape 
print 'original \n',b 
typ = [('dist',float),('ys',float)] 
p = np.array(b,dtype=typ) 
print "new shape \n", p.shape 
print "new \n",p 

と、この出力

original shape 
(3, 2) 
original 
[[ 10.29563014 1.  ] 
[ 6.08276253 3.  ] 
[ 18.44670431 7.  ]] 
new shape 
(3, 2) 
new 
[[(10.295630140987, 10.295630140987) (1.0, 1.0)] 
[(6.082762530298219, 6.082762530298219) (3.0, 3.0)] 
[(18.44670431269499, 18.44670431269499) (7.0, 7.0)]] 

技術的には、形状が変更されませんが、私はそれが基本的にタプルの各エントリ自体の複製を作る理由は分からないです。 これを修正する方法はありますか?

+1

は、化合物のDTYPEのドキュメントを再読み込み。構造体配列の表示スタイルに注意してください。 – hpaulj

+0

'astype'は各要素を新しいdtypeに変換しているので動作しません。各行(要素のペア)を新しいdtypeに変換することを期待します。 – hpaulj

答えて

0

:この使用squeezeを克服するために

In [507]: x=np.array([[10.29,1],[6.08,3],[18.44,7]]) 
In [508]: x 
Out[508]: 
array([[ 10.29, 1. ], 
     [ 6.08, 3. ], 
     [ 18.44, 7. ]]) 
In [509]: ind=np.argsort(x[:,0]) 
In [510]: x[ind,:] 
Out[510]: 
array([[ 6.08, 3. ], 
     [ 10.29, 1. ], 
     [ 18.44, 7. ]]) 

sortorderパラメータを利用して、我々は

In [524]: np.sort(x.view('f8,f8'),order=['f0'],axis=0).view('f8') 
Out[524]: 
array([[ 6.08, 3. ], 
     [ 10.29, 1. ], 
     [ 18.44, 7. ]]) 

を行うことができます私は仮定しますこれは後でdtypeを変更しようとしている理由です。タプル付きの表示は、構造化配列(複合dtype)では正常です。

他の回答については、viewは、構造化アレイ2dを作成する。整形またはスクイーズを行うと、余分なディメンションが削除されます。しかし、単純なdtypeへの復帰は、私がそのまま残すとうまくいく。私はこれがより多くの列で動作し、多分もっと多くの次元で動作すると仮定しますが、私はそれをテストしていません。

argsortアプローチが高速です:

In [526]: timeit x[np.argsort(x[:,0]),:] 
100000 loops, best of 3: 13.2 µs per loop 
In [527]: timeit np.sort(x.view('f8,f8'),order=['f0'],axis=0).view('f8') 
10000 loops, best of 3: 68.5 µs per loop 
0

bの各値をtypにキャストするので、各値を複製します。あなたが必要なもの

はあまりにもviewそれら別の方法である:

In [13]: b.view(typ) 
Out[13]: 
array([[(10.29563014, 1.0)], 
     [(6.08276253, 3.0)], 
     [(18.44670431, 7.0)]], 
     dtype=[('dist', '<f8'), ('ys', '<f8')]) 

しかし、その常に2D配列。構造化された配列に頼ることなく

第一列でソート
In [14]: b.view(typ).squeeze() 
Out[14]: 
array([(10.29563014, 1.0), (6.08276253, 3.0), (18.44670431, 7.0)], 
     dtype=[('dist', '<f8'), ('ys', '<f8')]) 
関連する問題