2014-12-22 3 views
0

Я повторяю массив NumPy (nd) строк OpenCV. Я хочу удалить все строки с 8-градусной вертикалью. Я понимаю, что массив numpy неизменен, а то, что я делаю в коде, неверно, но демонстрирует идею того, что я пытаюсь сделать;Удалите последовательный индекс массива NumPy в цикле над его содержимым

index = 0 
for line in self.lines[0]: 
    if (line[1]*180)/np.pi > 8:          
     self.lines[0] = np.delete(self.lines[0], index, axis=0) 
    index+=1 

Как я могу удалить эти индексы массива NumPy?

Спасибо!

+0

Лучшее объяснение проблемы требуется, если вы хотите, чтобы кто-то помог вам ... –

+0

какая другая информация? –

+0

Что на самом деле это строка кода 'if (line [1] * 180) /np.pi> 8' делает, или чего вы пытаетесь достичь с ней? –

ответ

3

Вы не можете удалять индексы массива в то время как итерация массива. Это даст неправильные результаты. Предположим, что вы находитесь на итерации 5, и этот индекс удовлетворяет условию if и его нужно удалить, но если мы удалим его, он заставит элемент массива в индексе 6 прийти к индексу 5, а следующий выбранный элемент будет равен 7, который приходит к индексу 6 после удаления и, следовательно, условие никогда не проверяется для элемента изначально по индексу 6, т.е. перед удалением.

Основная идея решения этой проблемы заключается в том, чтобы добавить эти индексы в список и удалить их вне очереди. Таким образом, ваш код:

index = 0 
idx = [] 
for line in self.lines[0]: 
    if (line[1]*180)/np.pi > 8:  
     idx.append(index)   
    index+=1 

self.lines[0] = np.delete(self.lines[0], idx, axis=0) 
+0

Я получаю сообщение об ошибке с вашим решением. ValueError: неверный ввод –

+0

Не могли бы вы вставить полный Traceback ... –

+0

извините, все в порядке. моя вина. благодаря! –

1

Я думаю, вам не хватает отступы в коде, так что я его интерпретировать так:

index = 0 
for line in self.lines[0]: 
    if (line[1]*180)/np.pi > 8:          
     self.lines[0] = np.delete(self.lines[0], index, axis=0) 
    index+=1 

Вы можете сделать это, конечно, без петли. Сначала мы делаем проверку, чтобы построить boolean indexing array (True/False значения для каждого элемента массива):

index = self.lines[0,:,1]*180/np.pi > 8 

Затем мы выбираем строки, где условие ложно:

a[~a%2==0] 

Где np.nonzero преобразует из булевого массива в массив, где перечислены все индексы с истинными значениями.

Например:

>>> a = np.arange(10) 
>>> a[~a%2==0] 
array([1, 3, 5, 7, 9]) 
+0

, что делает ваша вторая последняя строка? не знакомы с синтаксисом –

+0

@MarkCorrigan Я добавил теперь больше объяснений, пример и ссылки на документы. Теперь это будет способ достижения вашей проблемы в «Numpythonic». – sebix

+0

Это последнее 'delete' может быть заменено булевым индексированием:' a [~ a% 2 == 0] '. 'delete' - сложная функция, которая всегда возвращает новый массив. Он напрямую не изменяет свой вход. – hpaulj

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