Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 339
gluuke Avatar asked Jan 07 '14 14:01

gluuke


2 Answers

This should work

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

or

np.where(np.logical_and(a1[:,1]>l1, a1[:,1]<l2))
like image 195
YXD Avatar answered Sep 30 '22 09:09

YXD


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,:]
like image 43
usethedeathstar Avatar answered Sep 30 '22 11:09

usethedeathstar