2016-07-08 10 views
0

Ich verwende numpy.where, und ich fragte mich, ob es einen einfachen Weg gab, den unbenutzten Parameter zu vermeiden. Beispiel:numpy.where: Wie verzögert man die Auswertung von Parametern?

import numpy as np 
z = np.array([-2, -1, 0, 1, -2]) 
np.where(z!=0, 1/z, 1) 

kehrt:

array([-0.5, -1. , 1. , 1. , -0.5]) 

, aber ich erhalte eine Division durch Null Warnung, weil, wenn z 0 war, noch der Code 1/z auswertet, obwohl es sie nicht verwendet werden.

+0

Warum verwenden Sie nicht z = z [np.nonzero (z)] dann dividieren durch z, aber das gibt nur 1 zurück, also ich bin mir nicht sicher, warum –

+0

'1/z' vom Interpreter ausgeführt wird Teil des Aufrufs 'wo'. Das steht nicht unter der Kontrolle von 'wo'. Aber du kannst 'out [ind] = 1/z [ind] 'machen, wobei' ind 'die Maske der ok-Werte ist. Es gibt andere Möglichkeiten, durch Null zu gehen. – hpaulj

+0

Suchen Sie nach den Tags [numpy] und [dividiere durch Null] – hpaulj

Antwort

1

Sie eine Maske anwenden kann:

out = numpy.ones_like(z) 
mask = z != 0 
out[mask] = 1/z[mask] 
1

Sie können auch die Warnung ausschalten und wieder einschalten, nachdem Sie über den Kontextmanager errstate getan werden:

with np.errstate(divide='ignore'): 
    np.where(z!=0, 1/z, 1)