2009-10-19 64 views
0

我正在從matplotlib.mlab.csv2rec函數中重新獲取數據。我的期望是它會有'x'這樣的2個維度,但它有'y'這樣的1個維度。有沒有辦法從y獲得x?有沒有可能將recarray轉換爲ndarray並更改ndim?

>>> import numpy as np 
>>> from datetime import date 
>>> x=np.array([(date(2000,1,1),0,1), 
...    (date(2000,1,1),1,1), 
...    (date(2000,1,1),1,0), 
...    (date(2000,1,1),0,0), 
...    ]) 
>>> x 
array([[2000-01-01, 0, 1], 
     [2000-01-01, 1, 1], 
     [2000-01-01, 1, 0], 
     [2000-01-01, 0, 0]], dtype=object) 
>>> y = np.rec.fromrecords(x) 
>>> y 
rec.array([(datetime.date(2000, 1, 1), 0, 1), 
     (datetime.date(2000, 1, 1), 1, 1), 
     (datetime.date(2000, 1, 1), 1, 0), (datetime.date(2000, 1, 1), 0, 0)], 
     dtype=[('f0', '|O4'), ('f1', '<i4'), ('f2', '<i4')]) 
>>> x.ndim 
2 
>>> y.ndim 
1 
>>> x.shape 
(4, 3) 
>>> y.ndim 
1 
>>> y.shape 
(4,) 
>>> 
+0

如果您的csv文件有兩列,csv2rec應該創建一個具有兩個維度的數組。你能提供一個你正在解析的文件的例子,以及你對csv2rec的調用嗎?此外,請注意,您可以使用新的numpy.genfromtxt而不是csv2rec:它可以更好地工作,但您必須將dtype = None作爲參數傳遞給它。 – dalloliogm 2009-10-19 15:06:19

+0

實際上它有7列,第一個是格式dd/mm/yyyy的日期,然後是6雙打,可以是不同類型的原因? – maplpro 2009-10-19 21:44:20

回答

0

嗯,有可能比這更有效的方式,但這裏有一個辦法:

#!/usr/bin/env python 
import numpy as np 
from datetime import date 
x=np.array([(date(2000,1,1),0,1), 
       (date(2000,1,1),1,1), 
       (date(2000,1,1),1,0), 
       (date(2000,1,1),0,0), 
       ]) 

y=np.rec.fromrecords(x) 

z=np.empty((len(y),len(y.dtype)),dtype='object') 
for idx,field in enumerate(y.dtype.names): 
    z[:,idx]=y[field] 
assert (x==z).all() 
+0

當然,但我不能相信這種轉換沒有優雅的方式:( – maplpro 2009-10-19 21:47:58

0

聽起來有些不可思議,但...我可以用matplotlib.mlab.rec2csv保存到CSV,然後讀通過numpy.loadtxt到ndarray。我的情況更簡單,因爲我已經有csv文件。這是一個例子,它是如何工作的。

>>> a = np.loadtxt('name.csv', skiprows=1, delimiter=',', converters = {0: lambda x: 0}) 
>>> a 
array([[ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0.29, 0.29, 0.43, 0.29, 0. ], 
     [ 0. , 0.71, 0.29, 0.57, 0. , 0. ], 
     [ 0. , 1. , 0.57, 0.71, 0. , 0. ], 
     [ 0. , 0.43, 0.29, 0.14, 0.14, 0. ], 
     [ 0. , 1. , 0.43, 0.71, 0. , 0. ], 
     [ 0. , 0.57, 0.57, 0.29, 0.14, 0. ], 
     [ 0. , 1.43, 0.43, 0.86, 0.43, 0. ], 
     [ 0. , 1. , 0.71, 0.57, 0. , 0. ], 
     [ 0. , 1.14, 0.57, 0.29, 0. , 0. ], 
     [ 0. , 1.43, 0.29, 0.71, 0.29, 0.29], 
     [ 0. , 1.14, 0.43, 1. , 0.29, 0.29], 
     [ 0. , 0.43, 1.14, 0.86, 0.43, 0.14], 
     [ 0. , 1.14, 0.86, 0.86, 0.29, 0.29]]) 
>>> t = a.any(axis = 1) 
>>> t 
array([False, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False, False, True, True, 
     True, True, True, True, True, True, True, True, True, 
     True, True], dtype=bool) 
>>> a.ndim 
2 

同樣在我的情況下,我不需要第一列作出決定。

2

您可以通過大熊貓做到這一點:

import pandas as pd 
pd.DataFrame(y).values 

array([[2000-01-01, 0, 1], 
     [2000-01-01, 1, 1], 
     [2000-01-01, 1, 0], 
     [2000-01-01, 0, 0]], dtype=object) 

不過,我會考慮做我的項目如果我是你的話,在熊貓裏。對命名列的支持更深入地建立在熊貓身上,而不是普通的numpy。

>>> z = pd.DataFrame.from_records(y, index="f0") 
>>> z 
      f1 f2 
f0     
2000-01-01 0 1 
2000-01-01 1 1 
2000-01-01 1 0 
2000-01-01 0 0 
>>> z["f1"] 
f0 
2000-01-01 0 
2000-01-01 1 
2000-01-01 1 
2000-01-01 0 
Name: f1 
+1

+ 1對熊貓來說,這應該使所有這些更容易,但我相信作爲一個numpy數組訪問DataFrame的正確方法是' '.values'',而不是''.__ array __()''。 – 2013-10-10 15:16:03

+0

將__array __()更改爲值;謝謝,@DanAllan – kuzzooroo 2013-10-10 18:25:46

相關問題