【问题标题】:genfromtxt generates tuples, so does recfromcsvgenfromtxt 生成元组,recfromcsv 也是
【发布时间】:2014-08-17 06:21:40
【问题描述】:

我有一个 csv 文件(逗号分隔),结构如下:

A1,A2,A3

16516.1556163,163163.48315,41816.844334

当我尝试使用 numpy 从中创建一个二维矩阵时,它总是被转换为类似于结构化数组的东西。 根据我使用的 csv 文件的给定结构:

y = np.genfromtxt('file.csv', delimiter=',', usecols=(0,2), names=True)

y = np.recfromcsv('file.csv', usecols=(0,2)

在这两种情况下,我的数组都将具有 (1,) 而不是 (1,2) 的形状。查看 genfromtxt 或 recfromcsv 生成的 dtype,我可以看出它们都是相同的 dtype('a1'、'

您能告诉我如何将数组转换为从 csv 读取的正确格式吗?

托马斯干杯

【问题讨论】:

  • (1,) 的形状对于此输入是正确的。创建的数组是通过a['col_name'] 获得的每个字段id 的recarrays,在您的情况下将返回只有一个元素的数组...

标签: python arrays csv numpy


【解决方案1】:

当我尝试重现您的代码时,我得到:

In [71]: c = StringIO("A1,A2,A3\n16516.1556163,163163.48315,41816.844334")

In [72]: x = np.genfromtxt(c,delimiter=',',usecols=(0,2),names=True)
Out[72]: 
array((16516.1556163, 41816.844334), 
      dtype=[('A1', '<f8'), ('A3', '<f8')])

In [73]: x.shape
Out[73]: ()

In [83]: x.item()
Out[83]: (16516.1556163, 41816.844334)

In [129]: x.reshape((1,))
Out[129]: 
array([(16516.1556163, 41816.844334)], 
      dtype=[('A1', '<f8'), ('A3', '<f8')])

所以x 是一个记录数组。只有一个数据行,它的形状为()('标量')。如果你给了它两个数据行,形状将是(2,)。如果 'names=False',并且您告诉它跳过第一行,则结果(有 2 行)将是 (2,2)

这些'...fromtxt'函数逐行读取文件,解析每一行并构造一个列表列表,例如[[1,2,3],[3,4,5]]。然后转到np.array(带有适当的dtype)。最后它得到一个.squeeze(),删除所有的单件维度。

正是这个最终的squeeze 将形状为(1,) 的数组转换为()(或(1,2)-&gt;(2,))。您可以使用 reshape 轻松添加该维度。

要创建一个有 2 列的矩阵,您需要跳过标题和名称:

In [121]: x=np.genfromtxt(c,delimiter=',',usecols=(0,2),skip_header=1)

In [122]: x
Out[122]: array([ 16516.1556163,  41816.844334 ])

In [123]: x.shape
Out[123]: (2,)

【讨论】:

    【解决方案2】:

    您可以使用可以读取表格的astropy 库来读取您的csv 文件。这是一个示例实现:

    >>> from astropy.io import ascii
    >>> from numpy import *
    >>> data = ascii.read("test.csv",format='csv',delimiter=',')
    >>> print data
          A1           A2           A3     
    ------------- ------------ ------------
    16516.1556163 163163.48315 41816.844334
    

    然后使用numpy 将其转换为三列数组。顺便说一句,你不能有一个字符串数组和浮点数。

    >>> a = hstack((data['A1'],data['A2'],data['A3']))
    >>> print a
    [  16516.1556163  163163.48315     41816.844334 ]
    

    【讨论】:

      【解决方案3】:

      我在这两个建议上坐了一段时间,因为我基本上尝试了第一个建议的所有内容,所以我选择了 astropy。我在文档中读到支持 csv 作为一种格式,但是,嘿,这在 0.3 版中对我来说从来没有用过。 0.3.2 版支持的格式不包括 csv 和最新版本的 PyPi。

      但是,我尝试format='fixed_width' 并读入了一些内容,但这些值几乎被误解了。

      我还是不明白,但是当我忽略第一行 skip_header=1 并通过不设置 names(默认为 None)完全牺牲列名时,它就可以工作了。

      现在,当我说:

      x = np.genfromtxt('file.csv', delimiter=',', skip_header=1)
      x.shape
      

      结果为@​​987654326@

      【讨论】:

        猜你喜欢
        • 2011-08-05
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 2017-04-14
        相关资源
        最近更新 更多