Массивы 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 единицу
Есть ли способ векторизовать этот цикл, поскольку это сравнение между двумя массивами должно быть реализовано между тысячами пар массивов, и это будет означать нечто большее, чем 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
Мобильная версия