2016-05-08 5 views
0

У меня есть два массива 7X7 (именованные веса и расстояния), где элементы являются значениями с плавающей точкой.
Вот код, я работаю с:Ошибка numpy.float64 при итерации по значениям float

xmax = 7 
ymax = 7 
hist = [] 
for x in range(xmax): 
    for y in range(ymax): 
     for i in range (weights[x,y]): 
      hist = hist + [distances[x,y]] 
print hist 

Когда я пытаюсь перебирать в диапазоне (вес [х, у]), я получаю сообщение об ошибке из-за значения с плавающей точкой в ​​массах [х, у] , Я пробовал создавать различные функции frange, чтобы перебирать значения float, но ничего не работает хорошо. Я не знаю, каковы будут значения весов [x, y] перед запуском кода, поэтому я не могу по-настоящему положить начало и остановить функцию frange.

Любая помощь приветствуется, спасибо!

+2

Что вы ожидаете 'диапазон (вес [x, y])' будет? Какова цель этого цикла итерации. Вы не используете 'i' в следующем выражении. – hpaulj

ответ

0

Я считаю, что вы ищете что-то подобное, но я могу ошибаться. Для удобства примера я использую гораздо меньший набор данных.

weights = [[1,2],[3,4]] 
distance = [[9,8],[7,6]] 
hist = [] 

for x in range(len(weights)): 
    new_list = [] 
    for y in range(len(weights[x])): 
     new_list.append(weights[x][y] + distance[x][y]) 
    hist.append(new_list) 

print hist 

Возможно, это более элегантный способ сделать это, но он должен работать.

+0

Это похоже на то, что я ищу, но все еще не совсем верно. Я редактировал исходный вопрос, надеюсь, это поможет немного. – sunstache32

0

Проблема

Диапазон может принимать только целые числа. Вам нужно указать int, если есть нечетный тип. Это включает в себя поплавки, строки, все, что не является целым типом. Python не будет делать неявное преобразование.

>>> range(4.) 
TypeError: range() integer end argument expected, got float. 
>>> import numpy as np 
>>> range(np.float(5)) 
TypeError: range() integer end argument expected, got float. 
>>> range(int(4.)) 
[0, 1, 2, 3] 

Применение к вашему коду

Для вашего кода, просто сделать это:

for x in range(xmax): 
    for y in range(ymax): 
     for i in range(int(weights[x,y])): 
      hist = hist+[distances[x,y]] 
print hist 

Обратите внимание явную int вызова, чтобы обеспечить целое, а не число с плавающей точкой передается к функции range?

Numpy Arange

Если вам нужно использовать не целые значения, смотрите на numpy.arange.

>>> np.arange(5.) 
array([ 0., 1., 2., 3., 4.]) 
>>> np.arange(5.5) 
array([ 0., 1., 2., 3., 4., 5.]) 
>>> np.arange(0, 5.5, 0.5) 
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ]) 

Он позволяет использовать числа с плавающей запятой, пользовательские шаги и собственный запуск и остановку. Он просто возвращает массив numpy, а не список/итератор.

+0

Есть ли способ вернуть список, используя нецелые значения? – sunstache32

+0

@ sunstache32, нет, не используя 'np.arange'. Решение 'range' работает до тех пор, пока вы конвертируете в' int'. Хотя вы можете вызвать 'tolist()' в массиве numpy. Но так как вы можете перебирать массив numpy в любом случае, сделайте математику на нем, это будет так же хорошо, как и список. Конечно, для итерации это немного медленнее, но это было бы компенсировано путем вызова 'tolist' в массиве в любом случае. –

+0

Другим решением, @ sunstache32, было бы увеличить число чисел с плавающей запятой до отношения с помощью 'float.as_integer_ratio()', а затем итерации по диапазону числителей и деления каждого значения на делитель. Но это очень крутой способ сделать «np.arange». –

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