Python: numpy.genfromtxt - 需要包含无效字符的列名



我正在使用numpy.genfromtxt导入CSV文件。

要导入的数据具有列名标题,其中一些列名包含genfromtxt认为无效的字符。具体来说,某些名称包含"#"和"。输入数据无法更改,因为它是由我无法控制的其他来源生成的。

使用 names=Truecomments=None ,我无法引入我需要的所有列名。

我尝试覆盖numpy.lib.NameValidator.deletechars=None,但这不会影响实际使用的NameValidator类实例。

我知道deletechars的存在是由于有可能访问字段,就好像它是一个属性一样。但是,我必须能够读取包含无效字符的列名,即使这些字符在读入时被剥离。

有没有办法强制NameValidator不检查无效字符,或修改它检查的字符?我无法修改 numpy/lib/_iotools.py,因为我不是 root,修改共享安装会很糟糕。

你没有明确说明numpy.genfromtxt是一个硬性要求,所以让我建议你尝试一下。

此模块有一种方法可以在解析之前替换某些条目:http://cxc.harvard.edu/contrib/asciitable/#replace-bad-or-missing-values

您还可以根据现有的阅读器定义自己的阅读器:http://cxc.harvard.edu/contrib/asciitable/#advanced-table-reading

asciitable reader 的输出是 numpy 数组,因此您应该能够或多或少地直接将您当前使用的函数替换为 asciitable。

如果使用deletechars=None构造,NameValidator将使用其默认值集deletechars,但是如果您传入非None集合,那么它将使用该集合。 np.genfromtext采用一个deletechars参数,并将其传递给NameValidator

所以,你应该能够写

np.genfromtxt(..., deletechars=set())

对于空集或默认set("""~!@#$%^&*()-=+~|]}[{';: /?.>,<""")的某些子集:

deletechars = np.lib._iotools.NameValidator.defaultdeletechars - set("# ")
np.genfromtxt(..., deletechars=deletechars)

我直言,genfromtxt通常用于一些更简单的解决方案的情况。

因此,除非你有一些麻烦的数据集(缺少条目,多个未知的列类型),否则你最好编写一个快速而肮脏的解析器(即,跳过一些行,解析标题,阅读其余部分并在最后重新组织)。

现在,如果你真的需要genfromtxt,@ecatmur公正地指出,genfromtxtdeletechars参数被发送到_iotools.NameValidator以构造要删除的字符集。使用deletechars=None告诉NameValidator使用默认设置。首先要尝试的就是不使用deletechars=None,而是空的set''

请注意,无论如何,双引号"和结束空格都将被删除,并且将区分相似的名称:

>>> fields = ["blah", "'blah'", ""blah"", "#blah", "blah "]
>>> np.lib._iotools.NameValidator(deletechars='').validate(fields)
... ('blah', "'blah'", 'blah_1', '#blah', 'blah_2')

第三个也是最后一个条目将导致三列名为 blah ,因此我们必须重命名它们。

如果这不适合你,恐怕你遇到了障碍:目前没有办法告诉genfromtxt接受定制的NameValidator。不过,这可能是一个好主意,所以你可能想在numpy的邮件列表中提出这一点。

相关内容

  • 没有找到相关文章

最新更新