【发布时间】: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