2016-03-20 13 views
1

NxM Numpy配列の各列の行を最も効率的に検索する方法はありますか?私は現在、比較的低速である、Pythonでネストされたループを介してこれをやっているnumpy行列の最大列値の行インデックスの検索

:640×480画像の場合

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 

、これは約5秒かかります。巨大ではありませんが、Numpy/PIL/Cで完全に実装された、ぼかしのようなもっと複雑な画像操作は0.01秒以下です。これはビデオストリームで実行しようとしている操作なので、大きなボトルネックです。私自身のCエクステンションを書くのに手間がかかりません。

答えて

3

これにはnumpy.argmaxを使用します。これは、与えられた軸に沿った最大値に対応する要素のインデックスを返します。

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

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

そして例のために

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]) 
関連する問題