anndata 0.12.8__tar.gz → 0.12.9__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.8 → anndata-0.12.9}/PKG-INFO +2 -2
- anndata-0.12.9/docs/release-notes/0.12.9.md +6 -0
- {anndata-0.12.8 → anndata-0.12.9}/pyproject.toml +1 -1
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/methods.py +18 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_settings.py +8 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_settings.pyi +1 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_elementwise.py +107 -0
- {anndata-0.12.8 → anndata-0.12.9}/.cirun.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.codecov.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.cruft.json +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.editorconfig +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/dependabot.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/benchmark.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/check-pr.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/close-stale.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/codespell.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/label-stale.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/publish.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/test-cpu.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/test-gpu.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.gitignore +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.gitmodules +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.pre-commit-config.yaml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.readthedocs.yml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.taplo.toml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.vscode/launch.json +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/.vscode/settings.json +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/LICENSE +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/README.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/README.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/asv.conf.json +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/anndata.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/backed_hdf5.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/dataset2d.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/readwrite.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/sparse_dataset.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/utils.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/biome.jsonc +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/ci/constraints.txt +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/ci/min-constraints.txt +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/ci/scripts/min-deps.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/ci/scripts/towncrier_automation.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/Makefile +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/_key_contributors.rst +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/_static/img/anndata_schema.svg +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/_templates/autosummary/class.rst +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/api.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/benchmark-read-write.ipynb +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/benchmarks.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/concatenation.rst +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/conf.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/contributing.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/extensions/autosummary_skip_inherited.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/extensions/no_skip_abc_members.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/extensions/patch_myst_cite.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/fileformat-prose.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/index.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/interoperability.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/references.rst +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.1.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.2.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.3.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.4.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.5.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.6.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.7.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.8.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.9.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.1.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.2.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.3.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.4.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.1.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.2.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.3.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.4.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.5.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.6.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.7.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.8.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.4.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.5.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.6.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.6.x.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.2.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.3.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.4.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.5.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.6.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.7.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.8.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.8.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.9.0.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.9.1.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.9.2.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/2172.bug.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/index.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/tutorials/index.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/docs/tutorials/zarr-v3.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/hatch.toml +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/access.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/aligned_df.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/aligned_mapping.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/anndata.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/extensions.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/file_backing.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/index.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/merge.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/raw.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/sparse_dataset.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/storage.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/views.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/xarray.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/h5ad.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/read.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/lazy_methods.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/registry.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/utils.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/write.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/zarr.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_types.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_warnings.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/abc.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/compat/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/_dispatch_io.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/_compat.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/_io.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/_lazy_arrays.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/merge.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/multi_files/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/multi_files/_anncollection.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/pytorch/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/pytorch/_annloader.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/io.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/logging.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/tests/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/tests/helpers.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/types.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/typing.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/anndata/utils.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/_doctest.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/_pytest.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/py.typed +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/conftest.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/adata-comments.tsv +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/adata.csv +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/readme.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.11.4/adata.h5ad +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.11.4/readme.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.5.0/adata.h5ad +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.5.0/readme.md +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/excel.xlsx +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/data/umi_tools.tsv.gz +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/__init__.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/conftest.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/test_concat.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/test_read.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/test_write.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_anncollection.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_annot.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_awkward.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_backed_dense.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_backed_hdf5.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_backed_sparse.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_base.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_concatenate.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_concatenate_disk.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_dask.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_dask_view_mem.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_deprecations.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_extensions.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_get_vector.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_gpu.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_helpers.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_inplace_subset.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_backwards_compat.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_conversion.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_dispatched.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_partial.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_utils.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_warnings.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_layers.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_obsmvarm.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_obspvarp.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_raw.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_readwrite.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_repr.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_settings.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_structured_arrays.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_transpose.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_uns.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_utils.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_views.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_x.py +0 -0
- {anndata-0.12.8 → anndata-0.12.9}/tests/test_xarray.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: anndata
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.9
|
|
4
4
|
Summary: Annotated data.
|
|
5
5
|
Project-URL: Documentation, https://anndata.readthedocs.io/
|
|
6
6
|
Project-URL: Source, https://github.com/scverse/anndata
|
|
@@ -32,7 +32,7 @@ Requires-Dist: natsort
|
|
|
32
32
|
Requires-Dist: numpy>=1.26
|
|
33
33
|
Requires-Dist: packaging>=24.2
|
|
34
34
|
Requires-Dist: pandas!=2.1.2,<3,>=2.1.0
|
|
35
|
-
Requires-Dist: scipy
|
|
35
|
+
Requires-Dist: scipy!=1.17.0,>=1.12
|
|
36
36
|
Requires-Dist: zarr!=3.0.*,>=2.18.7
|
|
37
37
|
Provides-Extra: cu11
|
|
38
38
|
Requires-Dist: cupy-cuda11x; extra == 'cu11'
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
(v0.12.9)=
|
|
2
|
+
### 0.12.9 {small}`2026-01-29`
|
|
3
|
+
|
|
4
|
+
#### Performance
|
|
5
|
+
|
|
6
|
+
- Add a `write_csr_csc_indices_with_min_possible_dtype` option to {attr}`anndata.settings` to enable downcasting of the `indices` of csr and csc matrices to a smaller dtype when writing. For example, if your csr matrix only has 30000 columns, then you can write out the `indices` of that matrix as `uint16` instead of `int64`. {user}`ilan-gold` ({pr}`2159`)
|
|
@@ -738,6 +738,24 @@ def write_sparse_compressed(
|
|
|
738
738
|
for attr_name in ["data", "indices", "indptr"]:
|
|
739
739
|
attr = getattr(value, attr_name)
|
|
740
740
|
dtype = indptr_dtype if attr_name == "indptr" else attr.dtype
|
|
741
|
+
if (
|
|
742
|
+
attr_name == "indices"
|
|
743
|
+
and settings.write_csr_csc_indices_with_min_possible_dtype
|
|
744
|
+
):
|
|
745
|
+
# np.min_scalar_type can return things like np.ulonglong which zarr doesn't understand
|
|
746
|
+
# and I find this clearer as to what the result type is i.e., unsigned or signed.
|
|
747
|
+
# For example `np.iinfo(np.uint16).max + 1` could be either `uint32` or `int32`,
|
|
748
|
+
# and there's nothing in numpy's docs disallowing this output to change.
|
|
749
|
+
if (minor_axis_size := value.shape[value.format == "csr"]) <= np.iinfo(
|
|
750
|
+
np.uint8
|
|
751
|
+
).max:
|
|
752
|
+
dtype = np.dtype("uint8")
|
|
753
|
+
elif minor_axis_size <= np.iinfo(np.uint16).max:
|
|
754
|
+
dtype = np.dtype("uint16")
|
|
755
|
+
elif minor_axis_size <= np.iinfo(np.uint32).max:
|
|
756
|
+
dtype = np.dtype("uint32")
|
|
757
|
+
elif minor_axis_size <= np.iinfo(np.uint64).max:
|
|
758
|
+
dtype = np.dtype("uint64")
|
|
741
759
|
if isinstance(f, H5Group) or is_zarr_v2():
|
|
742
760
|
g.create_dataset(
|
|
743
761
|
attr_name, data=attr, shape=attr.shape, dtype=dtype, **dataset_kwargs
|
|
@@ -503,6 +503,14 @@ settings.register(
|
|
|
503
503
|
get_from_env=check_and_get_bool,
|
|
504
504
|
)
|
|
505
505
|
|
|
506
|
+
settings.register(
|
|
507
|
+
"write_csr_csc_indices_with_min_possible_dtype",
|
|
508
|
+
default_value=False,
|
|
509
|
+
description="Write a csr or csc matrix with the minimum possible data type for `indices`, always unsigned integer.",
|
|
510
|
+
validate=validate_bool,
|
|
511
|
+
get_from_env=check_and_get_bool,
|
|
512
|
+
)
|
|
513
|
+
|
|
506
514
|
settings.register(
|
|
507
515
|
"auto_shard_zarr_v3",
|
|
508
516
|
default_value=False,
|
|
@@ -46,6 +46,7 @@ class _AnnDataSettingsManager(SettingsManager):
|
|
|
46
46
|
use_sparse_array_on_read: bool = False
|
|
47
47
|
min_rows_for_chunked_h5_copy: int = 1000
|
|
48
48
|
disallow_forward_slash_in_h5ad: bool = False
|
|
49
|
+
write_csr_csc_indices_with_min_possible_dtype: bool = False
|
|
49
50
|
auto_shard_zarr_v3: bool = False
|
|
50
51
|
|
|
51
52
|
settings: _AnnDataSettingsManager
|
|
@@ -455,6 +455,113 @@ def test_write_indptr_dtype_override(store, sparse_format):
|
|
|
455
455
|
np.testing.assert_array_equal(store["X/indptr"][...], X.indptr)
|
|
456
456
|
|
|
457
457
|
|
|
458
|
+
@pytest.mark.parametrize(
|
|
459
|
+
("num_minor_axis", "expected_dtype"),
|
|
460
|
+
[
|
|
461
|
+
pytest.param(1, np.dtype("uint8"), id="one_col-expected_uint8_on_disk"),
|
|
462
|
+
pytest.param(
|
|
463
|
+
np.iinfo(np.uint8).max,
|
|
464
|
+
np.dtype("uint8"),
|
|
465
|
+
id="max_np.uint8-matching_dtype_on_disk",
|
|
466
|
+
),
|
|
467
|
+
pytest.param(
|
|
468
|
+
np.iinfo(np.int8).max,
|
|
469
|
+
np.dtype("uint8"),
|
|
470
|
+
id="max_np.int8-uint8_on_disk",
|
|
471
|
+
),
|
|
472
|
+
pytest.param(
|
|
473
|
+
np.iinfo(np.uint16).max,
|
|
474
|
+
np.dtype("uint16"),
|
|
475
|
+
id="max_np.uint16-matching_dtype_on_disk",
|
|
476
|
+
),
|
|
477
|
+
pytest.param(
|
|
478
|
+
np.iinfo(np.int16).max,
|
|
479
|
+
np.dtype("uint16"),
|
|
480
|
+
id="max_np.int16-uint16_on_disk",
|
|
481
|
+
),
|
|
482
|
+
pytest.param(
|
|
483
|
+
np.iinfo(np.uint32).max,
|
|
484
|
+
np.dtype("uint32"),
|
|
485
|
+
id="max_np.uint32-matching_dtype_on_disk",
|
|
486
|
+
),
|
|
487
|
+
pytest.param(
|
|
488
|
+
np.iinfo(np.int32).max,
|
|
489
|
+
np.dtype("uint32"),
|
|
490
|
+
id="max_np.int32-uint32_on_disk",
|
|
491
|
+
),
|
|
492
|
+
pytest.param(
|
|
493
|
+
np.iinfo(np.uint8).max + 1,
|
|
494
|
+
np.dtype("uint16"),
|
|
495
|
+
id="max_np.uint8_plus_one_cols-expected_uint16_on_disk",
|
|
496
|
+
),
|
|
497
|
+
pytest.param(
|
|
498
|
+
np.iinfo(np.uint16).max + 1,
|
|
499
|
+
np.dtype("uint32"),
|
|
500
|
+
id="max_np.uint16_plus_one_cols-expected_uint32_on_disk",
|
|
501
|
+
),
|
|
502
|
+
pytest.param(
|
|
503
|
+
np.iinfo(np.uint32).max + 1,
|
|
504
|
+
np.dtype("uint64"),
|
|
505
|
+
id="max_np.uint32_plus_one_cols-expected_uint64_on_disk",
|
|
506
|
+
),
|
|
507
|
+
pytest.param(
|
|
508
|
+
np.iinfo(np.int64).max + 1,
|
|
509
|
+
np.dtype("uint64"),
|
|
510
|
+
id="max_np.int64_plus_one_cols-expected_uint64_on_disk",
|
|
511
|
+
marks=pytest.mark.xfail(
|
|
512
|
+
reason="scipy sparse does not support bigger than max(int64) values in indices and there is no uint128."
|
|
513
|
+
),
|
|
514
|
+
),
|
|
515
|
+
pytest.param(
|
|
516
|
+
np.iinfo(np.uint64).max + 1,
|
|
517
|
+
np.dtype("uint64"),
|
|
518
|
+
id="max_np.uint64_plus_one_cols-expected_uint64_on_disk",
|
|
519
|
+
marks=pytest.mark.xfail(
|
|
520
|
+
reason="scipy sparse does not support bigger than max(int64) values in indices and there is no uint128."
|
|
521
|
+
),
|
|
522
|
+
),
|
|
523
|
+
],
|
|
524
|
+
)
|
|
525
|
+
@pytest.mark.parametrize("format", ["csr", "csc"])
|
|
526
|
+
def test_write_indices_min(
|
|
527
|
+
store: H5Group | ZarrGroup,
|
|
528
|
+
num_minor_axis: int,
|
|
529
|
+
expected_dtype: np.dtype,
|
|
530
|
+
format: Literal["csr", "csc"],
|
|
531
|
+
):
|
|
532
|
+
minor_axis_index = np.array([num_minor_axis - 1])
|
|
533
|
+
major_axis_index = np.array([10])
|
|
534
|
+
row_cols = (
|
|
535
|
+
(minor_axis_index, major_axis_index)
|
|
536
|
+
if format == "csc"
|
|
537
|
+
else (major_axis_index, minor_axis_index)
|
|
538
|
+
)
|
|
539
|
+
shape = (num_minor_axis, 20) if format == "csc" else (20, num_minor_axis)
|
|
540
|
+
X = getattr(sparse, f"{format}_array")(
|
|
541
|
+
(np.array([10]), row_cols),
|
|
542
|
+
shape=shape,
|
|
543
|
+
)
|
|
544
|
+
assert X.nnz == 1
|
|
545
|
+
with ad.settings.override(write_csr_csc_indices_with_min_possible_dtype=True):
|
|
546
|
+
write_elem(store, "X", X)
|
|
547
|
+
|
|
548
|
+
assert store["X/indices"].dtype == expected_dtype
|
|
549
|
+
with ad.settings.override(use_sparse_array_on_read=True):
|
|
550
|
+
result = read_elem(store["X"])
|
|
551
|
+
assert_equal(result.data, X.data)
|
|
552
|
+
assert_equal(result.indices, X.indices)
|
|
553
|
+
assert_equal(result.indptr, X.indptr)
|
|
554
|
+
assert X.format == result.format
|
|
555
|
+
assert result.shape == X.shape
|
|
556
|
+
# != comparison converts to csr, which allocates a lot of memory or errors out with:
|
|
557
|
+
# ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size.
|
|
558
|
+
# Because the old, very large, minor axis is now the major axis and so either it fails to create or the indptr is very big.
|
|
559
|
+
# The above tests should be enough to capture the desired equality checks so this is mostly for being extra sure.
|
|
560
|
+
# See https://github.com/scipy/scipy/issues/23826
|
|
561
|
+
if not (format == "csc" and num_minor_axis > np.iinfo(np.uint16).max + 1):
|
|
562
|
+
assert (result != X).nnz == 0
|
|
563
|
+
|
|
564
|
+
|
|
458
565
|
def test_io_spec_raw(store):
|
|
459
566
|
adata = gen_adata((3, 2), **GEN_ADATA_NO_XARRAY_ARGS)
|
|
460
567
|
adata.raw = adata.copy()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|