我正在尝试在 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
数组。 (注意:这要求原始数组是整数数组,因为 float
和 Fractions
之间的算术会产生 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(例如,int32
、float64
等);这些函数往往是 C/Cython 优化的例程,仅适用于 C 原语。并且因为 fractions.Fraction
是一个 Python 对象,这些函数将无法处理 Fraction
的数组。
正如其他地方提到的,与在 NumPy 上运行相比,即使是在 Fraction
数组上工作的函数在它们上运行速度也会明显变慢原始数据类型数组。
但是,如果您只是需要您的应用程序的自定义数值对象,例如任意精度有理数类型 Fraction
或以 10 为底的浮点类型 decimal.Decimal
,并希望使用例如对数组进行逐元素操作,您可以使用 NumPy 数组通过上述方法或类似方法实现这一点。
但它不像使用基元数组那样快速或得到很好的支持,所以就个人而言,如果我不需要自定义数字类型,我只使用 float64
或int64
关于python - 如何使用带有分数的 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42577828/