Handle all-NaN channels in calc_adc_params
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Jupyter Notebook
- Estrellas
- 853
- Forks
- 322
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
If all samples in a channel are NaN, calc_adc_params will fail:
>>> wfdb.wrsamp("xxx", fs=500, units=["mV"], sig_name=["I"], p_signal=numpy.array([[numpy.nan]]), fmt=["16"])
/home/bmoody/work/wfdb-python/wfdb/io/_signal.py:740: RuntimeWarning: All-NaN slice encountered
minvals = np.nanmin(self.p_signal, axis=0)
/home/bmoody/work/wfdb-python/wfdb/io/_signal.py:741: RuntimeWarning: All-NaN slice encountered
maxvals = np.nanmax(self.p_signal, axis=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/bmoody/work/wfdb-python/wfdb/io/record.py", line 2943, in wrsamp
record.set_d_features(do_adc=1)
File "/home/bmoody/work/wfdb-python/wfdb/io/_signal.py", line 470, in set_d_features
self.adc_gain, self.baseline = self.calc_adc_params()
File "/home/bmoody/work/wfdb-python/wfdb/io/_signal.py", line 787, in calc_adc_params
baseline = int(np.floor(baseline))
ValueError: cannot convert float NaN to integer
A couple things are wrong here:
-
if pmin == np.nandoesn't do what you think. -
nanminandnanmaxwill give a RuntimeWarning if all samples in a channel are NaN.
(1) is easy to fix. (2) is a little weirder; have a look at the code of nanmin:
if type(a) is np.ndarray and a.dtype != np.object_:
# Fast, but not safe for subclasses of ndarray, or object arrays,
# which do not implement isnan (gh-9009), or fmin correctly (gh-8975)
res = np.fmin.reduce(a, axis=axis, out=out, **kwargs)
if np.isnan(res).any():
warnings.warn("All-NaN slice encountered", RuntimeWarning,
stacklevel=3)
In other words, for ordinary numeric numpy arrays, np.fmin.reduce gives what we want (minimum non-NaN value if there is one, otherwise NaN, and no warning.) It might not work if the array is something more exotic (e.g. a numpy-compatible array class created by some other python package.)
I think I understand the comment about object arrays (https://github.com/numpy/numpy/issues/8975, https://github.com/numpy/numpy/issues/9009), but I don't understand the "subclasses of ndarray" comment. When I try creating a trivial subclass of ndarray, fmin still appears to work as expected. So I don't see why the strict is np.ndarray is needed.
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza en wfdb/io/_signal.py, en calc_adc_params, y sigue el manejo de nanmin/nanmax utilizado por wfdb.wrsamp. Reproduce el ejemplo de un canal con todos sus valores en NaN y, después, verifica que los canales con todos sus valores en NaN ya no generen una advertencia ni fallen, mientras que los canales que contienen valores conserven su comportamiento actual.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- numpy, python
- Área
- data
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 48/100