【发布时间】:2018-10-26 00:17:31
【问题描述】:
我有一组排序(一维)长度不等的数组(比如M0、M1 和M2)。我想找出每个数组有多少元素在特定的数字范围内(其中数字范围由另一个排序数组中的相邻元素指定,比如zbin )。我想知道实现这一目标的最快方法是什么。
在这里,我给出了一个我想做的任务的小例子(以及我目前为实现所需功能而遵循的方法):
""" Function to do search query """
def search(numrange, lst):
arr = np.zeros(len(lst))
for i in range(len(lst)):
probe = lst[i]
count = 0
for j in range(len(probe)):
if (probe[j]>numrange[1]): break
if (probe[j]>=numrange[0]) and (probe[j]<=numrange[1]): count = count + 1
arr[i] = count
return arr
""" Some example of sorted one-dimensional arrays of unequal lengths """
M0 = np.array([5.1, 5.4, 6.4, 6.8, 7.9])
M1 = np.array([5.2, 5.7, 8.8, 8.9, 9.1, 9.2])
M2 = np.array([6.1, 6.2, 6.5, 7.2])
""" Implementation and output """
lst = [M0, M1, M2]
zbin = np.array([5.0, 5.5, 6.0, 6.5])
zarr = np.zeros( (len(zbin)-1, len(lst)) )
for i in range(len(zbin)-1):
numrange = [zbin[i], zbin[i+1]]
zarr[i,:] = search(numrange, lst)
print zarr
输出:
[[ 2. 1. 0.]
[ 0. 1. 0.]
[ 1. 0. 3.]]
在这里,最终输出 zarr 为我提供了每个数组(M0、M1 和 M2)在每个 bin 中的元素数量,可能来自 zbin(viz . [5.0, 5.5]、[5.5, 6.0] 和 [6.0, 6.5]。)例如考虑 bin [5.0, 5.5]。数组 M0 在该 bin 中有 2 个元素(5.1 和 5.4),M1 有 1 个元素(5.2)和 M2该 bin 中有 0 个元素。这给出了zarr 的第一行,即[2,1,0]。可以以类似的方式获取zarr 的其他行。
在我的实际任务中,我将处理比我在此示例中给出的长度大得多的zbin,以及更大和更多的数组,例如M0、M1、...@987654349 @。所有Ms 和数组zbin 将始终排序。我想知道我设计的功能 (search()) 和我遵循的方法是否是实现所需功能的最佳和 最快 方法。我将非常感谢任何帮助。
【问题讨论】:
-
该列表中通常会有多少个数组?这些数组会一直排序吗?
-
@Divakar :大约有 1000 个这样的数组(
M)。它们将始终被排序。