【问题标题】:Read file with mixed types (floats and strings)读取混合类型的文件(浮点数和字符串)
【发布时间】:2014-02-24 15:13:36
【问题描述】:

我有一个由N 列和M 行组成的数据文件,我需要读取它们并将每一列存储到一个数组/列表中。该文件通常填充数字(浮点数),在这些情况下我可以这样做:

import numpy as np
f_data = np.loadtxt('file.dat', unpack=True)

结果是作为子列表存储在 f_data 中的列,其中的元素是 floats,正如预期的那样。

其他时候文件可能有散落在各处的随机字符串(请参阅此类文件的示例here)在这些情况下,我需要以相同的方式读取它(即:解压缩存储在列表/数组中的每一列和其中的所有元素都存储为float 类型),所有字符串都转换为默认浮点数(例如99.999

在上面的数据文件示例中,5 列在读取后会如下所示:

f_data[5]
[2.049, 0.946, 0.942, 0.889, 99.999, 0.879, 0.989, 1.142, 1.062, 0.551, 1.233, 0.503]

请注意,所有元素都是 float 类型,并且找到的字符串已转换为 99.999 并存储为浮点数。

np.genfromtxt 能够读取混合类型的文件,但结果是所有浮点数都存储为字符串,这不是我需要的。

我该怎么做?

【问题讨论】:

  • 对不起,我认为这是从帖子的上下文中明确暗示的。我现在把它说得更清楚。

标签: python numpy io


【解决方案1】:

np.genfromtxt 是答案,但要让它正常工作有点棘手。

试试:

np.genfromtxt("file.txt", dtype=float, filling_values=99.99)

这在任何情况下都会强制类型为浮点数。当 numpy 发现一个不是浮点数的值时,它会声明该值无效,因此会丢失。填充值给出了当数据丢失时要做什么的默认答案,在你的例子中是 99.99。

并且,要按要求进行编辑,按列存储,添加 unpack=True,得到总答案,

np.genfromtxt("file.txt", dtype=float, filling_values=99.99, unpack=True)

【讨论】:

  • 优秀的答案琼!我不知道genfromtxt 中的filling_values 选项,它工作得很好。对您的答案稍作修改,以便我可以接受:添加 Unpack=True 以便文件按列而不是按行存储。谢谢!
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2017-08-07
  • 2013-09-18
  • 2014-10-13
  • 2019-02-02
  • 2017-04-28
相关资源
最近更新 更多