Индексирование массива 4D с использованием другого массива индексов 3D

A имеют массив 4D M (a x b x c x d) и массив индексов I (3 x f), например.

I = np.array([1,2,3, ...], [2,1,3, ...], [4,1,6, ...])

Я хотел бы использовать I для получения матрицы X, которая имеет f строк и d столбцов, где:

X[0,:] = M[1,2,4,:]
X[1,:] = M[2,1,1,:]
X[2,:] = M[3,3,6,:]
...

Я знаю, что могу использовать M[I[0], I[1], I[2]], однако мне было интересно, есть ли более краткое решение?


person John Manak    schedule 23.06.2015    source источник
comment
Ваше существующее решение выглядит довольно лаконично, не так ли?   -  person heltonbiker    schedule 23.06.2015


Ответы (2)


Вы можете использовать use, например:

I = np.array([[1,2,3], [2,1,3], [4,1,6]])
M = np.ndarray((10,10,10,10))
X = np.array([M[t,:] for t in I])
person Arcturus B    schedule 23.06.2015

Это был бы один из способов сделать это -

import numpy as np

# Get row indices for use when M is reshaped to a 2D array of d-columns format
row_idx = np.sum(I*np.append(1,np.cumprod(M.shape[1:-1][::-1]))[::-1][:,None],0)

# Reshape M to d-columns 2D array and use row_idx to get final output
out = M.reshape(-1,M.shape[-1])[row_idx]

В качестве альтернативы поиску row_idx, если вы хотите избежать np.append, вы можете сделать -

row_idx = np.sum(I[:-1]*np.cumprod(M.shape[1:-1][::-1])[::-1][:,None],0) + I[-1]

Или менее страшный способ получить row_idx -

_,p2,p3,_ = M.shape
row_idx = np.sum(I*np.array([p3*p2,p3,1])[:,None],0)
person Divakar    schedule 23.06.2015