tl; dr: range()
ожидает целые числа в качестве аргументов, в то время как array
- это массив, а не целое число. Из вашего варианта использования кажется, что вы должны использовать range(len(array))
вместо range(array)
.
Длинная версия:
Python 3 range()
встроенный метод фактически создает объект итератора, который при повторении возвращает последовательность целых чисел. Из документации аргументы, передаваемые range()
, должны иметь либо значения int
, либо некоторого типа, который реализует метод __index__
. Метод __index__
- это специальный метод dunder , который позволяет использовать определенный пользователем объект в качестве индекса при индексации массива. Метод должен возвращать int
. Массивы
NumPy реализуют метод __index__
, однако он возвращает int
только тогда, когда объект массива действительно является скаляром, т. Е. Когда массив имеет форму ()
. Когда массив не является скаляром, он выдает это TypeError
исключение, которое вы видите. Например:
import numpy as np
l = [1, 2, 3]
np.array(1).shape # == ()
l[np.array(1)] # == l[1]
np.array([1]).shape # == (1,)
l[np.array([1])] # TypeError: only integer scalar arrays can be converted to a scalar index
l['string'] # TypeError: list indices must be integers or slices, not str