首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用numpy.savetxt: ValueError: fmt保存结构化数组的单个列的%格式数错误

用numpy.savetxt: ValueError: fmt保存结构化数组的单个列的%格式数错误
EN

Stack Overflow用户
提问于 2020-04-11 23:44:18
回答 1查看 197关注 0票数 1

我有点困惑,因为我在1-2年前运行代码时,这是以前的工作方式。

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

举个例子。

保存整个数组可以工作:

代码语言:javascript
复制
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")

保存其中的两列并不是:

代码语言:javascript
复制
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对象具有附加的属性偏移量和项大小。这会导致错误吗?

代码语言:javascript
复制
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})

我怎么才能解决这个问题?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-04-12 01:09:38

代码语言:javascript
复制
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')])

它适用于我:

代码语言:javascript
复制
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格式化‘行’的方式:

代码语言:javascript
复制
In [73]: tuple(arr[['w','y']][0])                                                                      
Out[73]: (0, 0)

我的版本:

代码语言:javascript
复制
In [74]: np.__version__                                                                                
Out[74]: '1.18.2'

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

代码语言:javascript
复制
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")  

多字段索引的重新工作发生在多个版本上,因此您可能有一个不太正确的索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61165076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档