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

Convert an array of integers into a SymPy matrix of their ratios

我想将 3D 整数数组更改为 SymPy 有理数矩阵。我知道我应该使用 SympyRationalMatrix),但我不知道该怎么做。

例如,

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

应该变成

2 1/3 3/2
4/3 5/2 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 错误。)