2017-10-18 9 views
0

Je sais que cela semble être une question assez courante, mais aucune des réponses ne semble actuellement aider ma situation. J'ai un tableau numpy 2D qui stocke un spectrogramme d'une chanson. Je veux identifier les pics en utilisant la fonction de numpy (je sais que les gens ont d'autres solutions pour trouver les pics, mais ce n'est pas ce que je cherche). Lorsque je l'ai utilisé sur mon tableau 2D, j'ai l'impression qu'il renvoie un tableau de coordonnées x, et un tableau de coordonnées y. Sauf presque toutes mes coordonnées x, à l'exception des quelques dernières, sont tous 5. Les coordonnées y semblent fonctionner, sauf qu'ils vont en haut.Obtenir des index pour le nombre maximum de points dans un tableau numpy 2D

Voici un exemple de la sortie:

Coefficient of Variation = 0.310873 
Skew = 33.2851477504 
Signal to Noise Ratio = 3.21674642281 
Peak threshold Scaler = 23.5 
Peak Amplitude threshold = 7.30551834404 

[5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
6 6 6] 
[ 259 283 324 388 389 412 424 449 453 501 1357 1422 1458 1459 1482 
1483 1486 1487 1535 1809 1874 1938 1939 1976 1999 2003 2068 2069 2084 2085 
2100 2101 2102 2116 2117 2118 2133 2134 2149 2150 2165 2166 2181 2182 2197 
2198 2199 2213 2214 2215 2229 2230 2231 2246 2247 2262 2263 2278 2279 2294 
2295 2296 2326 2350 2366 2367 2379 2391 2415 2431 2443 2455 2456 2480 2496 
2508 2520 2544 2556 2557 2568 2569 2843 3101 3126 3142 3154 3166 3190 3206 
3207 3218 3219 3231 3255 3271 3283 3295 3296 3319 3320 3331 3332 3344 3356 
3400 3412 3424 3449 3465 3477 3489 3513 3514 3529 3530 3541 3542 3554 3578 
3590 3602 3614 4119 4127 4135 4159 4175 4176 4187 4188 4200 4224 4240 4252 
4264 4265 4288 4289 4304 4305 4317 4329 4353 4365 4377 4389 4390 4393 4418 
4434 4446 4458 4482 4498 4499 4510 4511 4523 4547 4563 4575 4587 4588 4611 
4612 4623 4624 4636 4648 4652 4676 4692 4704 4716 4741 4757 4769 4781 4805 
4806 4821 4822 4833 4834 424 1974 1976] 
Total Time: 0.853456020355 seconds 
Time to find peaks: 0.0450880527496 seconds 
Number of x coords: 188 
Number of y coords: 188 
Number of amplitudes: 188 

et mon code ressemble à:

peaksx, peaksy = numpy.where(arr2D > (arr2Dcoefvar*threshold)) 
amplitudes = arr2D[peaksx,peaksy] 

print(peaksx) 
print(peaksy) 

Ici vous pouvez voir que je veux obtenir les coordonnées pour tout point dont la valeur (valeur z vraiment) est au-dessus 7,3055 ...

la forme du arr2D est: (2049, 5037)

Est-ce que je n'utilise pas la fonction where correctement? D'après ce que j'ai lu, il semble que je le suis, mais les valeurs sont complètement fausses.

Exemple d'image de ce tracé de manière incorrecte: bad maxima

Exemple d'image d'un bon terrain: good maxima

Merci un bouquet!

+0

Comment avez-vous généré le "bon" tracé? Est-ce la même méthode sur différentes données? – bnaecker

+0

Il est difficile de dire avec les données limitées et ne pas savoir à quoi ressemble votre code complet. np.where vous donnera les index dans arr2D mais est-ce que cela correspond exactement à vos valeurs x et y? Si non, avez-vous transformé ces données? Cela pourrait aussi être un problème avec les données elles-mêmes? – BenT

+0

@bnaecker Oui, le bon tracé a été généré à partir d'un code de stackoverflow, mais il faut près de 44 secondes pour le calculer. Mais il est exploité sur les mêmes données. – Clement

Répondre

0

Pour répondre à cette question pour les autres personnes qui sont curieuses de connaître la réponse, la façon dont elles sont indexées par rapport à matplotlib pose problème. Un peu comme lorsque vous étudiez les matrices et ils énumèrent la hauteur et la longueur. C'est semblable ici. Par conséquent, le code:

peaksx, peaksy = numpy.where(arr2D > (arr2Dcoefvar*threshold)) 

devrait être

peaksy, peaksx = numpy.where(arr2D > (arr2Dcoefvar*threshold)) 

et l'intrigue sortira correcte! :)