我有:
import numpy as np
from mpmath import *
mpf(np.array(range(0,600)))
Run Code Online (Sandbox Code Playgroud)
但它不会让我这样做:
TypeError: cannot create mpf from array
Run Code Online (Sandbox Code Playgroud)
那我该怎么办?
基本上我将使用这个数组,并根据环境(例如1.35626567e1084或6.2345252e-2732)因此需要mpf ,以元素方式乘以非常大或令人难以置信的小数.
更具体地说,我将使用besseli和besselk函数创建令人难以置信的大而令人难以置信的小值.
如何获得一个mpf数组来保存这些数字?
我编写了一个函数来计算函数的拉普拉斯变换scipy.integrate.quad。它不是一个非常复杂的函数,目前在 Erlang 分布的概率密度函数上表现不佳。
我在下面列出了我的所有工作。我首先计算拉普拉斯变换,然后计算逆变换,以便将其与 Erlang 的原始 pdf 进行比较。我用mpmath这个。这mpmath.invertlaplace不是问题,因为它成功地将封闭式拉普拉斯变换非常完美地转换回原始 pdf。
请帮助我理解我的数值拉普拉斯变换的问题是什么。我收到以下错误,但无法解决它。
IntegrationWarning: The occurrence of roundoff error is detected, which prevents the requested tolerance from being achieved. The error may be underestimated. a=0,b=np.inf,limit=limit)[0]
阴谋
代码
import numpy as np
import matplotlib.pyplot as plt
import math as m
import mpmath as mp
import scipy.stats as st
from scipy.integrate import quad
def get_laplace(func,limit=10000):
'''
Returns laplace transfrom function
'''
def laplace(s):
'''Numerical laplace transform'''
# Seperate into …Run Code Online (Sandbox Code Playgroud) 在matlab中有一个特殊的函数,在我所知道的Python(numpy,scipy,mpmath,...)的任何集合中都没有.
可能还有其他地方可以找到像这样的功能吗?
UPD对于所有认为这个问题很简单的人,请首先尝试为参数~30计算此函数.
UPD2任意精度是一个很好的解决方法,但如果可能的话我宁愿避免它.我需要一个"标准"的机器精度(不多也不少)和最高速度.
UPD3事实证明,mpmath结果令人惊讶地不准确.即使标准python math工作,mpmath结果也会更糟.这使它绝对毫无价值.
UPD4用于比较计算erfcx的不同方法的代码.
import numpy as np
def int_erfcx(x):
"Integral which gives erfcx"
from scipy import integrate
def f(xi):
return np.exp(-x*xi)*np.exp(-0.5*xi*xi)
return 0.79788456080286535595*integrate.quad(f,
0.0,min(2.0,50.0/(1.0+x))+100.0,limit=500)[0]
def my_erfcx(x):
"""M. M. Shepherd and J. G. Laframboise,
MATHEMATICS OF COMPUTATION 36, 249 (1981)
Note that it is reasonable to compute it in long double
(or whatever python has)
"""
ch_coef=[np.float128(0.1177578934567401754080e+01),
np.float128( -0.4590054580646477331e-02),
np.float128( -0.84249133366517915584e-01),
np.float128( 0.59209939998191890498e-01),
np.float128( -0.26658668435305752277e-01),
np.float128( …Run Code Online (Sandbox Code Playgroud) Python中允许用户扩展函数可以在不改变函数原始代码的情况下运行的类型的正确方法是什么?
假设我有一个模块,其my_module.foo()函数最初是为了处理float类型而编写的.现在我希望同样的功能能够使用,也就是说,mpmath任意精度浮点数 - 但不改变原始模块中的代码.
在C++中,我会添加一个额外的重载(或者,更可能的是,一些模板特化技巧与一个辅助结构).我应该如何构造原始my_module.foo()代码,以便用户可以在其中添加自己的自定义钩子?
我可以想到一些方法来实现这一点,但作为一个新手Python程序员,我相信他们中的大多数都会变得可怕:)
编辑:感谢所有答案到目前为止,非常感谢.
我应该澄清一个关键要求是能够应对我自己没有定义的类型.例如,如果我想编写一个通用的cos我的模块中的功能,我想打电话给math.cos在内置的类型,mpmath.cos在mpf类型sympy.cos上sympy象征性的类型,等等.当然我希望调度逻辑不是在我模块的cos实现.
这是我第一次尝试对 python 使用 JIT,这是我想要加速的用例。我读了一些关于 numba 的内容,它看起来很简单,但以下代码没有提供任何加速。请原谅我可能犯的任何明显错误。
我也尝试按照 cython 基本教程的建议进行操作,但时间上没有区别。 http://docs.cython.org/src/tutorial/cython_tutorial.html
我猜我必须做一些类似声明变量的事情?使用其他库?专门为所有事情使用 for 循环?如果有任何可以参考的指导或示例,我将不胜感激。
例如,我从之前的问题中知道mpmath 中的元素操作比 numpy 慢,并且其解决方案使用 gmpy 而不是 mpmath 明显更快。
import numpy as np
from scipy.special import eval_genlaguerre
from sympy import mpmath as mp
from sympy.mpmath import laguerre as genlag2
import collections
from numba import jit
import time
def len2(x):
return len(x) if isinstance(x, collections.Sized) else 1
@jit # <-- removing this doesn't change the output time if anything it's slower with this
def laguerre(a, b, x): …Run Code Online (Sandbox Code Playgroud) 我正在使用 mpmath python 库来在某些计算过程中获得精度,但我需要将结果转换为 numpy 本机类型。
更准确地说,我需要在 numpy.ndarray(包含浮点类型)中转换一个 mpmath 矩阵(包含 mpf 对象类型)。
我用原始方法解决了这个问题:
# My input Matrix:
matr = mp.matrix(
[[ '115.80200375', '22.80402473', '13.69453064', '54.28049263'],
[ '22.80402473', '86.14887381', '53.79999432', '42.78548627'],
[ '13.69453064', '53.79999432', '110.9695448' , '37.24270321'],
[ '54.28049263', '42.78548627', '37.24270321', '95.79388469']])
# multiple precision computation
D = MPDBiteration(matr)
# Create a new ndarray
Z = numpy.ndarray((matr.cols,matr.rows),dtype=numpy.float)
# I fill it pretty "manually"
for i in range(0,matr.rows):
for j in range(0,matr.cols):
Z[i,j] = D[i,j] # or float(D[i,j]) seems to work the …Run Code Online (Sandbox Code Playgroud) 我期待mpmath在Python数组上执行元素操作.例如,
import mpmath as mpm
x = mpm.arange(0,4)
y = mpm.sin(x) # error
Run Code Online (Sandbox Code Playgroud)
或者,使用mpmath矩阵
x = mpm.matrix([0,1,2,3])
y = mpm.sin(x) # error
Run Code Online (Sandbox Code Playgroud)
mpmath在这个领域是否有任何能力,或者是否有必要循环参赛作品?
我想在sympy中使用jacobDN功能,所以我python setup.py install成功下载了它.
当我想在文档中使用它时:
>>> from sympy.mpmath import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mpmath
>>>
Run Code Online (Sandbox Code Playgroud)
从sympy导入的所有东西都是成功的:
>>> from sympy import *
>>>
Run Code Online (Sandbox Code Playgroud)
然后我单独安装了mpmath,然后我可以使用mpmath的ellipfun.但是mpf显示出令人讨厌的情况:
>>> from mpmath import *
>>> ellipfun('dn',0.5,0.5)
mpf('0.94297242577738571')
>>>
Run Code Online (Sandbox Code Playgroud)
问题是如何在sympy.mpmath下使用ellipfun?如何检查我的安装漏洞?
以上解决方案是最好的!如果不能,我怎么能像使用普通函数一样在mpmath中使用ellipfun?
-> ~$ pip show sympy
---
Name: sympy
Version: 0.7.7.dev
Location: /usr/local/lib/python2.7/dist-packages/sympy-0.7.7.dev-py2.7.egg
Requires: mpmath
-> ~$ pip install --upgrade sympy
Requirement already up-to-date: sympy in /usr/local/lib/python2.7/dist-packages/sympy-0.7.7.dev-py2.7.egg
Requirement already …Run Code Online (Sandbox Code Playgroud) 我希望这个问题不是太初级。我已经广泛搜索了解决方案,但还没有发现。
我最近开始使用 Jupyter Notebook 和 Sympy 在我的微积分 II 课上做笔记和做作业(这真是一个巨大的好处!)。
但是,我唯一的问题是我无法弄清楚如何配置绘图的大小(即以像素为单位的尺寸)。
matplotlib直接使用(matplotlib.pyplot.figure()特别是)很容易,但我使用该Sympy.mpmath.plot模块是因为Sympy对于我们在本课程中进行的符号操作来说效果更好。我知道Sympy有它自己的绘图模块,但mpmath到目前为止似乎更容易使用(当然,这个问题除外)。
但是,我已经查看了mpmath文档并反复搜索了该问题,但没有解决方案。
如何更改使用mpmathAPI绘制函数所产生的图像大小?
给定一个 sympy 符号函数,例如
x=symbols("x")
h=sin(x)
Run Code Online (Sandbox Code Playgroud)
当一个人打电话
h.subs(x, mpf('1.0000000000000000000000000000000000000000000001'))
Run Code Online (Sandbox Code Playgroud)
sympy 返回一个浮点数。返回值不是 mpf。
是否有一种方便的方法可以让 sympy 使用任意精度来评估符号标准函数(如指数和三角函数)?