У меня есть одномерный массив numpy, состоящий из единиц и нулей, например:
[0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]
Для каждого ненулевого элемента массива я хочу вычислить «расстояние» до следующего ненулевого элемента. То есть я хочу ответить на вопрос «Как далеко находится следующий ненулевой элемент?» Таким образом, результат для приведенного выше массива будет таким:
[0, 0, 0, 1, 3, 0, 0, 6, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0]
Есть ли для этого встроенная функция numpy? И если нет, то какой самый эффективный способ реализовать это в numpy?
Давай попробуем:
import numpy as np
arr = np.array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1])
# create output
res = np.zeros_like(arr)
# select indices non-zero
where, = np.where(arr)
# assign the indices of the non-zero the diff
res[where[:-1]] = np.diff(where)
print(res)
Выход
[0 0 0 1 3 0 0 6 0 0 0 0 0 4 0 0 0 0]
Наверное, не лучший ответ.
np.where
даст вам расположение ненулевых индексов в порядке возрастания. Перебирая результат, вы знаете расположение каждого 1 и расположение следующего 1 и можете легко построить массив результатов самостоятельно. Если 1 разрежены, это, вероятно, довольно эффективно.
Позвольте мне посмотреть, смогу ли я придумать что-то более глупое.
== ОБНОВЛЕНИЕ ==
Ах, только что пришел ко мне
# Find the ones in the array
temp = np.where(x)[0]
# find the difference between adjacent elements
deltas = temp[1:] - temp[:-1]
# Build the result based on these
result = np.zeros_like(x)
result[temp[:-1]] = deltas
Вот 2 вкладыша. Если вы не хотите переопределять оригинал a
, замените на copy()
import numpy as np
a = np.array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1])
ix = np.where(a)[0]
a[ix[:-1]] = np.diff(ix)
print(a[:-1]) # --> array([0, 0, 0, 1, 3, 0, 0, 6, 0, 0, 0, 0, 0, 4, 0, 0, 0])
yhaa, но это нюанс. всегда можно b=a[:-1]
В конце вывода есть один