Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在将numpy Void数组转换为记录数组?_Python_Arrays_Numpy_Pyopencl - Fatal编程技术网

Python 正在将numpy Void数组转换为记录数组?

Python 正在将numpy Void数组转换为记录数组?,python,arrays,numpy,pyopencl,Python,Arrays,Numpy,Pyopencl,我有一个numpy数组,其中包含8个16字节长的无效记录,如下所示: 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],

我有一个numpy数组,其中包含8个16字节长的无效记录,如下所示:

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')
[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]
需要将其强制转换为一个具有8条16B长的自定义数据类型记录的数组,如下所示:

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')
[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]
我怎样才能做到这一点

我尝试了array.astypeself.dtype,copy=False,casting=safe, 但我明白了

ValueError:使用序列设置数组元素

这对我来说没什么意义


这些数据来自PyOpenCL内存映射缓冲区,我无法真正更改输入格式或数据类型。

只要字节数匹配,view就可以进行这种转换。它只是改变了“查看”数据缓冲区的方式

In [36]: dt=np.dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [37]: dt
Out[37]: dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])

In [39]: x = np.zeros((3,), dtype=dt)
In [40]: x
Out[40]: 
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)],
      dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [41]: x.view('|V16')
Out[41]: 
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]],
      dtype='|V16')
In [42]: x.view('|V16').view(dt)
Out[42]: 
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)],
      dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
我经常需要进行实验,以确定aType或view是否是转换结构化数组的正确方法。

可能会这样做,或者可能会有更具体、更安全的工具,但我怀疑是否真的不可能更改输入格式。numpy.ndarray.view工作得很好,谢谢。你能把它做成一个答案,让我接受吗?PyOpencl中有一个控制数据类型的旋钮,但它似乎只适用于简单的数据类型,而不适用于记录。这很可能是一个bug,但视图可能仍然是必要的,即使要正确修复它。