2016-03-31 11 views
0

Ich möchte relative lokale Maxima in einem 3D-Array (100,1000,1000) entlang der ersten Dimension finden. Ich bin die argrelmax Funktion von scipy.signalScipy: Argrelmax Finden Maxmima entlang Dimension in 3D Array

result = argrelmax(data, axis = 0, order = 20) 

verwendet, kann ich nicht wirklich Sinn der Ausgabe machen, erwartete ich so etwas wie die relativen Maxima für jede 1D Scheibe durch mein Datenvolumen. Stattdessen erhalte ich 3 Tupel mit 1653179 Werten. Wie kann ich sie auf meine ursprüngliche Form beziehen?

Antwort

1

Die Rückgabewerte von argrelmax sind die Array-Indizes der relativen Maxima. Zum Beispiel

In [47]: np.random.seed(12345) 

In [48]: x = np.random.randint(0, 10, size=(10, 3)) 

In [49]: x 
Out[49]: 
array([[2, 5, 1], 
     [4, 9, 5], 
     [2, 1, 6], 
     [1, 9, 7], 
     [6, 0, 2], 
     [9, 1, 2], 
     [6, 7, 7], 
     [7, 8, 7], 
     [1, 7, 4], 
     [0, 3, 5]]) 

In [50]: i, j = argrelmax(x, axis=0) 

In [51]: i 
Out[51]: array([1, 1, 3, 3, 5, 7, 7]) 

In [52]: j 
Out[52]: array([0, 1, 1, 2, 0, 0, 1]) 

i enthält die Zeilen und j enthält die Spalten der relativen Maxima. Z.B. x[1, 0] enthält den Wert 4, der in der ersten Spalte ein relatives Maximum darstellt, und x[1, 1] enthält den Wert 9, der in der zweiten Spalte ein relatives Maximum darstellt.

Um die lokale Maxima Spalte für Spalte zu verarbeiten, könnten Sie so etwas tun:

In [56]: for col in range(x.shape[1]): 
    ....:  mask = j == col 
    ....:  print("Column:", col, " Position of local max:", i[mask]) 
    ....:  
Column: 0 Position of local max: [1 5 7] 
Column: 1 Position of local max: [1 3 7] 
Column: 2 Position of local max: [3] 

Gleiches gilt für Ihre 3D-Array gilt. Im Folgenden einen viel kleineren 3D-Array als Beispiel verwendet:

In [73]: np.random.seed(12345) 

In [74]: data = np.random.randint(0, 10, size=(10, 3, 2)) 

In [75]: i, j, k = argrelmax(data, axis=0) 

Um die Positionen der relativen Maxima in der Scheibe zu bekommen data[:, 0, 0], könnten Sie tun:

In [76]: mask00 = (j == 0) & (k == 0) 

In [77]: i[mask00] 
Out[77]: array([5, 8]) 

überprüfen Sie, ob das sind die Indizes der die lokalen Maxima:

In [78]: data[:, 0, 0] 
Out[78]: array([2, 2, 6, 6, 1, 7, 3, 0, 8, 7]) 
+0

Ah, das macht jetzt total Sinn. In meinem Fall geben sie einfach die 3d Koordinaten jedes Maximums zurück. – Raubtaube

Verwandte Themen