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.
Files changed (217) hide show
  1. {anndata-0.12.8 → anndata-0.12.9}/PKG-INFO +2 -2
  2. anndata-0.12.9/docs/release-notes/0.12.9.md +6 -0
  3. {anndata-0.12.8 → anndata-0.12.9}/pyproject.toml +1 -1
  4. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/methods.py +18 -0
  5. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_settings.py +8 -0
  6. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_settings.pyi +1 -0
  7. {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_elementwise.py +107 -0
  8. {anndata-0.12.8 → anndata-0.12.9}/.cirun.yml +0 -0
  9. {anndata-0.12.8 → anndata-0.12.9}/.codecov.yml +0 -0
  10. {anndata-0.12.8 → anndata-0.12.9}/.cruft.json +0 -0
  11. {anndata-0.12.8 → anndata-0.12.9}/.editorconfig +0 -0
  12. {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  13. {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  14. {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
  15. {anndata-0.12.8 → anndata-0.12.9}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  16. {anndata-0.12.8 → anndata-0.12.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {anndata-0.12.8 → anndata-0.12.9}/.github/dependabot.yml +0 -0
  18. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/benchmark.yml +0 -0
  19. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/check-pr.yml +0 -0
  20. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/close-stale.yml +0 -0
  21. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/codespell.yml +0 -0
  22. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/label-stale.yml +0 -0
  23. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/publish.yml +0 -0
  24. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/test-cpu.yml +0 -0
  25. {anndata-0.12.8 → anndata-0.12.9}/.github/workflows/test-gpu.yml +0 -0
  26. {anndata-0.12.8 → anndata-0.12.9}/.gitignore +0 -0
  27. {anndata-0.12.8 → anndata-0.12.9}/.gitmodules +0 -0
  28. {anndata-0.12.8 → anndata-0.12.9}/.pre-commit-config.yaml +0 -0
  29. {anndata-0.12.8 → anndata-0.12.9}/.readthedocs.yml +0 -0
  30. {anndata-0.12.8 → anndata-0.12.9}/.taplo.toml +0 -0
  31. {anndata-0.12.8 → anndata-0.12.9}/.vscode/launch.json +0 -0
  32. {anndata-0.12.8 → anndata-0.12.9}/.vscode/settings.json +0 -0
  33. {anndata-0.12.8 → anndata-0.12.9}/LICENSE +0 -0
  34. {anndata-0.12.8 → anndata-0.12.9}/README.md +0 -0
  35. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/README.md +0 -0
  36. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/asv.conf.json +0 -0
  37. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/__init__.py +0 -0
  38. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/anndata.py +0 -0
  39. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/backed_hdf5.py +0 -0
  40. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/dataset2d.py +0 -0
  41. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/readwrite.py +0 -0
  42. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/sparse_dataset.py +0 -0
  43. {anndata-0.12.8 → anndata-0.12.9}/benchmarks/benchmarks/utils.py +0 -0
  44. {anndata-0.12.8 → anndata-0.12.9}/biome.jsonc +0 -0
  45. {anndata-0.12.8 → anndata-0.12.9}/ci/constraints.txt +0 -0
  46. {anndata-0.12.8 → anndata-0.12.9}/ci/min-constraints.txt +0 -0
  47. {anndata-0.12.8 → anndata-0.12.9}/ci/scripts/min-deps.py +0 -0
  48. {anndata-0.12.8 → anndata-0.12.9}/ci/scripts/towncrier_automation.py +0 -0
  49. {anndata-0.12.8 → anndata-0.12.9}/docs/Makefile +0 -0
  50. {anndata-0.12.8 → anndata-0.12.9}/docs/_key_contributors.rst +0 -0
  51. {anndata-0.12.8 → anndata-0.12.9}/docs/_static/img/anndata_schema.svg +0 -0
  52. {anndata-0.12.8 → anndata-0.12.9}/docs/_templates/autosummary/class.rst +0 -0
  53. {anndata-0.12.8 → anndata-0.12.9}/docs/api.md +0 -0
  54. {anndata-0.12.8 → anndata-0.12.9}/docs/benchmark-read-write.ipynb +0 -0
  55. {anndata-0.12.8 → anndata-0.12.9}/docs/benchmarks.md +0 -0
  56. {anndata-0.12.8 → anndata-0.12.9}/docs/concatenation.rst +0 -0
  57. {anndata-0.12.8 → anndata-0.12.9}/docs/conf.py +0 -0
  58. {anndata-0.12.8 → anndata-0.12.9}/docs/contributing.md +0 -0
  59. {anndata-0.12.8 → anndata-0.12.9}/docs/extensions/autosummary_skip_inherited.py +0 -0
  60. {anndata-0.12.8 → anndata-0.12.9}/docs/extensions/no_skip_abc_members.py +0 -0
  61. {anndata-0.12.8 → anndata-0.12.9}/docs/extensions/patch_myst_cite.py +0 -0
  62. {anndata-0.12.8 → anndata-0.12.9}/docs/fileformat-prose.md +0 -0
  63. {anndata-0.12.8 → anndata-0.12.9}/docs/index.md +0 -0
  64. {anndata-0.12.8 → anndata-0.12.9}/docs/interoperability.md +0 -0
  65. {anndata-0.12.8 → anndata-0.12.9}/docs/references.rst +0 -0
  66. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.0.md +0 -0
  67. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.1.md +0 -0
  68. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.2.md +0 -0
  69. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.3.md +0 -0
  70. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.4.md +0 -0
  71. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.5.md +0 -0
  72. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.6.md +0 -0
  73. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.7.md +0 -0
  74. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.8.md +0 -0
  75. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.10.9.md +0 -0
  76. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.0.md +0 -0
  77. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.1.md +0 -0
  78. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.2.md +0 -0
  79. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.3.md +0 -0
  80. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.11.4.md +0 -0
  81. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.0.md +0 -0
  82. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.1.md +0 -0
  83. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.2.md +0 -0
  84. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.3.md +0 -0
  85. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.4.md +0 -0
  86. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.5.md +0 -0
  87. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.6.md +0 -0
  88. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.7.md +0 -0
  89. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.12.8.md +0 -0
  90. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.4.0.md +0 -0
  91. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.5.0.md +0 -0
  92. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.6.0.md +0 -0
  93. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.6.x.md +0 -0
  94. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.0.md +0 -0
  95. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.2.md +0 -0
  96. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.3.md +0 -0
  97. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.4.md +0 -0
  98. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.5.md +0 -0
  99. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.6.md +0 -0
  100. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.7.md +0 -0
  101. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.7.8.md +0 -0
  102. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.8.0.md +0 -0
  103. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.9.0.md +0 -0
  104. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.9.1.md +0 -0
  105. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/0.9.2.md +0 -0
  106. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/2172.bug.md +0 -0
  107. {anndata-0.12.8 → anndata-0.12.9}/docs/release-notes/index.md +0 -0
  108. {anndata-0.12.8 → anndata-0.12.9}/docs/tutorials/index.md +0 -0
  109. {anndata-0.12.8 → anndata-0.12.9}/docs/tutorials/zarr-v3.md +0 -0
  110. {anndata-0.12.8 → anndata-0.12.9}/hatch.toml +0 -0
  111. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/__init__.py +0 -0
  112. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/__init__.py +0 -0
  113. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/access.py +0 -0
  114. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/aligned_df.py +0 -0
  115. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/aligned_mapping.py +0 -0
  116. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/anndata.py +0 -0
  117. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/extensions.py +0 -0
  118. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/file_backing.py +0 -0
  119. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/index.py +0 -0
  120. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/merge.py +0 -0
  121. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/raw.py +0 -0
  122. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/sparse_dataset.py +0 -0
  123. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/storage.py +0 -0
  124. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/views.py +0 -0
  125. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_core/xarray.py +0 -0
  126. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/__init__.py +0 -0
  127. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/h5ad.py +0 -0
  128. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/read.py +0 -0
  129. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/__init__.py +0 -0
  130. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/lazy_methods.py +0 -0
  131. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/specs/registry.py +0 -0
  132. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/utils.py +0 -0
  133. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/write.py +0 -0
  134. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_io/zarr.py +0 -0
  135. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_types.py +0 -0
  136. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/_warnings.py +0 -0
  137. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/abc.py +0 -0
  138. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/compat/__init__.py +0 -0
  139. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/__init__.py +0 -0
  140. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/_dispatch_io.py +0 -0
  141. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/__init__.py +0 -0
  142. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/_compat.py +0 -0
  143. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/_io.py +0 -0
  144. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/backed/_lazy_arrays.py +0 -0
  145. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/merge.py +0 -0
  146. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/multi_files/__init__.py +0 -0
  147. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/multi_files/_anncollection.py +0 -0
  148. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/pytorch/__init__.py +0 -0
  149. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/experimental/pytorch/_annloader.py +0 -0
  150. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/io.py +0 -0
  151. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/logging.py +0 -0
  152. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/tests/__init__.py +0 -0
  153. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/tests/helpers.py +0 -0
  154. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/types.py +0 -0
  155. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/typing.py +0 -0
  156. {anndata-0.12.8 → anndata-0.12.9}/src/anndata/utils.py +0 -0
  157. {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/__init__.py +0 -0
  158. {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/_doctest.py +0 -0
  159. {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/_pytest.py +0 -0
  160. {anndata-0.12.8 → anndata-0.12.9}/src/testing/anndata/py.typed +0 -0
  161. {anndata-0.12.8 → anndata-0.12.9}/tests/conftest.py +0 -0
  162. {anndata-0.12.8 → anndata-0.12.9}/tests/data/adata-comments.tsv +0 -0
  163. {anndata-0.12.8 → anndata-0.12.9}/tests/data/adata.csv +0 -0
  164. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/readme.md +0 -0
  165. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.11.4/adata.h5ad +0 -0
  166. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
  167. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.11.4/readme.md +0 -0
  168. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.5.0/adata.h5ad +0 -0
  169. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.5.0/readme.md +0 -0
  170. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
  171. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
  172. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
  173. {anndata-0.12.8 → anndata-0.12.9}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
  174. {anndata-0.12.8 → anndata-0.12.9}/tests/data/excel.xlsx +0 -0
  175. {anndata-0.12.8 → anndata-0.12.9}/tests/data/umi_tools.tsv.gz +0 -0
  176. {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/__init__.py +0 -0
  177. {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/conftest.py +0 -0
  178. {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/test_concat.py +0 -0
  179. {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/test_read.py +0 -0
  180. {anndata-0.12.8 → anndata-0.12.9}/tests/lazy/test_write.py +0 -0
  181. {anndata-0.12.8 → anndata-0.12.9}/tests/test_anncollection.py +0 -0
  182. {anndata-0.12.8 → anndata-0.12.9}/tests/test_annot.py +0 -0
  183. {anndata-0.12.8 → anndata-0.12.9}/tests/test_awkward.py +0 -0
  184. {anndata-0.12.8 → anndata-0.12.9}/tests/test_backed_dense.py +0 -0
  185. {anndata-0.12.8 → anndata-0.12.9}/tests/test_backed_hdf5.py +0 -0
  186. {anndata-0.12.8 → anndata-0.12.9}/tests/test_backed_sparse.py +0 -0
  187. {anndata-0.12.8 → anndata-0.12.9}/tests/test_base.py +0 -0
  188. {anndata-0.12.8 → anndata-0.12.9}/tests/test_concatenate.py +0 -0
  189. {anndata-0.12.8 → anndata-0.12.9}/tests/test_concatenate_disk.py +0 -0
  190. {anndata-0.12.8 → anndata-0.12.9}/tests/test_dask.py +0 -0
  191. {anndata-0.12.8 → anndata-0.12.9}/tests/test_dask_view_mem.py +0 -0
  192. {anndata-0.12.8 → anndata-0.12.9}/tests/test_deprecations.py +0 -0
  193. {anndata-0.12.8 → anndata-0.12.9}/tests/test_extensions.py +0 -0
  194. {anndata-0.12.8 → anndata-0.12.9}/tests/test_get_vector.py +0 -0
  195. {anndata-0.12.8 → anndata-0.12.9}/tests/test_gpu.py +0 -0
  196. {anndata-0.12.8 → anndata-0.12.9}/tests/test_helpers.py +0 -0
  197. {anndata-0.12.8 → anndata-0.12.9}/tests/test_inplace_subset.py +0 -0
  198. {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_backwards_compat.py +0 -0
  199. {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_conversion.py +0 -0
  200. {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_dispatched.py +0 -0
  201. {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_partial.py +0 -0
  202. {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_utils.py +0 -0
  203. {anndata-0.12.8 → anndata-0.12.9}/tests/test_io_warnings.py +0 -0
  204. {anndata-0.12.8 → anndata-0.12.9}/tests/test_layers.py +0 -0
  205. {anndata-0.12.8 → anndata-0.12.9}/tests/test_obsmvarm.py +0 -0
  206. {anndata-0.12.8 → anndata-0.12.9}/tests/test_obspvarp.py +0 -0
  207. {anndata-0.12.8 → anndata-0.12.9}/tests/test_raw.py +0 -0
  208. {anndata-0.12.8 → anndata-0.12.9}/tests/test_readwrite.py +0 -0
  209. {anndata-0.12.8 → anndata-0.12.9}/tests/test_repr.py +0 -0
  210. {anndata-0.12.8 → anndata-0.12.9}/tests/test_settings.py +0 -0
  211. {anndata-0.12.8 → anndata-0.12.9}/tests/test_structured_arrays.py +0 -0
  212. {anndata-0.12.8 → anndata-0.12.9}/tests/test_transpose.py +0 -0
  213. {anndata-0.12.8 → anndata-0.12.9}/tests/test_uns.py +0 -0
  214. {anndata-0.12.8 → anndata-0.12.9}/tests/test_utils.py +0 -0
  215. {anndata-0.12.8 → anndata-0.12.9}/tests/test_views.py +0 -0
  216. {anndata-0.12.8 → anndata-0.12.9}/tests/test_x.py +0 -0
  217. {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.8
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>=1.12
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`)
@@ -40,7 +40,7 @@ dependencies = [
40
40
  "pandas >=2.1.0, !=2.1.2, <3",
41
41
  "numpy>=1.26",
42
42
  # https://github.com/scverse/anndata/issues/1434
43
- "scipy >=1.12",
43
+ "scipy >=1.12,!=1.17.0",
44
44
  "h5py>=3.8",
45
45
  "natsort",
46
46
  "packaging>=24.2",
@@ -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