2015-06-23 5 views
4

A имеют 4D-массив M (a x b x c x d) и массив I индексов (3 x f), например.Индексирование массива 4D с использованием другого массива трехмерных индексов

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]], однако, мне было интересно, если есть более сжатое решение?

+0

Ваше существующее решение выглядит довольно кратким, не так ли? – heltonbiker

ответ

1

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

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

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

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) 

 Смежные вопросы

  • Нет связанных вопросов^_^