【发布时间】:2012-12-01 13:26:15
【问题描述】:
我想创建 numpy.ndarray 对象,其中包含复杂的整数值。 NumPy 确实具有内置的复杂支持,但仅适用于浮点格式(float 和 double);例如,我可以用dtype='cfloat' 创建一个ndarray,但没有类似的dtype='cint16'。我希望能够创建包含使用 8 位或 16 位整数表示的复杂值的数组。
我在this mailing list post from 2007 找到有人询问此类支持。他们建议的唯一解决方法是定义一个新的 dtype 来保存整数对。这似乎将每个数组元素表示为 2 个值的元组,但尚不清楚需要完成哪些其他工作才能使生成的数据类型与算术函数无缝协作。
我还考虑了另一种基于 registration of user-defined types 和 NumPy 的方法。如果它运行良好,我没有问题去 C API 进行设置。但是,documentation for the type descriptor strucure 似乎表明该类型的 kind 字段仅支持有符号/无符号整数、浮点和复数浮点数值类型。目前尚不清楚我是否能够尝试定义一个复杂的整数类型。
对可行的方法有什么建议吗?
编辑:还有一件事;我选择的任何方案都必须能够在不执行复制的情况下包装现有的复杂整数缓冲区。也就是说,我希望能够使用 PyArray_SimpleNewFromData() 将缓冲区公开给 Python,而不必先复制缓冲区。缓冲区已经是交错的实数/虚数格式,并且可以是int8_t 或int16_t 的数组。
【问题讨论】:
-
这很漂亮 - 非标准。你如何定义这种类型的划分?例如,如果你做
(2+1j)/(3+0j),你会期待什么?你希望它给你一个复杂的结果还是(0+0j)? -
出于好奇,在信号处理中何时使用复数?我想不出来的例子。
-
这很愚蠢。只需使用浮点运算完成工作,并沿途假设所有浮点值。然后您将不会面临类型转换(因为您期望浮动)。我已经为 NumPy 中的工作编写了许多数字信号处理模块,即使在处理特别依赖于高斯整数属性的事物(例如根轨迹工作或一些特殊的拉普拉斯变换)时,这种类型转换也从来不是问题。不是从性能(速度、四舍五入)的角度,也不是从数学的角度。
-
@EMS:我完全理解使用整数进行复杂算术的缺点。但是,您的论点对这个问题不是很有建设性。我只想说我有一个要求,有时需要与格式化为整数的复杂数据进行交互。
-
只是为了添加到讨论中,我也有复杂整数的要求。它基本上用于对算法的定点实现进行建模。这绝对是不罕见的。也就是说,在我的情况下,它可以使用具有适当舍入的浮点复数值来解决(因为我只处理乘法)。