33773


sympyの連結の使い方を教えて下さい

[code]

    from sympy import *
    var('x a b')
    f=a*(2*x**2 - 1) + 4*x**3 + x*(b - 3)
    p = Poly(f, x)
    colors = p.all_coeffs()
    print(colors)
    for i in range(len(colors)):
        print(colors[i] +"*X**" + str(len(colors)-i-1))
    #WANT 4*x**3+2*a*x**2+(b-3)*x-a
    #TypeError: unsupported operand type(s) for +: 'Integer' and 'str'
    
[/code]

(参考)  
<https://stackoverflow.com/questions/22955888/how-to-extract-all-coefficients-
in-sympy>  
<http://kesin.hatenablog.com/entry/2013/05/12/004541>


CC BY-SA 3.0
2017-04-04T13:25:41.537
33769
2017-10-17T06:59:37.930
2017-10-17T06:59:37.930
754
17199
question
python sympy
sympyの連結の使い方を教えて下さい


Poly 型のインスタンス(多項式)を評価すれば、一応、項の次数順に表示されます。

[code]

    >>> from sympy import *
    >>> var('x a b')
    >>> f = a*(2*x**2 - 1) + 4*x**3 + x*(b - 3)
    >>> p = Poly(f, x)
    >>> p
    Poly(4*x**3 + 2*a*x**2 + (b - 3)*x - a, x, domain='ZZ[a,b]')
    
[/code]

なので、式部分だけを取り出したいのであれば、`str(p)` の結果を加工しても良いかもしれません。

[code]

    >>> import re
    >>> re.search('^Poly\((.+?),', str(p)).group(1)
    '4*x**3 + 2*a*x**2 + (b - 3)*x - a'
    
[/code]

  
ところで、Poly 型インスタンスの内容を表示しているのは、以下のメソッドです。

**sympy/printing/str.py**

[code]

    def _print_Poly(self, expr):
        terms, gens = [], [ self._print(s) for s in expr.gens ]
    
        for monom, coeff in expr.terms():
                  :
    
[/code]

ここからコードをコピーして適当に変更すれば目的の関数を作成できます。

※ 以下の関数は単項式(monomial)のみに対応しています。

**monomial_as_ordered function**

[code]

    from sympy import *
    
    def monomial_as_ordered(p):
      terms, gen = [], str(p.gens[0])
    
      for monom, coeff in p.terms():
        s_monom = []
    
        for i, exp in enumerate(monom):
          if exp > 0:
            if exp == 1:
              s_monom.append(gen)
            else:
              s_monom.append(gen + "**%d" % exp)
    
        s_monom = "*".join(s_monom)
    
        if coeff.is_Add:
          if s_monom:
            s_coeff = "(" + str(coeff) + ")"
          else:
            s_coeff = str(coeff)
        else:
          if s_monom:
            if coeff is S.One:
              terms.extend(['+', s_monom])
              continue
    
            if coeff is S.NegativeOne:
              terms.extend(['-', s_monom])
              continue
    
          s_coeff = str(coeff)
    
        if not s_monom:
          s_term = s_coeff
        else:
          s_term = s_coeff + "*" + s_monom
    
        if s_term.startswith('-'):
          terms.extend(['-', s_term[1:]])
        else:
          terms.extend(['+', s_term])
    
      if terms[0] in ['-', '+']:
        modifier = terms.pop(0)
        if modifier == '-':
          terms[0] = '-' + terms[0]
    
      return ' '.join(terms)
    
[/code]

**実行**

[code]

    >>> print(monomial_as_ordered(p))
    4*x**3 + 2*a*x**2 + (b - 3)*x - a
    
[/code]

念の為に申し添えて置くと、この関数の戻り値は文字列であって Poly 型のインスタンスではありません。


CC BY-SA 3.0
2017-04-04T17:41:56.383
33773
2017-04-04T18:03:24.357
2017-04-04T18:03:24.357
33769
answer