2016-06-29 13 views
2

Ich habe eine binäre Matrix der Größe . Ich wollte die ganzen 1's in der Matrix ändern zu einem bestimmten Index -1Ersetzen Sie alle 1 bei einem bestimmten Index - numpy

konnte ich so etwas wie diese

import numpy as np 
mat = np.random.randint(2, size=(10, 10)) 
index = [6,7,8,9] 

mat[(mat[index,:] == 1).nonzero()] = -1 
print(mat) 

bekommen, wenn ich diese drucken, bekomme ich so etwas wie diese

[[-1 0 -1 1 0 -1 -1 1 -1 0] 
[ 1 0 1 -1 -1 1 -1 -1 -1 1] 
[ 0 -1 1 0 -1 -1 -1 1 -1 0] 
[-1 -1 -1 -1 -1 1 -1 1 -1 1] 
[ 1 1 1 1 0 0 0 0 0 1] 
[ 1 1 1 1 0 0 0 0 1 0] 
[ 1 0 1 0 0 1 1 0 1 0] 
[ 0 0 0 1 1 0 1 1 1 0] 
[ 0 1 0 0 1 1 1 0 1 0] 
[ 1 1 1 1 1 0 1 0 1 0]] 

Aber das scheint falsch zu sein, da der Index am Ende der Matrix ist, was ich wollte, war

[[ 1 0 1 1 0 1 1 1 1 0] 
[ 1 0 1 1 1 1 1 1 1 1] 
[ 0 1 1 0 1 1 1 1 1 0] 
[ 1 1 1 1 1 1 1 1 1 1] 
[ 1 1 1 1 0 0 0 0 0 1] 
[ 1 1 1 1 0 0 0 0 1 0] 
[-1 0 -1 0 0 -1 -1 0 -1 0] 
[ 0 0 0 -1 -1 0 -1 -1 -1 0] 
[ 0 -1 0 0 -1 -1 -1 0 -1 0] 
[-1 -1 -1 -1 -1 0 -1 0 -1 0]] 

Ich weiß, dass nonzero() nicht benötigt wird, da ich bereits den Inhalt zu 1 vergleiche, aber das ist das Beste, was ich habe.

Was mache ich falsch? Gibt es eine Möglichkeit, die richtige Antwort zu bekommen?

Antwort

2

Verwenden numpy.where auszuwählen bedingt Elemente basierend auf mat:

import numpy as np 
mat = np.random.randint(2, size=(10, 10)) 
index = [6,7,8,9] 

mat[index,:] = np.where(mat[index,:],-1,mat[index,:]) 
print(mat) 

Dadurch werden die gegebenen Reihen von mat je nach Iness der ursprünglichen Werte überschrieben. Wo die ursprünglichen Werte in diesen Zeilen 1 waren, werden sie mit -1 überschrieben, andernfalls werden sie in Ruhe gelassen.

Obwohl beachten Sie, dass, wenn Sie eine binäre Matrix mit nur Nullen und Einsen haben, können Sie in den angegebenen Zeilen das Zeichen jedes Element nur kippen kann, da 0 dieser Transformation invariant ist:

mat[index,:] = -mat[index,:] 
+0

Sie haben Recht 'mat [index ,:] = -mat [index,:]' das hat mich nicht getroffen. Danke für die Antwort – Akshay

+0

@akshay Ich bin froh, ich könnte helfen :) –

Verwandte Themen