реализация экзотических комплексных чисел для использования с NumPy - PullRequest
2 голосов
/ 26 октября 2011

Я использую python + numpy + scipy, чтобы выполнить некоторую сверточную фильтрацию массива комплексных чисел.

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

Итак, когда я хочу использовать сложный массив в numpy, все, что мне нужно сделатьэто передать dtype = комплексный параметр.Для моего исследования мне нужно реализовать два других типа комплексных чисел: двойные (i * i = 0) и двойные (i * i = 1).Это не имеет большого значения - я просто беру исходный код python для комплексных чисел и меняю функцию умножения.Проблема: как мне создать массив из этих экзотических числовых типов?

Ответы [ 3 ]

4 голосов
/ 27 октября 2011

Похоже, вы пытаетесь создать новый тип d например. двойные числа. Это можно сделать с помощью следующего кода:

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 голос
/ 16 ноября 2011

Вот мое решение:

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)))

Это простой способ создать массив пустых объектов. А как насчет scipy.signal.convolve - кажется, он не работает с моими комплексными числами, и мне пришлось сделать свою собственную свертку, и она работает до смерти Так что теперь я ищу способы ускорить его.

0 голосов
/ 16 ноября 2011

Будет ли работать, чтобы вывернуть вещи наизнанку? Я имею в виду вместо массива в качестве внешнего контейнера, содержащего небольшие контейнеры, содержащие пару значений с плавающей запятой в виде комплексного числа, переверните его так, чтобы комплексным числом был внешний контейнер. У вас будет два массива, один из которых представляет собой обычную часть с плавающей точкой, а другой - как воображаемую часть. Базовый сверхбыстрый конволвер может выполнять свою работу, хотя вам придется написать код, чтобы использовать его четыре раза для всех комбинаций реального / мнимого двух факторов.

При обработке цветных изображений я часто реорганизовывал свой код с использования массивов значений RGB на три массива скалярных значений и находил хорошее ускорение из-за более простых сверток и других операций, работающих намного быстрее с массивами байтов или чисел .

YMMV, поскольку местность компонентов комплекса (или цвета) может быть важной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...