2015-03-19 49 views
2

我想找到二维阵列的局部最大值,但只能在一维中找到。即:2D阵列一维中的Numpy局部最大值

1 2 3 2 1 1 4 5 6 2 
2 2 3 3 3 2 2 2 2 2 
1 2 3 2 2 2 2 3 3 3 

将返回:

0 0 1 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 1 0 

这显然是微不足道的通过数组迭代来解决,但这是缓慢的,通常是可以避免的。有没有一个快速的方法来实现这一目标?

编辑: 我已经设计了一个更快的解决方案:

进口numpy的为NP

testArray = np.array([[1,2,3,2,1,1,4,5,6,2],[2,2,3,3,3,2,2,2,2,2],[1,2,3,2,2,2,2,3,3,3] ]) 

leftShift = np.roll(testArray,1, axis=1) 
rightShift = np.roll(testArray,-1, axis=1) 

Max = ((testArray>leftShift) & (testArray>rightShift))*1 

print(Max) 

将返回:

[[0 0 1 0 0 0 0 0 1 0] 
[0 0 0 0 0 0 0 0 0 0] 
[0 0 1 0 0 0 0 0 0 0]] 

这是除了重复读数正确的结果。即......“13331”(最大值)与“13333789”(固定点)的区别

+2

你测试过它有多慢吗? – 2015-03-19 12:46:12

+0

是的,对于一个图像为0.8秒 – user2290362 2015-03-19 13:55:56

+0

答案实际上取决于您掌握的数据。在一个数据集(图像)内有多少个相同的最小值是平均值,数据集(图像)的大小是多少? – Konstantin 2015-03-19 16:13:27

回答

1

您可以通过对每一行应用有限差分梯度并检查符号变化来解决此问题。 但是不清楚在边界上应该做什么。