Думаю, я понял это. Я еще не тестировал его для Python 2, но Думаю, я знаю, почему он не работает в Python 3.
В вашем первом блоке кода, определяющем функцию mov_avg
, ваши первые два аргумента - x
и window
. В функции у вас есть строка:
wd1=(window-1)/2
Когда вы вызываете функцию, вы вызываете ее как:
obs_smooth = mov_avg(obs,7)
, где window=7
. В теле функции вычисляется wd1
, но оно не оценивается как 3, оно оценивается как 3,0 - значение с плавающей запятой, а не целое число. Поэтому, когда он пытается выполнить строку, начинающуюся с yyF[:,wd1:-wd1]
, происходит сбой, поскольку wd1 не является целым числом.
Вы можете попробовать использовать функцию int()
для преобразования ее в число с плавающей точкой.
Я протестировал доступ к образцу списка с использованием значений с плавающей запятой и целых чисел на установке по умолчанию Python 3.6.5, установленной с использованием Conda.
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,3,4,5]
>>> a[0], a[4]
(1, 5)
>>> a[0.0,4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not tuple
А в конкретном случае ваш код:
>>> window = 7
>>> wd1 = (window-1)/2
>>> wd1
3.0
>>> a[wd1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not float
EDIT: в Python 2 результатом последней операции будет целое число, а не число с плавающей точкой. Возможно, именно поэтому он работает на Python 2, а не на Python 3?
Отказ от ответственности : Я новичок в программировании, поэтому, если это не причина, извините! Я пытаюсь узнать больше, пытаясь ответить на несколько вопросов, чтобы я мог понять.