Векторизация поиска совпадений между массивами numpyPython

Программы на Python
Ответить
Anonymous
 Векторизация поиска совпадений между массивами numpy

Сообщение Anonymous »

Я пытаюсь проверить, сколько элементов в одном массиве numpy можно найти с определенным допуском внутри другого массива numpy. На данный момент я использую цикл for для применения своей логики сравнения, однако я подозреваю, что существует элегантное решение, использующее векторизованный подход.
Массивы numpy имеют следующую структуру:
ch1 = array([ 41, 53, 334, ..., 1180949, 1181054, 1181081], shape=(N,))

ch2 = array([ 85, 221, 335, ..., 1180996, 1181055, 1181087], shape=(M,)))

где N и M могут быть большими числами (и не обязательно равными), записи строго монотонно возрастают (все записи в каждом массиве уникальны и отсортированы в порядке возрастания) и между двумя массивами нет дубликатов, т.е. значения в ch1 отсутствуют в ch2.
Я пытаюсь подсчитать элементы ch1, которые отличаются от элементов ch2 на 1. В качестве примера, учитывая приведенные выше массивы, элемент 334 ch1 отличается на 1 от элемента 335 ch2, поэтому мы учитываем эту запись. То же самое относится к записи 1181054 из ch1 и записи 1181055 из ch2.
Способ создания массивов гарантирует, что в каждом массиве есть только один элемент, который удовлетворяет ограничению, поскольку:
  • два последовательных числа в каждом массиве находятся на расстоянии не менее 2 единиц друг от друга, например ch1 = array([3, 25, ..., 32, 34, ..., 18762, 18764, ...])
  • если два элемента в одном массиве отличаются на 2, то в другом массиве не будет числа между ними, т.е. если в ch2 у нас есть элементы 41 и 43, то в ch1 не будет элемента 42, но либо элемент 40, либо 44
  • для любого элемента одного массива существует только один элемент другого массива, который отличается на 1 единицу
Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку два массива не обязательно имеют одинаковую форму, я не могу просто выполнить (ch1 - ch2) или (ch2 - ch1), поскольку это приведет к выдаче ошибка. До сих пор я использовал цикл for для записей ch1/ch2, определял разницу между этим значением и другим массивом и подсчитывал запись, если элемент удовлетворяет логике (ниже вы можете найти фрагмент кода, который я сделал).
Есть ли способ векторизовать этот цикл, поскольку это сравнение между двумя массивами должно быть реализовано между тысячами пар массивов, и это будет означать нечто большее, чем 100 000 итераций.
counter = 0

for elm in ch1:
t_diff = elm - ch2
found, = numpy.nonzero(numpy.abs(t_diff) == 1)
if found.size > 0:
counter += 1


Подробнее здесь: https://stackoverflow.com/questions/798 ... mpy-arrays
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»