使用Matplotlib和csv2rec设置数据类型

3 投票
2 回答
4997 浏览
提问于 2025-04-17 01:55

我正在学习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

撰写回答