2015-05-12 70 views
13

我試圖用Sympy打印一些分區,但我注意到它沒有顯示對齊。未對齊Sympy的分區的好評

import sympy 
sympy.init_printing(use_unicode=True) 

sympy.pprint(sympy.Mul(-1, sympy.Pow(-5, -1, evaluate=False), evaluate=False)) 
# Output: 
# -1 
# ─── 
# -5 # Note that "-5" is displayed slightly more on the right than "-1". 

原因/解決方法?

編輯:我做了很多使用inspect.getsourceinspect.getsourcefile反向工程,但它並沒有真正幫幫忙到底。

在Sympy漂亮的印刷似乎是依靠漂亮的印刷由Jurjen博

import sympy 

from sympy.printing.pretty.stringpict import * 

sympy.init_printing(use_unicode=True) 

prettyForm("-1")/prettyForm("-5") 
# Displays: 
# -1 
# -- 
# -5 

所以它不顯示對齊,但我不能讓它使用unicode。

的PrettyPrinter從文件sympy/printing/pretty/pretty.py的方法PrettyPrinter._print_Mul這只是return prettyForm.__mul__(*a)/prettyForm.__mul__(*b)有,我想,ab只是被['-1']['-5']叫,但它是行不通的。

+0

我確認了這種行爲。當分子和分母都是負的單位數值時,似乎就會發生。 – dlask

+2

https://github.com/sympy/sympy/issues/9450 – JeromeJ

回答

2

發現哪裏出了怪異的一部分是來自:

stringpict.py行417:

 if num.binding==prettyForm.NEG: 
      num = num.right(" ")[0] 

這是正在做只爲分子。如果分子是負數,它會在分子後面增加一個空格...奇怪!

我不確定是否可以有一個固定的,而不是直接編輯文件。我要在Github上報告。

謝謝大家的幫助和建議。

PS:最後,我用pdb來幫助我調試並找出實際發生的事情!

編輯:修補程序,如果你不能/不想要編輯的代碼源:

import sympy 
sympy.init_printing(use_unicode=True) 

from sympy.printing.pretty.stringpict import prettyForm, stringPict 

def newDiv(self, den, slashed=False): 
    if slashed: 
     raise NotImplementedError("Can't do slashed fraction yet") 
    num = self 
    if num.binding == prettyForm.DIV: 
     num = stringPict(*num.parens()) 
    if den.binding == prettyForm.DIV: 
     den = stringPict(*den.parens()) 

    return prettyForm(binding=prettyForm.DIV, *stringPict.stack(
     num, 
     stringPict.LINE, 
     den)) 

prettyForm.__div__ = newDiv 

sympy.pprint(sympy.Mul(-1, sympy.Pow(-5, -1, evaluate=False), evaluate=False)) 

# Displays properly: 
# -1 
# ── 
# -5 

我只是複製從源代碼的功能,並刪除了牽連線。

可能的改進可能是functools.wraps與原來的新功能。

0

我不太清楚你在找什麼,但我想我剛剛在處理類似的事情。 我有一個理解列表,並用於打印。 您可能會覺得它有用。

x = amp * np.sin(2 * np.pi * 200 * times   ) + nse1 
    x2 = np.array_split(x,epochs(
    Rxy[i], freqs_xy = mlab.csd(x2[i], y2[i], NFFT=nfft, Fs=sfreq) 
    Rxy_mean0 = [complex(sum(x)/len(x)) for x in Rxy] 
    import pprint 
    pp = pprint.PrettyPrinter(indent=4) 
    pp.pprint(Rxy_mean0) 
1

負分母不是標準的,並且處理不好。如果你真的需要它們,你可以修改字符串outpout通過漂亮的函數給出:

import sympy 
sympy.init_printing(use_unicode=True) 
def ppprint(expr): 
    p=sympy.pretty(expr) 
    s=p.split('\n') 
    if len(s)==3 and int(s[2])<0: 
     s[0]=" "+s[0] 
     s[1]=s[1][0]+s[1] 
     p2="\n".join(s) 
     print(p2) 
    else: print(p) 

這延長酒吧和一個單位的負分母分子。對於大型表達式不具有健壯性的保證。

>>>> ppprint(sympy.Mul(sympy.Pow(-5, -1,evaluate=False),-1,evaluate=False)) 
-1 
──── 
-5 
+0

「骯髒」的黑客,但這是一個(偉大的)開始!我想我們甚至可以嘗試通過接近兩個部分的尺寸來使它更「聰明」並嘗試調整,如果我們真的需要。 – JeromeJ