2015-06-26 21 views
6

numpy diziler olarak verilmiştir yerel Maksimum ve Minimum şu şekildedir: Ben yerel asgari ve azami dizinini bulma amBul bütün x ve y değerleri ben iki diziyi <code>x</code> ve <code>y</code> sahip

x = np.array([6, 3, 5, 2, 1, 4, 9, 7, 8]) 
y = np.array([2, 1, 3, 5, 3, 9, 8, 10, 7]) 

:

sortId = np.argsort(x) 
x = x[sortId] 
y = y[sortId] 
minm = np.array([]) 
maxm = np.array([]) 
while i < y.size-1: 
    while(y[i+1] >= y[i]): 
     i = i + 1 

    maxm = np.insert(maxm, 0, i) 
    i++ 
    while(y[i+1] <= y[i]): 
     i = i + 1 

    minm = np.insert(minm, 0, i) 
    i++ 

Bu koddaki sorun nedir? Yanıt, minima = [2, 5, 7] ve maxima = [1, 3, 6] dizinindeki dizin olmalıdır.

+0

whate ile yapıyorsunuz sortId = np.argsort (x); x = x [sortId] '? – fferri

+0

Bir çift 'while' döngüsüyle bu çözüm çok yavaş olacaktır (ve np.insert'den bile bahsetmiyorum bile) 'minm' /' nmax' dizilerini her iterasyonda yeniden tahsis eder. Bunu düzgün bir şekilde yapmak için https://stackoverflow.com/questions/4624970/finding-local-maxima-minima-with-numpy-in-a-1d-numpy-rayrayim sayfasına bakın. – rth

+0

@mescalinum: x değerleri sıralıyorum ve karşılık gelen indeksler sortId içinde saklanacaktır. Böylece o değerleri y sırayla düzenleyebilirim. – prtkp

cevap

18

Bu while döngüsüne ihtiyacınız yok. Aşağıdaki kod, istediğiniz çıktıyı verecektir; tüm yerel minimumları ve tüm yerel maksimumları bulur ve bunları sırasıyla minm ve maxm'da depolar. Lütfen dikkat: Bunu büyük veri setlerine uyguladığınızda, önce sinyalleri pürüzsüzleştirdiğinizden emin olun; Aksi takdirde tonlarca ekstremite ile sonuçlanacaktır.

import numpy as np 
from scipy.signal import argrelextrema 
import matplotlib.pyplot as plt 

x = np.array([6, 3, 5, 2, 1, 4, 9, 7, 8]) 
y = np.array([2, 1, 3 ,5 ,3 ,9 ,8, 10, 7]) 

# sort the data in x and rearrange y accordingly 
sortId = np.argsort(x) 
x = x[sortId] 
y = y[sortId] 

# this way the x-axis corresponds to the index of x 
plt.plot(x-1, y) 
plt.show() 
maxm = argrelextrema(y, np.greater) # (array([1, 3, 6]),) 
minm = argrelextrema(y, np.less) # (array([2, 5, 7]),) 

Bu

çok daha verimli yukarıdaki while döngü daha olmalıdır.

Arsa bu gibi görünüyor; bunlar minm ve maxm döndürülen indekslerine karşılık gelecek şekilde I) X-değerleri değiştirmiş:

enter image description here

+0

ya .... bu iyi çalışıyor ... aşağıda verilen çözümüm de aynı cevabı veriyor .... ama sorun, büyük veri kümesinin coz'udur, ikinci sorumu anlattığım gibi çok sayıda aşırılık vermesi ve extremas bulmadan önce sinyali yumuşatmak için önerdi ... btw Thanks – prtkp

+1

Bu yorum eklemek için üzgünüz, ama arama yaparken soruyu nasıl kelime emin değilim. "Sinyalleri yumuşatmak" ile ne demek istiyorsun? Bunun için ne kullanırdınız? Teşekkürler. – datahappy

+1

@datahappy: "Pürüzsüz sinyal scipy" ve aynı zamanda "koşu ortalama" için doğru parçayı almalısınız. Yumuşatma, gerçek zirveleri bulmaya yardımcı olan birçok yerel ekstremiteden kurtulur. – Cleb

0

Bu sorun sorunsuz çalışacaktır. Python ++ yerine += kullanır.

Bir süre döngüsünde i'u kullanmadan önce, bir değer atamanız gerekir - bu durumda 0 -, bu şekilde hatadan kaçınmak için başlatılır.

import numpy as np 

x=np.array([6,3,5,2,1,4,9,7,8]) 
y=np.array([2,1,3,5,3,9,8,10,7]) 


sortId=np.argsort(x) 
x=x[sortId] 
y=y[sortId] 
minm = np.array([]) 
maxm = np.array([]) 
i = 0 
while i < y.size-1: 
    while(y[i+1] >= y[i]): 
     i+=1 

    maxm=np.insert(maxm,0,i) 
    i+=1 
    while(y[i+1] <= y[i]): 
     i+=1 

    minm=np.insert(minm,0,i) 
    i+=1 

print minm, maxm 
+0

Bu hata "endeksi tükendi" – prtkp

+0

bu bana – Geeocode

+0

için iyi sonuç veren [7. 5. 2.] [6. 3. 1.] – Geeocode

1
x=np.array([6,3,5,2,1,4,9,7,8]) 
y=np.array([2,1,3,5,7,9,8,10,7]) 

sort_idx = np.argsort(x) 
y=y[sort_idx] 
x=x[sort_idx] 
minm=np.array([],dtype=int) 
maxm=np.array([],dtype=int) 
length = y.size 
i=0 

while i < length-1: 
    if i < length - 1: 
     while i < length-1 and y[i+1] >= y[i]: 
      i+=1 

     if i != 0 and i < length-1: 
      maxm = np.append(maxm,i) 

     i+=1 

    if i < length - 1: 
     while i < length-1 and y[i+1] <= y[i]: 
      i+=1 

     if i < length-1: 
      minm = np.append(minm,i) 
     i+=1 


print minm 
print maxm 

minm ve maxm sırasıyla asgari ve azami indislerine içerir.

İlgili konular