指定数字范围内numpy数组的元素数

时间:2018-05-16 16:31:34

标签: python arrays numpy

有关已排序长度不等长度的数组(例如M0M1M2)的列表,我想要找到这些数组中每个数组的元素数量是由相邻的数组对给出的数字范围(例如zbinzbin 未排序和所述数字范围类似于以下[z[0], z[1]][z[2], z[3]][z[4], z[5]]等等。zbin始终具有偶数个元素。)未排序的性质zbin zbinzarr的{​​strong>相邻对的考虑因素来查找数字范围会使这个问题与此处提出的问题不同Number of elements of numpy arrays inside specific bins。在上述链接中,""" 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.2, 5.1, 5.3, 5.2, 5.4]) zarr = np.zeros( (len(zbin)/2, len(lst)) ) for i in np.arange(0, len(zbin)/2, 1): indx = i*2 print indx numrange = [zbin[indx], zbin[indx+1]] zarr[i,:] = search(numrange, lst) print zarr 已排序相邻元素给出了数字范围(此处相邻对给出数字范围)。

这就是我现在正在做的事情:

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

输出是:

zarr

此处,[1,1,0]的第一行(M0表示[5.0, 5.2]在所考虑的数字范围M1中有 1 元素,{{ 1}}包含 1 元素,M2包含 0 元素。第二行和第三行显示后续数字范围的结果, ie [5.1, 5.3][5.2, 5.4]。)

我想知道实现此所需功能的最快方法是什么(zarr)。在我的实际任务中,我将处理更大的zbin和更多的数组(M)。我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

不确定numpy会不会让你加速,但这是一次尝试:

lst = [M0, M1, M2]
zbin = np.array([5.0, 5.2, 5.1, 5.3, 5.2, 5.4])

zarr = np.zeros((len(zbin)//2, len(lst)), dtype=np.float)

for i,M in enumerate(lst):
    zarr[:,i] = np.count_nonzero(np.logical_and(M >= zbin[::2, np.newaxis],
                                                M <= zbin[1::2, np.newaxis]), axis=1)

In [10]: zarr
Out[10]: 
array([[1., 1., 0.],
       [1., 1., 0.],
       [1., 1., 0.]])

顺便说一句,如果你可以利用数组的排序特性,来自链接问题的@Divakar解决方案肯定会更快。