2013-12-10 4 views
-2

Я получаю эту ошибку: 'TypeError: list indices must be integers, not float'
но функции я использую необходимость принимать не являющихся целочисленные значения, в противном случае мои результаты разные ...
Просто чтобы дать вам идея, я написал некоторый код, который подходит для гауссовых к некоторым данным с одним пиком. Для этого мне нужно вычислить оценочное значение для сигмы. Чтобы получить это, я написал две функции, которые предназначены для просмотра данных, используйте значение x для пика, чтобы найти две точки (r_pos и l_pos), которые являются обе стороны пика и заданное расстояние от оси y (молотить). И из этого я могу получить оценочную сигму (r_pos - l_pos).
Это все идет об из куска кода, который работал, но знак лист для моих курсового говорит, что нужно использовать функции, так что я пытаюсь превратить это:Использование недопустимых целочисленных значений, как в функции

I0 = max(y) 
pos = y.index(I0) 
print 'Peak value is',I0,'Counts per sec at' ,x[pos], 'degrees(2theta)' 
print pos,I0 
#left position 
thresh = 10 
i = pos 
while y[i] > thresh: 
    i -= 1 
l_pos = x[i] 
#right position 
thresh = 10 
i = y.index(I0) 
while y[i] > thresh: 
    i += 1 
r_pos = x[i] 
print r_pos 
sigma0 = r_pos - l_pos 
print sigma0 

В то, что использует функцию что можно назвать и т.д. Это моя попытка:

def Peak_Find(x,y): 
    I0 = max(y) 
    pos = y.index(I0) 
    return I0, x[pos] 

def R_Pos(thresh,position): 
    i = position  
    while y[i] > thresh: 
     i += 0.1 
    r_pos = x[i] 
    return r_pos 

peak_y,peak_x = Peak_Find(x,y) 
Right Position = R_Pos(10,peak_x) 

peak_y = 855,0 Peak_x = 32,1, кстати

+4

Я уверен, что у вас будет около 6 комментариев в течение следующих 5 секунд с запросом кода ;-), поэтому я заберу этот мяч. Можете ли вы опубликовать код (минимальный пример того, что демонстрирует проблему) и ожидаемые входы/выходы? – mgilson

+3

Даже не видя кода, могу сказать, что вы используете float в качестве индекса списка. Не делай этого. – ApproachingDarknessFish

+0

Вам нужно сообщить нам, что функции _do_ с этими нецелыми значениями, и _why_ вы пытаетесь использовать их в качестве индекса, прежде чем мы сможем рассказать вам, что вам нужно сделать, чтобы исправить это. Возможно, вам нужно использовать 'int (x)' или 'round (x)' в качестве индекса, или, возможно, вам нужно использовать dict, а не список, или, может быть, вам нужно написать код для интерполяции между значениями или ... Как мы могли бы знать, не имея представления о том, что вы пытаетесь сделать? – abarnert

ответ

0

похоже, что вы хотите заменить строку

i = position 

С чем-то вроде

i = x.index(position) 

position, потому что это поплавок, и вы хотите, расположение в массиве position. Вы используете i, чтобы получить индекс массива, и вы должны использовать int s для этого, используя метод .index для возврата (целочисленного) местоположения в массиве.


Вам лучше написать программу таким образом, потому что тогда имена переменных будут фактически соответствовать тому, что содержится в переменных.

def Peak_Find(x,y): 
    I0 = max(y) 
    pos = y.index(I0) 
    return I0, pos 

def R_Pos(thresh,position): 
    while y[position] > thresh: 
     position += 1 # Not sure if this is what you want 
    r_pos = x[position] 
    return r_pos # Not sure what you want here... this is the value at x, not the position 
+0

Я думаю, вы неправильно поняли. Проблема в том, что вы не можете индексировать последовательность с помощью float, поскольку индекс (в данном случае) по определению должен быть целым числом. –

+0

@ HannesOvrén Если вы прочитали часть перед разрывом строки, я указываю, что вы не можете использовать 'position', потому что это float, а не int. Позвольте мне добавить предложение, чтобы сделать его явным, что я говорю это. – SethMMorton

+0

Тогда почему ваш последний фрагмент кода выполняет 'y [position]' и 'position + = 0.1'? –

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