【问题标题】:Saving individual columns of a structured array with numpy.savetxt: ValueError: fmt has wrong number of % formats使用 numpy.savetxt 保存结构化数组的各个列:ValueError: fmt has wrong number of % formats
【发布时间】:2020-07-24 15:58:15
【问题描述】:

我有点困惑,因为这在我 1-2 年前运行代码时就已经工作了。

我有一个具有不同数据类型和列名的大型结构化 numpy 数组。如果我提供描述每列数据类型的格式字符串 (fmt),我可以使用 numpy.savetxt() 保存它。 但是,如果我想通过 array[['col_name1', 'col_name2']] 保存选择的几列以及两列的 fmt 字符串,我会收到以下错误消息: ValueError:fmt 的 % 格式数量错误:%i %i

这里是一个例子。

保存整个数组有效:

import numpy as np
arr = np.zeros(3, dtype=[('w', int), ('x', float), ('y', int), ('z', "i8")])
np.savetxt('works.txt', arr, fmt="%i %06f %i %i")

保存两列不会:

import numpy as np
arr = np.zeros(3, dtype=[('w', int), ('x', float), ('y', int), ('z', "i8")])
np.savetxt('ValueError.txt', arr[['w','y']], fmt="%i %i")

这给了我错误信息:

ValueError: fmt has wrong number of % formats: %i %i

我的脚本对大型结构化数组执行完全相同的操作,并且当我在 1-2 年前使用它时它们可以正常工作。

我不知道发生了什么。进行列选择后,数组 dtype 对象具有附加属性 offsets 和 itemize。这会导致错误吗?

In [131]: arr
Out[131]: 
array([(0, 0., 0, 0), (0, 0., 0, 0), (0, 0., 0, 0)],
     dtype=[('w', '<i8'), ('x', '<f8'), ('y', '<i8'), ('z', '<i8')])

In [132]: arr[['w','y']]
Out[132]: 
array([(0, 0), (0, 0), (0, 0)],
     dtype={'names':['w','y'], 'formats':['<i8','<i8'], 'offsets':[0,16], 'itemsize':32})

我该如何解决这个问题? 谢谢!

【问题讨论】:

  • 最近的版本改变了多字段索引。它现在产生一个视图。 savetxt 尝试格式化行的元组版本,例如tuple(arr[['w','y']][0])。我自己没有尝试过,但它会带来问题并不感到惊讶。 recfunctions 有一个 repack_fields 函数,可以制作干净的副本。

标签: python arrays numpy structured-array


【解决方案1】:
In [66]: arr = np.zeros(3, dtype=[('w', int), ('x', float), ('y', int), ('z', "i8")])                  
In [67]: arr                                                                                           
Out[67]: 
array([(0, 0., 0, 0), (0, 0., 0, 0), (0, 0., 0, 0)],
      dtype=[('w', '<i8'), ('x', '<f8'), ('y', '<i8'), ('z', '<i8')])

它对我有用:

In [71]: np.savetxt('ValueError.txt', arr[['w','y']], fmt="%i %i")                                     
In [72]: cat ValueError.txt                                                                            
0 0
0 0
0 0

我怀疑savetxt's 格式化“行”的方式:

In [73]: tuple(arr[['w','y']][0])                                                                      
Out[73]: (0, 0)

我的版本:

In [74]: np.__version__                                                                                
Out[74]: '1.18.2'

在任何情况下都可以清理字段选择:

In [76]: import numpy.lib.recfunctions as rf                                                           
In [77]: rf.repack_fields(arr[['w','y']])                                                              
Out[77]: array([(0, 0), (0, 0), (0, 0)], dtype=[('w', '<i8'), ('y', '<i8')])
In [78]: np.savetxt('ValueError.txt', _77, fmt="%i %i")  

对多字段索引的修改发生在多个版本中,因此您可能有一个版本不太正确。

【讨论】:

  • 太棒了!谢谢!我的版本是 1.16.2。重新打包字段有效!
猜你喜欢
  • 2021-07-29
  • 2018-03-14
  • 2017-05-28
  • 2013-12-12
  • 2020-02-16
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
相关资源
最近更新 更多