Как реализовать двоичную поддержку фиксированной точки в numpy

У меня есть доморощенная библиотека поддержки двоичной арифметики с фиксированной точкой, и я хотел бы добавить поддержку массива numpy. В частности, я хотел бы иметь возможность передавать двумерные массивы двоичных чисел с фиксированной точкой и выполнять над ними различные операции, такие как сложение, вычитание, умножение, округление, изменение формата фиксированной точки и т. д.

Внутренняя поддержка фиксированной точки работает с целыми числами и раздельным отслеживанием данных формата с фиксированной точкой (количество целых и дробных битов) для проверки диапазона и преобразования типов.

Я читал документацию numpy по подклассам ndarray и dtype, похоже, мне может понадобиться хотя бы собственный dtype или отдельный объект dtype для каждой уникальной конфигурации диапазона/точности чисел с фиксированной точкой. Я пытался создать подкласс numpy.dtype в Python, но это не разрешено.

Я не уверен, смогу ли я написать что-то для взаимодействия с numpy так, как я хочу, без написания кода уровня C - пока все это чистый Python, я избегал заглядывать под одеяло, как работать на слое C на основе тупой.


person blueshift    schedule 29.08.2019    source источник
comment
Какой вопрос?   -  person Mad Physicist    schedule 29.08.2019


Ответы (2)


Для всех, кто интересуется, это оказалось слишком сложно сделать в Python, расширенном Numpy, или просто не соответствовало модели данных. В итоге я написал отдельную библиотеку типов Python, реализующую желаемое поведение, которая использует массивы целых чисел Numpy под капотом для скорости. Он работает нормально и выполняет строгий расчет двоичного диапазона и проверку, которые я хотел, но страдает от накладных расходов кода Python, особенно с небольшими массивами. Если бы у меня было время, я уверен, что это можно было бы сделать намного лучше/быстрее, чем библиотека C.

person blueshift    schedule 25.11.2019
comment
Вы открыли свою библиотеку? - person Daniel; 22.12.2020
comment
@ Даниэль, извини, нет. Он принадлежит моему бывшему работодателю. - person blueshift; 16.06.2021

Библиотека fxpmath для python поддерживает Numpy N-мерные массивы для чисел с фиксированной точкой, а также логические и арифметические операции. Вы можете найти информацию по адресу:

https://github.com/francof2a/fxpmath

пример:

from fxpmath import Fxp

# ndim list as input
x = Fxp([[-1.5, 2.5], [0.125, 7.75]])

# ndim list of binary strings
y = Fxp([['0b1100', '0b0110'], ['0b0000', '0b1111']], signed=True, n_frac=2)

import numpy as np
# numpy ndarrays as inputs
z1 = Fxp(np.random.uniform(size=(100,20)), signed=True, n_word=8, n_frac=6)
z2 = Fxp(np.random.uniform(size=(100,20)), signed=True, n_word=8, n_frac=6)
# some operation
z = z1 + z2
person francof2a    schedule 14.05.2020
comment
Я взглянул на него. Похоже, вы хотите перемещать биты между int и frac при сдвиге вправо/влево. - person blueshift; 18.05.2020