我在C++程序中使用^ {CD2>}:
编写了一个^ {CD1>}文件vector < double > vrmsd(max,99.9);
.
.
.
cnpy::npy_save(frmsd,&vrmsd,{nfeat},"w");
下面是here。
但是当我尝试使用^{cd3>}加载文件时,会出错
^{pr2}$
ValueError: descr is not a valid dtype descriptor: '<?24'
下面我粘贴^{cd4>}的结果,用于包含长度2的^{cd6>}文件(应包含46.950,43.94):
^{pr3}$此问题也已发布到^{cd2>}github站点。只是想知道在^{cd3}方面是否有什么可以做的?谢谢。
根据您提供的示例中
npy_save()
参数的格式,您有一个bug。在而不是
你想要
^{pr2}$如果你想从numpy的角度来解决这个问题……那么,你可能不想修改numpy来理解非标准的descr字符串,而且我怀疑即使你把descr字符串当作声明你会得到垃圾的东西。在
但是你可以做一个简单的解决办法。在
如果打开二进制文件,它应该以如下内容开头:
…后面是一个空白,后面是一些空白。在
您可以在十六进制编辑器或文本编辑器中仔细编辑,或者使用Python代码以二进制模式打开文件,读取文件,对字节执行一些常规字符串操作,然后将其写回。在
特别是,看起来像Python dict repr的部分实际上就是这样的,并且这些值的含义正是您所认为的。加载文件的结果是试图创建一个
np.dtype('<?24')
,这就是错误的来源。在如果您只需编辑
descr
和shape
值,并确保dict repr的长度相同(通过填充空格),那么您可以load
。在那么,
<?24
是什么意思?好吧,它不是PEP 3118和{a2}指定的有效格式,但它确实符合numpy对该格式的扩展模式。例如,在numpy中,您可以指定f8
,意思是“与f
相同,但是是8个字节”。因此,假设这意味着?
的一个24字节的小尾数版本,如果用C99编译,则意味着_Bool
,如果不是,则在Python中被解释为bool
。在所以,如果numpy允许这个descr指定一个数据类型,那么它意味着每个单元都是24个字节,被解释为一个小的endian整数,解释为bool。当然,numpy不知道如何处理除1、2、4或8字节以外的任何长度的整数,并且它希望bool是1字节,所以这是不允许的。但你可以读到24个不同的酒精。在
你怎么做到的?只需将
问题是,你的C++值是双倍的,而不是布尔值。在descr
字符串改为'?'
,将shape
改为(30, 20, 24)
,现在你得到了一个30x20x24布尔数组,如果你切片[..., 0]
,你将得到一个30x20的布尔数组。或者,'24?'
可以这样做而不需要更改shape
。在希望它只是用little-endian格式写双精度数,每一个后面都有16个额外的0字节。如果是这样,只需将
descr
改为'<f8'
,将shape
改为(30, 20, 3)
,看看你得到了什么。如果第一个(30, 20)
是您想要的数组,而另外两个都是零,那么就完成了;只需对它进行切片。(如果你想减少内存使用,也许ascontiguous
也可以相关问题 更多 >
编程相关推荐