简体   繁体   中英

How in numpy get elements of matrix between two indices arrays?

Let's say I have a matrix:

>> a = np.arange(25).reshape(5, 5)`
>> a
[[ 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]]

and two vectors of indices that define a span of matrix elements that I want to extract:

>> indices1 = np.array([0, 1, 1, 0, 0])
>> indices2 = np.array([2, 3, 3, 2, 2])

As you can see, difference between each corresponding index is equal to 2.

I would like to do sth like this extract a part of the matrix:

>> submatrix = a[indices1:indices2, :]

so that the result would be 2x5 matrix:

>> submatrix
[[ 0  6  7  3  4],
 [ 5 11 12  8  9]]

For all I know, numpy allows to provide indices as a boundaries, but does not allow to provide arrays, only integers, eg a[0:2] .

Note what I want to subtract is not a submatrix:

在此输入图像描述

Do you know of some other way of indexing a numpy matrix so that it is possible to provide arrays defining spans? For now I managed to do it only with for loops.

For reference, the most obvious loop (still took several experimental steps):

In [87]: np.concatenate([a[i:j,n] for n,(i,j) in enumerate(zip(indices1,indices2))], ).reshape(-1,2).T   
Out[87]: 
array([[ 0,  6,  7,  3,  4],
       [ 5, 11, 12,  8,  9]])

Broadcasted indices taking advantage of the constant length:

In [88]: indices1+np.arange(2)[:,None]                                                                   
Out[88]: 
array([[0, 1, 1, 0, 0],
       [1, 2, 2, 1, 1]])
In [89]: a[indices1+np.arange(2)[:,None],np.arange(5)]                                                   
Out[89]: 
array([[ 0,  6,  7,  3,  4],
       [ 5, 11, 12,  8,  9]])

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