python - 如何使用带有分数的 numpy 数组?

标签 python arrays numpy fractions

我正在尝试在 Python 中实现单纯形法,因此我需要对数组使用高斯消元法。分数经常出现,为了更清晰和精确,我想保留分数形式而不是使用 float 。 我知道“分数”模块,但我很难使用它。我使用这个模块编写了我的代码,但返回的数组总是带有 float 。是不是可以打印一个里面有分数的数组? 在这个基本示例中:

>>> A
array([[-1.,  1.],
       [-2., -1.]])
>>> A[0][0] = Fraction(2, 3)
>>> A
array([[ 0.66666667,  1. ],
       [-2.        , -1. ]])

我想拥有

array([[2/3,    1. ],
       [-2.,   -1. ]])

似乎 numpy 总是切换到 float

最佳答案

您还可以通过在算术运算下滥用 numpy 数组的逐元素转换,将整个数组转换为 fraction 对象的 object 数组。 (注意:这要求原始数组是整数数组,因为 floatFractions 之间的算术会产生 float。)

>>> A = np.array([[-1,  1],[-2, -1]])
array([[-1,  1],
       [-2, -1]])
>>>
>>> A.dtype
dtype('int64')
>>>
>>> A = A + Fraction()
>>> A
array([[Fraction(-1, 1), Fraction(1, 1)],
       [Fraction(-2, 1), Fraction(-1, 1)]], dtype=object)

对于这种格式的数组,任何进一步的算术运算都将针对 Fraction 类型的元素。

编辑:免责声明

正如@Hi-Angel 在评论中提到的那样,有许多 NumPy/SciPy 函数(例如,np.linalg.inv)期望输入数组使用原语dtype(例如,int32float64 等);这些函数往往是 C/Cython 优化的例程,仅适用于 C 原语。并且因为 fractions.Fraction 是一个 Python 对象这些函数将无法处理 Fraction 的数组。

正如其他地方提到的,与在 NumPy 上运行相比,即使是在 Fraction 数组上工作的函数在它们上运行速度也会明显变慢原始数据类型数组。

但是,如果您只是需要您的应用程序的自定义数值对象,例如任意精度有理数类型 Fraction 或以 10 为底的浮点类型 decimal.Decimal,并希望使用例如对数组进行逐元素操作,您可以使用 NumPy 数组通过上述方法或类似方法实现这一点。

但它不像使用基元数组那样快速或得到很好的支持,所以就个人而言,如果我不需要自定义数字类型,我只使用 float64int64

关于python - 如何使用带有分数的 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42577828/

相关文章:

python - 更优雅/pythonic 的方式附加到数组,或创建它

python - 在 django 的模板上为我们获取当前使用的 url 面包屑?

c++ - 为什么 C++ 代码必须包含在函数中?

python - pandas python的算法思路

python - 使用 Python 构建 GeoJSON

arrays - 从映射函数返回多个值

sql - 用于检查数组中的枚举值的 PostgreSQL 函数

python - 优化 numpy 矩阵运算(当前使用 for 循环)

python - Hypar(双曲抛物面)的表面积

python - 在xarray中取一个 "nanmean"