Сколько элементов массива numpy в указанном диапазоне номеров - PullRequest
0 голосов
/ 16 мая 2018

Для списка из отсортированных числовых массивов неравных длин (скажем, M0, M1, M2) я хочу узнать, сколько элементов каждого из этих Массивы находятся внутри диапазонов номеров, которые задаются соседними парами массива (скажем, zbin. zbin равен , не отсортирован , и указанные диапазоны номеров похожи на следующие [z[0], z[1]], [z[2], z[3]], [z[4], z[5]] и т. Д. zbin всегда имеет четное количество элементов.) несортированная природа из zbin и рассмотрение смежных пар для в zbin для Нахождение диапазонов чисел делает этот вопрос отличным от заданного здесь Количество элементов числовых массивов внутри определенных корзин . В указанной ссылке 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 имеет 1 элемент в рассматриваемом диапазоне номеров [5.0, 5.2], M1 имеет 1 element и M2 имеет 0 элементов. Во второй и третьей строках показаны результаты для последующих диапазонов чисел, т.е. [5.1, 5.3] и [5.2, 5.4].)

Я хочу знать, какой самый быстрый способ достичь желаемой функциональности (zarr). В моей реальной задаче я буду иметь дело с zbin гораздо большего размера и многими другими массивами (M). Я буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 16 мая 2018

Не уверен, что 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 из связанного вопроса определенно должно быть быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...