2016-03-20 5 views
1

Gibt es eine schnelle, effiziente Möglichkeit, die Zeile in jeder Spalte eines NxM Numpy-Arrays zu finden, die den höchsten Wert hat?Zeilenindex von max. Spaltenwerten in einer nuepy-Matrix finden

Ich mache das derzeit über eine verschachtelte Schleife in Python, die relativ langsam ist:

from PIL import Image 
import numpy as np 
img = Image.open('sample.jpg').convert('L') 
width, height = size = img.size 
y = np.asarray(img.getdata(), dtype=np.float64).reshape((height, width)) 
max_rows = [0]*width 
for col_i in xrange(y.shape[1]): 
    max_vaue, max_row = max([(y[row_i][col_i], row_i) for row_i in xrange(y.shape[0])]) 
    max_rows[col_i] = max_row 

Für ein 640x480 Bild, das dauert etwa 5 Sekunden. Nicht große, aber komplexere Bildoperationen, wie Unschärfen, die vollständig in Numpy/PIL/C implementiert sind, benötigen 0,01 Sekunden oder weniger. Dies ist eine Operation, die ich in einem Videostream ausführen möchte. Es handelt sich also um einen großen Engpass. Wie beschleunige ich das, ohne meine eigene C-Erweiterung zu schreiben?

Antwort

3

Sie werden numpy.argmax dafür verwenden wollen. Dies gibt den Index des Elements zurück, das dem Maximalwert entlang einer gegebenen Achse entspricht.

row_index = np.argmax(y, axis=0) 

# Alternately 
row_index = y.argmax(axis=0) 

Und im Interesse eines Beispiels

data = np.random.rand(4,2) 
# array([[ 0.09695379, 0.44602826], 
#  [ 0.73614533, 0.19700072], 
#  [ 0.87843682, 0.21188487], 
#  [ 0.11389634, 0.51628872]]) 

row_index = data.argmax(axis=0) 
# array([2, 3]) 
Verwandte Themen