2016-04-30 5 views
-1

У меня есть тензор с формой (4, 3, 20). Когда я делаю X[:, 0, :].shape, я получаю (4, 20). Когда я делаю X[:, [0,2,0,1], :].shape, я получаю (4, 4, 20).Numpy: Получить матрицы из тензора. Список индексов

У меня есть список индексов, представляющих второе измерение моего тензора. Я хочу получить двумерную матрицу, как я получаю, когда я делаю X[:, 0, :], но у меня разные индексы для второго измерения, а не только для одного. Как мне это сделать?

ответ

0

Ваш вопрос неясен, но я сделаю предположение

In [58]: X=np.arange(24).reshape(4,3,2) 

In [59]: X[range(4),[0,2,0,1],:] 
Out[59]: 
array([[ 0, 1], 
     [10, 11], 
     [12, 13], 
     [20, 21]]) 

Это поднимает ряд 0 из 1-й плоскости; строка 2 со второго и т. д. Результат имеет ту же форму, что и X[:,0,:], но значения вытягиваются из разных плоскостей 1-го измерения.

In [61]: X[:,0,:] 
Out[61]: 
array([[ 0, 1], # same 
     [ 6, 7], 
     [12, 13], # same 
     [18, 19]]) 
0

Я думаю, что вы ищете np.squeeze. Таким образом, для случаев, когда список индексирования, например, L имеет только один элемент и при индексировании входного массива с ним будет приводить к тому, что массив 3D с одномерным вторым измерением (размер длины 1) приведет к выводу 2D с этим сжатие. Для L с более чем одним элементом индексирование приведет к массиву 3D без какого-либо синглетного размера и, следовательно, без изменений с этим сжимает и, следовательно, желаемый результат. Таким образом, решение с ним будет -

np.squeeze(X[:,L,:]) 

с пробой, чтобы проверить формы на случайном массиве -

In [25]: A = np.random.rand(4,3,20) 

In [26]: L = [0] 

In [27]: np.squeeze(A[:,L,:]).shape 
Out[27]: (4, 20) 

In [28]: L = [0,2,0,1] 

In [29]: np.squeeze(A[:,L,:]).shape 
Out[29]: (4, 4, 20) 
Смежные вопросы