Как в numpy получить элементы матрицы между двумя массивами индексов? - PullRequest
3 голосов
/ 22 мая 2019

Допустим, у меня есть матрица:

>> 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]]

и два вектора индексов, которые определяют диапазон матричных элементов, которые я хочу извлечь:

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

Как видите, разница между каждым соответствующим индексом равна 2.

Я хотел бы сделать что-то вроде извлечения части матрицы:

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

так, чтобы результат был 2х5 матрицы:

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

Насколько я знаю, numpy позволяет указывать индексы в качестве границ, но не позволяет предоставлять массивы, только целые числа, например. a[0:2].

Обратите внимание, что я хочу вычесть не подматрица:

enter image description here

Вам известен какой-то другой способ индексации матрицы-пустышки, чтобы можно было предоставлять массивы, определяющие промежутки? На данный момент мне удалось сделать это только с помощью циклов.

1 Ответ

2 голосов
/ 22 мая 2019

Для справки, наиболее очевидный цикл (все же предпринято несколько экспериментальных шагов):

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]])

Трансляция индексов с использованием постоянной длины:

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]])
...