【问题标题】:How many elements of numpy array in specified number range指定数字范围内的numpy数组有多少个元素
【发布时间】:2018-05-16 16:31:34
【问题描述】:

对于 排序 不等长度的numpy数组列表(比如M0M1M2)我想知道每个数组有多少个元素这些数组中的一个在由相邻的数组对给出的数字范围内(比如zbinzbin 未排序,所述数字范围类似于以下[z[0], z[1]],@ 987654328@、[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 元素,M11 元素和M2 具有0 元素。第二行和第三行显示后续数字范围的结果, [5.1, 5.3][5.2, 5.4]。)

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

【问题讨论】:

  • 使用您之前链接的问题的已接受解决方案中的out[::2]
  • 或者为了节省内存,使用out = np.empty((len(zbin)//2, len(lst)),dtype=int)初始化,然后使用zbin[:-1:2]zbin[1::2]来获取左右索引?
  • Divakar:一如既往,这是一个很好的答案!非常感谢:)

标签: python arrays numpy


【解决方案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 解决方案肯定会更快。

【讨论】:

  • filippo:感谢这个非常好的答案!这行得通,速度符合我的要求。 :)
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2023-02-22
  • 2021-09-16
相关资源
最近更新 更多