将整数数组转换为其比率的SymPy矩阵

时间:2018-04-17 19:37:35

标签: python matrix sympy rational-number

我想将3D整数数组更改为SymPy有理数矩阵。我知道我应该使用Sympy(Rational和Matrix),但我不知道它是怎么做的。

例如,

[[[2, 1], [1, 3], [3, 2]], [[4, 3], [5, 2], [0, 1]]]

应该成为

2 1/3 3/2
4/3 5/2 0 

A Picture of how it should look

1 个答案:

答案 0 :(得分:0)

方便的方法是create a matrix from a function如下:

from sympy import Matrix, S
a = [[[2, 1], [1, 3], [3, 2]], [[4, 3], [5, 2], [0, 1]]]
m, n = len(a), len(a[0])
b = Matrix(m, n, lambda i, j: S(a[i][j][0])/a[i][j][1])

以上假设数组是嵌套的Python列表。如果是NumPy 3D阵列,可以做

from sympy import Matrix, S
import numpy as np
a = np.array([[[2, 1], [1, 3], [3, 2]], [[4, 3], [5, 2], [0, 1]]])
m, n, _ = a.shape
b = Matrix(m, n, lambda i, j: S(a[i, j, 0])/a[i, j, 1])

关于S(x)/yRational(x, y)的注意事项:前者是将x转换为SymPy对象之前的除法。 (见SymPy numbers。) 这使得任何类型的整数外输入都是合理的。 Rational(x, y)是Rational对象的直接构造,使用Python整数作为输入很好,但是np.int64数据类型存在问题。因此,Rational(a[i, j, 0], a[i, j, 1])在第二个代码段中不起作用。 (可能是一个SymPy错误。)