2011-09-09 27 views
3

我正在學習Matplotlib,並試圖手動實現簡單的線性迴歸。 但是,我在導入後遇到了問題,然後在使用csv2rec之後處理了我的數據。使用Matplotlib和csv2rec設置數據類型

data= matplotlib.mlab.csv2rec('KC_Filtered01.csv',delimiter=',') 

x = data['list_price'] 
y = data['square_feet'] 

sumx = x.sum() 
sumy = y.sum() 

sumxSQ = sum([sq**2 for sq in x]) 
sumySQ = sum([sq**2 for sq in y]) 

我在閱讀房屋價格表,並試圖獲得平方的總和。但是,當csv2rec從文件中讀取價格時,它將這些值存儲爲int32。由於住房價格的平方和大於一個32位的整數,因此它會溢出。但是,我沒有看到更改csv2rec讀取文件時分配的數據類型的方法。數組讀入或分配時如何更改數據類型?

回答

2

相反的mlab.csv2rec,你可以使用numpy的的等效功能,numpy.loadtxtdocumentation),讀取數據。該函數有一個參數來指定數據的dtype。

或者如果您想使用列名稱(如您的示例代碼中),則可以使用功能numpy.genfromtxtdocumentation)。這就像loadtxt一樣,但有更多的選項,例如從文件的第一行讀取列名(使用names = True)。

其用法的例子:

In [9]: 
import numpy as np 
from StringIO import StringIO 
data = StringIO("a, b, c\n 1, 2, 3\n 4, 5, 6") 
np.genfromtxt(data, names=True, dtype = 'int64', delimiter = ',') 

Out[9]: 
array([(1L, 2L, 3L), (4L, 5L, 6L)], 
     dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')]) 

您的代碼,使用numpy的陣列時,另一個句話你do't必須使用for循環。要計算平方,你可以這樣做:

xSQ = x**2 
sumxSQ = xSQ.sum() 

或一條線:

sumxSQ = numpy.sum(x**2) 
+0

謝謝你關於方塊和循環的問題,我真的可以看到這將使代碼更簡單和更清晰。我一直在避免使用loadtxt,因爲dtype數組似乎沒有清楚地解釋格式字符串是什麼。我會看看我是否可以在稍後追查。 –

+1

你的意思是'dtype數組似乎沒有清楚地解釋格式字符串是什麼'?你可以使用'dtype ='int64''。我添加了一個例子。 – joris

+0

函數loadtxt在由不同列類型組成的數組中讀取數據時需要使用dtype字典,比如混合字符串,整數和浮點數時。我使用的是csv2rec,因爲它可以自動讀取各種數據類型,並讓我專注於數據集和問題本身,而不是試圖理解dtype字典。我知道這可能是簡單化的,但我正在學習Matplotlib和Numpy/Scipy,在「運行之前先行走」。不過,我真的很欣賞這個例子。 –

相關問題