Jesh Kundem
Jesh Kundem

Reputation: 974

Edge of a curve based out of numpy array

I am looking for some mathematical guidance, to help me find the index locations (red circles) of a curve as shown in the image below. The curve is just 1D numpy array. I tried scipy - gaussianfilter1d. I also tried np.gradient and I am not anywhere close to what I want to do. The gradient is abruptly changing, so a first order gradient should give what I am looking for. Then I realized the data is not smooth, and I tried smoothing by 'gaussianfilter1d'. Even then, I am unable to pick up where it changes. I have various types of these numpy arrays (same size, values ranging from 0 - 1), so the solution has to be applicable, and not dependent on the given data set. So I could not hardcode. Any thoughts would be much appreciated.

CSV file

enter image description here

Upvotes: 0

Views: 419

Answers (1)

Lukas S
Lukas S

Reputation: 3583

First you get a smooth function from your data using scipy's UnivariateSpline. Then you plot the area where the absolute slope is say at least 1/4 of it's maximum.

from scipy.interpolate import UnivariateSpline

f= UnivariateSpline(np.arange(5500), y, k=3, s=0.3)
df = f.derivative()
plt.plot(x,f(x))
cond = np.abs(df(x)) > 0.25*np.max(np.abs(df(x)))
plt.scatter(x[cond],f(x[cond]), c='r')

function with high slope marked Looks like what you are looking for is the first and last point of the marked ones. So you do

(x[cond].min(),f(x[cond].min()).item()), (x[cond].max(), f(x[cond].max()).item())

And your points are:

((1455, 0.20595740349084446), (4230, 0.1722999962943679))

Upvotes: 1

Related Questions