【问题标题】:Setting Data Types with Matplotlib and csv2rec使用 Matplotlib 和 csv2rec 设置数据类型
【发布时间】:2011-09-09 19:05:10
【问题描述】:

我正在学习 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 读取文件时分配的数据类型的方法。读入或赋值数组时如何更改数据类型?

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:
    x = data['list_price'].astype('int64')
    

    y 相同。

    并且:csv2rec 有一个 converterd 参数:http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.csv2rec

    【讨论】:

    • 谢谢!这就像一个魅力。我不知道 numpy 有就地铸造。 This 链接甚至有我在之前的评论中寻找的类型格式化字符串。再次感谢!
    【解决方案2】:

    代替mlab.csv2rec,您可以使用numpy 的等效函数numpy.loadtxt (documentation) 来读取您的数据。此函数有一个参数来指定数据的 dtype。

    或者,如果您想使用列名(如示例代码中所示),请使用函数 numpy.genfromtxt (documentation)。这类似于 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 数组时,您不必使用 for 循环。要计算平方,您可以这样做:

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

    或一行:

    sumxSQ = numpy.sum(x**2)
    

    【讨论】:

    • 感谢您对正方形和 for 循环的提醒,我真的可以看到这将使代码更简单和更清晰。我一直在避免使用 loadtxt,因为 dtype 数组似乎没有清楚地解释格式字符串是什么。我会看看我以后能不能把它追下来。
    • “dtype 数组似乎没有明确解释格式字符串是什么”是什么意思?您可以使用dtype = 'int64'。我添加了一个示例。
    • 函数 loadtxt 在读取由不同列类型组成的数组时需要一个 dtype 字典,例如,当混合字符串、整数和浮点数时。我使用 csv2rec 是因为它可以自动读取各种数据类型,并让我专注于数据集和问题本身,而不是试图理解 dtype 字典。我知道这可能很简单,但我正在采取“跑前走”的方法来学习 Matplotlib 和 Numpy/Scipy。不过,我真的很欣赏这个例子。
    • 啊,我明白了。这就是我通常使用genfromtxt 而不是loadtxt 的原因,因为它可以从数据中读取名称和数据类型为csv2rec
    猜你喜欢
    • 2015-12-17
    • 2011-11-23
    • 2017-10-27
    • 2018-08-10
    • 1970-01-01
    • 2021-01-21
    • 2015-09-10
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多