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

Jas*_*n R 14 python numpy

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

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

我还考虑了另一种基于用NumPy 注册用户定义类型的方法.如果它能够正常工作,那么去C API进行设置我没有问题.但是,类型描述符结构文档似乎表明类型的kind字段仅支持有符号/无符号整数,浮点和复杂浮点数字类型.目前尚不清楚我是否能够在任何地方尝试定义复杂的整数类型.

关于可行的方法的任何建议?

编辑:还有一件事; 我选择的任何方案都必须适合包装现有的复数整数缓冲区而不执行复制.也就是说,我希望能够使用PyArray_SimpleNewFromData()将缓冲区暴露给Python,而不必首先复制缓冲区.缓冲区已经是交错的实/虚格式,并且可以是int8_t或的数组int16_t.

Gre*_*len 12

我还处理大量复杂的整数数据,通常是基数数据.我用

dtype = np.dtype([('re', np.int16), ('im', np.int16)])
Run Code Online (Sandbox Code Playgroud)

它并不完美,但它充分描述了数据.我用它来加载到内存中而不会增加数据的大小.它还具有能够使用HDF5透明地加载和存储的优点.

DATATYPE  H5T_COMPOUND {
    H5T_STD_I16LE "re";
    H5T_STD_I16LE "im";
}
Run Code Online (Sandbox Code Playgroud)

使用它很简单,只是不同.

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')])
Run Code Online (Sandbox Code Playgroud)

要用它做数学,我转换为本机复杂浮点类型.显而易见的方法不起作用,但也不是那么难.

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)
Run Code Online (Sandbox Code Playgroud)

最后一种转换方法受到/sf/answers/396091251/的启发