2016-11-13 187 views
2

下面是用於產生大小爲4的隨機排列的目的的兩行代碼:兼容性

from numpy import random 
t = random.permutation(4) 

這可以在Python執行,但不鼠尾草,這提供了以下錯誤:

TypeError         Traceback (most recent call last) 
<ipython-input-3-033ef4665637> in <module>() 
     1 from numpy import random 
----> 2 t = random.permutation(Integer(4)) 

mtrand.pyx in mtrand.RandomState.permutation (numpy/random/mtrand/mtrand.c:34842)() 

mtrand.pyx in mtrand.RandomState.shuffle (numpy/random/mtrand/mtrand.c:33796)() 

TypeError: len() of unsized object 

爲什麼?

多一點細節:我執行的代碼在Python 3,mtrand也是在Python 3目錄,其中應排除鼠尾草調用的Python 2版本numpy的可能性。

+0

儘管如此,目前使用的Sage只有Python 2(儘管在不久的將來它可能會發生變化,請參閱https://trac.sagemath.org/ticket/15530)。 – kcrisman

回答

1

這個在Sage中不起作用的原因是Sage準備輸入,從Python int變成了Sage Integer。在聖人,這將工作:

from numpy import random 
t = random.permutation(int(4)) 

或者你可以把預解析器關:

preparser(False) 
t = random.permutation(4) 
2

爲了逃避賢者預解析器,你還可以追加信r(「原始」),以數字輸入。

from numpy import random 
t = random.permutation(4r) 

4r超過int(4)的優點是,4r繞過 預解析器,而int(4)被preparsed作爲int(Integer(4))使得 Python的整數變換爲鼠尾草整數,然後 變換回到一個Python整數。

以同樣的方式,1.5r會給你一個純粹的Python浮點數而不是 一個Sage「實數」。