2015-03-21 23 views
1

Я пытаюсь создать два класса случайных двумерных точек, один из которых имеет значение [1,1], а другой - среднее значение [-1, -1]. Я написал функцию, но получаю ошибку, которая не может понять. Я искал ее, но ничего не нашел. Вот моя функция:Объект «float» является недоступным

def gen_arti_Bis(nbex=10,centerx=1,centery=1,sigma=0.1,epsilon=0.02): 
    xpos=np.random.multivariate_normal([centerx,centery],np.diag([sigma,sigma]),nbex/2) 
    xneg=np.random.multivariate_normal([-centerx,-centery],np.diag([sigma,sigma]),nbex/2) 
    data=np.vstack((xpos,xneg)) 
    y=np.hstack((np.ones(nbex/2),-np.ones(nbex/2))) 
    return data,y 

и вот сообщение об ошибке при вводе gen_arti():

Traceback (most recent call last): 
    File "<ipython-input-64-a173cf922dac>", line 1, in <module> 
    gen_arti_Bis() 
    File "<ipython-input-63-da8720093c11>", line 2, in gen_arti_Bis 
    xpos=np.random.multivariate_normal([centerx,centery],np.diag([sigma,sigma]),nbex/2) 
    File "mtrand.pyx", line 4308, in mtrand.RandomState.multivariate_normal (numpy/random/mtrand/mtrand.c:23108) 
TypeError: 'float' object is unsliceable 

ответ

2

В Python 3, разделение с помощью оператора / всегда делает с плавающей точкой разделения, даже если цифры на обе стороны оператора являются целыми числами. В нескольких местах вы вычисляете nbex/2 и передаете результат в качестве аргумента, где numpy ожидает целое число.

В частности, последний аргумент np.random.multivariate «s должен быть либо int или tuple из int с. Вы передаете float, который он не примет, даже если значение float на самом деле является целым числом (например, 5.0). Вы также передаете float в np.ones, но эта функция, похоже, обрабатывает его в порядке (он игнорирует какую-либо дробную часть входного номера).

Основным решением для этого является явное выполнение целочисленного деления с использованием оператора //. Замените каждое место у вас nbex/2 с nbex // 2, и оно должно работать так, как вы намеревались.

Обратите внимание, что целочисленное деление, выполняемое //, всегда будет выбирать значение пола (т. Е. Округляется до отрицательной бесконечности). Если вы хотите по-разному крутиться в некоторых ситуациях, вы можете сделать свое разделение с помощью /, а затем преобразовать результат поплавка в целое число с round (что будет округлять значение, которое находится на полпути между двумя целыми числами, на которые когда-либо одинаково) или math.ceil (который всегда будет округлять).

+0

О, спасибо большое, это сработало. Но откуда вы узнали, что это проблема? На самом деле, я не понял смысла сообщения об ошибке (unsliceable?!). Не могли бы вы объяснить это, пожалуйста? – dada

+1

Я просто искал места, где вы могли бы проходить поплавок, где его не ожидали. Я подозреваю, что в коде numpy есть что-то, что проверяет тип параметра 'size' с' isinstance (size, int) ', и затем возвращается к коду для обработки кортежа. Кортеж можно нарезать (например, 'tup [start: stop]'), и я думаю, что код пытается его использовать для любого нецелого аргумента, что приводит к исключению из-за нарезки float. – Blckknght

Смежные вопросы