NCAS-CMS / NCAS-CMS/cf-python

Most construct data wiped when unary operator taken of field

Aperta
#797 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug
Lingua principale
Python
Stelle
150
Fork
23
Merge medio
1g 11h
PR unite (30g)
2

Descrizione

Here's a funky one for the end of the working week! When taking the additive inverse i.e. negative of a field, the additive inverse of the (field) data is correctly taken but it results, as an unintended side effect, in all of the data for the metadata constructs being wiped, somehow (no time to investigate until next week, and I won't speculate quite how this even happens!). Note that an operation of -f shows this bug but -1*f does not, which implies it is likely an issue with the setup/logic of the - operator on a field.

Quick examples:

>>> f = cf.example_fields()
>>> print(f[0].data)  # all good
[[0.007, ..., 0.013]] 1
>>> print(-f[0].data)  # all good
[[-0.007, ..., -0.013]] 1
>>> print(-f[0])  # not all good - see the dim coords
Field: specific_humidity (ncvar%q)
----------------------------------
Data            : specific_humidity(latitude(5), longitude(8)) 1
Cell methods    : area: mean
Dimension coords: latitude(5) = 
                : longitude(8) = 
                : time(1) = 
>>> print(-1*f[0])  # also all good
Field: specific_humidity (ncvar%q)
----------------------------------
Data            : specific_humidity(latitude(5), longitude(8)) 1
Cell methods    : area: mean
Dimension coords: latitude(5) = [-75.0, ..., 75.0] degrees_north
                : longitude(8) = [22.5, ..., 337.5] degrees_east
                : time(1) = [2019-01-01 00:00:00]
>>>
>>> print(-f[1])  # note from this result that other constructs are affected too
Field: air_temperature (ncvar%ta)
---------------------------------
Data            : air_temperature(atmosphere_hybrid_height_coordinate(1), grid_latitude(10), grid_longitude(9)) K
Cell methods    : grid_latitude(10): grid_longitude(9): mean where land (interval: 0.1 degrees) time(1): maximum
Field ancils    : air_temperature standard_error
Dimension coords: atmosphere_hybrid_height_coordinate(1) = 
                : grid_latitude(10) = 
                : grid_longitude(9) = 
                : time(1) = 
Auxiliary coords: latitude
                : longitude
                : long_name=Grid latitude name
Cell measures   : measure:area
Coord references: grid_mapping_name:rotated_latitude_longitude
                : standard_name:atmosphere_hybrid_height_coordinate
Domain ancils   : atmosphere_hybrid_height_coordinate
                : ncvar%b
                : surface_altitude

I noticed this during working through issues in the cf-plot basic test suite, whereby a call to cfp.vect(u=c, v=-g) was failing with the error AttributeError: DimensionCoordinate has no data due to the underlying issue whereby the - operation is taken for the field input as the v argument. Which indicates it is more than a representational issue (i.e. the data is missing from the printed output), but I am yet to explore further.

Environment

Using the main branch:

>>> cf.environment()
Platform: Linux-6.5.13-7-MANJARO-x86_64-with-glibc2.39 
HDF5 library: 1.14.2 
netcdf library: 4.9.2 
udunits2 library: /home/slb93/miniconda3/envs/cf-env-312/lib/libudunits2.so.0 
esmpy/ESMF: 8.4.2 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/esmpy/__init__.py
Python: 3.12.0 /home/slb93/miniconda3/envs/cf-env-312/bin/python
dask: 2024.7.0 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/dask/__init__.py
netCDF4: 1.6.5 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/netCDF4/__init__.py
psutil: 5.9.5 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/psutil/__init__.py
packaging: 23.2 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/packaging/__init__.py
numpy: 1.26.4 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/numpy/__init__.py
scipy: 1.11.3 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/scipy/__init__.py
matplotlib: 3.8.0 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/matplotlib/__init__.py
cftime: 1.6.2 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/cftime/__init__.py
cfunits: 3.3.7 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/cfunits/__init__.py
cfplot: 3.3.0 /home/slb93/git-repos/cf-plot/cfplot/__init__.py
cfdm: 1.11.1.0 /home/slb93/git-repos/cfdm/cfdm/__init__.py
cf: 3.16.2 /home/slb93/git-repos/cf-python/cf/__init__.py

Guida per i contributori

Apri la guida per i contributori

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.

Direzione di ricerca

Inizia riproducendo il problema con cf.example_fields() e la negazione unaria di un campo, confrontando -f[0] con -1*f[0]. Segui il punto di ingresso del meno unario di Field e verifica perché i dati del costrutto di metadati vengono cancellati; la correzione è completa quando i costrutti conservano i propri dati e il caso cf-plot cfp.vect(u=c, v=-g) non genera più AttributeError.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.