我想使用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
当我指定单个数据类型时,我没有收到此错误。
答案 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,那么有几个选项。
您可以在genfromtxt
的调用中明确提供dtypearr = 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
会返回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]