Использование индексных массивов в столбцах MXNet NDArray

Учитывая массив индексов index и, скажем, матрицу A, мне нужна матрица B с соответствующей перестановкой столбцов A.

В Numpy я бы сделал следующее:

>>> A = np.arange(6).reshape(2,3); A
array([[0, 1, 2],
       [3, 4, 5]])
>>> index = [2,0,1]
>>> A[:,index]
array([[2, 0, 1],
       [5, 3, 4]])

Есть ли естественный или эффективный способ сделать это в MXNet? Функции pick() и take(), похоже, не работает таким образом. Мне удалось придумать следующее, но это не элегантно.

>>> mx.nd.take(A.T, mx.nd.array([[2],[0],[1]])).T.reshape((2,3))

[[ 2.  0.  1.]
 [ 5.  3.  4.]]
<NDArray 2x3 @cpu(0)>

Наконец, чтобы бросить гаечный ключ в работу, есть ли способ сделать это на месте?

Обновление Вот немного более элегантная, но предположительно не такая эффективная (из-за транспонирования) версия выше:

>>> mx.nd.take(A.T, mx.nd.array([2,0,1])).T
[[ 2.  0.  1.]
 [ 5.  3.  4.]]
<NDArray 2x3 @cpu(0)>

person Chris Swierczewski    schedule 01.09.2017    source источник
comment
Я предполагаю, что как только take() будет поддерживать axis=1 или любую другую ось, это будет иметь так называемое элегантное решение.   -  person Chris Swierczewski    schedule 01.09.2017


Ответы (1)


Что вам нужно, так это так называемая расширенная индексация в MXNet. Для получения элементов с помощью расширенной индексации из MXNet NDArray отправлен запрос на получение информации, который также добавит функциональность настройки элементов в NDArray. Ожидается, что он выйдет в версии 1.0.

https://github.com/apache/incubator-mxnet/pull/8246

person reminisce    schedule 18.10.2017