В 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])
Какую версию numpy вы используете? Я использую 1.9.1, и ваш код работает отлично для меня. – Carsten
1.8.1. Это причина этой проблемы? – user98643
Видимо, нет. Код для функции «перестановки» не изменяется от версии 1.8.1 до 1.9.1. – Carsten