gpt4 book ai didi

python - 使用 numpy.genfromtxt 时如何保留以减号开头的列名?

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:54 25 4
gpt4 key购买 nike

类似于this question , numpy.genfromtxt修改我的专栏名称:

import numpy as np
from io import BytesIO # https://stackoverflow.com/a/11970414/321973

str = 'x,-1,1\n0,1,1\n1,2,3'
data = np.genfromtxt(BytesIO(str.encode()), delimiter=',', names=True)
print(data.dtype.names)

产量 ('x', '1', '1_1')而不是所需的 ('x', '-1', '1') (或者更好,('x', -1, 1))。我试过 deletechars="""~!@#$%^&*()=+~\|]}[{';: /?>,<"""按照建议there无济于事。

最佳答案

您看到的行为是由 np.genfromtxt 使用 NameValidatorhere 引起的自动从字段名称中去除某些非字母数字字符。

字段名包含'-'字符是完全合法的,例如:

x = np.array((1,), dtype=[('-1', 'i')])
print(x['-1'])
# 1

事实上,从 np.genfromtxt 返回的修改后的字段名称中,有三分之二也不是“有效的 Python 标识符”('1''1_1',因为它们以数字开头)。

因此,只要绕过使用 np.genfromtxt 设置字段名称,就可以构建您描述的数组。一种方法是初始化一个空数组,明确指定字段名称和数据类型,然后用其余字符串内容填充它:

names = str.splitlines()[0].split(',')
types = ('i',) * 3
dtype = zip(names, types)

data = np.empty(2, dtype=dtype)
data[:] = np.genfromtxt(BytesIO(str.encode()), delimiter=',', dtype=dtype,
skiprows=1)
print(repr(data))
# array([(0, 0, 1), (1, 0, 2)],
# dtype=[('x', '<i4'), ('-1', '<i4'), ('1', '<i4')])

但是,仅仅因为您可以并不意味着您应该 - 在您的其中一个字段名称中使用 '-' 可能会产生其他不可预知的后果。最安全的选择是坚持只使用有效的 Python 标识符作为字段名称。

关于python - 使用 numpy.genfromtxt 时如何保留以减号开头的列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29097917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com