如何使用具有分数的numpy数组?

时间:2017-03-03 11:34:11

标签: python arrays numpy fractions

我试图在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总是切换到花车

2 个答案:

答案 0 :(得分:2)

由于Fraction不是native NumPy dtype,要将Fraction存储在NumPy数组中,您需要convert the arrayobject 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个对象数组。 (注意:这需要原始数组为整数数组,因为Fractionsfloat之间的算术产生>>> 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]]]) 类型的元素。