代码之家  ›  专栏  ›  技术社区  ›  nate

将文本文件(双引号字符串w/%e%i sqrt z1 z2 log)输入到劳伦特序列的sympy、numpy或scipy中

  •  1
  • nate  · 技术社区  · 7 年前

    很长的标题,但我认为最好是非常翔实的。。。

    我有很长的表达式,使用符号,如%I、%e、log、z1和z2,夹在双引号之间,例如,

    "(4*z1*z2*%e^(z2^2+z1^2)*((%e^z1^2-%e^z2^2)^2*(96*%e^(13*(((-(202907687053026635*%i*sqrt(1037*sqrt(23)*%i+1463)*(log(9)*sqrt(2)*sqrt(7)*sqrt(1037*sqrt(23)*%i+....."X
    

    (在十六进制编辑器中查看文件时,最后一个X不是X,而是十六进制0A-不管是什么-不要认为在ascii图表上查找它会对它有很大帮助)

    我想试试python/sympy/numpy/scipy/。。。合并取代了其他支持CAS的软件,但我不知道如何做到这一点,至少是从一个一致的“包”中。我看到了scipy教程中的片段,或者numpy中的片段,等等。

    我想取上面这样一个表达式的Laurent级数-它是没有浮点数的精确表达式。

    希望这是一个容易理解的请求,

    最美好的祝福。

    编辑-将Python更新为3.6-仍然是AttributeError

    因此,我在将符号exp等转换为可接受的字符串时看到了一些错误。这似乎效果更好 但是 “ex”仍然没有被视为

    (py3_kernel) sbh@sbh-MacBookPro ~ $ ipython
    Python 3.6.3 (default, Oct  6 2017, 08:44:35) 
    Type 'copyright', 'credits' or 'license' for more information
    IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: import sympy as s
    
    In [2]: import numpy as np
    
    In [3]: from numpy import *
    
    In [4]: from sympy import *
    
    In [5]: from sympy.utilities.lambdify import lambdify, implemented_function, lambdastr
    
    In [6]: with open('c.txt', 'r') as myfile:
       ...:     d=myfile.read().replace('\n', '').replace('%i','I').replace('%e','exp').replace('^','**
       ...: ').replace('exp**','exp')
       ...:     
    
    In [7]: d
    Out[7]: '"(4*z1*z2*exp(z2**2+z1**2)*sqrt(1037*sqrt(23)*I+1463))+log(1/2)+(sqrt(-I)*z1)/(sqrt(3)*23**(1/4))"'
    
    In [8]: z1,z2 = s.symbols('z1,z2', real=True)
    
    In [9]: ex = s.sympify(d)
    
    In [10]: ex
    Out[10]: '(4*z1*z2*exp(z2**2+z1**2)*sqrt(1037*sqrt(23)*I+1463))+log(1/2)+(sqrt(-I)*z1)/(sqrt(3)*23**(1/4))'
    
    In [11]: type(ex)
    Out[11]: str
    
    In [12]: ex.subs({z1:0, z2:1})
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-12-63eab202c7b1> in <module>()
    ----> 1 ex.subs({z1:0, z2:1})
    
    AttributeError: 'str' object has no attribute 'subs'
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   user6764549 user6764549    7 年前

    numpy.loadtxt() 通常用于将表格数据从文本文件读入Numpy数组。最好使用Python将文件读入字符串变量,然后使用 sympy.sympify() 假设我有一个文件 cal.txt 包含单行字符串的 z1^2*exp(z2)*%i . 下面几行将阅读它并将其转换为Symphy表达式。

    import sympy as s
    
    with open('cal.txt', 'r') as myfile:
        d=myfile.read().replace('\n', '').replace('%i',\
                     'I').replace('^','**').replace('"','')
    
    
    z1,z2 = s.symbols('z1,z2')
    
    ex = s.sympify(d)
    
    ex2 = ex.subs([(z1,0),(z2,0)])
    

    加州。txt文件 应包含有效的Symphy表达式。

    使现代化 :

    1. 我修改了文件的内容 加州。txt文件 "z1^2*exp(z2)*%i" AttributeError . 所以我们需要去掉 " 在您的字符串之前和之后 sympify 正常工作。我已将上述代码修改为 replace('"','')
    2. 在上面的代码中,如果我们替换该行 z1,z2 = s.symbols('z1,z2') 具有 z1,z2 = s.symbols('z1,z2', real=True) 这个 ex2 = ex.subs([(z1,0),(z2,0)]) 由于 assumption 我们已指定 z1 z2 . 因此,在使用符号时,在指定符号假设时需要小心 . 此信息的来源是“将字符串转换为表达式”部分 this 链接