使np.loadtxt与多个可能的分隔符一起使用

uhu*_*lol 6 python numpy

我有一个程序读取数据文件,用户选择他们想要使用的列.我希望它对输入文件更加通用; 有时,列可能如下所示:

10:34:24.58  8.284  6.121
Run Code Online (Sandbox Code Playgroud)

有时它们看起来像这样:

10 34 24.58  8.284  6.121
Run Code Online (Sandbox Code Playgroud)

我希望程序在两种情况下将其识别为5列,而不是第一列为5列而第二列为3列.基本上,我希望它能够识别white space为分隔符和:分隔符.

有一个简单的方法吗?我知道numpy需要一个delimiter命令,但据我所知它只能使用一个.

hpa*_*ulj 5

np.loadtxt(和genfromtxt)接受任何可迭代项作为输入,只要它一次将其馈入一行即可。因此,文件中的行可以通过函数或生成器传递,该函数或生成器以各种方式对消息进行按摩。这是一个简单的例子

定义一对模拟文件的线:

In [7]: txt="""10:34:24.58  8.284  6.121
   ...: 10 34 24.58  8.284  6.121
   ...: """

In [8]: txt=txt.splitlines()

In [9]: txt
Out[9]: ['10:34:24.58  8.284  6.121', '10 34 24.58  8.284  6.121']
Run Code Online (Sandbox Code Playgroud)

如果不是,:我可以直接传递给loadtxt

但是,让我们通过生成器传递这些行,该生成器用空格替换“:”。它可能是一个函数(带有yield)。在这里,我使用了一种新的生成器理解表达式:

In [10]: np.loadtxt((x.replace(b':',b' ') for x in txt))
Out[10]: 
array([[ 10.   ,  34.   ,  24.58 ,   8.284,   6.121],
       [ 10.   ,  34.   ,  24.58 ,   8.284,   6.121]])
Run Code Online (Sandbox Code Playgroud)

对于文件,这应该可以工作(在打开的文件上反复返回行):

with open(filename) as f:
    A=np.loadtxt((x.replace(b':',b' ') for x in f))
Run Code Online (Sandbox Code Playgroud)

regex对于更详尽的替换很有用。


uhu*_*lol 5

感谢上面的答案,但我相信我已经找到了一种解决方法,可以使用简单的两行解决方案,而无需修改程序的其余部分。

最初的 loadtxt 行如下所示:

import numpy as np
...
data = np.loadtxt(filename,skiprows=header,dtype=str)
Run Code Online (Sandbox Code Playgroud)

通过使用 StringIO,我们可以简单地读取文件并替换':'with 的每个实例" ",而无需修改任何其他代码。

import numpy as np
import StringIO
...
s = open(filename).read().replace(':',' ')
data = np.loadtxt(StringIO.StringIO(s),skiprows=header,dtype=str)
Run Code Online (Sandbox Code Playgroud)

我希望这对其他人有帮助!

  • 对于可能尝试使用此方法的任何人,请注意模块 StringIO 在 Python 3 中不再可用。相反,导入 io 模块并分别使用 io.StringIO 或 io.BytesIO 用于文本和数据。更多信息:https://docs.python.org/3.0/whatsnew/3.0.html (3认同)