Python:numpy.genfromtxt-需要包含无效字符的列名
我正在使用Python:numpy.genfromtxt-需要包含无效字符的列名,python,numpy,genfromtxt,Python,Numpy,Genfromtxt,我正在使用numpy.genfromtxt导入CSV文件 要导入的数据具有列名标题,其中一些列名包含genfromtxt认为无效的字符。具体来说,有些名称包含“#”和“”。无法更改输入数据,因为它是由我不控制的其他源生成的 使用names=True和comments=None,我无法输入我需要的所有列名 我已尝试重写numpy.lib.NameValidator.deletechars=None,但这不会影响实际使用的NameValidator类实例 我理解,deletechars的存在是因为可
numpy.genfromtxt
导入CSV文件
要导入的数据具有列名标题,其中一些列名包含genfromtxt
认为无效的字符。具体来说,有些名称包含“#”和“”。无法更改输入数据,因为它是由我不控制的其他源生成的
使用names=True
和comments=None
,我无法输入我需要的所有列名
我已尝试重写numpy.lib.NameValidator.deletechars=None
,但这不会影响实际使用的NameValidator类实例
我理解,deletechars
的存在是因为可以像访问属性一样重新排列字段。但是,我必须能够读入包含无效字符的列名,即使在读入时这些字符被剥离
是否有办法强制
名称验证程序
不检查无效字符,或修改其检查的字符?我无法修改numpy/lib/_iotools.py,因为我不是root用户,修改共享安装将不好。您没有明确说明numpy.genfromtxt是一个硬要求,因此我建议您尝试
此模块可以在解析之前替换某些条目:
您还可以根据现有的阅读器定义自己的阅读器:
asciitable reader的输出是numpy数组,因此您应该能够用asciitable或多或少地直接替换当前使用的函数。您没有明确说明numpy.genfromtxt是一个硬要求,因此我建议您尝试 此模块可以在解析之前替换某些条目: 您还可以根据现有的阅读器定义自己的阅读器:
asciitable reader的输出是numpy数组,因此您应该能够或多或少地直接用asciitable替换当前使用的函数。
NameValidator
如果使用deletechars=None
构造,则将使用其默认的deletechars
,但是如果您传入一个非None
集,那么它将使用该集。和np.genfromtext
获取一个deletechars
参数,并将其传递给namevalidater
所以,你应该能够写作
np.genfromtxt(..., deletechars=set())
对于空集或默认
集的某个子集(“~!@$%^&*()-=+~\\\\\]}[{';:/?。>,namevalidater
将使用其默认设置,如果使用deletechars=None
构造,则namevalidater
将使用该默认设置。而np.genfromtext
将使用一个deletechars
参数传递给namevalidater
所以,你应该能够写作
np.genfromtxt(..., deletechars=set())
对于空集或默认集的某个子集(“~!@$%^&*()-=+\\\\\\\\]}[{':/?。>,IMHO,genfromtxt
通常用于一些更简单的解决方案
因此,除非您有一些麻烦的数据集(缺少条目、多个未知的列类型),否则最好编写一个快速而脏的解析器(即,跳过一些行、解析标题、读取其余内容并在最后重新组织)
现在,如果您确实需要genfromtxt
,@ecatmur正好指出genfromtxt
的deletechars
参数被发送到\iotools.NameValidator
来构造要删除的字符集。使用deletechars=None
告诉NameValidator
使用默认集。首先要做的是ry只是不使用deletechars=None
,而是使用空的集合
或'
请注意,无论发生什么情况,双引号“
和结尾空格都将被删除,相似的名称将被区分:
>>> fields = ["blah", "'blah'", "\"blah\"", "#blah", "blah "]
>>> np.lib._iotools.NameValidator(deletechars='').validate(fields)
... ('blah', "'blah'", 'blah_1', '#blah', 'blah_2')
第三个也是最后一个条目将产生三列名为blah
,因此我们必须重命名它们
如果这不适合你,恐怕你遇到了麻烦:目前没有办法告诉genfromtxt
接受定制的namevalidater
。不过,这可能是个好主意,所以你可能想在numpy的邮件列表上提出一点。我想,genfromtxt
通常用于一些更简单的解决方案可以
因此,除非您有一些麻烦的数据集(缺少条目、多个未知的列类型),否则最好编写一个快速而脏的解析器(即,跳过一些行、解析标题、读取其余内容并在最后重新组织)
现在,如果您确实需要genfromtxt
,@ecatmur正好指出genfromtxt
的deletechars
参数被发送到\iotools.NameValidator
来构造要删除的字符集。使用deletechars=None
告诉NameValidator
使用默认集。首先要做的是ry只是不使用deletechars=None
,而是使用空的集合
或'
请注意,无论发生什么情况,双引号“
和结尾空格都将被删除,相似的名称将被区分:
>>> fields = ["blah", "'blah'", "\"blah\"", "#blah", "blah "]
>>> np.lib._iotools.NameValidator(deletechars='').validate(fields)
... ('blah', "'blah'", 'blah_1', '#blah', 'blah_2')
第三个也是最后一个条目将产生三列名为blah
,因此我们必须重命名它们
如果这不适合您,恐怕您遇到了障碍:目前没有办法告诉genfromtxt
接受定制的namevalidater
。不过,这可能是个好主意,因此您可能想在numpy的邮件列表上提出这一点。您不能自己提取标题,然后跳过它以获取纯数据吗通过genfromtxt
?@JakobS执行此操作。-我目前正在尝试此操作,读取标题行,然后使用正则表达式查找哪些名称包含无效字符并替换它们。但是,这与