python - index - numpy array zeros
¿Cuál podría ser la causa del ''valor no válido encontrado en less_equal'' en números? (2)
Experimenté un RuntimeWarning
RuntimeWarning: invalid value encountered in less_equal
Generado por esta línea de código mío:
center_dists[j] <= center_dists[i]
Tanto center_dists[j]
como center_dists[i]
son matrices numpy
¿Cuál podría ser la causa de esta advertencia?
Como seguimiento a la respuesta de Divakar y al comentario sobre cómo suprimir RuntimeWarning
, una forma más segura es suprimirlos solo localmente with np.errstate()
( docs ): es bueno estar alerta en general cuando se comparan con np.nan
False
, e ignora la advertencia solo cuando esto es realmente lo que se pretende. Aquí para el ejemplo de OP:
with np.errstate(invalid=''ignore''):
center_dists[j] <= center_dists[i]
Al salir del bloque with
, el manejo de errores se restablece a lo que era antes.
En lugar de invalid value encountered
un invalid value encountered
, también se pueden ignorar todos los errores pasando all=''ignore''
. Curiosamente, esto falta en los kwargs
en los documentos para np.errstate()
, pero no en los de np.seterr()
. (Parece un pequeño error en los documentos np.errstate()
).
Eso es más probable que ocurra debido a un np.nan
en algún lugar de las entradas involucradas. Un ejemplo de ello se muestra a continuación:
In [1]: A = np.array([4, 2, 1])
In [2]: B = np.array([2, 2, np.nan])
In [3]: A<=B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: array([False, True, False], dtype=bool)
Para todas aquellas comparaciones que involucran np.nan
, daría como resultado False
. Confirmémoslo para una comparación broadcasted
. Aquí hay una muestra:
In [1]: A = np.array([4, 2, 1])
In [2]: B = np.array([2, 2, np.nan])
In [3]: A[:,None] <= B
RuntimeWarning: invalid value encountered in less_equal
Out[3]:
array([[False, False, False],
[ True, True, False],
[ True, True, False]], dtype=bool)
Observe la tercera columna en la salida que corresponde a la comparación que involucra el tercer elemento np.nan
en B
y que da como resultado todos los valores False
.