Handle all-NaN channels in calc_adc_params
Nessuno ha ancora preso questa issue.
- Lingua principale
- Jupyter Notebook
- Stelle
- 853
- Fork
- 322
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
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.
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia in wfdb/io/_signal.py, in calc_adc_params, e segui la gestione di nanmin/nanmax utilizzata da wfdb.wrsamp. Riproduci l'esempio di un canale contenente solo valori NaN, quindi verifica che i canali contenenti solo valori NaN non generino più un avviso né falliscano, mentre i canali che contengono valori mantengano il comportamento esistente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- numpy, python
- Ambito
- data
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 48/100