Finde Peak von 2d Histogramm

Ich mache ein 2d Histogramm von einigen (x, y) Daten und ich bekomme ein Bild wie dieses:

Histogramm-2d

Ich möchte einen Weg, um die (x, y) Koordinaten der Punkte zu erhalten, die die Maximalwerte in H speichern. Zum Beispiel wäre bei dem obigen Bild zwei Punkte mit den aprox-Koordinaten: (1090, 1040) und (1110, 1090) .

Das ist mein Code:

 import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm from os import getcwd from os.path import join, realpath, dirname # Path to dir where this code exists. mypath = realpath(join(getcwd(), dirname(__file__))) myfile = 'datafile.dat' x, y = np.loadtxt(join(mypath,myfile), usecols=(1, 2), unpack=True) fig = plt.figure() ax = fig.add_subplot(111) xmin, xmax = min(x), max(x) ymin, ymax = min(y), max(y) rang = [[xmin, xmax], [ymin, ymax]] binsxy = [int((xmax - xmin) / 20), int((ymax - ymin) / 20)] H, xedges, yedges = np.histogram2d(x, y, range=rang, bins=binsxy) extent = [yedges[0], yedges[-1], xedges[0], xedges[-1]] cp = ax.imshow(H.transpose()[::-1], interpolation='nearest', extent=extent, cmap=cm.jet) fig.colorbar(cp) plt.show() 

Bearbeiten

Ich habe versucht, die Lösungen von Marek und qarma versucht, die Koordinaten der Bins anstatt der Index von ihnen zu erhalten, wie folgt:

 # Marek's answer x_cent, y_cent = unravel_index(H.argmax(), H.shape) print('Marek') print(x_cent, y_cent) print(xedges[x_cent], yedges[y_cent]) # qarma's answer idx = list(H.flatten()).index(H.max()) x_cent2, y_cent2 = idx / H.shape[1], idx % H.shape[1] local_maxs = np.argwhere(H == H.max()) print('\nqarma') print(x_cent2, y_cent2) print(xedges[x_cent2], yedges[y_cent2]) print(xedges[local_maxs[0,0]], yedges[local_maxs[0,1]], xedges[local_maxs[1,0]], yedges[local_maxs[1,1]]) 

was dazu führt:

 Marek (53, 50) (1072.7838144329899, 1005.0837113402063) qarma (53, 50) (1072.7838144329899, 1005.0837113402063) (1072.7838144329899, 1005.0837113402063, 1092.8257731958763, 1065.3611340206187) 

Also die maximalen Koordinaten sind die gleichen, die gut ist! Jetzt habe ich ein kleines Problem, denn wenn ich das 2d-Plot vergrößern möchte, sehe ich, dass die Koordinaten ein wenig außerhalb des Zentrums für das globale Maximum und das lokale Maximum sind:

Bildbeschreibung hier eingeben

Warum ist das?

2 Solutions collect form web for “Finde Peak von 2d Histogramm”

Hier finden Sie das erste globale Maximum

 idx = list(H.flatten()).index(H.max()) x, y = idx / H.shape[1], idx % H.shape[1] 

Die Suche nach der Koordinate aller Maxima wurde dem Leser als Übung überlassen …

 numpy.argwhere(H == H.max()) 

Bearbeiten

Dein Code:

 H, xedges, yedges = np.histogram2d(x, y, range=rang, bins=binsxy) 

Hier enthält H Histogrammwerte und xedges, yedges Grenzen für Histogramm-Bins. Beachten Sie, dass die Größe der edges Arrays ist ein größer als die Größe von H in der entsprechenden Dimension. So:

 for x, y in numpy.argwhere(H == H.max()): # center is between x and x+1 print numpy.average(xedges[x:x + 2]), numpy.average(yedges[y:y + 2]) 

Diese Frage sollte Ihnen helfen: Python: Holen Sie sich die Position des größten Artikels in einem numpy Array

Sie können H.max() , um den Maximalwert zu erhalten und dann mit H vergleichen und numpy.nonzero zu verwenden, um Positionen aller Maximalwerte zu finden: numpy.nonzero(H.max() == H) . Das wird teurer sein als nur H.argmax() aber du bekommst alle Maximalwerte.

  • Pythonische Art, Ausreißer in eindimensionalen Beobachtungsdaten zu erkennen
  • Multiplizieren Sie zwei Matrix mit Spalten mit Python
  • Scipy: Beschleunigung der Berechnung eines 2D komplexen Integrals
  • Kopieren von Werten eines numpy Arrays in eine bestimmte Stelle der spärlichen Matrix
  • Schnelle Umwandlung von C / C ++ - Vektor in Numpy Array
  • Numpy strukturierte Arrays: String-Typ nicht verstanden bei der Angabe von dtype mit einem dict
  • Python Array Scheibe mit Komma?
  • Lesen einer Datei mit String und float mit loadtxt
  • Warum gibt scipy.stats.nanmean ein anderes Ergebnis von numpy.nansum?
  • VTK Render Fensterbild zu numpy Array
  • Warum ist das Speichern / Laden von Daten in Python viel mehr Platz und Zeit als Matlab?
  • Python ist die beste Programmiersprache der Welt.