2015-01-08 4 views
4

Я столкнулся с этим кодом Python (который работает), и для меня это кажется потрясающим. Однако я не могу понять, что делает этот код. Для того, чтобы воспроизвести его, я вроде написал тестовый код:Индексирование массива python numpy. Как это работает?

import numpy as np 

# Create a random array which represent the 6 unique coeff. 
# of a symmetric 3x3 matrix 
x = np.random.rand(10, 10, 6) 

Итак, у меня есть 100 симметричных матриц 3x3 и я только хранить уникальные компоненты. Теперь я хочу создать полную матрицу 3x3, и именно здесь происходит волшебство.

indices = np.array([[0, 1, 3], 
        [1, 2, 4], 
        [3, 4, 5]]) 

Я вижу, что это делает. Вот как компоненты индекса 0-5 должны быть расположены в матрице 3x3, чтобы иметь симметричную матрицу.

mat = x[..., indices] 

Эта линия меня потеряла. Таким образом, он работает над последним измерением массива x, но мне совершенно не ясно, как выполняется перестановка и перестройка, но это действительно возвращает массив формы (10, 10, 3, 3). Я поражен и смущен!

+1

Мой ответ на этот вопрос: http://stackoverflow.com/questions/10921893/numpy-sorting-a-multidimensional-array-by-a-multidimensional-array/10922358#10922358 может помочь. – user545424

+1

Я начал писать ответ, но обнаружил, что в основном повторяю [эту ссылку] (http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-indexing). Если ссылка не ясна, возможно, обновите свой вопрос той частью, которую вы не понимаете, и мы можем вам помочь. –

ответ

1

Из передовой документации по индексированию - ссылка bi rico.

Пример

Пусть x.shape есть (10,20,30) и Ind является (2,3,4) -образный массив индексации INTP, thenresult = х [..., Ind, :] Имеет форму (10,2,3,4,30), потому что (20,) образное подпространство заменено (2,3,4) -образным широковещательным индексирующим подпространством. Если мы допустим i, j, kloop над (2,3,4) -образным подпространством, тогда получим [..., i, j, k ,:] = x [..., ind [i, j, k] ,:]. Этот пример дает тот же результат, что и x.take (ind, axis = -2).