python - Indexing a multidimensional Numpy array with an array of indices -
let have numpy array a shape (10, 10, 4, 5, 3, 3), , 2 lists of indices, b , c, of shape (1000, 6) , (1000, 5) respectively, represent indices , partial indices array. want use indices access array, producing arrays of shape (1000,) , (1000, 3), respectively.
i know of few ways this, they're unwieldy , rather un-pythonic, example converting indices tuples or indexing each axis separately.
a = np.random.random((10, 10, 4, 5, 3, 3)) b = np.random.randint(3, size=(1000, 6)) c = np.random.randint(3, size=(1000, 5)) # method 1 tuple_index_b = [tuple(row) row in b] tuple_index_c = [tuple(row) row in c] output_b = np.array([a[row] row in tuple_index_b]) output_c = np.array([a[row] row in tuple_index_c]) # method 2 output_b = a[b[:, 0], b[:, 1], b[:, 2], b[:, 3], b[:, 4], b[:, 5]] output_c = a[c[:, 0], c[:, 1], c[:, 2], c[:, 3], c[:, 4]] obviously, neither of these methods elegant or easy extend higher dimensions. first slow, 2 list comprehensions, , second requires write out each axis separately. intuitive syntax, a[b] returns array of shape (1000, 6, 10, 4, 5, 3, 3) reason, related broadcasting.
so, there way in numpy doesn't involve manual labor/time?
edit: not duplicate, since question deals list of multidimensional indices, , not single index, , has produced useful new methods.
you can convert index tuple each column separate element , use __getitem__, assuming indices first few dimensions:
a.__getitem__(tuple(b.t)) or simply:
a[tuple(b.t)] (a.__getitem__(tuple(b.t)) == output_b).all() # true (a.__getitem__(tuple(c.t)) == output_c).all() # true (a[tuple(b.t)] == output_b).all() # true (a[tuple(c.t)] == output_c).all() # true
Comments
Post a Comment