Получить начало и конец диапазона в массиве - PullRequest
0 голосов
/ 03 октября 2018

Предположим, у меня есть сигнал, скажем, синусоида:

x = np.arange(100)
y = np.sin(x/10)

Когда я рисую это, я хочу выделить красным цветом области, где значение y выше определенного порога,например 0,7.Я думал о том, чтобы сделать что-то вроде этого

region = [i for i, e in enumerate(y) if e >= 0.7]
fig, ax = plt.subplots()
ax.plot(x, y)

k = region [0]
for i in region:
    if i-k == 1:
       ax.axvspan(k, i+1, facecolor='red', alpha=0.2)
    k = i

plt.show()

+1 добавлено, потому что я хочу "включить" последнюю точку в выделенной области.

Однако это приводит к перекрытию axvspan s, что означает, что первый и последний будут "легче" (потому что я использую alpha = 0.2), как на рисунке: Plot

Есть ли еще(возможно, более простой) способ добиться этого?

1 Ответ

0 голосов
/ 03 октября 2018

Один из способов - применить маску к y, чтобы найти значения выше вашего порога.Затем вам нужно найти первое и последнее вхождение, где значения маски True.Это можно сделать, найдя True-False и False-True переходы, используя ответ на этот вопрос :

x = np.arange(100)
y = np.sin(x/10)

fig, ax = plt.subplots()
ax.plot(x, y)

mask = y >= 0.7

first_vals = np.argwhere((~mask[:-1] & mask[1:]))  # Look for False-True transitions
last_vals = np.argwhere((mask[:-1] & ~mask[1:])) + 1  # Look for True-False transitions

for start, stop in zip(first_vals, last_vals):
    ax.axvspan(start, stop, facecolor='red', alpha=0.2)

plt.show()

enter image description here

Введение второго условия означает, что вам придется использовать numpy.logical_or.Некоторые дополнительные проверки могут быть введены, если первое значение маски True:

mask = np.logical_or(y>0.7, y==0)

if mask[0]:
    first_vals = np.argwhere((~mask[:-1] & mask[1:]))  # Look for False-True transitions
    last_vals = np.argwhere((mask[:-1] & ~mask[1:])) + 1 # Look for True-False transitions
    first_vals = np.insert(first_vals, 0, 0, axis=0)

for start, stop in zip(first_vals, last_vals):
    ax.axvspan(start, stop, facecolor='red', alpha=0.2)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...