【问题标题】:Structured numpy array with 2 different data types具有 2 种不同数据类型的结构化 numpy 数组
【发布时间】:2020-12-17 02:42:36
【问题描述】:

我将一个 csv 文件导入到一个 numpy 数组中,我需要将其转换为一个结构化数组,其中只有第一列作为 dtype 字符串,所有其他 47 列作为浮点数。 如何在单个操作中定义其他 47 列的数据类型?我必须逐列指定 dtype 吗?

提前致谢

【问题讨论】:

  • 所有表都需要 numpy 数组吗?将每一列存储在单独的表中会很好(然后可能从列数组创建一个列表)?
  • this的可能重复
  • @JanStránský 谢谢您的回复。是的,我需要阵列上的所有列。第一列是重复的标识符,其他 47 列是浮点数,我需要运行复杂的计算
  • 您是否考虑过使用 pandas 来存储混合数据类型的数据?
  • @FBruzzesi - 我必须使用 numpy,除非我可以使用 Pandas 运行深度进化算法

标签: python numpy structured-array


【解决方案1】:

您可以像结构化数组一样读取源文件。

假设您输入的文件包含:

  • 一个字符串字段,命名为Id
  • 只有四个 float字段,分别命名为F1F2等。

所以它的内容是:

ABCD,160.72,180.21,260.13,451.48
EFGH,252.42,132.21,150.11,612.56
IJKL,541.77,455.21,268.76,543.81

要读取这样的文件,您可以使用 np.loadtxt 方法,将 dtype 传递为 结构化类型(定义列表),可以生成 例如在列表理解中:

nFloats = 4
a = np.loadtxt('Input.csv', delimiter=',',
    dtype=[('Id', 'U10')] + [( f'F{i+1}', '<f4' ) for i in range(nFloats)])

请注意,我将 U10 作为 Id 列的类型(10 个字符)传递。 如果需要,请设置此字段的其他大小。

结果是:

array([('ABCD', 160.72, 180.21, 260.13, 451.48),
       ('EFGH', 252.42, 132.21, 150.11, 612.56),
       ('IJKL', 541.77, 455.21, 268.76, 543.81)],
      dtype=[('Id', '<U10'), ('F1', '<f4'), ('F2', '<f4'), ('F3', '<f4'), ('F4', '<f4')])

当然,在你的目标代码版本中相应增加 nFloats (可能应该是 47)。

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多