<p>如果你想从numpy的角度来解决这个问题……那么,你可能不想修改numpy来理解非标准的descr字符串,而且我怀疑即使你把descr字符串当作声明你会得到垃圾的东西。在</p>
<p>但是你可以做一个简单的解决办法。在</p>
<p>如果打开二进制文件,它应该以如下内容开头:</p>
<pre><code>\x93NUMPY\x01\x00v\x00{'descr': '<?24', 'fortran_order': False, 'shape': (30, 20), }
</code></pre>
<p>…后面是一个空白,后面是一些空白。在</p>
<p>您可以在十六进制编辑器或文本编辑器中仔细编辑,或者使用Python代码以二进制模式打开文件,读取文件,对字节执行一些常规字符串操作,然后将其写回。在</p>
<p>特别是,看起来像Python dict repr的部分实际上就是这样的,并且这些值的含义正是您所认为的。加载文件的结果是试图创建一个<code>np.dtype('<?24')</code>,这就是错误的来源。在</p>
<p>如果您只需编辑<code>descr</code>和<code>shape</code>值,并确保dict repr的长度相同(通过填充空格),那么您可以<code>load</code>。在</p>
<p>那么,<code><?24</code>是什么意思?好吧,它不是<a href="https://www.python.org/dev/peps/pep-3118/" rel="nofollow noreferrer">PEP 3118</a>和{a2}指定的有效格式,但它确实符合numpy对该格式的扩展模式。例如,在numpy中,您可以指定<code>f8</code>,意思是“与<code>f</code>相同,但是是8个字节”。因此,假设这意味着<code>?</code>的一个24字节的小尾数版本,如果用C99编译,则意味着<code>_Bool</code>,如果不是,则在Python中被解释为<code>bool</code>。在</p>
<p>所以,如果numpy允许这个descr指定一个数据类型,那么它意味着每个单元都是24个字节,被解释为一个小的endian整数,解释为bool。当然,numpy不知道如何处理除1、2、4或8字节以外的任何长度的整数,并且它希望bool是1字节,所以这是不允许的。但你可以读到24个不同的酒精。在</p>
<p>你怎么做到的?只需将<code>descr</code>字符串改为<code>'?'</code>,将<code>shape</code>改为<code>(30, 20, 24)</code>,现在你得到了一个30x20x24布尔数组,如果你切片<code>[..., 0]</code>,你将得到一个30x20的布尔数组。或者,<code>'24?'</code>可以这样做而不需要更改<code>shape</code>。在</p>
问题是,你的C++值是双倍的,而不是布尔值。在</p>
<p>希望它只是用little-endian格式写双精度数,每一个后面都有16个额外的0字节。如果是这样,只需将<code>descr</code>改为<code>'<f8'</code>,将<code>shape</code>改为<code>(30, 20, 3)</code>,看看你得到了什么。如果第一个<code>(30, 20)</code>是您想要的数组,而另外两个都是零,那么就完成了;只需对它进行切片。(如果你想减少内存使用,也许<code>ascontiguous</code>也可以</p>