#python #numpy
#python #numpy
Вопрос:
Если у меня есть следующий массив 4D:
mat = np.array(np.arange(27)).reshape((3,3,3))
[[[ 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]]]
и следующий неразрешенный индекс:
ind = np.unravel_index([7], mat.shape[1:])
(array([2], dtype=int64), array([1], dtype=int64))
каков наилучший способ доступа
mat[:, 2, 1]
[ 7 16 25]
использование нерасчлененного индекса? Я ищу общее решение этой проблемы, в которой количество измерений mat
может варьироваться.
Я знаю, что мог бы сделать что-то вроде этого:
new_ind = (np.arange(mat.shape[0]),) ind
mat[new_ind]
[ 7 16 25]
но мне было интересно, есть ли способ сделать это, который не требует явного построения нового индекса?
Ответ №1:
Вам действительно нужно создать новый индексирующий кортеж:
In [8]: ind=np.unravel_index([7,8],(3,3))
In [9]: ind
Out[9]: (array([2, 2]), array([1, 2]))
In [10]: (slice(None),*ind)
Out[10]: (slice(None, None, None), array([2, 2]), array([1, 2]))
In [11]: np.arange(27).reshape(3,3,3)[_]
Out[11]:
array([[ 7, 8],
[16, 17],
[25, 26]])
Out[10]
Эквивалентно добавлению :
к вашим нерасчлененным индексам:
In [12]: np.s_[:,[2,2],[1,2]]
Out[12]: (slice(None, None, None), [2, 2], [1, 2])
Комментарии:
1. Спасибо, я не рассматривал использование slice (None), это намного приятнее, чем вызывать arange.