2016-03-20 21 views
1

En yüksek değere sahip NxM Numpy dizisinin her sütunundaki satırı bulmak için hızlı ve etkin bir yol var mı?Sayısal matriste maksimum sütun değerlerinin satır dizini bulma

Şu anda nispeten yavaştır Python, içinde yuvalanmış bir döngü aracılığıyla yapıyorum: Bir 640x480 resim için

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 

, bu yaklaşık 5 saniye sürer. Çok büyük değil, daha karmaşık görüntü işlemleri, bulanıklaştırma gibi, Numpy/PIL/C'de tamamen uygulandığında 0.01 saniye veya daha az sürer. Bu bir video akışında gerçekleştirmeye çalıştığım bir işlem, bu yüzden büyük bir darboğaz. Bunu nasıl hızlandırabilirim, kendi C uzantımı yazmaktan kısa bir süre sonra?

cevap

3

Bunun için numpy.argmax kullanmak isteyeceksiniz. Bu, verilen bir eksen boyunca maksimum değere karşılık gelen elemanın indeksini döndürecektir.

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

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

ve bir örneğinin uğruna

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]) 
İlgili konular