How to filter numpy array by list of indices?
It looks like you just need a basic integer array indexing:
filter_indices = [1,3,5]np.array([11,13,155,22,0xff,32,56,88])[filter_indices]
numpy.take
can be useful and works well for multimensional arrays.
import numpy as npfilter_indices = [1, 2]axis = 0array = np.array([[1, 2, 3, 4, 5], [10, 20, 30, 40, 50], [100, 200, 300, 400, 500]])print(np.take(array, filter_indices, axis))# [[ 10 20 30 40 50]# [100 200 300 400 500]]axis = 1print(np.take(array, filter_indices, axis))# [[ 2 3]# [ 20 30]# [200 300]]
Using Docs: https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.htmlThe following implementation should work for arbitrary number of dimensions/shapes for some numpy ndarray.
First we need a multi-dimensional set of indexes and some example data:
import numpy as npy = np.arange(35).reshape(5,7)print(y) indexlist = [[0,1], [0,2], [3,3]]print ('indexlist:', indexlist)
To actually extract the intuitive result the trick is to use a Transpose:
indexlisttranspose = np.array(indexlist).T.tolist()print ('indexlist.T:', indexlisttranspose)print ('y[indexlist.T]:', y[ tuple(indexlisttranspose) ])
Makes the following terminal output:
y: [[ 0 1 2 3 4 5 6] [ 7 8 9 10 11 12 13] [14 15 16 17 18 19 20] [21 22 23 24 25 26 27] [28 29 30 31 32 33 34]]indexlist: [[0, 1], [0, 2], [3, 3]]indexlist.T: [[0, 0, 3], [1, 2, 3]]y[indexlist.T]: [ 1 2 24]
The tuple... fixes a future warning which we can cause like so:
print ('y[indexlist.T]:', y[ indexlisttranspose ])
FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`.In the future this will be interpreted as an array index,`arr[np.array(seq)]`, which will result either in an error or adifferent result. print ('y[indexlist.T]:', y[ indexlisttranspose ])y[indexlist.T]: [ 1 2 24]