Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2015 10:33:18

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

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

Добрый день, уважаемые!

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

Есть массив, например:

Arr = numpy.array([[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]])

Требуется найти, например:
Arr_small = numpy.array([[5,4,3],
                         [4,2,3]])
Пройтись циклом со срезами я могу, но когда массив большой (например 1000x500) - это очень долго
Возможно, есть какой-нибудь способ сделать это средствами numpy?
Нашел один вариант, который по-началу показался нормальным.
Преобразовать Arr в массив “окон” типа:
numpy.array([[[1,2,3],
              [5,6,7]],
             [[2,3,4],
              [6,7,8]],
             [[3,4,5],
              [7,8,9]],
               ...
             [[4,3,2],
              [2,3,2]]])
После этого преобразовать его в список (tolist) и затем найти индекс Arr.index(Arr_small) и дальше уже вычислить позицию. Но, как оказалось, загвоздка в tolist - эта операция оказалась, внезапно, еще медленней, чем поиск обычным циклом.
Возможно, можно реализовать через numpy.where, но я так и не понял как.
Подскажите, пожалуйста, как можно это реализовать.


Отредактировано jor77 (Авг. 7, 2015 10:36:54)

Офлайн

#2 Авг. 7, 2015 11:08:40

Kixiro
От:
Зарегистрирован: 2009-09-06
Сообщения: 27
Репутация: +  1  -
Профиль   Отправить e-mail  

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

А поиск нужно делать в одном большом массиве много маленьких или наборот? И размерность маленького массива меняется?



Офлайн

#3 Авг. 7, 2015 11:25:39

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

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

Kixiro
А поиск нужно делать в одном большом массиве много маленьких или наборот? И размерность маленького массива меняется?
Нужно в одном большом найти один маленький.
Массивы двумерные. Количество строк и столбцов и в большом и в малом - произвольное.
Единственное - что большой больше малого и по строкам и по столбцам

Офлайн

#4 Авг. 7, 2015 11:31:06

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

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

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

Просто перебираешь элементы по i,j, пока не встретишь совпадение с первым элементом в искомом массиве. Если встретил, продвигаешься на второй элемент в искомом массиве. Если равны - продвигаешься на третий. А если не равны, возвращаешь указатель (индекс) в искомом массиве на первый элемент.



Офлайн

#5 Авг. 7, 2015 11:31:37

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

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

Не знаю как там в нумпи, в питоне это делается так

s = [1, 3, 4, [1, 2, 3], 0, 0]
print([x for x in s if isinstance(x, list)])



Офлайн

#6 Авг. 7, 2015 11:36:02

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

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

FishHook
Не знаю как там в нумпи, в питоне это делается так
Да со списками/кортежами всё точно так же делается - через индексы. Это оптимальное решение (по памяти).

Есть массив
[[1, 2, 3, 4], [5, 6, 7, 8]]

Найти подмассив
[[2, 3], [6, 7]]



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

Офлайн

#7 Авг. 7, 2015 11:43:17

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

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

FishHook
Не знаю как там в нумпи, в питоне это делается так

s = [1, 3, 4, , 0, 0]
print()



Хммм.. Я только не понял как это решит мою задачу. Это находит просто любой список в списке. А мне нужно найти двумерный массив в двумерном массиве и получить его координаты.

Офлайн

#8 Авг. 7, 2015 11:46:26

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

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

А я не понял задачу, что значит найти массив? Мой код как раз буквально ищет список в списке.



Офлайн

#9 Авг. 7, 2015 11:51:10

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

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

FishHook
А я не понял задачу, что значит найти массив? Мой код как раз буквально ищет список в списке.
Ну, я привел пример что и в чем нужно найти.
И написал, что нужно: “поиск маленького массива в большом и получение индексов, где маленький находится в большом.”
Потом уточнил - массивы двумерные. Впрочем, в примере они и описаны двумерными

Если упростить вопрос - есть большая картинка. И нужно найти маленькую картинку на большой и узнать координаты этой маленькой на большой.

Отредактировано jor77 (Авг. 7, 2015 11:55:25)

Офлайн

#10 Авг. 7, 2015 12:01:46

Kixiro
От:
Зарегистрирован: 2009-09-06
Сообщения: 27
Репутация: +  1  -
Профиль   Отправить e-mail  

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

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version