鼠尾草和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".
这里有两行代码用于生成大小为 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".