实现奇异的复杂数字与numpy一起使用

时间:2011-10-26 08:39:15

标签: python numpy scipy

我正在使用python + numpy + scipy对复数数组进行卷积滤波。

field = np.zeros((field_size, field_size), dtype=complex)
...
field = scipy.signal.convolve(field, kernel, 'same')

所以,当我想在numpy中使用复杂数组时,我需要做的就是传递dtype = complex参数。 对于我的研究,我需要实现另外两种类型的复数:dual(i * i = 0)和double(i * i = 1)。这不是什么大问题 - 我只需要复杂数字的python源代码并更改乘法函数。 问题是:如何制作那些奇特数字类型的numpy数组?

3 个答案:

答案 0 :(得分:4)

您似乎正在尝试为例如创建新的dtype双数字。可以使用以下代码执行此操作:

dual_type = np.dtype([("a", np.float), ("b", np.float)])
dual_array = np.zeros((10,), dtype=dual_type)

然而这只是一种存储数据类型的方式,并没有告诉他们所服从的特殊代数的任何内容。

您可以通过继承numpy.ndarray并覆盖相关的成员函数(例如__mul__进行乘法等)来部分实现所需的效果。这应该对任何python代码都可以正常工作,但我相当确定任何基于C或fortran的例程(即大多数numpy和scipy)都会直接乘以数字,而不是调用__mul__。我怀疑convolve会落入这个篮子里,因此它不会尊重你定义的规则,除非你编写了自己的纯python版本。

答案 1 :(得分:1)

这是我的解决方案:

from iComplex import SplitComplex as c_split
...
ctype = c_split
constructor = np.vectorize(ctype, otypes=[np.object])
field = constructor(np.zeros((field_size, field_size)))

这是创建numpy对象数组的简单方法。 怎么样scipy.signal.convolve - 它似乎不适用于我的复杂数字,我不得不自己进行卷积,它的工作速度非常慢。所以现在我正在寻找加快速度的方法。

答案 2 :(得分:0)

是否可以将内心彻底改变?我的意思是代替一个数组作为外部容器,容纳小容器,将一对浮点值作为一个复数,转过来,使你的复数是外容器。你有两个数组,一个是普通浮点数作为实部,另一个数组是虚部。基本的超快速卷积器可以完成它的工作,尽管你必须编写代码才能使用它四次,对于这两个因素的实/虚的所有组合。

在彩色图像处理中,我经常将我的代码重构为使用RGB值数组到三个标量值数组,并且由于更简单的卷积和其他操作在字节数组或浮点数上运行得更快,因此发现了良好的加速

YMMV,因为复合体(或颜色)的组成部分的位置可能很重要。