How to filter numpy array by list of indices? How to filter numpy array by list of indices? numpy numpy

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]