在两个Numpy数组中查找序列

时间:2014-06-21 20:20:49

标签: python arrays algorithm numpy sequence

我有两个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个位置内。基本上我试图根据强度值识别图像中的虚线。

2 个答案:

答案 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是通过使用布尔数组索引最大值来计算的(距离低于限制的真实数字)

如果矢量很长,这可能会变慢。如果不急,这是一段简单的代码。