Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2015 12:02:33

jor77
Зарегистрирован: 2014-06-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск массива в массиве numpy

py.user.next
Да со списками/кортежами всё точно так же делается - через индексы. Это оптимальное решение (по памяти).
А если память не важна, а важнее скорость?

Офлайн

#2 Авг. 7, 2015 12:08:56

jor77
Зарегистрирован: 2014-06-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск массива в массиве numpy

Kixiro
Можно попытаться расспаралелить обход по for на несколько процессов, чтобы ускорить выполнение задачи.
Не, нужно одним процессом.
Kixiro
Или искать подходящий алгоритм, где поиск осуществляется по коэффициентам или различным преобразованиям, а не в лоб.
Вот и ищу такой способ.
В numpy есть, например, numpy.where. Но вот ищет оно как-то своеобразно. Не полностью массив, а каждый элемент по позиции, и получается, что находит кучу всякого лишнего, и отфильтровать лишнее неизвестно как. Может я просто неправильно прописываю условие поиска, но как правильно не понимаю

Отредактировано jor77 (Авг. 7, 2015 12:09:37)

Офлайн

#3 Авг. 7, 2015 12:58:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Поиск массива в массиве numpy

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)



Офлайн

#4 Авг. 7, 2015 14:04:00

jor77
Зарегистрирован: 2014-06-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск массива в массиве numpy

FishHook
Это, как я понял, Вы реализовали то, что посоветовал py.user.next

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

Спасибо!

Офлайн

#5 Авг. 7, 2015 15:10:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

Поиск массива в массиве numpy

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

jor77
Неужели срезы так затормаживают процесс?
На создание в памяти копий элементов уходит время.



Отредактировано py.user.next (Авг. 7, 2015 15:11:37)

Офлайн

#6 Авг. 8, 2015 00:00:28

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Поиск массива в массиве numpy

А вообще поиск картинок в картинке делает opencv



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version