如何使用numpy在python中导入没有分隔符的文本文件?

时间:2014-01-26 04:01:16

标签: python numpy import

如何导入没有分隔符的文件?

我有一个名为text.txt的文件,其中包含2行文字:

  

00000000011100000000000000000000
  00000000011111110000000000000000

当我使用

  

f = open(“text.txt”)
  data = np.loadtxt(f)

我得到了

  

[1.11000000e + 22 1.11111100e + 22]

使用sep=""不会改变任何内容。

我想以许多单个数字整数的形式得到这个结果:

  

[[00000000011100000000000000000000]
  [00000000011111110000000000000000]]

感谢任何帮助。

更新:感谢所有人提供了很好的答案以及解决这个尴尬问题的许多有效解决方案。

3 个答案:

答案 0 :(得分:6)

我将采用声明“我希望得到这个结果,以许多单个数字整数的形式:”字面意思,并忽略它后面的样本的格式(它似乎只是两个整数,而不是比许多单个数字整数)。您可以使用参数delimiter=1dtype=int通过genfromtxt执行此操作。当delimiter是整数或整数序列时,这些值将被解释为包含固定宽度数据字段的文件的字段宽度。

例如:

In [15]: genfromtxt('text.txt', delimiter=1, dtype=int)
Out[15]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

答案 1 :(得分:2)

如果你没有给numpy任何指导,它必须猜测你想要的类型。

如果您的数据看起来像十进制格式的整数,它将尝试以这种方式解释它们并使它们适合int32。但是00000000011100000000000000000000(显然等于11100000000000000000000)需要74位,所以这不起作用。因此,它会回归到将它们存储在float64

如果您没有意识到1.11E22与11100000000000000000000的含义相同,则需要阅读scientific notation。 1.11E22是Python(和C,以及许多其他编程语言)1.11 * 10 ** 22的快捷方式。无论如何,你得到科学记数法的原因是float64数组的默认打印输出是%g - 样式,意思是“简单表示法-4 <= exponent < precision,否则指数”。

所以,这就是你得到[1.11000000e+22 1.11111100e+22]的原因。


您获得形状数组(2,)而不是(1, 2)的原因是默认情况下,loadtxt会挤压单维轴。如果这是您想要的,请添加ndmin=2


如果您要求NumPy将数据视为字符串,它会猜测正确的长度,并将其作为字符串读取:

>>> np.loadtxt(f, dtype=str, ndmin=2)
array([['00000000011100000000000000000000'],
       ['00000000011111110000000000000000']],
      dtype='|S32')

或者,如果您要求它将数据视为Python对象,它会将它们保留为Python str对象:

>>> np.loadtxt(f, dtype=object, ndmin=2)
array([['00000000011100000000000000000000'],
       ['00000000011111110000000000000000']],
      dtype=object)

如果你希望它们是128位整数......好吧,你的构建中可能没有int128支持,所以你不能拥有它。

如果您希望将它们解释为位字符串并以32位整数存储,则必须分两步完成。我不认为NumPy可以有效地矢量化解析位字符串,所以你可以在Python中做那个部分:

>>> np.fromiter((int(line, 2) for line in f), dtype=int)
array([7340032, 8323072])

如果你希望它们的解释器是单位整数,那么就没有办法直接这样做,但你也可以分两步完成(例如,将它读成2个字符串的数组,将每个字符串视为一个序列)字符,广播np.vectorize(int)。)

你想做的几乎任何事情都是可行的,但你必须真正知道你想做什么,并且能够在你能够解释它之前向人类解释它。

答案 2 :(得分:1)

如果我找到你,请尝试以下方法:

a = np.loadtxt('text.txt', dtype=np.character)
a = np.array(map(lambda x: map(int, x), a))

输出:

[[0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

这个解决方案有点愚蠢,虽然它失败了np.loadtxt的使用,但有时我们只是想让事情发挥作用。