2016-03-28 60 views
0

我想設置一個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

重讀化合物D型文檔。注意結構數組的顯示風格。 – hpaulj

+0

'astype'不起作用,因爲它將每個元素轉換爲新的dtype。您期望它將每行(元素對)轉換爲新的dtype。 – hpaulj

回答

0

由第一列排序,而不訴諸結構數組:

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')]) 

但它始終是一個二維數組。克服這種使用squeeze

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')]) 
相關問題