指定数量的numpy数组有多少个元素

2024-06-06 22:00:28 发布

您现在位置:Python中文网/ 问答频道 /正文

对于长度不等的排序的numpy数组的列表(例如M0M1M2),我想找出这些数组中每个数组的多少元素在数组的相邻对(例如zbin)给出的数字范围内。zbin未排序,所述数字范围如下[z[0], z[1]][z[2], z[3]][z[4], z[5]]等。zbin总是有偶数个元素。)由于zbin未排序性质,以及在zbin中对邻接对的考虑,使得这个问题不同于这里提出的Number of elements of numpy arrays inside specific bins。在所述链接中,zarr排序并且相邻元素给出了数字范围(这里相邻对给出了数字范围)。你知道吗

这就是我目前正在做的:

""" 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]中具有1元素,M1具有1元素,M2具有0元素。第二行和第三行显示后续数字范围的结果,[5.1, 5.3][5.2, 5.4]。)

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


Tags: of元素len排序np数字数组probe
1条回答
网友
1楼 · 发布于 2024-06-06 22:00:28

不确定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解决方案肯定会更快。你知道吗

相关问题 更多 >