2012-09-11 61 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

相关问题