2016-09-10 3 views
2

J'ai une matrice numx NxM remplie de zéros et un tableau 1D numpy de taille N avec des entiers aléatoires entre 0 et M-1. Comme vous pouvez le voir, la dimension du tableau correspond au nombre de lignes dans la matrice. Chaque élément du tableau d'entiers signifie qu'à cette position donnée dans la rangée correspondante doit être mis à 1. Par exemple:Comment utiliser un index différent pour chaque ligne d'un tableau numpy?

# The matrix to be modified 
a = np.zeros((2,10)) 
# Indices array of size N 
indices = np.array([1,4]) 
# Indexing, the result must be 
a = a[at indices per row] 
print a 

[[0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]] 

I essayé d'utiliser l'indexation a[:,indices] mais cela crée les mêmes indices pour chaque rangée, et ce définit finalement toutes les lignes avec celles. Comment puis-je définir l'index donné sur 1 par ligne?

Répondre

2

Utilisez np.arange(N) pour répondre aux lignes et indices pour les colonnes:

>>> a[np.arange(2),indices] = 1 
>>> a 
array([[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]]) 

Ou:

>>> a[np.where(indices)+(indices,)] = 1 
>>> a 
array([[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]]) 
+0

fantastique. Cela signifie que je dois apprendre la différence entre l'accès à une ligne par simple tranchage comme 0: 2, ou simplement: pour toutes les lignes) et donner aux index d'accéder à la ligne et aux colonnes comme des paires pour définir la valeur. –

+0

@AlejandroSazo Oui, en effet, pas non plus que vous pouvez passer les index de colonnes et de lignes sous la forme d'un tuple à un tableau. Donc par exemple 'a [np.where (indices) + (indices,)] = 1' fera aussi le même travail. – Kasramvd