负荷给出值错误:descr不是有效的数据类型描述符:

2024-05-15 02:33:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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}方面是否有什么可以做的?谢谢。


Tags: 文件程序heresavemaxdoublevectorcd1
2条回答

根据您提供的示例中npy_save()参数的格式,您有一个bug。在

而不是

cnpy::npy_save(frmsd,&vrmsd,{nfeat},"w");

你想要

^{pr2}$

如果你想从numpy的角度来解决这个问题……那么,你可能不想修改numpy来理解非标准的descr字符串,而且我怀疑即使你把descr字符串当作声明你会得到垃圾的东西。在

但是你可以做一个简单的解决办法。在

如果打开二进制文件,它应该以如下内容开头:

\x93NUMPY\x01\x00v\x00{'descr': '<?24', 'fortran_order': False, 'shape': (30, 20), }

…后面是一个空白,后面是一些空白。在

您可以在十六进制编辑器或文本编辑器中仔细编辑,或者使用Python代码以二进制模式打开文件,读取文件,对字节执行一些常规字符串操作,然后将其写回。在

特别是,看起来像Python dict repr的部分实际上就是这样的,并且这些值的含义正是您所认为的。加载文件的结果是试图创建一个np.dtype('<?24'),这就是错误的来源。在

如果您只需编辑descrshape值,并确保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个不同的酒精。在

你怎么做到的?只需将descr字符串改为'?',将shape改为(30, 20, 24),现在你得到了一个30x20x24布尔数组,如果你切片[..., 0],你将得到一个30x20的布尔数组。或者,'24?'可以这样做而不需要更改shape。在

问题是,你的C++值是双倍的,而不是布尔值。在

希望它只是用little-endian格式写双精度数,每一个后面都有16个额外的0字节。如果是这样,只需将descr改为'<f8',将shape改为(30, 20, 3),看看你得到了什么。如果第一个(30, 20)是您想要的数组,而另外两个都是零,那么就完成了;只需对它进行切片。(如果你想减少内存使用,也许ascontiguous也可以

相关问题 更多 >

    热门问题