anndata 0.12.5__tar.gz → 0.12.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- anndata-0.12.7/.cruft.json +43 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/test-cpu.yml +1 -4
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/test-gpu.yml +2 -1
- {anndata-0.12.5 → anndata-0.12.7}/.pre-commit-config.yaml +2 -2
- {anndata-0.12.5 → anndata-0.12.7}/PKG-INFO +10 -9
- anndata-0.12.7/ci/min-constraints.txt +1 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/_key_contributors.rst +3 -4
- {anndata-0.12.5 → anndata-0.12.7}/docs/concatenation.rst +2 -2
- {anndata-0.12.5 → anndata-0.12.7}/docs/conf.py +4 -1
- {anndata-0.12.5 → anndata-0.12.7}/docs/fileformat-prose.md +39 -8
- anndata-0.12.7/docs/index.md +21 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/references.rst +0 -5
- anndata-0.12.7/docs/release-notes/0.12.6.md +6 -0
- anndata-0.12.7/docs/release-notes/0.12.7.md +12 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/tutorials/zarr-v3.md +16 -6
- {anndata-0.12.5 → anndata-0.12.7}/hatch.toml +6 -2
- {anndata-0.12.5 → anndata-0.12.7}/pyproject.toml +11 -12
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/aligned_df.py +5 -5
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/anndata.py +31 -17
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/file_backing.py +21 -12
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/merge.py +25 -13
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/sparse_dataset.py +11 -2
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/views.py +1 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/xarray.py +31 -15
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/h5ad.py +3 -2
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/read.py +3 -3
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/specs/lazy_methods.py +14 -2
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/specs/methods.py +31 -31
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_settings.py +3 -3
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_types.py +2 -2
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/compat/__init__.py +78 -10
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/_dispatch_io.py +1 -4
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/backed/_io.py +13 -7
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/backed/_lazy_arrays.py +25 -19
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/merge.py +67 -21
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/multi_files/_anncollection.py +2 -2
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/tests/helpers.py +54 -37
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/utils.py +7 -7
- {anndata-0.12.5 → anndata-0.12.7}/src/testing/anndata/_pytest.py +2 -1
- {anndata-0.12.5 → anndata-0.12.7}/tests/conftest.py +8 -2
- anndata-0.12.7/tests/data/archives/v0.5.0/adata.h5ad +0 -0
- anndata-0.12.7/tests/data/archives/v0.5.0/readme.md +7 -0
- anndata-0.12.7/tests/lazy/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/lazy/conftest.py +0 -3
- {anndata-0.12.5 → anndata-0.12.7}/tests/lazy/test_read.py +31 -8
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_annot.py +1 -1
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_backed_sparse.py +1 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_concatenate.py +28 -8
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_concatenate_disk.py +57 -4
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_dask.py +8 -10
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_io_backwards_compat.py +10 -3
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_io_elementwise.py +147 -33
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_io_partial.py +5 -2
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_io_warnings.py +4 -5
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_layers.py +0 -24
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_readwrite.py +32 -118
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_settings.py +6 -5
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_utils.py +7 -5
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_views.py +3 -2
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_xarray.py +17 -1
- anndata-0.12.5/.prettierignore +0 -1
- anndata-0.12.5/.prettierrc.yaml +0 -7
- anndata-0.12.5/docs/index.md +0 -28
- anndata-0.12.5/docs/news.md +0 -10
- {anndata-0.12.5 → anndata-0.12.7}/.cirun.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.codecov.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.editorconfig +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/dependabot.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/benchmark.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/check-pr.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/close-stale.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/codespell.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/label-stale.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.github/workflows/publish.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.gitignore +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.gitmodules +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.readthedocs.yml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.taplo.toml +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.vscode/launch.json +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/.vscode/settings.json +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/LICENSE +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/README.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/README.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/asv.conf.json +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/benchmarks/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/benchmarks/anndata.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/benchmarks/backed_hdf5.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/benchmarks/dataset2d.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/benchmarks/readwrite.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/benchmarks/sparse_dataset.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/benchmarks/benchmarks/utils.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/biome.jsonc +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/ci/constraints.txt +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/ci/scripts/min-deps.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/ci/scripts/towncrier_automation.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/Makefile +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/_static/img/anndata_schema.svg +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/_templates/autosummary/class.rst +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/api.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/benchmark-read-write.ipynb +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/benchmarks.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/contributing.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/extensions/autosummary_skip_inherited.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/extensions/no_skip_abc_members.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/extensions/patch_myst_cite.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/interoperability.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.1.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.2.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.3.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.4.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.5.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.6.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.7.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.8.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.10.9.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.11.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.11.1.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.11.2.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.11.3.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.11.4.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.12.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.12.1.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.12.2.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.12.3.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.12.4.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.12.5.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.4.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.5.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.6.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.6.x.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.2.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.3.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.4.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.5.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.6.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.7.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.7.8.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.8.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.9.0.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.9.1.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/0.9.2.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/2172.bug.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/release-notes/index.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/docs/tutorials/index.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/access.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/aligned_mapping.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/extensions.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/index.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/raw.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_core/storage.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/specs/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/specs/registry.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/utils.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/write.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_io/zarr.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_settings.pyi +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/_warnings.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/abc.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/backed/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/backed/_compat.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/multi_files/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/pytorch/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/experimental/pytorch/_annloader.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/io.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/logging.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/tests/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/types.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/anndata/typing.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/testing/anndata/__init__.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/testing/anndata/_doctest.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/src/testing/anndata/py.typed +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/adata-comments.tsv +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/adata.csv +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/readme.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/v0.11.4/adata.h5ad +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/v0.11.4/readme.md +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/excel.xlsx +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/data/umi_tools.tsv.gz +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/lazy/test_concat.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/lazy/test_write.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_anncollection.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_awkward.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_backed_dense.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_backed_hdf5.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_base.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_dask_view_mem.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_deprecations.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_extensions.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_get_vector.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_gpu.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_helpers.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_inplace_subset.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_io_conversion.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_io_dispatched.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_io_utils.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_obsmvarm.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_obspvarp.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_raw.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_repr.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_structured_arrays.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_transpose.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_uns.py +0 -0
- {anndata-0.12.5 → anndata-0.12.7}/tests/test_x.py +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"template": "https://github.com/scverse/cookiecutter-scverse",
|
|
3
|
+
"commit": "d383d94fadff9e4e6fdb59d77c68cb900d7cedec",
|
|
4
|
+
"checkout": "v0.6.0",
|
|
5
|
+
"context": {
|
|
6
|
+
"cookiecutter": {
|
|
7
|
+
"project_name": "anndata",
|
|
8
|
+
"package_name": "anndata",
|
|
9
|
+
"project_description": "Annotated data.",
|
|
10
|
+
"author_full_name": "Philipp Angerer",
|
|
11
|
+
"author_email": "philipp.angerer@helmholtz-munich.de",
|
|
12
|
+
"github_user": "scverse",
|
|
13
|
+
"github_repo": "anndata",
|
|
14
|
+
"license": "BSD 3-Clause License",
|
|
15
|
+
"ide_integration": true,
|
|
16
|
+
"_copy_without_render": [
|
|
17
|
+
".github/workflows/build.yaml",
|
|
18
|
+
".github/workflows/test.yaml",
|
|
19
|
+
"docs/_templates/autosummary/**.rst"
|
|
20
|
+
],
|
|
21
|
+
"_exclude_on_template_update": [
|
|
22
|
+
"CHANGELOG.md",
|
|
23
|
+
"LICENSE",
|
|
24
|
+
"README.md",
|
|
25
|
+
"docs/api.md",
|
|
26
|
+
"docs/index.md",
|
|
27
|
+
"docs/notebooks/example.ipynb",
|
|
28
|
+
"docs/references.bib",
|
|
29
|
+
"docs/references.md",
|
|
30
|
+
"src/**",
|
|
31
|
+
"tests/**"
|
|
32
|
+
],
|
|
33
|
+
"_render_devdocs": false,
|
|
34
|
+
"_jinja2_env_vars": {
|
|
35
|
+
"lstrip_blocks": true,
|
|
36
|
+
"trim_blocks": true
|
|
37
|
+
},
|
|
38
|
+
"_template": "https://github.com/scverse/cookiecutter-scverse",
|
|
39
|
+
"_commit": "d383d94fadff9e4e6fdb59d77c68cb900d7cedec"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"directory": null
|
|
43
|
+
}
|
|
@@ -64,13 +64,10 @@ jobs:
|
|
|
64
64
|
|
|
65
65
|
- name: Install dependencies
|
|
66
66
|
run: |
|
|
67
|
-
|
|
68
|
-
uv tool install --with='click!=8.3.0' hatch
|
|
67
|
+
uv tool install hatch
|
|
69
68
|
hatch -v env create ${{ matrix.env.name }}
|
|
70
69
|
|
|
71
70
|
- name: Run tests
|
|
72
|
-
env:
|
|
73
|
-
COVERAGE_PROCESS_START: ${{ github.workspace }}/pyproject.toml
|
|
74
71
|
run: |
|
|
75
72
|
hatch run ${{ matrix.env.name }}:run-cov -v --color=yes ${{ matrix.io_mark != 'dask_distributed' && '-n auto' || '' }} --junitxml=test-data/test-results.xml -m "${{ matrix.io_mark }}" ${{ matrix.env.args }}
|
|
76
73
|
hatch run ${{ matrix.env.name }}:cov-combine
|
|
@@ -66,7 +66,8 @@ jobs:
|
|
|
66
66
|
uses: astral-sh/setup-uv@v6 # TODO: upgrade once cirun image supports node 24
|
|
67
67
|
with:
|
|
68
68
|
enable-cache: true
|
|
69
|
-
|
|
69
|
+
# Any Cuda 14+ will support Python 3.14: https://github.com/cupy/cupy/issues/9346
|
|
70
|
+
python-version: '3.13' # ${{ env.max_python_version }}
|
|
70
71
|
|
|
71
72
|
- name: Install AnnData
|
|
72
73
|
run: |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
repos:
|
|
2
2
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
-
rev: v0.
|
|
3
|
+
rev: v0.14.7
|
|
4
4
|
hooks:
|
|
5
5
|
- id: ruff-check
|
|
6
6
|
args: ["--fix"]
|
|
@@ -10,7 +10,7 @@ repos:
|
|
|
10
10
|
id: ruff
|
|
11
11
|
args: ["--preview", "--select=PLR0917"]
|
|
12
12
|
- repo: https://github.com/biomejs/pre-commit
|
|
13
|
-
rev: v2.
|
|
13
|
+
rev: v2.3.8
|
|
14
14
|
hooks:
|
|
15
15
|
- id: biome-format
|
|
16
16
|
- repo: https://github.com/ComPWA/taplo-pre-commit
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: anndata
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.7
|
|
4
4
|
Summary: Annotated data.
|
|
5
5
|
Project-URL: Documentation, https://anndata.readthedocs.io/
|
|
6
6
|
Project-URL: Source, https://github.com/scverse/anndata
|
|
7
7
|
Project-URL: Home-page, https://github.com/scverse/anndata
|
|
8
|
-
Author: Philipp Angerer, Alex Wolf, Isaac Virshup, Sergei Rybakov
|
|
9
|
-
Maintainer-email:
|
|
8
|
+
Author: Philipp Angerer, Alex Wolf, Isaac Virshup, Sergei Rybakov, Ilan Gold
|
|
9
|
+
Maintainer-email: Philipp Angerer <philipp.angerer@helmholtz-munich.de>, Ilan Gold <ilan.gold@helmholtz-munich.de>
|
|
10
10
|
License-Expression: BSD-3-Clause
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
Classifier: Environment :: Console
|
|
@@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
22
|
Classifier: Programming Language :: Python :: 3.12
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
25
|
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
25
26
|
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
26
27
|
Requires-Python: >=3.11
|
|
@@ -30,7 +31,7 @@ Requires-Dist: legacy-api-wrap
|
|
|
30
31
|
Requires-Dist: natsort
|
|
31
32
|
Requires-Dist: numpy>=1.26
|
|
32
33
|
Requires-Dist: packaging>=24.2
|
|
33
|
-
Requires-Dist: pandas!=2.1.2,>=2.1.0
|
|
34
|
+
Requires-Dist: pandas!=2.1.2,<3,>=2.1.0
|
|
34
35
|
Requires-Dist: scipy>=1.12
|
|
35
36
|
Requires-Dist: zarr!=3.0.*,>=2.18.7
|
|
36
37
|
Provides-Extra: cu11
|
|
@@ -56,7 +57,7 @@ Requires-Dist: sphinx-copybutton; extra == 'doc'
|
|
|
56
57
|
Requires-Dist: sphinx-design>=0.5.0; extra == 'doc'
|
|
57
58
|
Requires-Dist: sphinx-issues>=5.0.1; extra == 'doc'
|
|
58
59
|
Requires-Dist: sphinx-toolbox>=3.8.0; extra == 'doc'
|
|
59
|
-
Requires-Dist: sphinx
|
|
60
|
+
Requires-Dist: sphinx<9,>=8.2.1; extra == 'doc'
|
|
60
61
|
Requires-Dist: sphinxext-opengraph; extra == 'doc'
|
|
61
62
|
Requires-Dist: towncrier>=24.8.0; extra == 'doc'
|
|
62
63
|
Provides-Extra: gpu
|
|
@@ -78,13 +79,13 @@ Requires-Dist: joblib; extra == 'test'
|
|
|
78
79
|
Requires-Dist: loompy>=3.0.5; extra == 'test'
|
|
79
80
|
Requires-Dist: matplotlib; extra == 'test'
|
|
80
81
|
Requires-Dist: openpyxl; extra == 'test'
|
|
81
|
-
Requires-Dist: pyarrow
|
|
82
|
+
Requires-Dist: pyarrow; extra == 'test'
|
|
83
|
+
Requires-Dist: pytest; extra == 'test'
|
|
82
84
|
Requires-Dist: pytest-cov; extra == 'test'
|
|
83
85
|
Requires-Dist: pytest-memray; extra == 'test'
|
|
84
86
|
Requires-Dist: pytest-mock; extra == 'test'
|
|
85
87
|
Requires-Dist: pytest-randomly; extra == 'test'
|
|
86
88
|
Requires-Dist: pytest-xdist[psutil]; extra == 'test'
|
|
87
|
-
Requires-Dist: pytest<8.3.4,>=8.2; extra == 'test'
|
|
88
89
|
Requires-Dist: requests; extra == 'test'
|
|
89
90
|
Requires-Dist: scanpy>=1.10; extra == 'test'
|
|
90
91
|
Requires-Dist: scikit-learn; extra == 'test'
|
|
@@ -100,13 +101,13 @@ Requires-Dist: joblib; extra == 'test-min'
|
|
|
100
101
|
Requires-Dist: loompy>=3.0.5; extra == 'test-min'
|
|
101
102
|
Requires-Dist: matplotlib; extra == 'test-min'
|
|
102
103
|
Requires-Dist: openpyxl; extra == 'test-min'
|
|
103
|
-
Requires-Dist: pyarrow
|
|
104
|
+
Requires-Dist: pyarrow; extra == 'test-min'
|
|
105
|
+
Requires-Dist: pytest; extra == 'test-min'
|
|
104
106
|
Requires-Dist: pytest-cov; extra == 'test-min'
|
|
105
107
|
Requires-Dist: pytest-memray; extra == 'test-min'
|
|
106
108
|
Requires-Dist: pytest-mock; extra == 'test-min'
|
|
107
109
|
Requires-Dist: pytest-randomly; extra == 'test-min'
|
|
108
110
|
Requires-Dist: pytest-xdist[psutil]; extra == 'test-min'
|
|
109
|
-
Requires-Dist: pytest<8.3.4,>=8.2; extra == 'test-min'
|
|
110
111
|
Requires-Dist: scanpy>=1.10; extra == 'test-min'
|
|
111
112
|
Requires-Dist: scikit-learn; extra == 'test-min'
|
|
112
113
|
Description-Content-Type: text/markdown
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pyarrow<21
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
.. sidebar:: Key Contributors
|
|
2
2
|
|
|
3
|
-
*
|
|
3
|
+
* Isaac Virshup: anndata >= 0.7, diverse contributions
|
|
4
4
|
* Sergei Rybakov: diverse contributions
|
|
5
|
-
*
|
|
5
|
+
* Alex Wolf: initial conception/development
|
|
6
6
|
* Philipp Angerer: initial conception/development, software quality
|
|
7
|
+
* Ilan Gold: improved cloud support, software quality
|
|
7
8
|
|
|
8
9
|
.. _contributions graph: https://github.com/scverse/anndata/graphs/contributors
|
|
9
|
-
.. _Isaac Virshup: https://twitter.com/ivirshup
|
|
10
|
-
.. _Alex Wolf: https://twitter.com/falexwolf
|
|
@@ -22,14 +22,14 @@ Let's start off with an example:
|
|
|
22
22
|
>>> from scipy import sparse
|
|
23
23
|
>>> from anndata import AnnData
|
|
24
24
|
>>> pbmc = sc.datasets.pbmc68k_reduced()
|
|
25
|
-
>>> pbmc
|
|
25
|
+
>>> pbmc # doctest: +ELLIPSIS
|
|
26
26
|
AnnData object with n_obs × n_vars = 700 × 765
|
|
27
27
|
obs: 'bulk_labels', 'n_genes', 'percent_mito', 'n_counts', 'S_score', 'G2M_score', 'phase', 'louvain'
|
|
28
28
|
var: 'n_counts', 'means', 'dispersions', 'dispersions_norm', 'highly_variable'
|
|
29
29
|
uns: 'bulk_labels_colors', 'louvain', 'louvain_colors', 'neighbors', 'pca', 'rank_genes_groups'
|
|
30
30
|
obsm: 'X_pca', 'X_umap'
|
|
31
31
|
varm: 'PCs'
|
|
32
|
-
obsp:
|
|
32
|
+
obsp: ...
|
|
33
33
|
|
|
34
34
|
If we split this object up by clusters of observations, then stack those subsets we'll obtain the same values – just ordered differently.
|
|
35
35
|
|
|
@@ -88,8 +88,9 @@ typehints_defaults = "braces"
|
|
|
88
88
|
todo_include_todos = False
|
|
89
89
|
nitpicky = True # Report broken links
|
|
90
90
|
nitpick_ignore = [ # APIs without an intersphinx entry
|
|
91
|
-
#
|
|
91
|
+
# These APIs aren’t actually documented
|
|
92
92
|
("py:class", "anndata._core.raw.Raw"),
|
|
93
|
+
("py:class", "pandas._libs.missing.NAType"),
|
|
93
94
|
# TODO: remove zappy support; the zappy repo is archived
|
|
94
95
|
("py:class", "anndata.compat.ZappyArray"),
|
|
95
96
|
]
|
|
@@ -134,6 +135,7 @@ intersphinx_mapping = dict(
|
|
|
134
135
|
obstore=("https://developmentseed.org/obstore/latest/", None),
|
|
135
136
|
pandas=("https://pandas.pydata.org/pandas-docs/stable", None),
|
|
136
137
|
# TODO: switch to `/3` once docs are built with Python 3.14
|
|
138
|
+
# https://github.com/readthedocs/readthedocs.org/issues/12523
|
|
137
139
|
python=("https://docs.python.org/3.13", None),
|
|
138
140
|
scipy=("https://docs.scipy.org/doc/scipy", None),
|
|
139
141
|
sklearn=("https://scikit-learn.org/stable", None),
|
|
@@ -169,6 +171,7 @@ qualname_overrides = {
|
|
|
169
171
|
"anndata.compat.XDataset": "xarray.Dataset",
|
|
170
172
|
"awkward.highlevel.Array": "ak.Array",
|
|
171
173
|
"numpy.int64": ("py:attr", "numpy.int64"),
|
|
174
|
+
"numpy.dtypes.StringDType": ("py:attr", "numpy.dtypes.StringDType"),
|
|
172
175
|
"pandas.DataFrame.iloc": ("py:attr", "pandas.DataFrame.iloc"),
|
|
173
176
|
"pandas.DataFrame.loc": ("py:attr", "pandas.DataFrame.loc"),
|
|
174
177
|
# should be fixed soon: https://github.com/tox-dev/sphinx-autodoc-typehints/pull/516
|
|
@@ -7,12 +7,13 @@ but will still be read by newer versions of the library.
|
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
AnnData objects are saved on disk to hierarchical array stores like [HDF5]
|
|
10
|
-
(via {doc}`H5py <h5py:index>`) and {
|
|
10
|
+
(via {doc}`H5py <h5py:index>`) and {mod}`zarr`.
|
|
11
11
|
This allows us to have very similar structures in disk and on memory.
|
|
12
12
|
|
|
13
13
|
As an example we’ll look into a typical `.h5ad`/ `.zarr` object that’s been through an analysis.
|
|
14
14
|
The structures are largely equivalent, though there are a few minor differences when it comes to type encoding.
|
|
15
15
|
|
|
16
|
+
(elements)=
|
|
16
17
|
## Elements
|
|
17
18
|
|
|
18
19
|
<!-- I’ve started using h5py since I couldn’t figure out a nice way to print attributes from bash. -->
|
|
@@ -69,12 +70,14 @@ For example, we can see that this file represents an `AnnData` object from its m
|
|
|
69
70
|
|
|
70
71
|
Using this information, we're able to dispatch onto readers for the different element types that you'd find in an anndata.
|
|
71
72
|
|
|
73
|
+
(element)=
|
|
72
74
|
### Element Specification
|
|
73
75
|
|
|
74
76
|
* An element can be any object within the storage hierarchy (typically an array or group) with associated metadata
|
|
75
77
|
* An element MUST have a string-valued field `"encoding-type"` in its metadata
|
|
76
78
|
* An element MUST have a string-valued field `"encoding-version"` in its metadata that can be evaluated to a version
|
|
77
79
|
|
|
80
|
+
(anndata)=
|
|
78
81
|
### AnnData specification (v0.1.0)
|
|
79
82
|
|
|
80
83
|
* An `AnnData` object MUST be a group.
|
|
@@ -88,10 +91,11 @@ Using this information, we're able to dispatch onto readers for the different el
|
|
|
88
91
|
* The group MAY contain a mapping `varp`. Entries in `varp` MUST be sparse or dense arrays. The entries first two dimensions MUST be of size `n_var`
|
|
89
92
|
* The group MAY contain a mapping `uns`. Entries in `uns` MUST be an anndata encoded type.
|
|
90
93
|
|
|
94
|
+
(dense-arrays)=
|
|
91
95
|
## Dense arrays
|
|
92
96
|
|
|
93
97
|
Dense numeric arrays have the most simple representation on disk,
|
|
94
|
-
as they have native equivalents in H5py {doc}`h5py:high/dataset` and
|
|
98
|
+
as they have native equivalents in H5py {doc}`h5py:high/dataset` and {class}`zarr.Array`\ s.
|
|
95
99
|
We can see an example of this with dimensionality reductions stored in the `obsm` group:
|
|
96
100
|
|
|
97
101
|
`````{tab-set}
|
|
@@ -129,11 +133,13 @@ X_pca Dataset {38410, 50}
|
|
|
129
133
|
X_umap Dataset {38410, 2}
|
|
130
134
|
``` -->
|
|
131
135
|
|
|
136
|
+
(array)=
|
|
132
137
|
### Dense arrays specification (v0.2.0)
|
|
133
138
|
|
|
134
139
|
* Dense arrays MUST be stored in an Array object
|
|
135
140
|
* Dense arrays MUST have the entries `'encoding-type': 'array'` and `'encoding-version': '0.2.0'` in their metadata
|
|
136
141
|
|
|
142
|
+
(sparse-arrays)=
|
|
137
143
|
## Sparse arrays
|
|
138
144
|
|
|
139
145
|
Sparse arrays don’t have a native representations in HDF5 or Zarr,
|
|
@@ -188,6 +194,8 @@ indptr <zarr.core.Array '/X/indptr' (164115,) int32 read-only>
|
|
|
188
194
|
|
|
189
195
|
`````
|
|
190
196
|
|
|
197
|
+
(csr_matrix)=
|
|
198
|
+
(csc_matrix)=
|
|
191
199
|
### Sparse array specification (v0.1.0)
|
|
192
200
|
|
|
193
201
|
* Each sparse array MUST be its own group
|
|
@@ -197,6 +205,7 @@ indptr <zarr.core.Array '/X/indptr' (164115,) int32 read-only>
|
|
|
197
205
|
* `"encoding-version"`, which is set to `"0.1.0"`
|
|
198
206
|
* `"shape"` which is an integer array of length 2 whose values are the sizes of the array's dimensions
|
|
199
207
|
|
|
208
|
+
(dataframes)=
|
|
200
209
|
## DataFrames
|
|
201
210
|
|
|
202
211
|
DataFrames are saved as a columnar format in a group, so each column of a DataFrame is saved as a separate array.
|
|
@@ -263,6 +272,7 @@ feature_is_filtered <zarr.core.Array '/var/feature_is_filtered' (40145,) bool re
|
|
|
263
272
|
{'encoding-type': 'array', 'encoding-version': '0.2.0'}
|
|
264
273
|
```
|
|
265
274
|
|
|
275
|
+
(dataframe)=
|
|
266
276
|
### Dataframe Specification (v0.2.0)
|
|
267
277
|
|
|
268
278
|
* A dataframe MUST be stored as a group
|
|
@@ -274,6 +284,7 @@ feature_is_filtered <zarr.core.Array '/var/feature_is_filtered' (40145,) bool re
|
|
|
274
284
|
* Each entry in the group MUST correspond to an array with equivalent first dimensions
|
|
275
285
|
* Each entry SHOULD share chunk sizes (in the HDF5 or zarr container)
|
|
276
286
|
|
|
287
|
+
(mappings)=
|
|
277
288
|
## Mappings
|
|
278
289
|
|
|
279
290
|
Mappings are simply stored as `Group`s on disk.
|
|
@@ -314,13 +325,14 @@ pca/variance_ratio <zarr.core.Array '/uns/pca/variance_ratio' (50,) float64 read
|
|
|
314
325
|
|
|
315
326
|
`````
|
|
316
327
|
|
|
317
|
-
|
|
318
|
-
|
|
328
|
+
(dict)=
|
|
329
|
+
(mapping)=
|
|
319
330
|
### Mapping specifications (v0.1.0)
|
|
320
331
|
|
|
321
332
|
* Each mapping MUST be its own group
|
|
322
333
|
* The group's metadata MUST contain the encoding metadata `"encoding-type": "dict"`, `"encoding-version": "0.1.0"`
|
|
323
334
|
|
|
335
|
+
(scalars)=
|
|
324
336
|
## Scalars
|
|
325
337
|
|
|
326
338
|
Zero dimensional arrays are used for scalar values (i.e. single values like strings, numbers or booleans).
|
|
@@ -363,6 +375,8 @@ random_state <zarr.core.Array '/uns/neighbors/params/random_state' () int64 read
|
|
|
363
375
|
{'encoding-type': 'string', 'encoding-version': '0.2.0'}
|
|
364
376
|
```
|
|
365
377
|
|
|
378
|
+
(numeric-scalar)=
|
|
379
|
+
(string)=
|
|
366
380
|
### Scalar specification (v0.2.0)
|
|
367
381
|
|
|
368
382
|
* Scalars MUST be written as a 0 dimensional array
|
|
@@ -374,6 +388,7 @@ random_state <zarr.core.Array '/uns/neighbors/params/random_state' () int64 read
|
|
|
374
388
|
* In zarr, scalar strings MUST be stored as a fixed length unicode dtype
|
|
375
389
|
* In HDF5, scalar strings MUST be stored as a variable length utf-8 encoded string dtype
|
|
376
390
|
|
|
391
|
+
(categorical-arrays)=
|
|
377
392
|
## Categorical arrays
|
|
378
393
|
|
|
379
394
|
```python
|
|
@@ -414,6 +429,7 @@ codes <zarr.core.Array '/obs/development_stage/codes' (164114,) int8 read-only>
|
|
|
414
429
|
|
|
415
430
|
`````
|
|
416
431
|
|
|
432
|
+
(categorical)=
|
|
417
433
|
### Categorical array specification (v0.2.0)
|
|
418
434
|
|
|
419
435
|
* Categorical arrays MUST be stored as a group
|
|
@@ -423,6 +439,7 @@ codes <zarr.core.Array '/obs/development_stage/codes' (164114,) int8 read-only>
|
|
|
423
439
|
* The `"codes"` array MAY contain signed integer values. If so, the code `-1` denotes a missing value
|
|
424
440
|
* The group MUST contain an array called `"categories"`
|
|
425
441
|
|
|
442
|
+
(string-arrays)=
|
|
426
443
|
## String arrays
|
|
427
444
|
|
|
428
445
|
Arrays of strings are handled differently than numeric arrays since numpy doesn't really have a good way of representing arrays of unicode strings.
|
|
@@ -457,6 +474,7 @@ Arrays of strings are handled differently than numeric arrays since numpy doesn'
|
|
|
457
474
|
{'encoding-type': 'string-array', 'encoding-version': '0.2.0'}
|
|
458
475
|
```
|
|
459
476
|
|
|
477
|
+
(string-array)=
|
|
460
478
|
### String array specifications (v0.2.0)
|
|
461
479
|
|
|
462
480
|
* String arrays MUST be stored in arrays
|
|
@@ -464,9 +482,10 @@ Arrays of strings are handled differently than numeric arrays since numpy doesn'
|
|
|
464
482
|
* In `zarr`, string arrays MUST be stored using `numcodecs`' `VLenUTF8` codec
|
|
465
483
|
* In `HDF5`, string arrays MUST be stored using the variable length string data type, with a utf-8 encoding
|
|
466
484
|
|
|
467
|
-
|
|
485
|
+
(nullable-arrays)=
|
|
486
|
+
## Nullable integers, booleans, and strings
|
|
468
487
|
|
|
469
|
-
We support IO with Pandas nullable integer and
|
|
488
|
+
We support IO with Pandas nullable integer, boolean, and string arrays.
|
|
470
489
|
We represent these on disk similar to `numpy` masked arrays, `julia` nullable arrays, or `arrow` validity bitmaps (see {issue}`504` for more discussion).
|
|
471
490
|
That is, we store an indicator array (or mask) of null values alongside the array of all values.
|
|
472
491
|
|
|
@@ -523,21 +542,33 @@ nullable_integer/values <zarr.core.Array '/nullable_integer/values' (4,) int64>
|
|
|
523
542
|
{'encoding-type': 'nullable-integer', 'encoding-version': '0.1.0'}
|
|
524
543
|
```
|
|
525
544
|
|
|
545
|
+
(nullable-integer)=
|
|
526
546
|
### Nullable integer specifications (v0.1.0)
|
|
527
547
|
|
|
528
548
|
* Nullable integers MUST be stored as a group
|
|
529
|
-
* The group
|
|
549
|
+
* The group’s attributes MUST contain the encoding metadata `"encoding-type": "nullable-integer"`, `"encoding-version": "0.1.0"`
|
|
530
550
|
* The group MUST contain an integer valued array under the key `"values"`
|
|
531
551
|
* The group MUST contain an boolean valued array under the key `"mask"`
|
|
532
552
|
|
|
553
|
+
(nullable-boolean)=
|
|
533
554
|
### Nullable boolean specifications (v0.1.0)
|
|
534
555
|
|
|
535
556
|
* Nullable booleans MUST be stored as a group
|
|
536
|
-
* The group
|
|
557
|
+
* The group’s attributes MUST contain the encoding metadata `"encoding-type": "nullable-boolean"`, `"encoding-version": "0.1.0"`
|
|
537
558
|
* The group MUST contain an boolean valued array under the key `"values"`
|
|
538
559
|
* The group MUST contain an boolean valued array under the key `"mask"`
|
|
539
560
|
* The `"values"` and `"mask"` arrays MUST be the same shape
|
|
540
561
|
|
|
562
|
+
(nullable-string-array)=
|
|
563
|
+
### Nullable string specifications (v0.1.0)
|
|
564
|
+
|
|
565
|
+
* Nullable strings MUST be stored as a group
|
|
566
|
+
* The group’s attributes MUST contain the encoding metadata `"encoding-type": "nullable-string-array"`, `"encoding-version": "0.1.0"`
|
|
567
|
+
* The group MUST contain a string valued array under the key `"values"`
|
|
568
|
+
* The group MUST contain a boolean valued array under the key `"mask"`
|
|
569
|
+
* The `"values"` and `"mask"` arrays MUST be the same shape
|
|
570
|
+
|
|
571
|
+
(awkward-array)=
|
|
541
572
|
## AwkwardArrays
|
|
542
573
|
|
|
543
574
|
```{warning}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
```{include} ../README.md
|
|
2
|
+
```
|
|
3
|
+
|
|
4
|
+
# Latest additions
|
|
5
|
+
|
|
6
|
+
See {doc}`/release-notes/index`.
|
|
7
|
+
|
|
8
|
+
```{toctree}
|
|
9
|
+
:hidden: true
|
|
10
|
+
:maxdepth: 1
|
|
11
|
+
|
|
12
|
+
tutorials/index
|
|
13
|
+
api
|
|
14
|
+
concatenation
|
|
15
|
+
fileformat-prose
|
|
16
|
+
interoperability
|
|
17
|
+
benchmarks
|
|
18
|
+
contributing
|
|
19
|
+
release-notes/index
|
|
20
|
+
references
|
|
21
|
+
```
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
References
|
|
2
2
|
----------
|
|
3
3
|
|
|
4
|
-
.. [Bredikhin22]
|
|
5
|
-
Bredikhin *et al.* (2022),
|
|
6
|
-
*MUON: multimodal omics analysis framework*,
|
|
7
|
-
Genome Biology https://doi.org/10.1186/s13059-021-02577-8.
|
|
8
|
-
|
|
9
4
|
.. [Hastie09]
|
|
10
5
|
Hastie *et al.* (2009),
|
|
11
6
|
*The Elements of Statistical Learning*,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
(v0.12.7)=
|
|
2
|
+
### 0.12.7 {small}`2025-12-16`
|
|
3
|
+
|
|
4
|
+
#### Documentation
|
|
5
|
+
|
|
6
|
+
- Add cruft config & update contributors {smaller}`zethson` ({pr}`2223`)
|
|
7
|
+
|
|
8
|
+
#### Bug fixes
|
|
9
|
+
|
|
10
|
+
- Handle `pandas.options.future.infer_string` {smaller}`P Angerer` {smaller}`I Gold` ({pr}`2133`)
|
|
11
|
+
- Ensure there are no dangling file handles in {func}`anndata.experimental.concat_on_disk` when passing `.h5ad`-terminated strings as path inputs. {user}`ilan-gold` ({pr}`2218`)
|
|
12
|
+
- Ensure {attr}`anndata.experimental.backed.Dataset2D.true_index` is carried over when subsetting by columns i.,e `ds[[col1, col2]]` {user}`ilan-gold` ({pr}`2220`)
|
|
@@ -6,7 +6,11 @@ Here is a quick guide on some of our learnings so far:
|
|
|
6
6
|
|
|
7
7
|
## Consolidated Metadata
|
|
8
8
|
|
|
9
|
-
All `zarr` stores are now consolidated by default when written via {func}`anndata.io.write_zarr` or {meth}`anndata.AnnData.write_zarr`.
|
|
9
|
+
All `zarr` stores are now consolidated by default when written via {func}`anndata.io.write_zarr` or {meth}`anndata.AnnData.write_zarr`.
|
|
10
|
+
For more information on this topic, please see the zarr [consolidated metadata] user guide.
|
|
11
|
+
Practcally, this changes means that once a store has been written, it should be treated as immutable **unless you remove the consolidated metadata and/or rewrite after the mutating operation** i.e.,
|
|
12
|
+
if you wish to use {func}`anndata.io.write_elem` to add a column to `obs`, a `layer` etc. to an existing store.
|
|
13
|
+
For example, to mutate an existing store on-disk, you may do:
|
|
10
14
|
|
|
11
15
|
```python
|
|
12
16
|
g = zarr.open_group(orig_path, mode="a", use_consolidated=False)
|
|
@@ -19,13 +23,14 @@ ad.io.write_elem(
|
|
|
19
23
|
zarr.consolidate_metadata(g.store)
|
|
20
24
|
```
|
|
21
25
|
|
|
22
|
-
In this example, the store was opened unconsolidated (trying to open it as a consolidated store would error out), edited, and then reconsolidated.
|
|
26
|
+
In this example, the store was opened unconsolidated (trying to open it as a consolidated store would error out), edited, and then reconsolidated.
|
|
27
|
+
Alternatively, one could simple delete the file containing the consolidated metadata first at the root, `.zmetadata`.
|
|
23
28
|
|
|
24
29
|
## Remote data
|
|
25
30
|
|
|
26
31
|
We now provide the {func}`anndata.experimental.read_lazy` feature for reading as much of the {class}`~anndata.AnnData` object as lazily as possible, using `dask` and {mod}`xarray`.
|
|
27
32
|
Please note that this feature is experimental and subject to change.
|
|
28
|
-
To enable this functionality in a performant and feature-complete way for remote data sources, we use
|
|
33
|
+
To enable this functionality in a performant and feature-complete way for remote data sources, we use [consolidated metadata] on the `zarr` store (written by default).
|
|
29
34
|
Please note that this introduces consistency issues – if you update the structure of the underlying `zarr` store i.e., remove a column from `obs`, the consolidated metadata will no longer be valid.
|
|
30
35
|
Further, note that without consolidated metadata, we cannot guarantee your stored `AnnData` object will be fully readable.
|
|
31
36
|
And even if it is fully readable, it will almost certainly be much slower to read.
|
|
@@ -37,7 +42,7 @@ There are two ways of opening remote `zarr` stores from the `zarr-python` packag
|
|
|
37
42
|
|
|
38
43
|
Local data generally poses a different set of challenges.
|
|
39
44
|
First, write speeds can be somewhat slow and second, the creation of many small files on a file system can slow down a filesystem.
|
|
40
|
-
For the "many small files" problem, `zarr` has introduced
|
|
45
|
+
For the "many small files" problem, `zarr` has introduced [sharding] in the v3 file format.
|
|
41
46
|
We offer {attr}`anndata.settings.auto_shard_zarr_v3` to hook into zarr's ability to automatically compute shards, which is experimental at the moment.
|
|
42
47
|
Manual sharding requires knowledge of the array element you are writing (such as shape or data type), though, and therefore you will need to use {func}`anndata.experimental.write_dispatched` to use custom sharding.
|
|
43
48
|
For example, you cannot shard a 1D array with `shard` sizes `(256, 256)`.
|
|
@@ -97,11 +102,13 @@ Therefore, we recommend passing in the {class}`zarr.codecs.BloscCodec` to `compr
|
|
|
97
102
|
|
|
98
103
|
## Dask
|
|
99
104
|
|
|
100
|
-
Zarr v3 should be compatible with dask, although the default behavior is to use zarr's chunking for dask's own.
|
|
105
|
+
Zarr v3 should be compatible with dask, although the default behavior is to use zarr's chunking for dask's own.
|
|
106
|
+
With sharding, this behavior may be undesirable as shards can often contain many small chunks, thereby slowing down i/o as dask will need to index into the zarr store for every chunk.
|
|
107
|
+
Therefore it may be better to customize this behavior by passing `chunks=my_zarr_array.shards` as an argument to {func}`dask.array.from_zarr` or similar.
|
|
101
108
|
|
|
102
109
|
## GPU i/o
|
|
103
110
|
|
|
104
|
-
At the moment, it is unlikely your `anndata` i/o will work if you use
|
|
111
|
+
At the moment, it is unlikely your `anndata` i/o will work if you use [`zarr.config.enable_gpu`][GPU user guide].
|
|
105
112
|
It's *possible* dense data i/o i.e., using {func}`anndata.io.read_elem` will work as expected, but this functionality is untested – sparse data, awkward arrays, and dataframes will not.
|
|
106
113
|
`kvikio` currently provides a {class}`kvikio.zarr.GDSStore` although there are no working compressors at the moment exported from the `zarr-python` package (work is underway for `Zstd`: {pr}`zarr-developers/zarr-python#2863`.
|
|
107
114
|
|
|
@@ -114,5 +121,8 @@ However, `zarr-python` has a fully `async` API and provides its own event-loop s
|
|
|
114
121
|
We anticipate providing `async` versions of {func}`anndata.io.read_elem` and {func}`anndata.experimental.read_dispatched` so that users can download data asynchronously without using the `zarr-python` event loop.
|
|
115
122
|
We also would like to create an asynchronous partial reader to enable iterative streaming of a dataset.
|
|
116
123
|
|
|
124
|
+
[consolidated metadata]: https://zarr.readthedocs.io/en/latest/user-guide/consolidated_metadata/
|
|
117
125
|
[`obstore` claims]: https://developmentseed.org/obstore/latest/performance
|
|
126
|
+
[sharding]: https://zarr.readthedocs.io/en/stable/user-guide/arrays/#sharding
|
|
118
127
|
[zarr-benchmarks]: https://github.com/LDeakin/zarr_benchmarks
|
|
128
|
+
[GPU user guide]: https://zarr.readthedocs.io/en/stable/user-guide/gpu/
|
|
@@ -21,13 +21,14 @@ env-vars.UV_CONSTRAINT = "ci/constraints.txt"
|
|
|
21
21
|
overrides.matrix.deps.env-vars = [
|
|
22
22
|
{ if = [ "pre" ], key = "UV_PRERELEASE", value = "allow" },
|
|
23
23
|
{ if = [ "pre" ], key = "UV_CONSTRAINT", value = "ci/pre-deps.txt" },
|
|
24
|
-
{ if = [ "min" ], key = "UV_CONSTRAINT", value = "ci/constraints.txt ci/min-deps.txt" },
|
|
24
|
+
{ if = [ "min" ], key = "UV_CONSTRAINT", value = "ci/constraints.txt ci/min-constraints.txt ci/min-deps.txt" },
|
|
25
25
|
]
|
|
26
26
|
overrides.matrix.deps.pre-install-commands = [
|
|
27
27
|
{ if = [
|
|
28
28
|
"min",
|
|
29
29
|
], value = "uv run ci/scripts/min-deps.py pyproject.toml --all-extras -o ci/min-deps.txt" },
|
|
30
30
|
# To prevent situations like https://github.com/pydata/xarray/issues/10419 going forward, and test against zarr as well
|
|
31
|
+
# IMPORTANT: `zarr` being a pre-release is used in the testing code
|
|
31
32
|
{ if = [
|
|
32
33
|
"pre",
|
|
33
34
|
], value = "echo 'xarray @ git+https://github.com/pydata/xarray.git\nzarr @ git+https://github.com/zarr-developers/zarr-python.git' > ci/pre-deps.txt" },
|
|
@@ -35,7 +36,10 @@ overrides.matrix.deps.pre-install-commands = [
|
|
|
35
36
|
]
|
|
36
37
|
overrides.matrix.deps.python = [
|
|
37
38
|
{ if = [ "min" ], value = "3.11" },
|
|
38
|
-
|
|
39
|
+
# transitive test dep numba doesn’t support 3.14 in a stable release yet:
|
|
40
|
+
# https://github.com/numba/numba/issues/9957
|
|
41
|
+
{ if = [ "stable" ], value = "3.13" },
|
|
42
|
+
{ if = [ "pre" ], value = "3.14" },
|
|
39
43
|
]
|
|
40
44
|
overrides.matrix.deps.features = [
|
|
41
45
|
{ if = [ "stable", "pre" ], value = "test" },
|