У меня есть NumPy массив целых чисел:
x = np.array([1, 0, 2, 1, 4, 1, 4, 1, 0, 1, 4, 3, 0, 1, 0, 2, 1, 4, 3, 1, 4, 1, 0])
и другой массив индексов, который ссылается на указанный выше массив:
indices = np.array([22, 12, 8, 1, 14, 21, 7, 0, 13, 19, 5, 3, 9, 16, 2, 15, 11, 18, 20, 6, 4, 10, 17])
Для каждой пары соседних индексов мы нужно посчитать, сколько последовательных значений в x
перекрываются, начиная с каждого из двух соседних индексов. Например, для indices[2]
и indices[3]
у нас есть индексы 8
и 1
соответственно, и они обе имеют ссылочные позиции в x
. Затем, начиная с x[8]
и x[1]
, мы подсчитываем, сколько последовательных значений совпадают или перекрываются, но мы прекращаем проверять перекрытие при определенных условиях c (см. Ниже). Другими словами, мы проверяем:
x[8] == x[1]
x[9] == x[2]
# увеличивает каждый индекс на один - ... # продолжает увеличивать каждый индекс, кроме в следующих условиях
- остановится, если
i >= x.shape[0]
- остановится, если
j >= x.shape[0]
6. остановка, если x[i] == 0
7. остановить если x[j] == 0
останов, если
x[i] != x[j]
В действительности, мы делаем это для всех соседних индексных пар:
out = np.zeros(indices.shape[0], dtype=int)
for idx in range(indices.shape[0]-1):
count = 0
i = indices[idx]
j = indices[idx + 1]
k = 0
# while i+k < x.shape[0] and j+k < x.shape[0] and x[i+k] != 0 and x[j+k] != 0 and x[i+k] == x[j+k]:
while i+k < x.shape[0] and j+k < x.shape[0] and x[i+k] == x[j+k]:
count += 1
k += 1
out[idx] = k
И вывод:
# [0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 2, 3, 0, 3, 0, 1, 0, 2, 2, 1, 2, 0] # This is the old output if x[i] == 0 and x[j] == 0 are included
[1 2 1 4 0 2 2 5 1 4 3 2 3 0 3 0 1 0 3 2 1 2 0]
Я ищу векторизованный способ сделать это в NumPy.