【问题标题】:Import CSV file into numpy as data table resulting in incorrect shape将 CSV 文件导入 numpy 作为数据表,导致形状不正确
【发布时间】:2014-09-19 21:41:59
【问题描述】:

我正在尝试使用 numpy 将 CSV 文件作为数据表读取,但遇到了问题。

这是我的完整 CSV 文件:

week,count,is_successful,percent,percent_tablet,percent_desktop
1,2005,0,23,32,45
1,3805,1,18,22,55
2,1872,0,35,22,43
2,2990,1,22,21,57
3,2005,0,24,24,48
3,3805,1,27,21,52

这是我的 numpy 代码:

data = np.genfromtxt("data.csv", delimiter=',', names=True)
print data.shape

这给了我(6,) - 它看到行但没有列。为什么不将其作为表格导入?

【问题讨论】:

  • import pprint; pprint.pprint(data) 显示什么?
  • 您的示例有 6 行数据和 6 列,请尝试添加一行以确保您看到的内容...
  • 如果你还不习惯使用numpy,我会看看pandaspd.read_csv("data.csv") 会给你一些更符合你期望的东西。
  • 这个问题几乎与stackoverflow.com/questions/24143807/…重复

标签: python csv numpy


【解决方案1】:

当您命名列时,genfromtxt 创建的数组是一维的structured array。使用列名作为键访问列,例如data['week'].

您可以使用view 方法获得数据的二维视图:table = data.view(np.float64).reshape(len(data), -1)

【讨论】:

    【解决方案2】:

    来自documentation

    控制我们读取的字符串序列的主要方法 将文件转换为其他类型是设置 dtype 参数。 此参数的可接受值为:

    • 单一类型,例如 dtype=float。输出将是具有给定 dtype 的 2D,除非名称已与每列相关联
      使用名称参数(见下文)。请注意,dtype=float 是
      genfromtxt 的默认值。

    • 一系列类型,例如 dtype=(int, float, float)。

    • 逗号分隔的字符串,例如 dtype="i4,f8,|S3"。

    • 具有两个键“名称”和“格式”的字典。

    • 元组序列(名称、类型),例如 dtype=[('A', int), ('B', float)]。

    • 现有的 numpy.dtype 对象。

    • 特殊值无。在这种情况下,列的类型将由数据本身确定(见下文)。

    在除第一种情况之外的所有情况下,输出都是具有结构化 dtype 的一维数组。此 dtype 具有与序列中的项目一样多的字段。字段名称是用 names 关键字定义的。

    本质上,如果数据是异构的或未指定的,您将获得一个 dtypes 数组。只有齐次才能得到矩阵。

    【讨论】:

      【解决方案3】:

      您可以使用skiprows 并将names 保留为默认的False 值。这将绕过将数据组装成结构。

      data = np.genfromtxt("data.csv", delimiter=',', skiprows=1)
      print data.shape
      

      【讨论】:

        猜你喜欢
        • 2019-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        • 2020-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多