if Counter(pixelarray[i])[0] <= 1:
IndexError: index 183 is out of bounds for axis 0 with size 183
В этом выражении pixelarray[i]
- единственная часть, которая может вызвать эту ошибку. Это ошибка numpy
, говорящая нам, что i
слишком велико для текущей формы pixelarray
.
pixelarray
- это двумерный массив. i
считается вверх по направлению к pixelarray.shape[0]
(исходная форма). Но вы удаляете строки из pixelarray
в цикле; это уменьшается. Так что в какой-то момент счетчик выходит за пределы текущего размера массива.
Это может произойти в базе Python, если вы удалите элементы из списка в al oop.
In [456]: alist = [1,2,3,4]
In [457]: for i in range(len(alist)):
...: print(i, alist)
...: del alist[i]
...:
0 [1, 2, 3, 4]
1 [2, 3, 4]
2 [2, 4]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-457-5e5f105666aa> in <module>
1 for i in range(len(alist)):
2 print(i, alist)
----> 3 del alist[i]
4
IndexError: list assignment index out of range
Посмотрите, как сокращается список при увеличении i
. К i=2
список уменьшен до 2 пунктов, поэтому alist[2]
больше не действителен. Обратите внимание, как он также опустил «3», а не «1». Если мое намерение было удалить последовательные значения из списка, это не работает.
С помощью списков способ обойти проблему такого рода - удалить с конца
In [463]: for i in range(len(alist),0,-1):
...: print(i, alist)
...: del alist[i-1]
...:
...:
4 [1, 2, 3, 4]
3 [1, 2, 3]
2 [1, 2]
1 [1]
In [464]: alist
Out[464]: []
В вашем случае np.delete
создает новый массив при каждом вызове. Для массивов это довольно неэффективно. Таким образом, проблема индексации или нет, мы не рекомендуем повторное удаление, как это. Однако вы можете собрать все нужные индексы «удаления» в списке (добавление в список эффективно) и выполнить удаление в конце. np.delete
берет список индексов.