2012-09-11 101 views
0

我嘗試瞭解如何設置數組的dtypes。我最初的numpy數組尺寸是(583760,7),即583760行和7列。我正在設置dtype如下爲什麼在numpy數組上設置dtype會更改尺寸?

>>> allRics.shape 
(583760, 7) 
>>> allRics.dtype = [('idx', np.float), ('opened', np.float), ('time', np.float),('trdp1',np.float),('trdp0',np.float),('dt',np.float),('value',np.float)] 
>>> allRics.shape 
(583760, 1) 

爲什麼數組的原始形狀有變化?什麼導致了這種變化?我基本上試圖排列time列原始numpy數組,這就是爲什麼我設置dtype。但是在尺寸改變之後,我無法對數組進行排序

>>> x=np.sort(allRics,order='time') 

上述命令的輸出沒有變化。你能諮詢一下嗎?

+0

你期望看到什麼發生而不是那個? – DarenW

+1

尺寸應該保持相同'(583760,7)',最後我應該可以使用'order ='time''列進行排序。 – Alok

回答

3

您正在將您的陣列轉換爲structured array。基本上,而不是二維數組,它現在被視爲一維結構數組。看看下面一個簡單的例子:

>>> import numpy as np 
>>> arr = np.array([(1,2,3),(3,4,5)]) 
>>> arr 
array([[1, 2, 3], 
     [3, 4, 5]]) 
>>> arr.shape 
(2, 3) 
>>> arr.dtype=[('a',int),('b',int),('c', int)] 
>>> arr # Notice that tuples inside the elements 
array([[(1, 2, 3)], 
     [(3, 4, 5)]], 
     dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')]) 
>>> arr.shape 
(2, 1) 

的結構數組排序不是最assurdly一個bug。它看起來像一個解決它所以實際上聲明數組結構陣列開始:

>>> arr_s = np.sort(arr, order='b') 
>>> arr_s 
array([[(1, 2, 3)], 
     [(3, 4, 5)]], 
     dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')]) 
>>> dtype=[('a',np.int64),('b',np.int64),('c', np.int64)] 
>>> arr = np.array([(5,2,3),(3,4,1)], dtype=dtype) 
>>> arr 
array([(5, 2, 3), (3, 4, 1)], 
     dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')]) 
>>> arr_s = np.sort(arr, order='a') 
>>> arr_s 
array([(3, 4, 1), (5, 2, 3)], 
     dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')]) 
>>> arr_s = np.sort(arr, order='b') 
>>> arr_s 
array([(5, 2, 3), (3, 4, 1)], 
     dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')]) 
>>> arr_s = np.sort(arr, order='c') 
>>> arr_s 
array([(3, 4, 1), (5, 2, 3)], 
     dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')]) 
>>> 
+1

你的意思是'now'而不是'not'嗎? – Alok

+0

這就解釋了我的輸出數組。這似乎是正確的。我不明白爲什麼我的排序功能不起作用。 'x = np.sort(allRics,order ='time')'沒有按'time'列排序。我在這裏錯過了什麼嗎? – Alok

+1

是的'現在'不''不'',還增加了對排序的評論。看起來是一個錯誤。 – aterrel

1

您可能能夠避免使用結構化的陣列產品總數,如果你使用的是他們對所有的排序。你可以這樣做:

new_order = np.argosrt(allRics[:, 2]) 
x = allRics[new_order] 
+0

謝謝。我已經實施了相同的解決方案。它爲我工作。 – Alok

相關問題