Bug: structured data transpose changes face mapping in from_xarray
维护者通常 3 天内回复
还没有人认领这个 Issue。
评估
调研方向
Read _map_dims_to_ugrid in uxarray/core/utils.py and face construction in uxarray/io/_structured.py, then inspect the existing structured mapping regression test. Reproduce the issue using the supplied (y, x) and (x, y) datasets and add a regression test showing both conversions map values identically to the same grid faces. Done when the test passes and the mapping remains consistent with the documented face ordering.
由索引模型根据 Issue 内容生成。
描述
Version
Source main at 6d6c6dacd2472fda8c6a3f71af659e1eb1cbadc9; Python 3.12.14, NumPy 2.5.4, xarray 2026.9.0 on Linux.
How did you install UXarray?
Source
What happened?
Converting equivalent structured datasets with UxDataset.from_xarray(..., uxgrid=grid) associates different values with the same grid faces when the spatial dimension order is transposed. The conversion succeeds without a warning. This matters when normalizing structured member files into a shared unstructured representation for regional statistics or integration.
For the synthetic example below, (y, x) produces face values [0, 0, 0, 100, 100, 100], while the equivalent (x, y) input produces [0, 100, 0, 100, 0, 100]. Both retain exactly the same Grid object and its face connectivity. The integral changes from 67.08123535225863 to 79.37563993526874 for this example; this is not a general error bound.
What did you expect to happen?
Transposing named input dimensions should preserve the physical field and its association with grid faces, so both mapped values and integration results should agree.
Can you provide a MCVE to repoduce the bug?
import numpy as np
import xarray as xr
import uxarray as ux
original = xr.Dataset(
{"temperature": (("y", "x"), [[0., 0., 0.], [100., 100., 100.]])},
coords={"x": [0., 20., 40.], "y": [-10., 50.]},
)
transposed = original.transpose("x", "y")
xr.testing.assert_identical(original, transposed.transpose("y", "x"))
grid = ux.Grid.from_structured(lon=original.x, lat=original.y)
a = ux.UxDataset.from_xarray(original, uxgrid=grid)
b = ux.UxDataset.from_xarray(transposed, uxgrid=grid)
assert a.uxgrid is b.uxgrid is grid
print(a.temperature.values) # [0., 0., 0., 100., 100., 100.]
print(b.temperature.values) # [0., 100., 0., 100., 0., 100.]
print(float(a.temperature.integrate())) # 67.08123535225863
print(float(b.temperature.integrate())) # 79.37563993526874
np.testing.assert_array_equal(a.temperature.values, b.temperature.values)
The last assertion fails. I also reproduced the mapping after writing the two synthetic members as separate NetCDF files and reading them through xarray. Explicitly transposing the source back to (..., "y", "x") before conversion restores the correct values and integral.
Investigation and scope
_map_dims_to_ugrid chooses its stacking order from a data variable's final dimension, while _read_structured_grid constructs face connectivity in latitude-major, longitude-minor order. The existing structured mapping regression test also documents face k as (k // n_lon, k % n_lon).
This reproduction uses the existing from_xarray API on main, without the changes in #1827. It does not call weighted_mean, so it is distinct from #1800's reduction-axis issue. No implementation changes are included here. I would be happy to work on a focused fix and regression tests if this can be assigned to me, following the contribution guide.
AI assistance: OpenAI Codex assisted with investigation and synthetic reproduction; the recorded results were actually executed against the pinned source.
- 主要语言
- Python
- 星标
- 230
- 派生
- 57
- 平均合并
- 4 天 14 小时
- 30 天内合并 PR
- 7
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
UXARRAY/uxarray 的其他 Issue
-
Update installation docs to include new conda recipes可能已有人在做 @Sevans711 于 19 天前认领。 未关闭documentation
难度 1/5 1 小时以内 新手友好度 82/100
UXARRAY/uxarray#1793 · 1 条评论 · 已指派 1 人 ·
维护者通常 3 天内回复
-
developer experience
难度 1/5 1 小时以内 新手友好度 90/100
维护者通常 3 天内回复
-
zonal_mean() and weighted_mean() should return the same type of object可能重新可做 @Sevans711 于 28 天前认领,目前没有进行中的 PR。 未关闭bug
难度 2/5 1-3 小时 新手友好度 72/100
UXARRAY/uxarray#1733 · 已指派 1 人 ·
维护者通常 3 天内回复
-
documentation
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 3 天内回复
-
Neighborhood filter radii in kilometers可能已有人在做 @cmdupuis3 于 6 天前认领。 未关闭improvement
UXARRAY/uxarray#1824 · 已指派 1 人 ·
维护者通常 3 天内回复
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 90/100
SublimeText/AdvancedNewFile#211 ·
-
难度 2/5 1-3 小时 新手友好度 73/100
-
难度 2/5 1-3 小时 新手友好度 83/100
Imbad0202/academic-research-skills#987 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 62/100
-
Pull-through from gcr.io returns 500 when pulling using podman/buildah可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭Issue Triage-Needed
难度 2/5 1-3 小时 新手友好度 68/100
pulp/pulp_container#2581 ·
维护者通常 1 天内回复