Найти - Пользователи
Полная версия: Поиск массива в массиве numpy
Начало » Python для новичков » Поиск массива в массиве numpy
1 2
jor77
py.user.next
Да со списками/кортежами всё точно так же делается - через индексы. Это оптимальное решение (по памяти).
А если память не важна, а важнее скорость?
jor77
Kixiro
Можно попытаться расспаралелить обход по for на несколько процессов, чтобы ускорить выполнение задачи.
Не, нужно одним процессом.
Kixiro
Или искать подходящий алгоритм, где поиск осуществляется по коэффициентам или различным преобразованиям, а не в лоб.
Вот и ищу такой способ.
В numpy есть, например, numpy.where. Но вот ищет оно как-то своеобразно. Не полностью массив, а каждый элемент по позиции, и получается, что находит кучу всякого лишнего, и отфильтровать лишнее неизвестно как. Может я просто неправильно прописываю условие поиска, но как правильно не понимаю

FishHook
matrix =[[1,2,3,4,5],
         [5,6,7,8,9],
         [9,0,0,0,2],
         [6,5,4,3,2],
         [3,4,2,3,2]]
pattern = [[5,4,3],
           [4,2,3]]
def finder(matrix, pattern):
    width = len(matrix[0])
    height = len(matrix)
    p_width = len(pattern[0])
    p_height = len(pattern)
    def comparer(r, c):
        if c + p_width > width:
            return
        if r + p_height > height:
            return
        for i, row in enumerate(pattern):
            for j, e in enumerate(row):
                matrix_i = i + r
                matrix_j = j + c
                if matrix[matrix_i][matrix_j] != e:
                    return
        return True
    corner = pattern[0][0]
    def cmp():
        for row, sub in enumerate(matrix):
            for column, elem in enumerate(sub):
                if corner == elem:
                    if comparer(row, column):
                        return row, column
    return cmp()
print finder(matrix, pattern)
jor77
FishHook
Это, как я понял, Вы реализовали то, что посоветовал py.user.next

Честно говоря, не верилось в то, что этот подход быстрее работает.
А проверил Ваш код - и действительно, в десятки раз быстрей выходит почему-то.
Неужели срезы так затормаживают процесс?

Спасибо!
py.user.next
jor77
Это, как я понял, Вы реализовали то, что посоветовал py.user.next
Ну да, типа того. Только там проверку длин и высот нужно делать не на каждом сравнении, а перед циклами один раз урезать, чтобы оно дальше не ходило.

jor77
Неужели срезы так затормаживают процесс?
На создание в памяти копий элементов уходит время.
doza_and
А вообще поиск картинок в картинке делает opencv
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB