有没有办法在 Numpy 中获得更好的矩阵格式,例如类似于 Sage 中的 show() 或 Sympy 中的 init_printing() 获得的结果?
我正在研究 Craig Finch 写的关于 Sage 的书,在关于线性代数的章节中,很明显 Sage 的输出与 Numpy 的输出之间的质量和清晰度差异。有没有办法最终直接在 IPython 笔记本中提高 Numpy 输出质量?
只是为了澄清我的要求:我习惯了 Sage 笔记本,但想探索 Ipython 笔记本的新可能性。我特别想准备一些关于线性代数和Numpy的笔记本。但是 Numpy 的简单纯文本输出不是特别好或清晰(http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-2-Numpy.ipynb),我会喜欢某种排版风格,特别是矩阵(方括号、圆括号、行列式竖线等)。
我试图解一组方程:
from sympy import *
from sympy.solvers import *
a,b,c = symbols('a,b,c')
equations=[
Eq(a*1**2+b*2+c,3),
Eq(a*4**2+b*5+c,6),
Eq(a*7**2+b*8+c,9),
]
solve(equations)
Run Code Online (Sandbox Code Playgroud)
效果很好...我会得到类似的输出
[{a: 1, c:-2, b:3}]
Run Code Online (Sandbox Code Playgroud)
但现在我想选择符号 c 的解决方案并使其可处理。我怎样才能做到这一点。我在文档中没有找到任何内容。
多谢!
我在 Windows 8.1 (x64) 上使用 sympy 0.7.5(通过 pip 安装)和 Python 3.4.2。请考虑这个简短的程序:
import sympy
import time
start = time.time()
for i in range(100):
sympy.Point(12345.0, 54321.0)
print('Elapsed (ms):', (time.time() - start) * 1000)
Run Code Online (Sandbox Code Playgroud)
我的机器大约需要22 秒才能执行此操作。我在这里缺少什么?
我想为求和编写一个 sympy 符号,但求和的索引也显示为被加数中变量名称的下标。例如,
import numpy as np
import sympy
sympy.init_printing()
r = sympy.Symbol('r')
a = sympy.Matrix(sympy.symbols('a:4'))
rpowers = sympy.Matrix([r**i for i in range(len(a))])
long_expr = a.dot(rpowers)
n = sympy.Symbol('n')
a_n = sympy.Symbol('a_n')
short_expr = sympy.Sum(a_n * r**n, (n, 0, 3))
Run Code Online (Sandbox Code Playgroud)
long_expr并short_expr在数学上表示相同的事物。但是使用long_expr,我可以替换 的值a,然后将该表达式羔羊化为 numpy 函数:
coeffed_long_expr = long_expr.subs(zip(a, [-1, 3, 23, 8]))
func_long_expr = sympy.lambdify([r], coeffed_long_expr, 'numpy')
Run Code Online (Sandbox Code Playgroud)
我怎样才能做同样的事short_expr?或者short_expr在这种情况下仅对显示带有求和符号的表达式有用?我希望能够使用求和符号来显示,特别是对于大ns 。
Python 3.5.0 |Anaconda 2.4.0 (x86_64) Python 4.0.0 Spyder 今天更新。在 Mac iBook OS 10.10.1 上运行
>>> M = Matrix([[1, 0, 1, 3], [2, 3, 4, 7], [-1, -3, -3, -4]])
>>> M
Run Code Online (Sandbox Code Playgroud)
在 Spyder 内部控制台中产生以下错误:
>>> /Users/webe077/anaconda/lib/python3.5/site-packages/nbformat/current.py:19: UserWarning: nbformat.current is deprecated.
- use nbformat for read/write/validate public API
- use nbformat.vX directly to composing notebooks of a particular version
""")
ERROR:root:Failed to render latex: '$$\left ( \left[\begin{matrix}1 & 0 & 1 & 3\\0 & 1 & \frac{2}{3} & \frac{1}{3}\\0 & 0 …Run Code Online (Sandbox Code Playgroud) 假设我有一些表达
from sympy import *
a,b,c,x,y = symbols('a c b x y')
eq=a*x + b*x*y + c*y**2
Run Code Online (Sandbox Code Playgroud)
需要分成一个包含单项式的数组。
我目前的解决方案是
parts = str(eq).split(' + ')
Run Code Online (Sandbox Code Playgroud)
然后,我对数组部分的每个元素使用 eval 函数,将其解释为表达式。
我可以做什么来将多元多项式拆分为单项式部分,而不先将表达式转换为字符串?
我正在尝试构建一个类,其目标是将函数的导数f也作为函数返回。我读过 Sympy 并开始尝试使用这个包。
假设我有一个只有一个参数的简单函数,如下所示:
def f1p(x):
return x**2 + 5**x * 2*x + 1
Run Code Online (Sandbox Code Playgroud)
现在,我有一种方法可以确保函数只有一个参数,然后计算导数(仅作为表达式):
from sympy import *
import inspect
def get_derivative(fun):
parameters=inspect.getargspec(f).args
if(len(parameters)>1):
raise ValueError('Function has more than one parameter.')
fdiff=fun(Symbol(parameters[0])).diff()
print(fdiff)
Run Code Online (Sandbox Code Playgroud)
假设它fdiff包含导函数的主要表达式,因此,我要解决的问题是返回一个函数以对其进行评估,例如:
f_deriv=get_derivative(f1p) #f_deriv is a callable function
print(f_deriv(a)) #Prints derivative value of f1p in a
Run Code Online (Sandbox Code Playgroud)
注意:我尝试过return eval/exec(diff)但不是一个好主意,因为需要声明参数。我还尝试用以下内容包装表达式:
eval('def foo('+parameters[0]+'):\n\treturn '+diff)
Run Code Online (Sandbox Code Playgroud)
这仍然不是一个好主意。
假设现在我们在基本函数中使用(例如)对数,因此,我们以这种方式实现它
import math
def f1p(x):
return x**2 + 5**x * 2*x + 1 + math.log(x)
Run Code Online (Sandbox Code Playgroud)
当我将上一个函数应用于此时,出现以下错误: …
我想从点列表中制作一个 sympy Polygon。文档说它需要一系列点。我不知道如何转换。
from sympy import Point2D, Polygon
# this works
p1 = Polygon(Point2D(0,0), Point2D(1,0), Point2D(1,1), Point2D(0,1))
print(p1.area)
# this fails at the Polygon call
points=[]
points.append(Point2D(0,0))
points.append(Point2D(0,1))
points.append(Point2D(1,1))
points.append(Point2D(1,0))
t = tuple(points)
p = Polygon(t)
Run Code Online (Sandbox Code Playgroud)
当它失败时,我得到这个
Traceback (most recent call last):
File "t_polygon.py", line 14, in <module>
p = Polygon(t)
File "C:\Program Files (x86)\Python\Lib\site-packages\sympy\geometry\polygon.py", line 126, in __new__
vertices = [Point(a, dim=2, **kwargs) for a in args]
File "C:\Program Files (x86)\Python\Lib\site-packages\sympy\geometry\polygon.py", line 126, in <listcomp>
vertices = [Point(a, dim=2, …Run Code Online (Sandbox Code Playgroud) 我想在 sympy 中禁用自动简化,例如求解x*y-x我想要的方程x/x而不是1
import sympy
from sympy.abc import x,y,z
expr = x*y-x
sympy.solve(expr,y)
=> 1 # i want unsimplified x/x instead of 1
Run Code Online (Sandbox Code Playgroud)
从 sympy 手册中,我找到了 UnevaluatedExpr 用于此目的,但它返回给定示例的空列表
from sympy import UnevaluatedExpr
expr1 = UnevaluatedExpr(x)*UnevaluatedExpr(y)-UnevaluatedExpr(x)
sympy.solve(expr1,y)
=> []
Run Code Online (Sandbox Code Playgroud)
我的问题是
我想在这里解决我的另一个问题,所以只要没有积分的解析/符号解决方案,我就需要 sympy 返回错误。
例如,如果我尝试:
from sympy import *
init_printing(use_unicode=False, wrap_line=False, no_global=True)
x = Symbol('x')
integrate(1/cos(x**2), x)
Run Code Online (Sandbox Code Playgroud)
它只是 [漂亮] 打印积分本身
没有解决和/或给出无法解决的错误!
PS 我也在Reddit 上问过这个问题。
python ×10
sympy ×10
numpy ×2
automation ×1
derivative ×1
formatting ×1
integral ×1
ipython ×1
list ×1
sequence ×1
spyder ×1