Python genfromtxt有多种数据类型

时间:2013-10-27 20:14:53

标签: python python-2.7 numpy genfromtxt

我想使用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

当我指定单个数据类型时,我没有收到此错误。

2 个答案:

答案 0 :(得分:4)

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

来自the docs

  

dtype:dtype,可选

     

结果数组的数据类型。 如果为None,则dtypes将为   由每列的内容单独确定。

(我的重点。)


由于您的数据以逗号分隔,请务必包含delimiter=',',否则np.genfromtxt会将每列(execpt最后一列)解释为包含字符串字符(逗号),因此会错误地指定字符串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')]

显示每列的名称和dtypes。例如,('f3', <f8)表示第四列的名称为'f3',且dtype为'&lt; i4。 i表示它是整数dtype。如果你需要第三列是float dtype,那么有几个选项。

  1. 您可以通过在中添加小数点来手动编辑数据 第三列强制genfromtxt解释该列中的值 是一个浮动dtype。
  2. 您可以在genfromtxt

    的调用中明确提供dtype
    arr = np.genfromtxt(
        'data', delimiter=',',
        dtype=[('f0', '<f8'), ('f1', 'S4'), ('f2', '<f4'), ('f3', '<f8'), ('f4', '<f8')])
    

  3. 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]
    

    如果您有混合dtypes,np.genfromtxt会返回structured array。您需要阅读结构化数组,因为访问列的语法不同于用于同类dtype的普通数组的语法。

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

    y['f0']
    

    或者,更好的是,在names中提供np.genfromtxt参数,这样您就可以使用更相关的列名,例如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]
    

答案 1 :(得分:0)

请试试这个:

import numpy

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