OVH Cloud OVH Cloud

Numarray et extractikon de plages selon valeur

7 réponses
Avatar
Eric Deveaud
bonsoir,

l'exercice du vendredi ;-))

je dispose d'une array d'entiers dans la plage 0 à n (n < 1000) representant
les valuers d'une courbe
du genre
a = array([1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1])

(je sais elle est pas belle ma courbe)

je voudrais pouvoir sortir de cette array les abscisses correspondant à
l'intersection de la "courbe" avec un seuil telle que la zone
comprise entre les abscisses trouvées contiennent au moin une valeur superieur
a un seuil2

comme un dessin vaut mieux qu'un discours, ca donnerai a peu près ceci

4 + *
|
3 +-----------*---*---------------------- <- seuil2 = 3
|
2 +-------*-*-------*-*-------*-*-*-*- -- <- seuil1 = 2
|
1 * * * * * * * * *
|
0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^
| b1 b2 | +---------+---- pas pris en compte il n'y a pas
s1 s2 de valeur >= seuil2 dans
l'intervalle


pour le momment je m'en sort en faisant des pirouettes grace aux methodes
des numarray pour trouver les bornes b1 et b2 des domaines qui contiennent
au moin une valeur >= seuil2, puis a partir de ses bornes je parcours a partir
de b2 en amont et en aval a partir de b1 jsuqu'a trouver le point validant
valeur <= seuil1

du genre pour determiner les bornes b1, b2, b(n)
tmp = numarray.nonzero(numarray.greater(self.coverage, cut_off-1))
suivi d'un parcour de tmp pour determiner si je suis au sein d'un pic ou si je
viens de changer de pic: ie calcul du delta entre 2 valeurs consecutives
delta == 1 ==> même pic
delta != 1 ==> 2 pics différents

c'est lourd et pas tres joli, une idée pour tourner la chose autrement ??


Eric

PS je tiens le code a dispo de qui le veut.

7 réponses

Avatar
Eric Deveaud
Eric Deveaud wrote:

Subject: Numarray et extractikon de plages selon valeur
~~~~~~~~~~~

c'est moi le tikon, j'aurais du me relire ;-(

Eric
Avatar
Jerome
Eric Deveaud wrote:
bonsoir,

l'exercice du vendredi ;-))

je dispose d'une array d'entiers dans la plage 0 à n (n < 1000) representant
les valuers d'une courbe
du genre
a = array([1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1])

(je sais elle est pas belle ma courbe)

je voudrais pouvoir sortir de cette array les abscisses correspondant à
l'intersection de la "courbe" avec un seuil telle que la zone
comprise entre les abscisses trouvées contiennent au moin une valeur superieur
a un seuil2

comme un dessin vaut mieux qu'un discours, ca donnerai a peu près ceci

4 + *
|
3 +-----------*---*---------------------- <- seuil2 = 3
|
2 +-------*-*-------*-*-------*-*-*-*- -- <- seuil1 = 2
|
1 * * * * * * * * *
|
0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^
| b1 b2 | +---------+---- pas pris en compte il n'y a pas
s1 s2 de valeur >= seuil2 dans
l'intervalle


pour le momment je m'en sort en faisant des pirouettes grace aux methodes
des numarray pour trouver les bornes b1 et b2 des domaines qui contiennent
au moin une valeur >= seuil2, puis a partir de ses bornes je parcours a partir
de b2 en amont et en aval a partir de b1 jsuqu'a trouver le point validant
valeur <= seuil1

du genre pour determiner les bornes b1, b2, b(n)
tmp = numarray.nonzero(numarray.greater(self.coverage, cut_off-1))
suivi d'un parcour de tmp pour determiner si je suis au sein d'un pic ou si je
viens de changer de pic: ie calcul du delta entre 2 valeurs consecutives
delta == 1 ==> même pic
delta != 1 ==> 2 pics différents

c'est lourd et pas tres joli, une idée pour tourner la chose autrement ??


Eric

PS je tiens le code a dispo de qui le veut.




Comment veux-tu gérer le cas où ta fonction est monotone, ou bien quand
elle n'est pas continue ?

Avatar
Eric Deveaud
Jerome wrote:
Comment veux-tu gérer le cas où ta fonction est monotone, ou bien quand
elle n'est pas continue ?


ce n'est pas une fonction, ce sont des données collectés lors de séquençage
shot gun.
les valeurs représentent le nombre de fragments séquences pour une base du
consensu.

Eric. pas matheux pour 2 sous ;-)

--
A noter que si on a installé Macsbug, on peut avoir accès à une fenêtre
bien plus grande, bourrée d'information passionnantes, en couleur et
clickodrome. Et tout pour planter geekement son Mac.
-+- Ol. in Guide du Macounet Pervers : Savez-vous planter des choux..-+-

Avatar
Gerard Flanagan
Eric Deveaud wrote:

bonsoir,

l'exercice du vendredi ;-))

je dispose d'une array d'entiers dans la plage 0 à n (n < 1000) represe ntant
les valuers d'une courbe
du genre
a = array([1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1])

(je sais elle est pas belle ma courbe)

je voudrais pouvoir sortir de cette array les abscisses correspondant à
l'intersection de la "courbe" avec un seuil telle que la zone
comprise entre les abscisses trouvées contiennent au moin une valeur su perieur
a un seuil2

comme un dessin vaut mieux qu'un discours, ca donnerai a peu près ceci

4 + *
|
3 +-----------*---*---------------------- <- seuil2 = 3
|
2 +-------*-*-------*-*-------*-*-*-*- -- <- seuil1 = 2
|
1 * * * * * * * * *
|
0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^
| b1 b2 | +---------+---- pas pris en compte il n'y a p as
s1 s2 de valeur >= seuil2 dans
l'intervalle


pour le momment je m'en sort en faisant des pirouettes grace aux methodes
des numarray pour trouver les bornes b1 et b2 des domaines qui contiennent
au moin une valeur >= seuil2, puis a partir de ses bornes je parcours a partir
de b2 en amont et en aval a partir de b1 jsuqu'a trouver le point validant
valeur <= seuil1

du genre pour determiner les bornes b1, b2, b(n)
tmp = numarray.nonzero(numarray.greater(self.coverage, cut_off-1))
suivi d'un parcour de tmp pour determiner si je suis au sein d'un pic ou si je
viens de changer de pic: ie calcul du delta entre 2 valeurs consecutives
delta == 1 ==> même pic
delta != 1 ==> 2 pics différents

c'est lourd et pas tres joli, une idée pour tourner la chose autrement ??


Eric

PS je tiens le code a dispo de qui le veut.


une idee (si j'ai compris le probleme):

from itertools import groupby

graph = lambda lst: enumerate(lst)

def iterarcs(lst, inf):
for k,g in groupby( graph(a), lambda (x,y): y<inf ):
if k is False:
yield list(g)

def filtre(lst, sup):
for (x, y) in lst:
if y>sup:
return True
return False

a = [1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1]

seuil1 = 2
seuil2 = 3

arcs = [ X for X in iterarcs(a, seuil1) if filtre(X, seuil2) ]

print arcs

out: [[(4, 2), (5, 2), (6, 3), (7, 4), (8, 3), (9, 2), (10, 2)]]

intervalles = [ (X[0][0], X[-1][0]) for X in itergraph(a, seuil1) if
filtre(X, seuil2) ]

print intervalles

out: [(4, 10)]


Gerard

Avatar
Gerard Flanagan
Gerard Flanagan wrote:

Eric Deveaud wrote:

bonsoir,

l'exercice du vendredi ;-))

je dispose d'une array d'entiers dans la plage 0 à n (n < 1000) repre sentant
les valuers d'une courbe
du genre
a = array([1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1 ])

(je sais elle est pas belle ma courbe)

je voudrais pouvoir sortir de cette array les abscisses correspondant à
l'intersection de la "courbe" avec un seuil telle que la zone
comprise entre les abscisses trouvées contiennent au moin une valeur superieur
a un seuil2

comme un dessin vaut mieux qu'un discours, ca donnerai a peu près ceci

4 + *
|
3 +-----------*---*---------------------- <- seuil2 = 3
|
2 +-------*-*-------*-*-------*-*-*-*- -- <- seuil1 = 2
|
1 * * * * * * * * *
|
0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^
| b1 b2 | +---------+---- pas pris en compte il n'y a pas
s1 s2 de valeur >= seuil2 dans
l'intervalle


pour le momment je m'en sort en faisant des pirouettes grace aux method es
des numarray pour trouver les bornes b1 et b2 des domaines qui contienn ent
au moin une valeur >= seuil2, puis a partir de ses bornes je parcours a partir
de b2 en amont et en aval a partir de b1 jsuqu'a trouver le point valid ant
valeur <= seuil1

du genre pour determiner les bornes b1, b2, b(n)
tmp = numarray.nonzero(numarray.greater(self.coverage, cut_off-1))
suivi d'un parcour de tmp pour determiner si je suis au sein d'un pic o u si je
viens de changer de pic: ie calcul du delta entre 2 valeurs consecutives
delta == 1 ==> même pic
delta != 1 ==> 2 pics différents

c'est lourd et pas tres joli, une idée pour tourner la chose autremen t ??


Eric

PS je tiens le code a dispo de qui le veut.


une idee (si j'ai compris le probleme):

from itertools import groupby

graph = lambda lst: enumerate(lst)

def iterarcs(lst, inf):
for k,g in groupby( graph(a), lambda (x,y): y<inf ):
if k is False:
yield list(g)

def filtre(lst, sup):
for (x, y) in lst:
if y>sup:
return True
return False

a = [1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1]

seuil1 = 2
seuil2 = 3

arcs = [ X for X in iterarcs(a, seuil1) if filtre(X, seuil2) ]

print arcs

out: [[(4, 2), (5, 2), (6, 3), (7, 4), (8, 3), (9, 2), (10, 2)]]

intervalles = [ (X[0][0], X[-1][0]) for X in itergraph(a, seuil1) if
filtre(X, seuil2) ]

print intervalles

out: [(4, 10)]



-------------------------------------------
from itertools import groupby

def groups(lst, inf):
for k,g in groupby( enumerate(lst), lambda (x,y): y<inf ):
if k is False:
yield list(g)

def itergraph(lst, inf, sup):
for X in groups(lst, inf):
for (x, y) in X:
if y>sup:
yield X

a = [1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1]

seuil1 = 2
seuil2 = 3

arcs = list(itergraph(a, seuil1, seuil2) )

print arcs

intervalles = [ (X[0][0], X[-1][0]) for X in itergraph(a, seuil1,
seuil2) ]

print intervalles

-----------------------------------

Gerard


Avatar
Gerard Flanagan
Gerard Flanagan wrote:

Gerard Flanagan wrote:

Eric Deveaud wrote:

bonsoir,

l'exercice du vendredi ;-))

je dispose d'une array d'entiers dans la plage 0 à n (n < 1000) rep resentant
les valuers d'une courbe
du genre
a = array([1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1])

(je sais elle est pas belle ma courbe)

je voudrais pouvoir sortir de cette array les abscisses correspondant à
l'intersection de la "courbe" avec un seuil telle que la zone
comprise entre les abscisses trouvées contiennent au moin une valeu r superieur
a un seuil2

comme un dessin vaut mieux qu'un discours, ca donnerai a peu près c eci

4 + *
|
3 +-----------*---*---------------------- <- seuil2 = 3
|
2 +-------*-*-------*-*-------*-*-*-*- -- <- seuil1 = 2
|
1 * * * * * * * * *
|
0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^
| b1 b2 | +---------+---- pas pris en compte il n'y a pas
s1 s2 de valeur >= seuil2 dans
l'intervalle


pour le momment je m'en sort en faisant des pirouettes grace aux meth odes
des numarray pour trouver les bornes b1 et b2 des domaines qui contie nnent
au moin une valeur >= seuil2, puis a partir de ses bornes je parcou rs a partir
de b2 en amont et en aval a partir de b1 jsuqu'a trouver le point val idant
valeur <= seuil1

du genre pour determiner les bornes b1, b2, b(n)
tmp = numarray.nonzero(numarray.greater(self.coverage, cut_off-1))
suivi d'un parcour de tmp pour determiner si je suis au sein d'un pic ou si je
viens de changer de pic: ie calcul du delta entre 2 valeurs consecuti ves
delta == 1 ==> même pic
delta != 1 ==> 2 pics différents

c'est lourd et pas tres joli, une idée pour tourner la chose autrem ent ??



-------------------------------------------
from itertools import groupby

def groups(lst, inf):
for k,g in groupby( enumerate(lst), lambda (x,y): y<inf ):
if k is False:
yield list(g)



def itergraph(lst, inf, sup):
for X in groups(lst, inf):
for (x, y) in X:
if y>sup:
yield X



pardon, un 'break' est essentiel ici pour eviter repetition:

def itergraph(lst, inf, sup):
for X in groups(lst, inf):
for (x, y) in X:
if y>sup:
yield X
break

a = [1, 1, 1, 1, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1]

seuil1 = 2
seuil2 = 3

arcs = list(itergraph(a, seuil1, seuil2) )

print arcs

intervalles = [ (X[0][0], X[-1][0]) for X in itergraph(a, seuil1,
seuil2) ]

print intervalles

-----------------------------------



Gerard



Avatar
Eric Deveaud
Gerard Flanagan wrote:

merci, tu as bien compris mon pb.

il me reste a comprendre comment fonctionne les itertools ;-(

Eric

--
Il n'a pas tort, mais vous avez raison.
-+- LF In GNU : Soyons prudents -+-