是否可以创建一个包含复杂整数的numpy.ndarray?
我想创建numpy.ndarray
在其中包含复杂整数值的对象。NumPy确实内置了复杂的支持,但仅适用于浮点格式(float
和double
)。例如,我可以创建一个ndarray
with
dtype='cfloat'
,但没有类似之处dtype='cint16'
。我希望能够创建包含使用8位或16位整数表示的复杂值的数组。
我从2007年发现了此邮件列表帖子,那里有人询问这种支持。他们建议的唯一解决方法是定义一个dtype
包含整数对的新方法。这似乎将每个数组元素表示为2个值的元组,但是尚不清楚为了使所得的数据类型与算术函数无缝地工作,还需要做哪些其他工作。
我还考虑了另一种基于用户定义类型向NumPy注册的方法。如果运行良好,我可以使用C
API进行设置。但是,有关类型描述符结构的文档似乎建议类型kind
字段仅支持有符号/无符号整数,浮点数和复杂的浮点数字类型。尚不清楚我是否能够尝试定义复杂的整数类型。
关于可行的方法有什么建议吗?
编辑:还有
一件事;我选择的任何方案都必须能够包装现有的复杂整数缓冲区而无需执行复制。也就是说,我希望能够用于PyArray_SimpleNewFromData()
将缓冲区公开给Python,而不必先创建缓冲区的副本。缓冲区将已经是交错的实/虚格式,并且将是int8_t
或的数组int16_t
。
-
我还处理许多复杂的整数数据,通常是基带数据。我用
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启发