简体   繁体   中英

indexing numpy array with logical operator

I have a 2d numpy array, for instance as:

import numpy as np
a1 = np.zeros( (500,2) )

a1[:,0]=np.arange(0,500)
a1[:,1]=np.arange(0.5,1000,2)
# could be also read from txt

then I want to select the indexes corresponding to a slice that matches a criteria such as all the value a1[:,1] included in the range (l1,l2):

l1=20.0; l2=900.0; #as example

I'd like to do in a condensed expression. However, neither:

np.where(a1[:,1]>l1 and a1[:,1]<l2)

(it gives ValueError and it suggests to use np.all, which it is not clear to me in such a case); neither:

np.intersect1d(np.where(a1[:,1]>l1),np.where(a1[:,1]<l2))

is working (it gives unhashable type: 'numpy.ndarray')

My idea is then to use these indexes to map another array of size (500,n).

Is there any reasonable way to select indexes in such way? Or: is it necessary to use some mask in such case?

This should work

np.where((a1[:,1]>l1) & (a1[:,1]<l2))

or

np.where(np.logical_and(a1[:,1]>l1, a1[:,1]<l2))

Does this do what you want?

import numpy as np
a1 = np.zeros( (500,2) )
a1[:,0]=np.arange(0,500)
a1[:,1]=np.arange(0.5,1000,2)
c=(a1[:,1]>l1)*(a1[:,1]<l2) # boolean array, true if the item at that position is ok according to the criteria stated, false otherwise 
print a1[c] # prints all the points in a1 that correspond to the criteria 

afterwards you can than just select from your new array that you make, the points that you need (assuming your new array has dimensions (500,n)) , by doing

print newarray[c,:]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM