我有点困惑,因为我在1-2年前运行代码时,这是以前的工作方式。
我有一个具有不同数据类型和列名的大型结构化numpy数组。如果我提供一个格式字符串(fmt)来描述每个列的数据类型,我可以用numpy.savetxt()保存它。但是,如果我想通过数组[‘colname1’,'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有错误的%格式数:%i %i
我的脚本和大型结构化数组完全一样,我在1-2年前使用它时它们也能工作。
我不知道发生了什么事。在进行列选择之后,数组dtype对象具有附加的属性偏移量和项大小。这会导致错误吗?
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})我怎么才能解决这个问题?谢谢!
发布于 2020-04-12 01:09:38
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") 多字段索引的重新工作发生在多个版本上,因此您可能有一个不太正确的索引。
https://stackoverflow.com/questions/61165076
复制相似问题