【问题标题】:Python genfromtext multiple datatypesPython genfromtxt 多种数据类型
【发布时间】:2013-11-06 12:41:33
【问题描述】:

我想使用 genfromtxt 读取 csv 文件。 我有六列是浮动的,一列是字符串。

如何设置数据类型,以便将浮点列作为浮点数读入,而将字符串列作为字符串读入?我试过 dtype='void' 但这不起作用。

建议?

谢谢

.csv 文件

999.9, abc, 34, 78, 12.3
1.3, ghf, 12, 8.4, 23.7
101.7, evf, 89, 2.4, 11.3



x = sys.argv[1]
f = open(x, 'r')
y = np.genfromtxt(f, delimiter = ',', dtype=[('f0', '<f8'), ('f1', 'S4'), (\
'f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8'), ('f6', '<f8')])

ionenergy = y[:,0]
units = y[:,1]

错误:

ionenergy = y[:,0]
IndexError: invalid index

我在指定单一数据类型时没有收到此错误。

【问题讨论】:

    标签: python python-2.7 numpy genfromtxt


    【解决方案1】:

    请试试这个:

    import numpy
    
    ionenergy = y.iloc[:,0]
    units = y.iloc[:,1]
    

    【讨论】:

    • 嗨@Joye,你能解释一下.iloc 构造在这里做什么,以及它与数据类型有什么关系吗?
    【解决方案2】:

    dtype=None 告诉 genfromtxt 猜测适当的 dtype。

    来自the docs

    dtype:dtype,可选

    结果数组的数据类型。 如果没有,dtypes 将是 由每列的内容单独确定。

    (我的重点。)


    由于您的数据是逗号分隔的,请务必包含delimiter=',',否则np.genfromtxt 会将每一列(除最后一列)解释为包含一个字符串字符(逗号),因此会错误地为每个列分配一个字符串 dtype这些列。

    例如:

    import numpy as np
    
    arr = np.genfromtxt('data', dtype=None, delimiter=',')
    
    print(arr.dtype)
    # [('f0', '<f8'), ('f1', 'S4'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8')]
    

    这显示了每列的名称和数据类型。例如,('f3', &lt;f8) 表示第四列的名称为 'f3' 并且是 dtype 'i 表示它是一个整数 dtype。如果您需要第三列是 float dtype,那么有几个选项。

    1. 您可以通过添加小数点手动编辑数据 第三列强制 genfromtxt 解释该列中的值 为浮点数据类型。
    2. 您可以在对 genfromtxt 的调用中明确提供 dtype

      arr = np.genfromtxt(
          'data', delimiter=',',
          dtype=[('f0', '<f8'), ('f1', 'S4'), ('f2', '<f4'), ('f3', '<f8'), ('f4', '<f8')])
      

    print(arr)
    # [(999.9, ' abc', 34, 78.0, 12.3) (1.3, ' ghf', 12, 8.4, 23.7)
    #  (101.7, ' evf', 89, 2.4, 11.3)]
    
    print(arr['f2'])
    # [34 12 89]
    

    错误信息IndexError: invalid index正在由该行生成

    ionenergy = y[:,0]
    

    当你有混合数据类型时,np.genfromtxt 返回一个structured array。您需要阅读结构化数组,因为访问列的语法与用于同质 dtype 的普通数组的语法不同。

    代替y[:, 0],要访问结构化数组y的第一列,请使用

    y['f0']
    

    或者,更好的是,在np.genfromtxt 中提供names 参数,这样您就可以使用更相关的列名,例如y['ionenergy']

    import numpy as np
    arr = np.genfromtxt(
        'data', delimiter=',', dtype=None,
        names=['ionenergy', 'foo', 'bar', 'baz', 'quux', 'corge'])
    
    print(arr['ionenergy'])
    # [ 999.9    1.3  101.7]
    

    【讨论】:

    • 生成的 dtype 是什么?列中是否有任何文本应为floats?你是用names还是skip_header来处理header的(如果有的话)?
    • 我没有标题。使用 dtype=None,当我尝试分配每一列时,我得到一个无效索引范围的错误。此外,列中没有应该只是浮动的文本。
    • 请使用genfromtxt发布您正在解析的文本示例。
    • 好的,我尝试指定每一列,但仍然出现无效索引错误。
    • 您能发布您的代码和完整的回溯错误消息吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 2020-02-16
    • 2021-06-16
    • 1970-01-01
    • 2013-06-11
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多