【问题标题】:Converting numpy Void array to record array?将numpy Void数组转换为记录数组?
【发布时间】: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


【解决方案1】:

只要字节数匹配,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')])

我经常需要尝试确定astypeview 是否是转换结构化数组的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2021-12-29
    • 2017-03-08
    • 1970-01-01
    • 2021-03-10
    • 2016-01-21
    • 2011-11-27
    相关资源
    最近更新 更多