我有一组不等长的排序(一维)数组(例如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。数组[5.0, 5.5]在该bin中具有2个元素([5.5, 6.0]和[6.0, 6.5]),[5.0, 5.5]在该bin中具有1个元素(M0),而5.1具有0个元素。这给出了5.4的第一行,即M1。可以类似的方式获得5.2的其他行。在我的实际任务中,我将处理长度大于本例中给出的长度的M2,并且还要处理更大,更多的数组,例如zarr,[2,1,0],zarr zbin。所有M0和数组M1将始终进行排序。我想知道我设计的功能(...)和我遵循的方法是否是实现所需功能的最佳方法和最快方法。我将非常感谢您的帮助。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我们可以利用排序后的性质,因此在此任务中使用np.searchsorted,就像这样-out = np.empty((len(zbin)-1, len(lst)),dtype=int)for i,l in enumerate(lst): left_idx = np.searchsorted(l, zbin[:-1], 'left') right_idx = np.searchsorted(l, zbin[1:], 'right') out[:,i] = right_idx - left_idx (adsbygoogle = window.adsbygoogle || []).push({});
10-04 20:44