【发布时间】:2017-09-12 20:10:45
【问题描述】:
我有一个 numpy 数组,其中包含 8 个 16 字节长的 void 记录,如下所示:
array([[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]],
dtype='|V16')
并且需要将其转换为具有 8 个 16B 长的自定义 dtype 记录的数组,如下所示:
[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]
我怎样才能做到这一点?
我试过array.astype(self.dtype, copy=False, casting="unsafe"),
但我明白了
ValueError: 使用序列设置数组元素。
这对我来说没有多大意义。
此数据来自 PyOpenCL(内存映射缓冲区),我无法真正更改输入格式或 dtype。
【问题讨论】:
-
numpy.ndarray.view可能会这样做,或者可能有更具体和更安全的工具,但我会质疑是否真的不可能更改输入格式。 -
numpy.ndarray.view工作得很好,谢谢。你能把它变成一个答案,所以我可以接受吗? PyOpencl 中有一个用于控制 dtype 的旋钮,但它似乎只适用于简单的 dtype,而不适用于记录。这很可能是一个错误,但即使正确修复它,view可能仍然是必要的。
标签: python arrays numpy pyopencl