Код: Выделить всё
a = np.array([1, 0, 2, 0, 0, 1, 0, 2, 0, 0, 1, 0, 2, 0, 0 ] )
b = np.array([2, 0, 0, 1, 0, 2, 0, 0, 1, 0, 2, 0, 0, 1, 0] )
# expected
c = np.array ([3, 0, 2, 1, 0, 2, 0, 2, 1, 0, 2, 0,2, 1, 0 ])
в массиве A , первый элемент - 1, а ближайшее совпадение в b - 3 шага. Второй элемент в - 0, и это совпадение в B , так что ноль уходит. Третий элемент составляет 2, а закрытие в b -b [0] , который составляет 2 шага от [2] = 2 .. и т. Д.def find_shifts_required(x, y):
assert len(x) == len(y)
result = np.zeros(len(x))
labels = np.unique(x)
for lbl in labels:
x_pos = np.where(x == lbl)
y_pos = np.where(y == lbl) #.min())
result[x_pos] = np.subtract(x_pos , y_pos )
_shifts = np.absolute(result).astype(int)
return _shifts
d = find_shifts_required(a,b)
print("expected: " , c)
print("actual: " , d)
< /code>
, который дает мне: < /p>
expected: [3 0 2 1 0 2 0 2 1 0 2 0 2 1 0]
actual: [3 0 2 1 0 3 0 2 1 0 3 0 2 1 0]
< /code>
Мне интересно, была ли эта проблема где -то решена (Scipy: я не смог найти имя) или лучшая реализация. Более проще, быстрее будет великолепно.
Подробнее здесь: https://stackoverflow.com/questions/796 ... s-elements