Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Handle all-NaN channels in calc_adc_params

Aperta
#485 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
48/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
numpy, python
Ambito
data

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.

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:

  1. if pmin == np.nan doesn't do what you think.

  2. nanmin and nanmax will 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.

Lingua principale
Jupyter Notebook
Stelle
853
Fork
322
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di MIT-LCP/wfdb-python

Tutte le issue di MIT-LCP/wfdb-python

Issue simili

Altre issue su Data Engineering

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.