将 Mathematica 代码转换为 Python
Converting a Mathematica code into Python
我正在将 Mathematica 中的一些代码转换成 Python。假设我有以下列表:
l = [["x1", "x2", "x3"], ["x4", "x5", "x6"], ["x7", "x8"], ["x9",
"x10"], ["x11"]]
我想将上面的内容变成一个多项式,这样列表中每个元素的长度就是变量 x 的幂。在 Mathematica 中,我通过以下方式做到这一点:
Total[x^Map[Length, l]]
给出:
Output: x + 2 x^2 + 2 x^3
这意味着我在列表 l 中有 1 个长度为 1 的元素、2 个长度为 2 的元素和 2 个长度为 3 的元素。在 Python 中,我尝试了以下操作:
sum(x**map(len(l), l))
但这不起作用,因为 x 未定义,我也尝试使用 "x",但它也不起作用。我想知道如何翻译这样的代码。
您可以根据您的规格创建一个字符串,例如:
from itertools import groupby
l = [["x1", "x2", "x3"], ["x7", "x8"], ["x9", "x10"], ["x4", "x5", "x6"], ["x11"]]
g = groupby(sorted(l, key = len), key = len)
s = " + ".join([" ".join([str(len(list(i))), "* x **", str(j)]) for j, i in g])
print(s)
#output
#1 * x ** 1 + 2 * x ** 2 + 2 * x ** 3
但这只是一个字符串,而我从你的问题中假设你想稍后计算这个公式。
您可以为此使用 sympy:
import sympy as sym
l = [["x1", "x2", "x3"], ["x4", "x5", "x6"], ["x7", "x8"], ["x9", "x10"], ["x11"]]
x = sym.Symbol('x')
expr = sym.S.Zero
for exponent in map(len, l):
expr += x ** exponent
print(expr)
将给予:
2*x**3 + 2*x**2 + x
在这里,我创建了一个符号零单例 sympy.S.Zero
,然后我将 x
添加到我们可以从 map(len, l)
获得的那些幂。
print(list(map(len, l)))
将给予:
[3, 3, 2, 2, 1]
这是另一个使用 sympy 的解决方案:
from sympy import Matrix
from sympy.abc import x
l = [["x1", "x2", "x3"], ["x4", "x5", "x6"], ["x7", "x8"], ["x9", "x10"], ["x11"]]
powers = Matrix(list(map(len, l))) # Matrix([3, 3, 2, 2, 1])
raise_x_to_power = lambda y: x**y
output = sum(powers.applyfunc(raise_x_to_power))
print(output)
# 2*x**3 + 2*x**2 + x
我正在将 Mathematica 中的一些代码转换成 Python。假设我有以下列表:
l = [["x1", "x2", "x3"], ["x4", "x5", "x6"], ["x7", "x8"], ["x9",
"x10"], ["x11"]]
我想将上面的内容变成一个多项式,这样列表中每个元素的长度就是变量 x 的幂。在 Mathematica 中,我通过以下方式做到这一点:
Total[x^Map[Length, l]]
给出:
Output: x + 2 x^2 + 2 x^3
这意味着我在列表 l 中有 1 个长度为 1 的元素、2 个长度为 2 的元素和 2 个长度为 3 的元素。在 Python 中,我尝试了以下操作:
sum(x**map(len(l), l))
但这不起作用,因为 x 未定义,我也尝试使用 "x",但它也不起作用。我想知道如何翻译这样的代码。
您可以根据您的规格创建一个字符串,例如:
from itertools import groupby
l = [["x1", "x2", "x3"], ["x7", "x8"], ["x9", "x10"], ["x4", "x5", "x6"], ["x11"]]
g = groupby(sorted(l, key = len), key = len)
s = " + ".join([" ".join([str(len(list(i))), "* x **", str(j)]) for j, i in g])
print(s)
#output
#1 * x ** 1 + 2 * x ** 2 + 2 * x ** 3
但这只是一个字符串,而我从你的问题中假设你想稍后计算这个公式。
您可以为此使用 sympy:
import sympy as sym
l = [["x1", "x2", "x3"], ["x4", "x5", "x6"], ["x7", "x8"], ["x9", "x10"], ["x11"]]
x = sym.Symbol('x')
expr = sym.S.Zero
for exponent in map(len, l):
expr += x ** exponent
print(expr)
将给予:
2*x**3 + 2*x**2 + x
在这里,我创建了一个符号零单例 sympy.S.Zero
,然后我将 x
添加到我们可以从 map(len, l)
获得的那些幂。
print(list(map(len, l)))
将给予:
[3, 3, 2, 2, 1]
这是另一个使用 sympy 的解决方案:
from sympy import Matrix
from sympy.abc import x
l = [["x1", "x2", "x3"], ["x4", "x5", "x6"], ["x7", "x8"], ["x9", "x10"], ["x11"]]
powers = Matrix(list(map(len, l))) # Matrix([3, 3, 2, 2, 1])
raise_x_to_power = lambda y: x**y
output = sum(powers.applyfunc(raise_x_to_power))
print(output)
# 2*x**3 + 2*x**2 + x