【问题标题】:Unsized object error with numpy.random.permutation?numpy.random.permutation 的大小不一的对象错误?
【发布时间】:2015-04-10 04:55:00
【问题描述】:

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

perm = numpy.random.permutation(128)

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

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

【问题讨论】:

  • 你使用的是什么版本的 numpy?我使用的是 1.9.1,你的代码对我来说很好。
  • 1.8.1.这是造成这个问题的原因吗?
  • 显然不是。 permutation 函数的代码从版本 1.8.1 到 1.9.1 没有变化。
  • 能否包含整个异常消息? (这也适用于我。)
  • 与 numpy 版本无关,它是 Sage 预解析器将 Python int 转换为 Sage Integer。

标签: python numpy sage


【解决方案1】:

在 Sage 中,输入由 Sage 预解析器进行预解析。

我将使用 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 预解析器。

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])

【讨论】:

  • 还有一个选择是使用 Ipython 笔记本,或者从系统的下拉菜单中以“python”模式使用 Sage 笔记本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2021-05-11
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多