Расстояние до следующего ненулевого элемента в одномерном массиве numpy

У меня есть одномерный массив 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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
423
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Давай попробуем:

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])

В конце вывода есть один

Dani Mesejo 15.12.2020 15:55

yhaa, но это нюанс. всегда можно b=a[:-1]

Lior Cohen 15.12.2020 15:58

Другие вопросы по теме