如何在 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 中实现定点二进制支持的主要内容,如果未能解决你的问题,请参考以下文章

如何在任何编译器中实现int?

如何在SQL中实现区分大小写的查询

如何在 Numpy 中实现 ReLU 函数

如何在matlab中实现灰度形态检测灰度图像上的圆形物体?

在 Java 中实现多维度的 Adaboost

在我的二进制堆/优先级队列实现中实现删除时遇到问题