blosc2 4.2.0__tar.gz → 4.3.0__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 (425) hide show
  1. blosc2-4.3.0/ANNOUNCE.rst +135 -0
  2. {blosc2-4.2.0 → blosc2-4.3.0}/CMakeLists.txt +18 -34
  3. {blosc2-4.2.0 → blosc2-4.3.0}/PKG-INFO +1 -1
  4. {blosc2-4.2.0 → blosc2-4.3.0}/RELEASE_NOTES.md +153 -0
  5. {blosc2-4.2.0 → blosc2-4.3.0}/RELEASING.rst +1 -2
  6. {blosc2-4.2.0 → blosc2-4.3.0}/doc/conf.py +15 -0
  7. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/13.containers.ipynb +70 -46
  8. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/13.ctable-basics.ipynb +804 -705
  9. {blosc2-4.2.0 → blosc2-4.3.0}/doc/python-blosc2.rst +1 -1
  10. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/classes.rst +1 -0
  11. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ctable.rst +207 -15
  12. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/misc.rst +1 -0
  13. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/reduction_functions.rst +12 -0
  14. blosc2-4.3.0/doc/reference/ref.rst +54 -0
  15. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/aggregates.py +9 -0
  16. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/arrow_interop.py +18 -5
  17. blosc2-4.3.0/examples/ctable/group_by.py +75 -0
  18. blosc2-4.3.0/examples/ctable/ndim-cols.py +138 -0
  19. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/querying.py +8 -0
  20. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/schema.py +65 -6
  21. {blosc2-4.2.0 → blosc2-4.3.0}/examples/tree-store.py +46 -1
  22. blosc2-4.3.0/plans/ctable-dictionary-type.md +688 -0
  23. blosc2-4.3.0/plans/ctable-groupby.md +433 -0
  24. blosc2-4.3.0/plans/ctable-ndarray-cols-copilot-sonnet.md +647 -0
  25. blosc2-4.3.0/plans/ctable-ndarray-cols.md +660 -0
  26. blosc2-4.3.0/plans/ctable-nested-fields.md +251 -0
  27. blosc2-4.3.0/plans/ctable-separate-nested-cols.md +686 -0
  28. blosc2-4.3.0/plans/tree_store_ctable_ndarray.md +670 -0
  29. {blosc2-4.2.0 → blosc2-4.3.0}/pyproject.toml +1 -1
  30. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/__init__.py +31 -8
  31. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/batch_array.py +49 -9
  32. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/c2array.py +10 -5
  33. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/cli/parquet_to_blosc2.py +705 -28
  34. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/core.py +2 -1
  35. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/ctable.py +3916 -450
  36. blosc2-4.3.0/src/blosc2/ctable_storage.py +1167 -0
  37. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/dict_store.py +19 -4
  38. blosc2-4.3.0/src/blosc2/dictionary_column.py +280 -0
  39. blosc2-4.3.0/src/blosc2/groupby.py +1808 -0
  40. blosc2-4.3.0/src/blosc2/groupby_ext.pyx +1140 -0
  41. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/indexing.py +6 -1
  42. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/indexing_ext.pyx +27 -0
  43. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/lazyexpr.py +120 -34
  44. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/list_array.py +52 -3
  45. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/ndarray.py +34 -7
  46. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema.py +212 -4
  47. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema_compiler.py +58 -8
  48. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema_validation.py +18 -4
  49. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema_vectorized.py +24 -1
  50. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schunk.py +6 -28
  51. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/tree_store.py +451 -81
  52. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/utils.py +61 -35
  53. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/version.py +1 -1
  54. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_arrow_interop.py +84 -1
  55. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_column.py +103 -4
  56. blosc2-4.3.0/tests/ctable/test_csv_interop.py +529 -0
  57. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_ctable_dataclass_schema.py +98 -0
  58. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_ctable_indexing.py +2 -0
  59. blosc2-4.3.0/tests/ctable/test_ctable_ndarray_columns.py +231 -0
  60. blosc2-4.3.0/tests/ctable/test_dictionary_column.py +485 -0
  61. blosc2-4.3.0/tests/ctable/test_getitem_access.py +145 -0
  62. blosc2-4.3.0/tests/ctable/test_groupby.py +451 -0
  63. blosc2-4.3.0/tests/ctable/test_nested_access_storage.py +165 -0
  64. blosc2-4.3.0/tests/ctable/test_nested_append.py +96 -0
  65. blosc2-4.3.0/tests/ctable/test_nested_metadata_root.py +93 -0
  66. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_nullable.py +23 -0
  67. blosc2-4.3.0/tests/ctable/test_object_spec.py +66 -0
  68. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_parquet_interop.py +638 -2
  69. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_specs.py +18 -0
  70. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_table_persistency.py +2 -7
  71. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_varlen_columns.py +10 -0
  72. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_elementwise_funcs.py +2 -0
  73. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_indexing.py +20 -0
  74. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lazyexpr.py +66 -73
  75. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_reductions.py +99 -120
  76. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_batch_array.py +11 -4
  77. blosc2-4.3.0/tests/test_group_reduce.py +85 -0
  78. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_open.py +11 -15
  79. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_tree_store.py +386 -0
  80. blosc2-4.2.0/ANNOUNCE.rst +0 -86
  81. blosc2-4.2.0/doc/reference/ref.rst +0 -13
  82. blosc2-4.2.0/src/blosc2/ctable_storage.py +0 -605
  83. blosc2-4.2.0/tests/ctable/test_csv_interop.py +0 -235
  84. {blosc2-4.2.0 → blosc2-4.3.0}/.gitattributes +0 -0
  85. {blosc2-4.2.0 → blosc2-4.3.0}/.gitignore +0 -0
  86. {blosc2-4.2.0 → blosc2-4.3.0}/.guix/modules/python-blosc2-package.scm +0 -0
  87. {blosc2-4.2.0 → blosc2-4.3.0}/.guix-channel +0 -0
  88. {blosc2-4.2.0 → blosc2-4.3.0}/.pre-commit-config.yaml +0 -0
  89. {blosc2-4.2.0 → blosc2-4.3.0}/.skills/wasm32-pyodide-dev/SKILL.md +0 -0
  90. {blosc2-4.2.0 → blosc2-4.3.0}/.skills/wasm32-pyodide-dev/references/commands.md +0 -0
  91. {blosc2-4.2.0 → blosc2-4.3.0}/ADD_LAZYFUNCS.md +0 -0
  92. {blosc2-4.2.0 → blosc2-4.3.0}/AGENTS.md +0 -0
  93. {blosc2-4.2.0 → blosc2-4.3.0}/CONTRIBUTING.rst +0 -0
  94. {blosc2-4.2.0 → blosc2-4.3.0}/LICENSE.txt +0 -0
  95. {blosc2-4.2.0 → blosc2-4.3.0}/README.rst +0 -0
  96. {blosc2-4.2.0 → blosc2-4.3.0}/README_DEVELOPERS.md +0 -0
  97. {blosc2-4.2.0 → blosc2-4.3.0}/ROADMAP-TO-4.0.md +0 -0
  98. {blosc2-4.2.0 → blosc2-4.3.0}/code_of_conduct.md +0 -0
  99. {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-favicon_32x32.png +0 -0
  100. {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-favicon_64x64.png +0 -0
  101. {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-logo_128.png +0 -0
  102. {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-logo_256.png +0 -0
  103. {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/css/custom.css +0 -0
  104. {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/code-of-conduct.rst +0 -0
  105. {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/contributing.rst +0 -0
  106. {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/index.rst +0 -0
  107. {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/roadmap.rst +0 -0
  108. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/dsl_syntax.md +0 -0
  109. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/index.rst +0 -0
  110. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/installation.rst +0 -0
  111. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/overview.rst +0 -0
  112. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/01.ndarray-basics.ipynb +0 -0
  113. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/02.lazyarray-expressions.ipynb +0 -0
  114. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/03.lazyarray-udf-kernels.ipynb +0 -0
  115. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/03.lazyarray-udf.ipynb +0 -0
  116. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/04.reductions.ipynb +0 -0
  117. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/05.persistent-reductions.ipynb +0 -0
  118. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/06.remote_proxy.ipynb +0 -0
  119. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/07.schunk-basics.ipynb +0 -0
  120. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/08.schunk-slicing_and_beyond.ipynb +0 -0
  121. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/09.ucodecs-ufilters.ipynb +0 -0
  122. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/10.prefilters.ipynb +0 -0
  123. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/11.objectarray.ipynb +0 -0
  124. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/12.batcharray.ipynb +0 -0
  125. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/14.indexing-arrays.ipynb +0 -0
  126. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/15.indexing-ctables.ipynb +0 -0
  127. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/blosc2-pipeline.png +0 -0
  128. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/blosc2-pipeline.svg +0 -0
  129. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/containers/README.md +0 -0
  130. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/containers/overview.svg +0 -0
  131. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/lazyexpr-broadcast.png +0 -0
  132. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/proxyconnection.png +0 -0
  133. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/3D-cube-plane.png +0 -0
  134. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/3D-cube.png +0 -0
  135. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/memory-access-2D-x.png +0 -0
  136. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/memory-access-2D-y.png +0 -0
  137. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/remote_proxy.png +0 -0
  138. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/backward.png +0 -0
  139. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/backward.svg +0 -0
  140. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.png +0 -0
  141. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.svg +0 -0
  142. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.png +0 -0
  143. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.svg +0 -0
  144. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.png +0 -0
  145. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.svg +0 -0
  146. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.png +0 -0
  147. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.svg +0 -0
  148. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/forward.png +0 -0
  149. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/forward.svg +0 -0
  150. {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials.rst +0 -0
  151. {blosc2-4.2.0 → blosc2-4.3.0}/doc/index.rst +0 -0
  152. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/additional_funcs.rst +0 -0
  153. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/array.rst +0 -0
  154. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/array_operations.rst +0 -0
  155. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/batch_array.rst +0 -0
  156. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/c2array.rst +0 -0
  157. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/dict_store.rst +0 -0
  158. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/embed_store.rst +0 -0
  159. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/index.rst +0 -0
  160. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/index_class.rst +0 -0
  161. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/index_funcs.rst +0 -0
  162. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/lazyarray.rst +0 -0
  163. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/linalg.rst +0 -0
  164. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/list_array.rst +0 -0
  165. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/low_level.rst +0 -0
  166. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/msgpack_serialization.rst +0 -0
  167. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ndarray.rst +0 -0
  168. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ndfield.rst +0 -0
  169. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/objectarray.rst +0 -0
  170. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/proxy.rst +0 -0
  171. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/proxyndsource.rst +0 -0
  172. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/proxysource.rst +0 -0
  173. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/save_load.rst +0 -0
  174. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/schunk.rst +0 -0
  175. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/simpleproxy.rst +0 -0
  176. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/storage.rst +0 -0
  177. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/tree_store.rst +0 -0
  178. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ufuncs.rst +0 -0
  179. {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/utilities.rst +0 -0
  180. {blosc2-4.2.0 → blosc2-4.3.0}/doc/release_notes/index.md +0 -0
  181. {blosc2-4.2.0 → blosc2-4.3.0}/examples/batch_array.py +0 -0
  182. {blosc2-4.2.0 → blosc2-4.3.0}/examples/blosc2_hdf5_compression.py +0 -0
  183. {blosc2-4.2.0 → blosc2-4.3.0}/examples/btune.py +0 -0
  184. {blosc2-4.2.0 → blosc2-4.3.0}/examples/c2array-get-slice.py +0 -0
  185. {blosc2-4.2.0 → blosc2-4.3.0}/examples/compress2_decompress2.py +0 -0
  186. {blosc2-4.2.0 → blosc2-4.3.0}/examples/compress_decompress.py +0 -0
  187. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/basics.py +0 -0
  188. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/computed-columns.py +0 -0
  189. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/csv_interop.py +0 -0
  190. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/index_on_b2z.py +0 -0
  191. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/indexing.py +0 -0
  192. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/mutations.py +0 -0
  193. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/nullable.py +0 -0
  194. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/persistence.py +0 -0
  195. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/real_world.py +0 -0
  196. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/varlen_columns.py +0 -0
  197. {blosc2-4.2.0 → blosc2-4.3.0}/examples/dict-store.py +0 -0
  198. {blosc2-4.2.0 → blosc2-4.3.0}/examples/embed-store.py +0 -0
  199. {blosc2-4.2.0 → blosc2-4.3.0}/examples/embedded-expr-udf-b2z.py +0 -0
  200. {blosc2-4.2.0 → blosc2-4.3.0}/examples/filler.py +0 -0
  201. {blosc2-4.2.0 → blosc2-4.3.0}/examples/gil.py +0 -0
  202. {blosc2-4.2.0 → blosc2-4.3.0}/examples/mmap-rw.py +0 -0
  203. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/animated_plot.py +0 -0
  204. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/arange-constructor.py +0 -0
  205. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/asarray_.py +0 -0
  206. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/black-scholes_hist-dsl.ipynb +0 -0
  207. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/blosc2_3_10_demo.py +0 -0
  208. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/broadcast_expr.py +0 -0
  209. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/buffer.py +0 -0
  210. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/bytedelta_filter.py +0 -0
  211. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/c2array_expr.py +0 -0
  212. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_expr.py +0 -0
  213. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_fields.py +0 -0
  214. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_udf_numba.py +0 -0
  215. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_where.py +0 -0
  216. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/copy_.py +0 -0
  217. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/dsl_save.py +0 -0
  218. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/empty_.py +0 -0
  219. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/expression_index.py +0 -0
  220. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/eye-constructor.py +0 -0
  221. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/filter_sort_fields.py +0 -0
  222. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/formats.py +0 -0
  223. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/fromiter-constructor.py +0 -0
  224. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/general_expressions.py +0 -0
  225. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/getitem.py +0 -0
  226. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/index_append_maintenance.py +0 -0
  227. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/index_sorted_iteration.py +0 -0
  228. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/ironpill1.ipynb +0 -0
  229. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/iterchunks_info.py +0 -0
  230. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/jit-expr.py +0 -0
  231. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/jit-numpy-funcs.py +0 -0
  232. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/jit-reduc.py +0 -0
  233. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/lazyexpr_where_indexing.py +0 -0
  234. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/linspace-constructor.py +0 -0
  235. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/lists-vs-bools-idx.py +0 -0
  236. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/malformed_dsl.py +0 -0
  237. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/mandelbrot-dsl.ipynb +0 -0
  238. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/mandelbrot-pure-dsl.ipynb +0 -0
  239. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/meta.py +0 -0
  240. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/ndarray_copy.py +0 -0
  241. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/ndmean.py +0 -0
  242. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/persistency.py +0 -0
  243. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/proxy-carray.py +0 -0
  244. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/proxy-ndarray.py +0 -0
  245. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_and_enlarge.py +0 -0
  246. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_expr.py +0 -0
  247. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_expr_save.py +0 -0
  248. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_string_expr.py +0 -0
  249. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/resize_.py +0 -0
  250. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/string_arrays.ipynb +0 -0
  251. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/work_with_numpy.py +0 -0
  252. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/xarray-expression.py +0 -0
  253. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/zfp_codec.py +0 -0
  254. {blosc2-4.2.0 → blosc2-4.3.0}/examples/objectarray.py +0 -0
  255. {blosc2-4.2.0 → blosc2-4.3.0}/examples/pack_array.py +0 -0
  256. {blosc2-4.2.0 → blosc2-4.3.0}/examples/pack_tensor.py +0 -0
  257. {blosc2-4.2.0 → blosc2-4.3.0}/examples/postfilter1.py +0 -0
  258. {blosc2-4.2.0 → blosc2-4.3.0}/examples/postfilter2.py +0 -0
  259. {blosc2-4.2.0 → blosc2-4.3.0}/examples/postfilter3.py +0 -0
  260. {blosc2-4.2.0 → blosc2-4.3.0}/examples/prefilter.py +0 -0
  261. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ref-object.py +0 -0
  262. {blosc2-4.2.0 → blosc2-4.3.0}/examples/save_tensor.py +0 -0
  263. {blosc2-4.2.0 → blosc2-4.3.0}/examples/schunk.py +0 -0
  264. {blosc2-4.2.0 → blosc2-4.3.0}/examples/schunk_roundtrip.py +0 -0
  265. {blosc2-4.2.0 → blosc2-4.3.0}/examples/tree-store-blog.py +0 -0
  266. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ucodecs.py +0 -0
  267. {blosc2-4.2.0 → blosc2-4.3.0}/examples/ufilters.py +0 -0
  268. {blosc2-4.2.0 → blosc2-4.3.0}/examples/vlmeta.py +0 -0
  269. {blosc2-4.2.0 → blosc2-4.3.0}/examples/vlstore-lazyudf.py +0 -0
  270. {blosc2-4.2.0 → blosc2-4.3.0}/generate_version.py +0 -0
  271. {blosc2-4.2.0 → blosc2-4.3.0}/guix.scm +0 -0
  272. {blosc2-4.2.0 → blosc2-4.3.0}/images/Complete-Write-Read-B2ND.png +0 -0
  273. {blosc2-4.2.0 → blosc2-4.3.0}/images/M1-i386-vs-arm64-pack.png +0 -0
  274. {blosc2-4.2.0 → blosc2-4.3.0}/images/M1-i386-vs-arm64-unpack.png +0 -0
  275. {blosc2-4.2.0 → blosc2-4.3.0}/images/Read-Partial-Slices-B2ND.png +0 -0
  276. {blosc2-4.2.0 → blosc2-4.3.0}/images/b2nd-2level-parts.png +0 -0
  277. {blosc2-4.2.0 → blosc2-4.3.0}/images/eval-expr-full-mem-M2.png +0 -0
  278. {blosc2-4.2.0 → blosc2-4.3.0}/images/eval-expr-scarce-mem-M2.png +0 -0
  279. {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-dask-large.png +0 -0
  280. {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-dask-small.png +0 -0
  281. {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-expr-large.png +0 -0
  282. {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-expr.png +0 -0
  283. {blosc2-4.2.0 → blosc2-4.3.0}/images/linspace-compress.png +0 -0
  284. {blosc2-4.2.0 → blosc2-4.3.0}/images/linspace-decompress.png +0 -0
  285. {blosc2-4.2.0 → blosc2-4.3.0}/images/pack-array-cratios.png +0 -0
  286. {blosc2-4.2.0 → blosc2-4.3.0}/images/reduc-float64-amd.png +0 -0
  287. {blosc2-4.2.0 → blosc2-4.3.0}/images/reduc-float64-log-amd.png +0 -0
  288. {blosc2-4.2.0 → blosc2-4.3.0}/plans/changing-default-open-mode.md +0 -0
  289. {blosc2-4.2.0 → blosc2-4.3.0}/plans/computed-column-copilot.md +0 -0
  290. {blosc2-4.2.0 → blosc2-4.3.0}/plans/containers-tutorial.md +0 -0
  291. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-direct-expr-indexing.md +0 -0
  292. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-getitem-row.md +0 -0
  293. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-implementation-log.md +0 -0
  294. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-indexes-opsi.md +0 -0
  295. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-indexing.md +0 -0
  296. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-nulls.md +0 -0
  297. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-object-array.md +0 -0
  298. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-parquet-metadata.md +0 -0
  299. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-persistency.md +0 -0
  300. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-schema.md +0 -0
  301. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-user-guide.md +0 -0
  302. {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-varlen-cols.md +0 -0
  303. {blosc2-4.2.0 → blosc2-4.3.0}/plans/external-js-glue-blosc2-todo.md +0 -0
  304. {blosc2-4.2.0 → blosc2-4.3.0}/plans/external-js-glue.md +0 -0
  305. {blosc2-4.2.0 → blosc2-4.3.0}/plans/materialized-computed-column.md +0 -0
  306. {blosc2-4.2.0 → blosc2-4.3.0}/plans/new-ctable-views.md +0 -0
  307. {blosc2-4.2.0 → blosc2-4.3.0}/plans/phase0-t1-dsl-syntax-inventory.md +0 -0
  308. {blosc2-4.2.0 → blosc2-4.3.0}/plans/tree_store_extensions.md +0 -0
  309. {blosc2-4.2.0 → blosc2-4.3.0}/plans/treestore-ctable-extension.md +0 -0
  310. {blosc2-4.2.0 → blosc2-4.3.0}/plans/wasm32-todo.md +0 -0
  311. {blosc2-4.2.0 → blosc2-4.3.0}/pytest.ini +0 -0
  312. {blosc2-4.2.0 → blosc2-4.3.0}/scripts/install-codex-skill-wasm32.sh +0 -0
  313. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/b2objects.py +0 -0
  314. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/blosc2_ext.pyx +0 -0
  315. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/cli/__init__.py +0 -0
  316. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/dsl_kernel.py +0 -0
  317. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/embed_store.py +0 -0
  318. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/exceptions.py +0 -0
  319. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/fft.py +0 -0
  320. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/info.py +0 -0
  321. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/linalg.py +0 -0
  322. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/matmul_kernels.c +0 -0
  323. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/matmul_kernels.h +0 -0
  324. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/msgpack_utils.py +0 -0
  325. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/objectarray.py +0 -0
  326. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/proxy.py +0 -0
  327. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/ref.py +0 -0
  328. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/scalar_array.py +0 -0
  329. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/storage.py +0 -0
  330. {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/wasm_jit.py +0 -0
  331. {blosc2-4.2.0 → blosc2-4.3.0}/tests/array-api-xfails.txt +0 -0
  332. {blosc2-4.2.0 → blosc2-4.3.0}/tests/conftest.py +0 -0
  333. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_column_ndarray_like.py +0 -0
  334. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_compact.py +0 -0
  335. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_construct.py +0 -0
  336. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_ctable_computed_cols.py +0 -0
  337. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_delete_rows.py +0 -0
  338. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_extend_delete.py +0 -0
  339. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_row_logic.py +0 -0
  340. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_compiler.py +0 -0
  341. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_mutations.py +0 -0
  342. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_validation.py +0 -0
  343. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_select_describe_cov.py +0 -0
  344. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_sort_by.py +0 -0
  345. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_varlen_schema_compiler.py +0 -0
  346. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_vlstring_vlbytes.py +0 -0
  347. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_where_expressions.py +0 -0
  348. {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyexpr_v1/a.b2nd +0 -0
  349. {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyexpr_v1/b.b2nd +0 -0
  350. {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyexpr_v1/expr.b2nd +0 -0
  351. {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyudf_v1/a.b2nd +0 -0
  352. {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyudf_v1/b.b2nd +0 -0
  353. {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyudf_v1/expr.b2nd +0 -0
  354. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_auto_parts.py +0 -0
  355. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_buffer.py +0 -0
  356. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_c2array_expr.py +0 -0
  357. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_c2array_reductions.py +0 -0
  358. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_c2array_udf.py +0 -0
  359. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_concat.py +0 -0
  360. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_copy.py +0 -0
  361. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_dsl_kernels.py +0 -0
  362. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_empty.py +0 -0
  363. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_evaluate.py +0 -0
  364. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_full.py +0 -0
  365. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_get_slice_nchunks.py +0 -0
  366. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_getitem.py +0 -0
  367. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_iterchunks_info.py +0 -0
  368. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_jit.py +0 -0
  369. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lazyexpr_fields.py +0 -0
  370. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lazyudf.py +0 -0
  371. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_linalg.py +0 -0
  372. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lossy.py +0 -0
  373. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_metalayers.py +0 -0
  374. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_mode.py +0 -0
  375. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_nans.py +0 -0
  376. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_ndarray.py +0 -0
  377. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_numpy.py +0 -0
  378. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_persistency.py +0 -0
  379. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_proxy.py +0 -0
  380. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_proxy_c2array.py +0 -0
  381. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_proxy_expr.py +0 -0
  382. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_resize.py +0 -0
  383. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_setitem.py +0 -0
  384. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_slice.py +0 -0
  385. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_squeeze.py +0 -0
  386. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_stringarrays.py +0 -0
  387. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_struct_dtype.py +0 -0
  388. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_wasm_dsl_jit.py +0 -0
  389. {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_zeros.py +0 -0
  390. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_b2objects.py +0 -0
  391. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_bytes_array.py +0 -0
  392. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_comp_info.py +0 -0
  393. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_compress2.py +0 -0
  394. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_compression_parameters.py +0 -0
  395. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_compressors.py +0 -0
  396. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_decompress.py +0 -0
  397. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_dict_store.py +0 -0
  398. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_embed_store.py +0 -0
  399. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_iterchunks.py +0 -0
  400. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_list_array.py +0 -0
  401. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_mmap.py +0 -0
  402. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_numexpr_threads.py +0 -0
  403. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_objectarray.py +0 -0
  404. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_open_c2array.py +0 -0
  405. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_pandas_udf_engine.py +0 -0
  406. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_pathlib.py +0 -0
  407. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_postfilters.py +0 -0
  408. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_prefilters.py +0 -0
  409. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_proxy_schunk.py +0 -0
  410. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_python_blosc.py +0 -0
  411. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk.py +0 -0
  412. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_constructor.py +0 -0
  413. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_delete.py +0 -0
  414. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_get_slice.py +0 -0
  415. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_get_slice_nchunks.py +0 -0
  416. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_insert.py +0 -0
  417. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_reorder_offsets.py +0 -0
  418. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_set_slice.py +0 -0
  419. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_update.py +0 -0
  420. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_storage.py +0 -0
  421. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_tensor.py +0 -0
  422. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_ucodecs.py +0 -0
  423. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_ufilters.py +0 -0
  424. {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_vlmeta.py +0 -0
  425. {blosc2-4.2.0 → blosc2-4.3.0}/update_version.py +0 -0
@@ -0,0 +1,135 @@
1
+ Announcing Python-Blosc2 4.3.0
2
+ ===============================
3
+
4
+ We are happy to announce Python-Blosc2 4.3.0. This release deepens the
5
+ ``CTable`` container with three major additions: **N-dimensional columns**,
6
+ **group-by aggregation**, and **dictionary/categorical column types**.
7
+
8
+ N-dimensional columns let each cell in a CTable hold a full compressed
9
+ multidimensional array — ideal for embedding vectors, image patches,
10
+ time-series windows or any per-row tensor payload. ndarray columns support
11
+ CSV/DataFrame round-trips, nullable semantics, and are automatically detected
12
+ when importing from pandas.
13
+
14
+ N-dimensional columns inherit the full power of Blosc2 ``NDArray`` objects.
15
+ They are not opaque blobs, but first-class arrays that support slicing,
16
+ indexing, and full Blosc2 operations, including multi-threaded and
17
+ SIMD-accelerated expression evaluation. This gives ``CTable`` a strong bridge
18
+ between tabular and array workflows in a single container.
19
+
20
+ See example at: https://github.com/Blosc/python-blosc2/blob/main/examples/ctable/ndim-cols.py
21
+
22
+ Group-by brings SQL-style ``GROUP BY`` directly to CTables::
23
+
24
+ by_city = t.group_by("city", sort=True)
25
+ by_city.agg({"sales": ["sum", "mean"], "qty": "sum"})
26
+
27
+ Multi-key groupings, filtered aggregates (``where=`` pushdown), and persistent
28
+ output (``urlpath=``) are all supported. Behind the scenes, Cython-accelerated
29
+ kernels deliver dramatic speedups — ~25× for float keys, ~8× for integer keys —
30
+ backed by dense-indexing and general-purpose hash-table paths.
31
+
32
+ Also, ``DictionarySpec`` introduces dictionary-encoded (categorical) columns
33
+ that store compact integer codes mapped to a shared string dictionary, giving
34
+ both compact storage and accelerated equality/membership queries. Dictionary
35
+ columns work transparently in ``where`` clauses and nested dotted-name
36
+ expressions.
37
+
38
+ Other highlights in 4.3.0 include:
39
+
40
+ - **Nested columns and field-name escaping**: Columns from Arrow/Parquet struct
41
+ hierarchies are flattened into physical leaf columns under hierarchical
42
+ ``_cols`` storage paths, with logical dotted-name access preserved.
43
+ Round-trip fidelity is maintained for nested schemas, and literal ``.`` / ``/``
44
+ in field names are automatically escaped.
45
+
46
+ - **Parquet import improvements**: Arrow serializer is now the default;
47
+ nested columns are always separated; new ``--progress``/``--max-rows``/
48
+ ``--timestamp-unit``/``--float-trunc-prec`` options for
49
+ ``parquet-to-blosc2`` CLI; and a ``list_serializer`` parameter for fine-tuning
50
+ list-type column storage.
51
+
52
+ - **Inline CTable support in TreeStore**: CTables can now be stored as items
53
+ inside a ``TreeStore``, enabling hierarchical containers that mix arrays
54
+ and tables.
55
+
56
+ - **Performance wins**: ``CTable.open()`` is faster thanks to lazy ``nrows``
57
+ and deferred column metainfo loading. Scalar and small-slice access paths
58
+ have been overhauled. ``import blosc2`` is leaner via late-import
59
+ optimizations for heavy optional dependencies.
60
+
61
+ - **New tutorials and examples**: Group-by, nested fields, dictionary columns,
62
+ TreeStore–CTable integration, and dedicated benchmarks for group-by,
63
+ nested-filter, and Parquet round-trips.
64
+
65
+ - **Fixes**: Null/NaN sentinel normalization, empty aggregate results,
66
+ generated-column safety, miniexpr bundling, and more.
67
+
68
+ - **Updated C-Blosc2** to version 3.0.3 (latest).
69
+
70
+ You can think of Python-Blosc2 4.x as an extension of NumPy/numexpr that:
71
+
72
+ - Can deal with NDArray compressed objects using first-class codecs & filters.
73
+ - Performs many kinds of math expressions, including reductions, indexing...
74
+ - Supports multi-threading and SIMD acceleration (via numexpr/miniexpr).
75
+ - Can operate with data from other libraries (like PyTables, h5py, Zarr, Dask, etc).
76
+ - Supports NumPy ufunc mechanism: mix and match NumPy and Blosc2 computations.
77
+ - Integrates with Numba and Cython via UDFs (User Defined Functions).
78
+ - Adheres to modern array API standard conventions (https://data-apis.org/array-api/).
79
+ - Can perform linear algebra operations (like ``blosc2.tensordot()``).
80
+ - Can store and query compressed columnar tables via ``blosc2.CTable``.
81
+
82
+ Install it with::
83
+
84
+ pip install blosc2 --upgrade # if you prefer wheels
85
+ conda install -c conda-forge python-blosc2 mkl # if you prefer conda and MKL
86
+
87
+ For more info, you can have a look at the release notes in:
88
+
89
+ https://github.com/Blosc/python-blosc2/releases
90
+
91
+ Small CTable group-by example::
92
+
93
+ import blosc2
94
+ from dataclasses import dataclass
95
+
96
+ @dataclass
97
+ class Order:
98
+ city: str = blosc2.field(blosc2.string(max_length=16))
99
+ product: str = blosc2.field(blosc2.string(max_length=16))
100
+ qty: int = blosc2.field(blosc2.int32())
101
+ price: float = blosc2.field(blosc2.float64(nullable=True), default=0.0)
102
+
103
+ # Create a table with 200 random orders
104
+ t = blosc2.CTable(Order, new_data=orders)
105
+
106
+ # Group by city: total and average price per city in one call
107
+ print(t.group_by("city", sort=True).agg({"price": ["sum", "mean"], "qty": "sum"}))
108
+
109
+ # Multi-key: city + product breakdown
110
+ print(t.group_by(["city", "product"], sort=True).agg({"qty": "sum", "price": "mean"}))
111
+
112
+ # Filtered: only Widget orders, grouped by city
113
+ print(t.where(t.product == "Widget").group_by("city", sort=True).agg({"qty": "sum"}))
114
+
115
+ Sources repository
116
+ ------------------
117
+
118
+ The sources and documentation are managed through GitHub services at:
119
+
120
+ https://github.com/Blosc/python-blosc2
121
+
122
+ Python-Blosc2 is distributed using the BSD license, see
123
+ https://github.com/Blosc/python-blosc2/blob/main/LICENSE.txt
124
+ for details.
125
+
126
+ Mastodon feed
127
+ -------------
128
+
129
+ Follow https://fosstodon.org/@Blosc2 to get informed about the latest
130
+ developments.
131
+
132
+ Enjoy!
133
+
134
+ - Blosc Development Team
135
+ Compress Better, Compute Bigger
@@ -15,7 +15,7 @@ endif()
15
15
  project(python-blosc2)
16
16
 
17
17
  set(BLOSC2_MIN_VERSION 3.0.0)
18
- set(BLOSC2_BUNDLED_VERSION v3.0.2)
18
+ set(BLOSC2_BUNDLED_VERSION v3.0.3)
19
19
 
20
20
  if(WIN32 AND NOT CMAKE_C_COMPILER_ID STREQUAL "Clang")
21
21
  message(FATAL_ERROR "Windows builds require clang-cl. Set CC/CXX to clang-cl or configure CMake with -T ClangCL.")
@@ -51,6 +51,13 @@ add_custom_command(
51
51
  DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/blosc2/indexing_ext.pyx"
52
52
  VERBATIM)
53
53
 
54
+ add_custom_command(
55
+ OUTPUT groupby_ext.c
56
+ COMMAND Python::Interpreter -m cython
57
+ "${CMAKE_CURRENT_SOURCE_DIR}/src/blosc2/groupby_ext.pyx" --output-file groupby_ext.c
58
+ DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/blosc2/groupby_ext.pyx"
59
+ VERBATIM)
60
+
54
61
  # ...and add it to the target
55
62
  Python_add_library(blosc2_ext MODULE blosc2_ext.c WITH_SOABI)
56
63
  target_sources(blosc2_ext PRIVATE src/blosc2/matmul_kernels.c)
@@ -59,10 +66,12 @@ if(UNIX)
59
66
  target_link_libraries(blosc2_ext PRIVATE ${CMAKE_DL_LIBS})
60
67
  endif()
61
68
  Python_add_library(indexing_ext MODULE indexing_ext.c WITH_SOABI)
69
+ Python_add_library(groupby_ext MODULE groupby_ext.c WITH_SOABI)
62
70
 
63
71
  # We need to link against NumPy
64
72
  target_link_libraries(blosc2_ext PRIVATE Python::NumPy)
65
73
  target_link_libraries(indexing_ext PRIVATE Python::NumPy)
74
+ target_link_libraries(groupby_ext PRIVATE Python::NumPy)
66
75
 
67
76
  # Fetch and build miniexpr library
68
77
  include(FetchContent)
@@ -72,6 +81,12 @@ set(MINIEXPR_BUILD_SHARED OFF CACHE BOOL "Build miniexpr shared library" FORCE)
72
81
  set(MINIEXPR_BUILD_TESTS OFF CACHE BOOL "Build miniexpr tests" FORCE)
73
82
  set(MINIEXPR_BUILD_EXAMPLES OFF CACHE BOOL "Build miniexpr examples" FORCE)
74
83
  set(MINIEXPR_BUILD_BENCH OFF CACHE BOOL "Build miniexpr benchmarks" FORCE)
84
+ # Keep miniexpr's bundled libtcc and related files inside the blosc2 package.
85
+ # Without this, miniexpr's install rules use the default CMAKE_INSTALL_LIBDIR
86
+ # ("lib"), which scikit-build places at site-packages/lib.
87
+ set(CMAKE_INSTALL_INCLUDEDIR ${SKBUILD_PLATLIB_DIR}/blosc2/include)
88
+ set(CMAKE_INSTALL_LIBDIR ${SKBUILD_PLATLIB_DIR}/blosc2/lib)
89
+ set(CMAKE_INSTALL_DATADIR ${SKBUILD_PLATLIB_DIR}/blosc2/share)
75
90
 
76
91
  if(EMSCRIPTEN)
77
92
  set(MINIEXPR_ENABLE_TCC_JIT ON CACHE BOOL "Enable TCC JIT in Emscripten builds" FORCE)
@@ -93,6 +108,7 @@ endif()
93
108
 
94
109
  target_compile_features(blosc2_ext PRIVATE c_std_11)
95
110
  target_compile_features(indexing_ext PRIVATE c_std_11)
111
+ target_compile_features(groupby_ext PRIVATE c_std_11)
96
112
  if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
97
113
  execute_process(
98
114
  COMMAND "${CMAKE_C_COMPILER}" -print-resource-dir
@@ -131,8 +147,6 @@ else()
131
147
  set(BUILD_BENCHMARKS OFF CACHE BOOL "Build C-Blosc2 benchmarks")
132
148
  set(BUILD_FUZZERS OFF CACHE BOOL "Build C-Blosc2 fuzzers")
133
149
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
134
- set(CMAKE_INSTALL_INCLUDEDIR ${SKBUILD_PLATLIB_DIR}/blosc2/include) # directory for include files
135
- set(CMAKE_INSTALL_LIBDIR ${SKBUILD_PLATLIB_DIR}/blosc2/lib) # directory for libblosc2 and pkgconfig
136
150
  set(Blosc2_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/blosc2) # directory for cmake files
137
151
  set(CMAKE_INSTALL_BINDIR ${SKBUILD_PLATLIB_DIR}/blosc2/lib) # directory for libblosc2.dll on windows
138
152
  # we will put the binaries of the C-Blosc2 library into the wheels according to PEP
@@ -169,7 +183,7 @@ endif()
169
183
 
170
184
  # Python extension -> site-packages/blosc2
171
185
  install(
172
- TARGETS blosc2_ext indexing_ext
186
+ TARGETS blosc2_ext indexing_ext groupby_ext
173
187
  LIBRARY DESTINATION ${SKBUILD_PLATLIB_DIR}/blosc2
174
188
  )
175
189
 
@@ -177,33 +191,3 @@ install(
177
191
  FILES "${miniexpr_SOURCE_DIR}/src/me_jit_glue.js"
178
192
  DESTINATION ${SKBUILD_PLATLIB_DIR}/blosc2
179
193
  )
180
-
181
- # Install bundled libtcc next to the Python package (separate LGPL artifact).
182
- if(MINIEXPR_ENABLE_TCC_JIT)
183
- if(APPLE)
184
- install(
185
- FILES "${miniexpr_BINARY_DIR}/libtcc.dylib"
186
- DESTINATION ${SKBUILD_PLATLIB_DIR}/blosc2/lib
187
- OPTIONAL
188
- )
189
- elseif(WIN32)
190
- install(
191
- FILES
192
- "${miniexpr_BINARY_DIR}/tcc.dll"
193
- "${miniexpr_BINARY_DIR}/Debug/tcc.dll"
194
- "${miniexpr_BINARY_DIR}/Release/tcc.dll"
195
- "${miniexpr_BINARY_DIR}/RelWithDebInfo/tcc.dll"
196
- "${miniexpr_BINARY_DIR}/MinSizeRel/tcc.dll"
197
- DESTINATION ${SKBUILD_PLATLIB_DIR}/blosc2/lib
198
- OPTIONAL
199
- )
200
- else()
201
- install(
202
- FILES
203
- "${miniexpr_BINARY_DIR}/libtcc.so"
204
- "${miniexpr_BINARY_DIR}/libtcc.so.1"
205
- DESTINATION ${SKBUILD_PLATLIB_DIR}/blosc2/lib
206
- OPTIONAL
207
- )
208
- endif()
209
- endif()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blosc2
3
- Version: 4.2.0
3
+ Version: 4.3.0
4
4
  Summary: A fast & compressed ndarray library with a flexible compute engine.
5
5
  Author-Email: Blosc Development Team <blosc@blosc.org>
6
6
  Maintainer-Email: Blosc Development Team <blosc@blosc.org>
@@ -1,5 +1,158 @@
1
1
  # Release notes
2
2
 
3
+ ## Changes from 4.2.0 to 4.3.0
4
+
5
+ ### CTable: N-dimensional (ndarray) columns
6
+
7
+ - **Multidimensional columns**: CTable columns can now hold NDArray-backed cells, allowing
8
+ each row of a column to contain a full n-dimensional compressed array. This enables
9
+ use cases such as embedding vectors, image patches, time-series windows, or any other
10
+ multidimensional per-row payload.
11
+ - **CSV and DataFrame import/export**: Multidimensional column data can be imported and
12
+ exported via CSV and pandas DataFrames, with automatic detection of array-valued cells.
13
+ - **Nullable ndarray columns**: Multidimensional columns fully support the nullable
14
+ semantics (`null_count`, sentinel handling, `null_policy`) already available for scalar
15
+ columns.
16
+ - **`from_pandas()` improvements**: `CTable.from_pandas()` now creates the correct
17
+ specialized backing storage for `DictionarySpec`, `ListSpec`, `VLStringSpec`,
18
+ `VLBytesSpec`, and other variable-length scalar specifications.
19
+ - **Improved schema coverage**: New CTable timestamp schema type and extended
20
+ `Column.info` output with `shape`, `chunks`, and `blocks` descriptors.
21
+ - **Arg reductions**: Added `argmin()` and `argmax()` for scalar and ndarray
22
+ CTable columns, plus row-transformer support for generated columns such as
23
+ per-row peak-hour or dominant-embedding-dimension features.
24
+
25
+ ### CTable: Group-by and filtered aggregation
26
+
27
+ - **`CTable.group_by()`**: The primary group-by interface. Call
28
+ ``t.group_by("city", sort=True).agg({"qty": "mean"})`` to produce a new
29
+ :class:`CTable` with aggregated results. Single-key and multi-key groupings are
30
+ supported, along with convenience methods such as ``.size()``, ``.count()``,
31
+ ``.sum()``, ``.mean()``, ``.min()`` and ``.max()``:
32
+
33
+ .. code-block:: python
34
+
35
+ by_city = t.group_by("city", sort=True)
36
+ by_city.size() # COUNT(*)
37
+ by_city.sum("sales") # SUM(sales) per city
38
+ by_city.agg({"sales": ["sum", "mean"]}) # SUM(sales), AVG(sales) per city
39
+
40
+ - **Performance accelerators**: Dedicated Cython fast paths deliver significant speedups:
41
+ ~25× for float32/64 group-by keys, ~8× for integer and dictionary-code keys, and a
42
+ general-purpose hash table for arbitrary float keys.
43
+ - **Filtered aggregate pushdown**: The `where=` parameter is now accepted in aggregation
44
+ methods, pushing the filter into the compute engine so that only matching rows are
45
+ read and reduced.
46
+ - **Persistent grouped output**: Group-by results can be saved directly to persistent
47
+ storage via the `urlpath=` parameter.
48
+ - **`blosc2.group_reduce()`**: New public function that performs group-by reduction over
49
+ NDArray instances and CTable columns, with Cython-accelerated backends for common
50
+ key/reduction combinations.
51
+
52
+ ### CTable: Dictionary / categorical columns
53
+
54
+ - **`DictionarySpec` column type**: Introduced a new dictionary-encoded (categorical)
55
+ column type that stores string or integer codes mapped to a shared dictionary, providing
56
+ compact storage and accelerated equality and membership queries.
57
+ - **Dictionary types in `where` clauses**: Dictionary columns can be queried with the same
58
+ `where=` expression syntax as other column types, including nested dotted-name access.
59
+ - **Improved display**: `CTable` printing now adapts to the terminal width, and dictionary
60
+ values are shown in their decoded form. `Column.info` has been extended with type
61
+ details, shape, chunks, and blocks.
62
+
63
+ ### CTable: Nested columns and field-name escaping
64
+
65
+ - **Dotted nested column access**: Columns whose names contain literal `.`
66
+ (e.g., `"root.nested"`) are now fully addressable via the dotted accessor syntax in
67
+ `where` expressions, `__getitem__`, and the public API.
68
+ - **Hierarchical `_cols` storage paths**: The internal column storage layout now preserves
69
+ a hierarchical structure that mirrors the logical nesting, improving introspection
70
+ and interop.
71
+ - **Nested-field pipeline**: A new flattened-storage pipeline with logical mapping
72
+ preserves nested schema structure (field names, types, and hierarchy) through
73
+ Arrow and Parquet import/export. For unnamed top-level `list<struct<...>>` Parquet
74
+ files, the logical schema round-trips faithfully, though the original physical row
75
+ grouping is intentionally not preserved.
76
+ - **Field-name escaping**: Special characters (`.` and `/`) in column names are
77
+ automatically escaped during schema construction and metadata round-trips.
78
+
79
+ ### Parquet import/export improvements
80
+
81
+ - **Arrow serializer by default**: `CTable.from_parquet()` now defaults to the Arrow
82
+ serializer, providing better schema fidelity and nested-type support.
83
+ - **Progress reporting**: A `--progress` flag and an ETA estimator have been added to
84
+ the `parquet-to-blosc2` CLI for long-running imports.
85
+ - **`--max-rows` parameter**: `CTable.from_parquet()` and the CLI now accept `max_rows`
86
+ to limit the number of imported rows.
87
+ - **`--timestamp-unit`**: New CLI option to control timestamp unit conversion on import.
88
+ - **`--float-trunc-prec`**: New CLI option to truncate floating-point precision on import.
89
+ - **Separated nested columns enabled by default**: The `separate_nested_cols` flag is now
90
+ `True` by default for both the Python API and the CLI, ensuring nested Arrow structs
91
+ are always expanded into flat columns.
92
+ - **`list_serializer` parameter**: New option to control how list-type columns are
93
+ serialized, with sensible defaults for different list layouts.
94
+ - **Validation optimizations**: Arrow datetime values are validated only during import,
95
+ reducing runtime overhead on subsequent operations.
96
+
97
+ ### TreeStore: Inline CTable support
98
+
99
+ - **CTables inside TreeStore**: `CTable` objects can now be stored inline as items
100
+ inside a `TreeStore`, enabling hierarchical storage that mixes arrays and tables in a
101
+ single persistent container.
102
+ - **Cache hardening**: TreeStore cache assignments now use defensive copies and cache
103
+ effective object roots to avoid aliasing and stale-cache errors.
104
+ - **Examples and tutorials**: New tutorials and docstring examples demonstrate how to
105
+ store, retrieve, and query CTables within a TreeStore.
106
+
107
+ ### Performance and usability enhancements
108
+
109
+ - **Faster open and import**: `blosc2.open()` and store constructors now assume valid
110
+ file extensions and defer column metainfo loading, making `CTable.open()` and
111
+ package import noticeably faster.
112
+ - **`CTable.nrows` is now lazy**: The row count is computed on demand rather than eagerly,
113
+ speeding up open and schema-inspection workflows.
114
+ - **Accelerated scalar and small-slice access**: The batch/list path for reading scalar
115
+ values or small column slices has been overhauled, eliminating internal placeholder
116
+ materialization and yielding lower latency.
117
+ - **Late-import optimizations**: Heavy optional dependencies are imported lazily at the
118
+ blosc2 package level, reducing the baseline `import blosc2` overhead.
119
+ - **`iter_arrow_batches()` optimization**: Avoids full Python object materialization of
120
+ batches during iteration, reducing memory pressure.
121
+ - **`NDArray`-to-list conversion**: Small optimization when converting NDArray objects
122
+ to Python lists.
123
+ - **`_last_pos` invalidation skipped**: Mid-table deletes no longer eagerly invalidate
124
+ cached positional state, improving delete latency.
125
+
126
+ ### Documentation, examples and benchmarks
127
+
128
+ - **API reference expanded**: `blosc2.group_reduce()` has been added to the Sphinx
129
+ reference, along with updated CTable, Column, and TreeStore pages.
130
+ - **New tutorials and examples**: Added sections on CTable–TreeStore integration,
131
+ nested fields, dictionary columns, aggregates, grouping and querying with `where=`.
132
+ - **New benchmarks**: Graph benchmarks for CTable insert time, column count, memory usage,
133
+ and `where=` queries, plus dedicated group-by, nested-filter, and Parquet round-trip
134
+ benchmarks.
135
+
136
+ ### Fixes and compatibility
137
+
138
+ - **Null and NaN handling**: NumPy scalar null sentinels are now normalized to plain Python
139
+ scalars, and floating-point NaN sentinels are treated consistently with Python
140
+ `float('nan')`.
141
+ - **Empty aggregate results**: Filtered aggregations that produce no rows now handle the
142
+ empty result gracefully.
143
+ - **Generated column safety**: Accessing a stalled (unfillable) generated column now raises
144
+ a clear exception instead of producing undefined results.
145
+ - **Miniexpr bundling**: Miniexpr’s bundled `libtcc` and related runtime files are now
146
+ kept inside the `blosc2` package, avoiding conflicts with other TCC installations.
147
+ - **Test improvements**: Torch-dependent tests are marked as `heavy`, PyArrow-optional
148
+ tests are skipped when the library is absent, and parametrization matrices have been
149
+ trimmed to reduce CI time.
150
+ - **Missing Cython validation**: Added validation guards for several Cython extension
151
+ functions that previously lacked explicit error checking.
152
+ - **C-Blosc2 update**: Bundled C-Blosc2 has been updated to the latest version (3.0.3).
153
+ - **``blosc2.open()`` default mode changed from 'a' to 'r'**: Removed the FutureWarning that
154
+ was added to prepare for this transition.
155
+
3
156
  ## Changes from 4.1.2 to 4.2.0
4
157
 
5
158
  ### CTable: columnar compressed tables
@@ -42,7 +42,7 @@ Preliminaries
42
42
 
43
43
  * Check that the metainfo for the package is correct::
44
44
 
45
- pipx run build --sdist
45
+ uv build --sdist --no-build-isolation
46
46
  twine check --strict dist/*
47
47
 
48
48
 
@@ -101,7 +101,6 @@ Checking packaging
101
101
 
102
102
  pip install --group test
103
103
  pip install blosc2 -U
104
- python -c "import blosc2; blosc2.print_versions()"
105
104
  pytest
106
105
 
107
106
  * Do an actual release in GitHub by visiting:
@@ -186,6 +186,21 @@ Reduction operations can be used with any of :ref:`NDArray <NDArray>`, :ref:`C2A
186
186
  """
187
187
  )
188
188
  genbody(f, sorted(reducers))
189
+ f.write(
190
+ """
191
+ Grouped reductions
192
+ ~~~~~~~~~~~~~~~~~~
193
+
194
+ The :func:`blosc2.group_reduce` function is a lower-level, array-oriented primitive that groups one-dimensional keys and applies eager reductions to the associated values.
195
+
196
+ .. autosummary::
197
+
198
+ group_reduce
199
+
200
+
201
+ .. autofunction:: blosc2.group_reduce
202
+ """
203
+ )
189
204
 
190
205
  hidden = "_ignore_multiple_size"
191
206
 
@@ -5,22 +5,7 @@
5
5
  "id": "cell-01",
6
6
  "metadata": {},
7
7
  "source": [
8
- "# Working with Containers\n",
9
- "\n",
10
- "This notebook is a guided tour of the main data containers in `python-blosc2`.\n",
11
- "\n",
12
- "The goal is to build a practical mental model first: what each container is, how the containers relate, and when each one is the right tool.\n",
13
- "\n",
14
- "We will cover these containers in this order:\n",
15
- "\n",
16
- "1. `SChunk`\n",
17
- "2. `NDArray`\n",
18
- "3. `ObjectArray`\n",
19
- "4. `BatchArray`\n",
20
- "5. `EmbedStore`\n",
21
- "6. `DictStore`\n",
22
- "7. `TreeStore`\n",
23
- "8. `C2Array`"
8
+ "# Working with Containers\n\nThis notebook is a guided tour of the main data containers in `python-blosc2`.\n\nThe goal is to build a practical mental model first: what each container is, how the containers relate, and when each one is the right tool.\n\nWe will cover these containers in this order:\n\n1. `SChunk`\n2. `NDArray`\n3. `ObjectArray`\n4. `BatchArray`\n5. `EmbedStore`\n6. `DictStore`\n7. `TreeStore` (including inline `CTable` support)\n8. `C2Array`"
24
9
  ]
25
10
  },
26
11
  {
@@ -444,6 +429,73 @@
444
429
  " show(\"/exp/run2/data\", tstore[\"/exp/run2/data\"][:])"
445
430
  ]
446
431
  },
432
+ {
433
+ "cell_type": "markdown",
434
+ "id": "cell-17b",
435
+ "metadata": {},
436
+ "source": [
437
+ "### Storing CTables inside a TreeStore\n",
438
+ "\n",
439
+ "A `TreeStore` can hold **both NDArrays and CTables** in the same bundle. A `CTable` is stored inline as a named subtree — all its columns, metadata, and index sidecars live as ordinary Blosc2 leaves inside the outer store. From the outside it appears as a single key, exactly like any other leaf:\n",
440
+ "\n",
441
+ "* `ts[\"/table\"] = ctable` — stores the CTable inline (same syntax as NDArray).\n",
442
+ "* `ts[\"/table\"]` — returns a `CTable` object transparently.\n",
443
+ "* `\"/table/_meta\" not in ts` — internal keys are hidden from normal traversal.\n",
444
+ "* `del ts[\"/table\"]` — removes the whole object and all its leaves at once.\n",
445
+ "\n",
446
+ "The inline layout means there are **no nested ZIP files**: all leaves are flat members of the outer `.b2z` archive and can be opened by offset without extraction."
447
+ ]
448
+ },
449
+ {
450
+ "cell_type": "code",
451
+ "execution_count": null,
452
+ "id": "cell-17c",
453
+ "metadata": {},
454
+ "outputs": [],
455
+ "source": [
456
+ "from dataclasses import dataclass\n",
457
+ "\n",
458
+ "\n",
459
+ "@dataclass\n",
460
+ "class Reading:\n",
461
+ " sensor_id: int = 0\n",
462
+ " value: float = 0.0\n",
463
+ "\n",
464
+ "\n",
465
+ "bundle_path = reset(\"bundle.b2z\")\n",
466
+ "\n",
467
+ "# --- Write: mix NDArrays and CTables in one bundle ----------------------\n",
468
+ "t = blosc2.CTable(Reading)\n",
469
+ "for i in range(6):\n",
470
+ " t.append(Reading(sensor_id=i, value=round(i * 1.1, 2)))\n",
471
+ "\n",
472
+ "with blosc2.TreeStore(bundle_path, mode=\"w\") as ts:\n",
473
+ " ts[\"/raw/signal\"] = np.arange(8, dtype=np.float32)\n",
474
+ " ts[\"/tables/readings\"] = t # CTable stored inline\n",
475
+ " show(\"keys after write\", sorted(ts.keys()))\n",
476
+ " show(\"/tables/readings/_meta in ts (hidden)\", \"/tables/readings/_meta\" in ts)\n",
477
+ "\n",
478
+ "# --- Read back from the .b2z archive ------------------------------------\n",
479
+ "with blosc2.open(bundle_path, mode=\"r\") as ts:\n",
480
+ " readings = ts[\"/tables/readings\"] # returns CTable transparently\n",
481
+ " show(\"type\", type(readings).__name__)\n",
482
+ " show(\"rows\", len(readings))\n",
483
+ " show(\"sensor_id\", list(readings[\"sensor_id\"][:]))\n",
484
+ " show(\"value\", list(readings[\"value\"][:]))\n",
485
+ "\n",
486
+ "# --- Append a row in-place (append mode) --------------------------------\n",
487
+ "with blosc2.TreeStore(bundle_path, mode=\"a\") as ts:\n",
488
+ " r = ts[\"/tables/readings\"]\n",
489
+ " r.append(Reading(sensor_id=99, value=-1.0))\n",
490
+ " r.close() # optional; outer store also closes it on __exit__\n",
491
+ " show(\"rows after append\", len(ts[\"/tables/readings\"]))\n",
492
+ "\n",
493
+ "# --- Delete the CTable (all internal leaves removed) -------------------\n",
494
+ "with blosc2.TreeStore(bundle_path, mode=\"a\") as ts:\n",
495
+ " del ts[\"/tables/readings\"]\n",
496
+ " show(\"keys after delete\", sorted(ts.keys()))"
497
+ ]
498
+ },
447
499
  {
448
500
  "cell_type": "markdown",
449
501
  "id": "cell-18",
@@ -494,25 +546,7 @@
494
546
  "id": "cell-20",
495
547
  "metadata": {},
496
548
  "source": [
497
- "## Choosing The Right Container\n",
498
- "\n",
499
- "| Container | Backing idea | Best for |\n",
500
- "| --- | --- | --- |\n",
501
- "| `SChunk` | raw compressed chunks | direct chunk-level storage control |\n",
502
- "| `NDArray` | `SChunk` plus array metadata | dense numeric arrays |\n",
503
- "| `ObjectArray` | one variable-length entry per chunk | ragged or heterogeneous Python values |\n",
504
- "| `BatchArray` | one batch per chunk | batch-oriented ingestion and access |\n",
505
- "| `EmbedStore` | one bundled object store | packaging a few Blosc2 objects together |\n",
506
- "| `DictStore` | keyed collection of leaves | portable multi-object datasets |\n",
507
- "| `TreeStore` | hierarchical keyed collection | tree-structured datasets |\n",
508
- "| `C2Array` | remote array handle | arrays hosted by a remote Caterva2 service |\n",
509
- "\n",
510
- "A simple rule of thumb is:\n",
511
- "\n",
512
- "- start with `NDArray` for dense numeric data\n",
513
- "- drop down to `SChunk` if you need chunk-level control\n",
514
- "- use `ObjectArray` or `BatchArray` for variable-length Python objects\n",
515
- "- use `EmbedStore`, `DictStore`, or `TreeStore` when your dataset contains multiple objects"
549
+ "## Choosing The Right Container\n\n| Container | Backing idea | Best for |\n| --- | --- | --- |\n| `SChunk` | raw compressed chunks | direct chunk-level storage control |\n| `NDArray` | `SChunk` plus array metadata | dense numeric arrays |\n| `ObjectArray` | one variable-length entry per chunk | ragged or heterogeneous Python values |\n| `BatchArray` | one batch per chunk | batch-oriented ingestion and access |\n| `EmbedStore` | one bundled object store | packaging a few Blosc2 objects together |\n| `DictStore` | keyed collection of leaves | portable multi-object datasets |\n| `TreeStore` | hierarchical keyed collection | tree-structured datasets with NDArrays and/or CTables |\n| `C2Array` | remote array handle | arrays hosted by a remote Caterva2 service |\n\nA simple rule of thumb is:\n\n- start with `NDArray` for dense numeric data\n- drop down to `SChunk` if you need chunk-level control\n- use `ObjectArray` or `BatchArray` for variable-length Python objects\n- use `EmbedStore`, `DictStore`, or `TreeStore` when your dataset contains multiple objects"
516
550
  ]
517
551
  },
518
552
  {
@@ -520,17 +554,7 @@
520
554
  "id": "cell-21",
521
555
  "metadata": {},
522
556
  "source": [
523
- "## Final Notes\n",
524
- "\n",
525
- "This notebook is intentionally organized from low-level storage to higher-level organization:\n",
526
- "\n",
527
- "- understand `SChunk` first\n",
528
- "- use `NDArray` for most dense numeric workloads\n",
529
- "- move to `ObjectArray` or `BatchArray` when entries stop being fixed-size arrays\n",
530
- "- use `EmbedStore`, `DictStore`, or `TreeStore` when you need to package multiple objects together\n",
531
- "- use `C2Array` when the data lives on a remote service\n",
532
- "\n",
533
- "For deeper details on a specific class, continue with the reference docs and the dedicated tutorials for `ObjectArray`, `BatchArray`, and indexing."
557
+ "## Final Notes\n\nThis notebook is intentionally organized from low-level storage to higher-level organization:\n\n- understand `SChunk` first\n- use `NDArray` for most dense numeric workloads\n- move to `ObjectArray` or `BatchArray` when entries stop being fixed-size arrays\n- use `EmbedStore`, `DictStore`, or `TreeStore` when you need to package multiple objects together\n- use `TreeStore` + `CTable` together when your bundle mixes dense arrays with structured tables\n- use `C2Array` when the data lives on a remote service\n\nFor deeper details on a specific class, continue with the reference docs and the dedicated tutorials for `ObjectArray`, `BatchArray`, and indexing."
534
558
  ]
535
559
  },
536
560
  {