numpy.random.permutation的unsized对象错误?

时间:2015-02-10 08:14:54

标签: python numpy sage

我现在有一些代码卡在一行:

perm = numpy.random.permutation(128)

它给出了以下错误:“未定义对象的TypeError:len()。”我无法弄清楚问题是什么,因为128只是一个整数。我发现这是一个可能在此之前已经解决的问题:http://mail.scipy.org/pipermail/numpy-discussion/2007-January/025592.html但是他们的解决方案对我没有帮助,因为它是关于浮点数。

谁能看到这里出了什么问题?

1 个答案:

答案 0 :(得分:4)

在Sage中,输入由Sage preparser预先准备。

我将使用12而不是128,因此这些示例适用于一行。

输入以下内容时:

sage: import numpy
sage: perm = numpy.random.permutation(12)

您收到的错误消息如下:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-38b6a5e3e889> in <module>()
----> 1 perm = numpy.random.permutation(Integer(12))

/opt/sage/local/lib/python2.7/site-packages/numpy/random/mtrand.so in mtrand.RandomState.permutation (numpy/random/mtrand/mtrand.c:21297)()

/opt/sage/local/lib/python2.7/site-packages/numpy/random/mtrand.so in mtrand.RandomState.shuffle (numpy/random/mtrand/mtrand.c:20965)()

TypeError: len() of unsized object

你特别注意到这一行:

----> 1 perm = numpy.random.permutation(Integer(12))

告诉你输入

perm = numpy.random.permutation(12)

已预先准备

perm = numpy.random.permutation(Integer(12))

然而numpy并不是很高兴喂Sage Integer, 它更喜欢Python int。

输入原始Python整数的最简单方法是向其附加r

sage: perm = numpy.random.permutation(12r)

这对你有用:

sage: perm = numpy.random.permutation(12r)
sage: perm    # random
array([ 9,  0, 11,  4,  2, 10,  3,  5,  7,  6,  1,  8])

另一种方法是让Sage将Python int转换为Sage Integer,然后强制它将其转换回Python整数:

sage: perm = numpy.random.permutation(int(12))
sage: perm    # random
array([ 5,  9,  1,  7,  0,  2, 10,  6,  3,  8,  4, 11])

你可以做的另一件事就是关闭Sage preparser。

sage: preparser(False)
sage: perm = numpy.random.permutation(12)
sage: perm    # random
array([ 0,  2,  7,  5,  8, 11,  1,  6,  9, 10,  3,  4])