使用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 个回答
2
你可以用一个叫做 numpy.loadtxt
的函数来读取数据,这个函数和 mlab.csv2rec
功能相似。它有一个参数可以让你指定数据的类型。你可以在这里查看它的详细说明:documentation。
如果你想处理列名(就像你示例代码中那样),可以使用 numpy.genfromtxt
这个函数。它和 loadtxt
类似,但提供了更多选项,比如可以从文件的第一行读取列名(通过设置 names = True
)。详细说明可以查看这里:documentation。
下面是它的使用示例:
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 数组时,不需要使用 for 循环。比如要计算平方,你可以直接这样做:
xSQ = x**2
sumxSQ = xSQ.sum()
或者用一行代码实现:
sumxSQ = numpy.sum(x**2)
2
x = data['list_price'].astype('int64')
同样的道理也适用于 y
。
另外,csv2rec
有一个叫 converterd
的参数:http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.csv2rec