我试图在Python中实现simplex方法,所以我需要在数组上使用高斯消元法。通常会出现分数,为了更清晰和精确,我想保留分数形式而不是使用浮点数。 我知道'分数'模块,但我努力使用它。我使用这个模块编写了我的代码,但数组总是返回浮点数。是不是可以打印出里面有分数的数组? 在这个基本的例子上:
>>> 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总是切换到花车
答案 0 :(得分:2)
由于Fraction
不是native NumPy dtype,要将Fraction
存储在NumPy数组中,您需要convert the array到object
dtype:
import numpy as np
from fractions import Fraction
A = np.array([[-1., 1.],
[-2., -1.]]) # <-- creates an array with a floating-point dtype (float32 or float64 depending on your OS)
A = A.astype('object')
A[0, 0] = Fraction(2,3)
print(A)
打印
[[Fraction(2, 3) 1.0]
[-2.0 -1.0]]
PS。如user2357112 suggests,如果您希望使用有理数字,最好使用sympy
。或者,只是将矩阵表示为列表列表。如果你的数组是object
dtype,那么使用NumPy没有速度优势。
import sympy as sy
A = [[-1., 1.],
[-2., -1.]]
A[0][0] = sy.Rational('2/3')
print(A)
打印
[[2/3, 1.0], [-2.0, -1.0]]
答案 1 :(得分:0)
您还可以通过在算术运算下滥用numpy数组的逐元素转换,将整个数组转换为Fraction
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)
s。)
Fraction
使用此格式的数组,执行的任何进一步算术将超过In [41]: arr = np.zeros((4,3,2), int)
In [42]: x = np.arange(12).reshape(2,3,2)
In [43]: arr[:2,:,:] = x
In [44]: arr
Out[44]:
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]],
[[ 0, 0],
[ 0, 0],
[ 0, 0]],
[[ 0, 0],
[ 0, 0],
[ 0, 0]]])
类型的元素。