Skip to main content
Added tag
Link
FMc
  • 12.8k
  • 2
  • 28
  • 40
Source Link
shamalaia
  • 294
  • 1
  • 11

find max value in islands defined by other vector

I have a vector of values vals, a same-dimension vector of frequencies freqs, and a set of frequency values pins.

I need to find the max values of vals within the corresponding interval around each pin (from pin-1 to pin+1). However, the intervals merge if they overlap (e.g., [1,2] and [0.5,1.5] become [0.5,2]).

I have a code that (I think) works, but I feel is not optimal at all:

import numpy as np

freqs = np.linspace(0, 20, 50)
vals = np.random.randint(100, size=(len(freqs), 1)).flatten()
print(freqs)
print(vals)

pins = [2, 6, 10, 11, 15, 15.2]
# find one interval for every pin and then sum to find final ones
islands = np.zeros((len(freqs), 1)).flatten()
for pin in pins:
    island = np.zeros((len(freqs), 1)).flatten()
    island[(freqs >= pin-1) * (freqs <= pin+1)] = 1
    islands += island
islands = np.array([1 if x>0 else 0 for x in islands])
print(islands)

maxs = []
k = 0
idxs = []
for i,x in enumerate(islands):
    if (x > 0) and (k == 0):  # island begins
        k += 1
        idxs.append(i)
    elif (x > 0) and (k > 0):  # island continues
        pass
    elif (x == 0) and (k > 0):  # island finishes
        idxs.append(i)
        maxs.append(np.max(vals[idxs[0]:idxs[1]]))
        k = 0
        idxs = []
        continue
print(maxs)