我有两个Numpy数组,其中包含来自另一个数组的最大值和最小值的索引。
例如,对于一个输出,maxima和minima数组如下所示:
Maxima indices are (array([ 4, 10, 14, 37, 43, 51, 59, 67, 81, 89, 95]),)
Minima indices are (array([ 7, 12, 25, 33, 40, 49, 56, 63, 76, 92]),)
这些指数来自图像行中的强度值。
我需要找出两个最小值之间的四个索引位置内出现最大值的次数 - 换句话说:
minima + 4 + maxima + 4 + minima
如何在Python中有效地完成此操作?如何比较两个数组中的索引值以查找此序列的实例,然后计算总共有多少个实例?
非常感谢您的帮助。
编辑:每个最大值必须在左侧和右侧最近的最小值的4个位置内。基本上我试图根据强度值识别图像中的虚线。
答案 0 :(得分:0)
让我们试试。
import numpy
# create a vector for distances from the nearest leftmost minimum
# img_len is the length of the image row
# first we create an integer vector with 1 at each minimum
b = numpy.zeros(img_len, dtype='int')
# then we create an integer vector for the distances
d = numpy.zeros(img_len, dtype='int')
# we mark leftmost distances up to the first minimum to be largest possible
d[:minima[0]] = minima[0] - numpy.arange(minima[0])
# then we iterate through the vector and calculate the distances
for i in range(len(minima) - 1):
prev = minima[i]
next = minima[i+1]
# now we have a gap between the two minima
# let's fill it with a triangle 0,1,2,...,2,1,0
k = (next-prev + 1) // 2
d[prev:prev+k+1] = numpy.arange(k+1)
d[next-k+1:next] = k -1 - numpy.arange(k-1)
# fill in the space after the last minimum:
d[minima[-1]:] = numpy.arange(img_len - minima[-1])
# all maxima whose distance is less than D from the closest minimum
results = [ m for m in maxima if d[m] < D ]
除非代码明显,否则我们的想法是创建一个向量d
,它对应于距离最近的最小值的距离。得到的矢量是例如4,3,2,1,0,1,2,3,2,1,0,1,2,1,0,......其中零对应于最小位置。最难的是让循环中的三角形制作正确。 (我希望我清理所有的那些......)
当然,现在您还可以为最大位置创建元组列表:
[ (m, d[m]) for m in maxima ]
对于问题中的数据,这将返回:
[(4, 3),
(10, 2),
(14, 2),
(37, 3),
(43, 3),
(51, 2),
(59, 3),
(67, 4),
(81, 5),
(89, 3),
(95, 3)]
即使问题中两个最小值之间存在多个最大值,代码也能正常工作。 (如果只有一个最大值,则代码几乎完全不同。)
答案 1 :(得分:0)
我将此作为另一个答案,因为这是一种完全不同的方法。不太宽松,但代码非常短,而且非常小巧。
import numpy
# let's assume minima and maxima are 1-d arrays
# then the distance matrix for distances between any maximum to any minimum is:
md = numpy.amin(numpy.abs(maxima[:,None]-minima[None,:]), axis=1)
# the maxima which are at most D pixels away form the closest minima:
cm = maxima[md < D]
这些当然可以组合成一个很难理解的单线。
简要说明:
amin
操作,从每个最大值到最小值的最短距离cm
是通过使用布尔数组索引最大值来计算的(距离低于限制的真实数字)如果矢量很长,这可能会变慢。如果不急,这是一段简单的代码。