是否有一种快速有效的方法来查找具有最高值的NxM Numpy数组的每一列中的行?
我目前正在通过Python中的嵌套循环执行此操作,这相对较慢:
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
对于640x480图像,这需要大约5秒钟。不是很大,但更复杂的图像操作,如模糊,完全在Numpy / PIL / C中实现需要0.01秒或更短时间。这是我试图在视频流上执行的操作,因此这是一个巨大的瓶颈。如果没有编写自己的C扩展,我如何加快速度?
答案 0 :(得分:4)
您可能希望使用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])