【问题标题】:How to use numpy.savetxt with a structured array that contains an array如何将 numpy.savetxt 与包含数组的结构化数组一起使用
【发布时间】:2017-08-13 18:53:51
【问题描述】:

假设我有一个结构化数组,如下所示:

a = np.zeros(10,dtype=[('label1',np.int32, 4), ('label2', np.float_)])

我尝试将其保存为 csv 文件:

np.savetxt('output.csv', a, fmt='%d,%d,%d,%d,%f')

Python 会产生这个错误:

ValueError: fmt has wrong number of % formats:  %d,%d,%d,%d,%f

我无法创建适合我的输出的 fmt 字符串。 %s 在这里对我不起作用,因为我需要能够指定浮点数的格式。

是否可以从这种类型的结构化数组创建 csv 文件?

【问题讨论】:

    标签: python csv numpy


    【解决方案1】:

    本质上savetxt 所做的是:

    for row in arr:
        print(fmt % tuple(row))
    

    所以fmt 必须与row 一起使用,或者在这种情况下,是您数组的一个元素。

    In [330]: a = np.zeros(10,dtype=[('label1',np.int32, 4), ('label2', np.float_)])
         ...: 
    In [331]: a
    Out[331]: 
    array([([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],  0.),
           ([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.),
           ([0, 0, 0, 0],  0.)], 
          dtype=[('label1', '<i4', (4,)), ('label2', '<f8')])
    In [332]: a[0]
    Out[332]: ([0, 0, 0, 0],  0.)
    In [333]: tuple(a[0])
    Out[333]: (array([0, 0, 0, 0]), 0.0)
    

    将 4 个 int 嵌套在 label1 中,很难找到一种有效的格式。问题在于如何进行 Python '%' 格式化。

    In [334]: '%s, %f'%_
    Out[334]: '[0 0 0 0], 0.000000'
    

    如果a 是 5 个字段会更容易

    In [335]: a = np.zeros(10,dtype='i,i,i,i,f')
    In [336]: a
    Out[336]: 
    array([(0, 0, 0, 0,  0.),....
           (0, 0, 0, 0,  0.)], 
          dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<f4')])
    In [337]: tuple(a[0])
    Out[337]: (0, 0, 0, 0, 0.0)
    In [338]: '%d, %d, %d, %d, %f'%tuple(a[0])
    Out[338]: '0, 0, 0, 0, 0.000000'
    

    我认为您需要“扁平化”数组的结构,或者编写自定义 savetxt。正如我所指出的,savetxt 并不花哨。如果您可以print 以所需格式逐个元素地排列数组,则可以将该格式写入文件。

    【讨论】:

    • 感谢您的回复 - 这很有意义。停止使用嵌套数组肯定会更容易,但我的数组比我给出的示例更复杂 - 它包含许多字段,其中一些包含嵌套整数。在这种情况下,放弃结构化数组并使用普通数组 - 使用其他方法跟踪列是否有意义?
    • 取决于您对数组所做的其他操作。在 SO 问题中,结构化数组通常由 genfromtxt 读取 csv 并混合了字符串和数字来创建。它甚至可以像这样创建嵌套的,虽然我没有经常看到。但是对于计算,多个数组通常与结构化数组一样有用。你不能跨领域做数学。
    猜你喜欢
    • 2020-06-09
    • 2015-05-04
    • 2020-05-28
    • 1970-01-01
    • 2018-08-11
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多