如何在 numpy 中实现定点二进制支持
Posted
技术标签:
【中文标题】如何在 numpy 中实现定点二进制支持【英文标题】:How to implement fixed-point binary support in numpy 【发布时间】:2019-08-29 04:06:29 【问题描述】:我有一个自制的二进制定点算术支持库,并想添加 numpy 数组支持。具体来说,我希望能够传递定点二进制数的二维数组并对它们进行各种操作,例如加法、减法、乘法、舍入、更改定点格式等。
引擎盖下的定点支持适用于整数,并单独跟踪定点格式数据(整数和小数位数)以进行范围检查和类型转换。
我一直在阅读关于 ndarray 子类化和 dtype 的 numpy 文档,看来我可能需要至少一个自定义 dtype,或者为定点数的每个唯一范围/精度配置单独的 dtype 对象。我尝试在 Python 中对 numpy.dtype 进行子类化,但这是不允许的。
我不确定是否可以在不编写 C 级代码的情况下以我想要的方式编写与 numpy 互操作的东西 - 到目前为止一切都是纯 Python,我避免在幕后研究如何在 C 上工作-基于 numpy 的层。
【问题讨论】:
有什么问题? 【参考方案1】:对于任何感兴趣的人来说,这在 Python 扩展的 Numpy 中太难了,或者只是不适合数据模型。我最终编写了一个单独的 Python 类型库来实现我想要的行为,它在引擎盖下使用 Numpy 整数数组来提高速度。 它工作正常,可以进行我想要的严格的二进制范围计算和检查,但会遭受 Python 代码速度开销,尤其是对于小型数组。如果我有时间,我相信它可以作为 C 库做得更好/更快。
【讨论】:
你的图书馆开放了吗? @Daniel 对不起,不。它归我的前雇主所有。【参考方案2】:python 的库 fxpmath 支持用于定点数和逻辑和算术运算的 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
【讨论】:
我看了一眼。看起来你想在进行右移/左移时在 int 和 frac 之间移动位。以上是关于如何在 numpy 中实现定点二进制支持的主要内容,如果未能解决你的问题,请参考以下文章