Ich muss ein häufigstes Element in einer Matrix basierend auf den Nachbarwerten und sich selbst berechnen. Ich habe eine generic_filter Funktion gefunden, mit der ich berechnet habe, was ich wollte. Also hier ist, wie ich dies für ein 2D-Array tunndimage.generic_function auf 3D-Array
arr = np.array([
[1, 2, 4],
[5, 6, 7],
[2, 4, 4]
])
def most_frequent(arr):
def most_frequent(val):
return Counter(val).most_common(1)[0][0]
footprint = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
return ndimage.generic_filter(arr, most_frequent, footprint=footprint, mode='constant')
print most_frequent(arr)
Das gibt mir
[[0 0 0]
[0 4 0]
[0 0 0]]
Ignorieren Sie die Elemente am Rand. Wie Sie sehen, ist das mittlere Element 4, da dies ein häufigstes Element unter den Nachbarn und dem Wert ist.
Das große Problem ist, dass ich das gleiche für eine 3D-Matrix tun muss. Also für eine Matrix wie diese
arr = np.array([
[[1, 1], [2, 2], [4, 4]],
[[5, 5], [6, 6], [7, 7]],
[[2, 2], [4, 4], [4, 4]]
])
erwarte ich [0, 0]
überall und [4, 4]
in der Mitte zu bekommen. Dies schlägt mit RuntimeError('filter footprint array has incorrect shape.')
fehl. Das Schlimmste, was ich Zweifel habe, dass ich generic_filter hier verwenden kann, weil die docs sagen:
CVAL: Skalar, optional Wert auf vergangene Kanten des Eingangs zu füllen, wenn Modus ‚constant‘ ist.
Also, wie kann ich mein Problem lösen?
Enthält das 3D-Eingabearray nur ganze Zahlen? – Divakar
Noch eine Frage - Sie beabsichtigen, einen solchen Filter gleitend über das Entir auszuführen Das 3D-Array könnte beliebig lang sein und nicht nur '(3,3,2)', oder? – Divakar