1

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

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

4

2 回答 2

4

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

文档

dtype:dtype,可选

结果数组的数据类型。如果为 None,则 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', <f8)表示第四列有名称'f3'并且是 dtype '<i4. 这i意味着它是一个整数 dtype。如果您需要第三列是 float dtype,那么有几个选项。

  1. 您可以通过在第三列中添加小数点来手动编辑数据,以强制 genfromtxt 将该列中的值解释为 float dtype。
  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]

当您混合 dtypes 时,np.genfromtxt返回一个结构化数组。您需要阅读结构化数组,因为访问列的语法与用于同质 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]
于 2013-10-27T20:15:40.870 回答
0

请试试这个:

import numpy

ionenergy = y.iloc[:,0]
units = y.iloc[:,1]
于 2017-03-16T03:01:52.663 回答