【问题标题】:How to define a structured data type for numpy loadtxt?如何为 numpy loadtxt 定义结构化数据类型?
【发布时间】:2019-09-24 18:43:15
【问题描述】:

我想读取一个数据文件,其中每一列由一个制表符分隔,每一行看起来像这样:

[475.407, 792.916]  [893.258, 614.066]  [461.864, 356.715]  [758.244, 274.128]

目前,我使用 numpy.loadtxt 将此文件作为字符串读取,它工作正常:

data = np.loadtxt (filename, dtype=np.str, delimiter="\t")

但是我需要的是浮点数而不是字符串。我的预期输出是:

(np.float32, np.float32) (np.float32, np.float32) (np.float32, np.float32) (np.float32, np.float32)

所以我决定定义一个新的数据类型为 np.dtype("f4, f4") 以便每个元素被视为两个浮点数:

data = np.loadtxt (filename, dtype=np.dtype("f4, f4"), delimiter="\t")

这会导致以下错误:

ValueError: could not convert string to float: '[475.407, 792.916]'

问题

  • 如何为 numpy.loadtxt 定义新的数据类型?
  • 还有其他工具可以替代吗?

【问题讨论】:

  • 您只是在这里使用了错误的工具。您似乎想要的数据类型实际上只是np.float64。但这对您没有帮助,因为 numpy.readtext 只是一种非常愚蠢的便捷方法,用于加载简单的字符分隔字符串。
  • 预期输出是什么?
  • @juanpa.arrivillaga 您是否建议使用其他工具,例如 genfromtext?
  • @DanielMesejo 我更新了问题。我想将每个元素 [x, y] 读取为浮点数而不是字符串。
  • @Ali 不,因为这本质上是等价的。我会建议从源头上解决问题:无论生成此文本,不要那样做,并使用预先构建的序列化格式。否则,我建议只是手动解析,您可以“作弊”并使用ast.literal_eval。但实际上,你应该修复源代码

标签: python numpy


【解决方案1】:

另一种方法是使用np.fromregex

import numpy as np

arr = np.fromregex('test.txt', '(\d+.\d+),\s+(\d+.\d+)', dtype=[('u', np.float32), ('v', np.float32)])

print(arr)

输出

[(475.407, 792.916) (893.258, 614.066) (461.864, 356.715)
 (758.244, 274.128)]

虽然我建议您遵循@juanpa.arrivillaga 的建议并从源头上解决此问题。

【讨论】:

  • 谢谢。虽然它制作了一个 1D numpy 数组而不是 2D,但它是一个很好的解决方案。
  • @Ali 之后可以重新整形数组。
【解决方案2】:

每个元素都保存在x中:

data = np.loadtxt (filename, dtype=np.str, delimiter="\t")

for txt in data:
    x_list = [float(a) for a in txt[1:-1].split(",")]
    x = np.array(x_list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多