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