Numpy: find index of the elements within range

前端 未结 12 2043
盖世英雄少女心
盖世英雄少女心 2020-11-28 23:01

I have a numpy array of numbers, for example,

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])  

I would like to find all the indexes of the

相关标签:
12条回答
  • 2020-11-28 23:02

    Other way is with:

    np.vectorize(lambda x: 6 <= x <= 10)(a)
    

    which returns:

    array([False, False, False,  True,  True,  True, False, False, False])
    

    It is sometimes useful for masking time series, vectors, etc.

    0 讨论(0)
  • 2020-11-28 23:06

    Wanted to add numexpr into the mix:

    import numpy as np
    import numexpr as ne
    
    a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])  
    
    np.where(ne.evaluate("(6 <= a) & (a <= 10)"))[0]
    # array([3, 4, 5], dtype=int64)
    

    Would only make sense for larger arrays with millions... or if you hitting a memory limits.

    0 讨论(0)
  • 2020-11-28 23:08

    This may not be the prettiest, but works for any dimension

    a = np.array([[-1,2], [1,5], [6,7], [5,2], [3,4], [0, 0], [-1,-1]])
    ranges = (0,4), (0,4) 
    
    def conditionRange(X : np.ndarray, ranges : list) -> np.ndarray:
        idx = set()
        for column, r in enumerate(ranges):
            tmp = np.where(np.logical_and(X[:, column] >= r[0], X[:, column] <= r[1]))[0]
            if idx:
                idx = idx & set(tmp)
            else:
                idx = set(tmp)
        idx = np.array(list(idx))
        return X[idx, :]
    
    b = conditionRange(a, ranges)
    print(b)
    
    0 讨论(0)
  • 2020-11-28 23:13

    This code snippet returns all the numbers in a numpy array between two values:

    a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56] )
    a[(a>6)*(a<10)]
    

    It works as following: (a>6) returns a numpy array with True (1) and False (0), so does (a<10). By multiplying these two together you get an array with either a True, if both statements are True (because 1x1 = 1) or False (because 0x0 = 0 and 1x0 = 0).

    The part a[...] returns all values of array a where the array between brackets returns a True statement.

    Of course you can make this more complicated by saying for instance

    ...*(1-a<10) 
    

    which is similar to an "and Not" statement.

    0 讨论(0)
  • 2020-11-28 23:16

    You can use np.where to get indices and np.logical_and to set two conditions:

    import numpy as np
    a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])
    
    np.where(np.logical_and(a>=6, a<=10))
    # returns (array([3, 4, 5]),)
    
    0 讨论(0)
  • 2020-11-28 23:22
    s=[52, 33, 70, 39, 57, 59, 7, 2, 46, 69, 11, 74, 58, 60, 63, 43, 75, 92, 65, 19, 1, 79, 22, 38, 26, 3, 66, 88, 9, 15, 28, 44, 67, 87, 21, 49, 85, 32, 89, 77, 47, 93, 35, 12, 73, 76, 50, 45, 5, 29, 97, 94, 95, 56, 48, 71, 54, 55, 51, 23, 84, 80, 62, 30, 13, 34]
    
    dic={}
    
    for i in range(0,len(s),10):
        dic[i,i+10]=list(filter(lambda x:((x>=i)&(x<i+10)),s))
    print(dic)
    
    for keys,values in dic.items():
        print(keys)
        print(values)
    

    Output:

    (0, 10)
    [7, 2, 1, 3, 9, 5]
    (20, 30)
    [22, 26, 28, 21, 29, 23]
    (30, 40)
    [33, 39, 38, 32, 35, 30, 34]
    (10, 20)
    [11, 19, 15, 12, 13]
    (40, 50)
    [46, 43, 44, 49, 47, 45, 48]
    (60, 70)
    [69, 60, 63, 65, 66, 67, 62]
    (50, 60)
    [52, 57, 59, 58, 50, 56, 54, 55, 51]  
    
    0 讨论(0)
提交回复
热议问题