2015-02-10 1 views
2

я часть кода прямо сейчас, что застрять на одной линии:Ошибка объектного объекта с numpy.random.permutation?

perm = numpy.random.permutation(128) 

, к которому он дать следующее сообщение об ошибке: «TypeError: LEN() из некалиброванной объекта.» Я не могу понять, в чем проблема, так как 128 - это целое число. Я вижу, что это проблема, которая, вероятно, была решена до этого: http://mail.scipy.org/pipermail/numpy-discussion/2007-January/025592.html, но их решение не помогает мне, поскольку речь идет о поплавках.

Может ли кто-нибудь увидеть, что здесь не так?

+1

Какую версию numpy вы используете? Я использую 1.9.1, и ваш код работает отлично для меня. – Carsten

+1

1.8.1. Это причина этой проблемы? – user98643

+1

Видимо, нет. Код для функции «перестановки» не изменяется от версии 1.8.1 до 1.9.1. – Carsten

ответ

3

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

был preparsed в

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

Еще одним вариантом было бы использовать ноутбук Ipython или использовать ноутбук Sage в режиме «python» из раскрывающегося меню систем. – kcrisman