鼠尾草和numpy之间的兼容性

compatibility between sage and numpy

这里有两行代码用于生成大小为 4 的随机排列:

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

这可以在Python中执行,但不能在sage中执行,它给出了以下错误:

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

为什么?

详细一点:我执行了Python3中的代码,mtrand也在Python3目录下,应该排除sage是调用 Python 2 版本的 numpy.

这在 Sage 中不起作用的原因是 Sage 会预先解析其输入,将“4”从 Python int 转换为 Sage Integer。在 Sage 中,这将起作用:

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

或者您可以关闭预解析器:

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

要转义 Sage 的预解析器,您还可以将字母 r(对于 "raw")附加到数字输入中。

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

4r 相对于 int(4) 的优势在于 4r 绕过了 预解析器,而 int(4) 被预解析为 int(Integer(4)) 以便 Python 整数被转换为 Sage 整数,然后 转换回 Python 整数。

以同样的方式,1.5r 会给你一个纯粹的 Python 浮点数而不是 圣人 "real number".