2017-09-01 4 views
2

Étant donné un tableau d'index index et, disons, une matrice A je veux une matrice B avec la permutation correspondante des colonnes de A.Utilisation de tableaux d'index sur les colonnes d'un MXDA NDArray

En Numpy je ferais ce qui suit,

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

est-il un naturel efficace ou façon de le faire en MXNet? Les fonctions pick() et take() ne semblent pas fonctionner de cette manière. J'ai réussi à trouver ce qui suit, mais ce n'est pas élégant.

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

Enfin, pour jeter une clé dans les travaux, y at-il un moyen de le faire sur place?

Mise à jour est ici un peu plus élégant, mais sans doute pas aussi efficace (en raison de la transposition), version ci-dessus:

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

Je suppose qu'une fois 'prendre()' 'soutient axe = 1', ou tout autre axe pour cette matière, cela aura une solution dite « élégante ». –

Répondre

2

Qu'est-ce que vous avez besoin est la soi-disant indexation avancée dans MXNet. Il y a un PR soumis pour obtenir des éléments grâce à l'indexation avancée de MXNet NDArray et ajoutera également la fonctionnalité de définition des éléments à NDArray. Il devrait sortir dans la version 1.0.

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