我想创建包含复杂整数值的 numpy.ndarray
对象。 NumPy 确实内置了复杂的支持,但仅适用于浮点格式(float
和 double
);例如,我可以使用 dtype='cfloat'
创建一个 ndarray
,但是没有类似的 dtype='cint16'
。我希望能够创建包含使用 8 位或 16 位整数表示的复数值的数组。
我找到了 this mailing list post from 2007有人询问此类支持的地方。他们推荐的唯一解决方法涉及定义一个新的 dtype
来保存整数对。这似乎将每个数组元素表示为两个值的元组,但不清楚还需要完成哪些其他工作才能使生成的数据类型与算术函数无缝配合。
我还考虑了另一种基于 registration of user-defined types 的方法与 NumPy。如果它运行良好,我对使用 C API 进行设置没有任何问题。然而,documentation for the type descriptor strucure似乎表明该类型的 kind
字段仅支持有符号/无符号整数、 float 和复数 float 类型。目前尚不清楚我是否能够尝试定义复杂的整数类型。
对于可能有效的方法有哪些建议?
无论我选择什么方案,它都必须能够在不执行复制的情况下包装现有的复杂整数缓冲区。也就是说,我希望能够使用 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')])
为了用它做数学运算,我将其转换为原生的复杂浮点类型。显而易见的方法行不通,但也没有那么难。
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)
最后一种转换方法的灵感来自 an answer to What's the fastest way to convert an interleaved NumPy integer array to complex64?
关于python - 是否可以创建一个包含复杂整数的 numpy.ndarray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13863523/