2017-08-05 5 views
2

fragen sich, ob es eine einfache Möglichkeit, dies zu tun:in einer bestimmten Dimension angegebene Werte auf numpy Array ändern

sagt, dass ich mit der Form (2,3,2), beispielsweise einen numpy Array:

x = 
[[[ 0, 1], 
    [ 2, 3], 
    [ 4, 5]], 

[[ 6, 7], 
    [ 8, 9], 
    [10,11]]] 

Wenn ich wollte alle Einträge ersetzen, den axis=1 entsprechen und position=0, mit Null, er könnte dies leicht tun:

x[:,0,:] = 0 
x = 
[[[ 0 0] 
    [ 2 3] 
    [ 4 5]] 

[[ 0 0] 
    [ 8 9] 
    [10 11]]] 

jedoch wh Wenn ich eine Liste von Achsen hatte, mit denen ich diese Operationen ausführen wollte. Gibt es dafür eine eingebaute Numpy-Funktion? Im Idealfall würde es in etwa so aussehen:

array_replace(array=x,axis=1,pos=0,replace_val=0)

, die wie oben die gleiche Anordnung geben würde.

Ich kann mir eine Möglichkeit vorstellen, dies zu tun, indem ich Matrizen abflachen und berechnen würde, wo die Positionen jeder Variablen auf der Dimension jedes Arrays basieren würden, aber ich frage mich, ob es schon etwas in Numpy eingebaut hat.

+0

Ich bin nicht sicher, was Sie wollen, aber das ist nicht der beste Weg, es zu tun, ich garantieren kann. Numpy ist stark genug, dass solche Operationen leicht vektorisiert werden können. –

Antwort

2

Sie können ein Tupel von Schichten konstruieren und dann die spezifische Achse für die Position verwenden. So können Sie eine solche Funktion definieren als:

def array_replace(array, axis, pos, replace_val): 
    array[(slice(None),) * axis + (pos,)] = replace_val 

Also, was wir tun, ist ein 1-Tupel mit einem slice Objekt konstruieren (slice(None),). Ein Slice-Objekt erzeugt Python hinter den Vorhängen für einen Doppelpunkt :. So ist x[:,0,:] eine einfache Darstellung für x[(slice(None),0,slice(None))].

Als nächstes wiederholen wir diese Scheibe axis mal (die Anzahl der Male vor der angegebenen Achse), gefolgt von der Position, die wir wollen. Die übrigen Slices sind optional, daher geben wir diese hier nicht an. Wir verwenden dann numpy's Broadcasting, um allen diesen Indizes die zuzuordnen.

Dies erzeugt dann:

>>> x 
array([[[ 0, 1], 
     [ 2, 3], 
     [ 4, 5]], 

     [[ 6, 7], 
     [ 8, 9], 
     [10, 11]]]) 
>>> array_replace(array=x, axis=1, pos=0, replace_val=0) 
>>> x 
array([[[ 0, 0], 
     [ 2, 3], 
     [ 4, 5]], 

     [[ 0, 0], 
     [ 8, 9], 
     [10, 11]]]) 
+0

Danke! Kennen Sie einen Hinweis darauf, was die "Slice" -Funktion hinter den Vorhängen macht? Ich habe diese Verwendung noch nie gesehen, aber es scheint sehr nützlich zu sein. – lstbl

+0

@lstbl: 'slice' ist Konstruktor. Er konstruiert ein "Slice" -Objekt. Es tut nicht viel, es ist einfach da als eine Darstellung von ':'. Suc, dass ein Objekt mit einer '__getitem__'-Funktion mit Slices umgehen kann. Es hat ein "Start", "Schritt" und "Stopp" Attribut. –

Verwandte Themen