是否可以创建一个包含复杂整数的numpy.ndarray?

发布于 2021-01-29 15:26:39

我想创建numpy.ndarray在其中包含复杂整数值的对象。NumPy确实内置了复杂的支持,但仅适用于浮点格式(floatdouble)。例如,我可以创建一个ndarraywith
dtype='cfloat',但没有类似之处dtype='cint16'。我希望能够创建包含使用8位或16位整数表示的复杂值的数组。

从2007年发现了此邮件列表帖子,那里有人询问这种支持。他们建议的唯一解决方法是定义一个dtype包含整数对的新方法。这似乎将每个数组元素表示为2个值的元组,但是尚不清楚为了使所得的数据类型与算术函数无缝地工作,还需要做哪些其他工作。

我还考虑了另一种基于用户定义类型向NumPy注册的方法。如果运行良好,我可以使用C
API进行设置。但是,有关类型描述符结构文档似乎建议类型kind字段仅支持有符号/无符号整数,浮点数和复杂的浮点数字类型。尚不清楚我是否能够尝试定义复杂的整数类型。

关于可行的方法有什么建议吗?

编辑:还有
一件事;我选择的任何方案都必须能够包装现有的复杂整数缓冲区而无需执行复制。也就是说,我希望能够用于PyArray_SimpleNewFromData()将缓冲区公开给Python,而不必先创建缓冲区的副本。缓冲区将已经是交错的实/虚格式,并且将是int8_t或的数组int16_t

关注者
0
被浏览
148
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我还处理许多复杂的整数数据,通常是基带数据。我用

    dtype = np.dtype([('re', np.int16), ('im', np.int16)])
    

    它不是完美的,但是可以充分描述数据。我将其用于加载到内存中,而不会增加数据大小。它还具有能够通过HDF5透明加载和存储的优点。

    DATATYPE  H5T_COMPOUND {
        H5T_STD_I16LE "re";
        H5T_STD_I16LE "im";
    }
    

    使用它很简单,只是有所不同。

    x = np.zeros((3,3),dtype)
    x[0,0]['re'] = 1
    x[0,0]['im'] = 2
    x
    >> array([[(1, 2), (0, 0), (0, 0)],
    >>        [(0, 0), (0, 0), (0, 0)],
    >>        [(0, 0), (0, 0), (0, 0)]], 
    >>  dtype=[('re', '<i2'), ('im', '<i2')])
    

    为了进行数学运算,我将其转换为本机复杂的float类型。显而易见的方法行不通,但也不难。

    y = x.astype(np.complex64) # doesn't work, only gets the real part
    y = x['re'] + 1.j*x['im']  # works, but slow and big
    y = x.view(np.int16).astype(np.float32).view(np.complex64)
    y
    >> array([[ 1.+2.j,  0.+0.j,  0.+0.j],
    >>        [ 0.+0.j,  0.+0.j,  0.+0.j],
    >>        [ 0.+0.j,  0.+0.j,  0.+0.j]], dtype=complex64)
    

    最后一种转换方法受https://stackoverflow.com/a/5658446/1784179启发



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看