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.
- blosc2-4.3.0/ANNOUNCE.rst +135 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/CMakeLists.txt +18 -34
- {blosc2-4.2.0 → blosc2-4.3.0}/PKG-INFO +1 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/RELEASE_NOTES.md +153 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/RELEASING.rst +1 -2
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/conf.py +15 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/13.containers.ipynb +70 -46
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/13.ctable-basics.ipynb +804 -705
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/python-blosc2.rst +1 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/classes.rst +1 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ctable.rst +207 -15
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/misc.rst +1 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/reduction_functions.rst +12 -0
- blosc2-4.3.0/doc/reference/ref.rst +54 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/aggregates.py +9 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/arrow_interop.py +18 -5
- blosc2-4.3.0/examples/ctable/group_by.py +75 -0
- blosc2-4.3.0/examples/ctable/ndim-cols.py +138 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/querying.py +8 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/schema.py +65 -6
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/tree-store.py +46 -1
- blosc2-4.3.0/plans/ctable-dictionary-type.md +688 -0
- blosc2-4.3.0/plans/ctable-groupby.md +433 -0
- blosc2-4.3.0/plans/ctable-ndarray-cols-copilot-sonnet.md +647 -0
- blosc2-4.3.0/plans/ctable-ndarray-cols.md +660 -0
- blosc2-4.3.0/plans/ctable-nested-fields.md +251 -0
- blosc2-4.3.0/plans/ctable-separate-nested-cols.md +686 -0
- blosc2-4.3.0/plans/tree_store_ctable_ndarray.md +670 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/pyproject.toml +1 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/__init__.py +31 -8
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/batch_array.py +49 -9
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/c2array.py +10 -5
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/cli/parquet_to_blosc2.py +705 -28
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/core.py +2 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/ctable.py +3916 -450
- blosc2-4.3.0/src/blosc2/ctable_storage.py +1167 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/dict_store.py +19 -4
- blosc2-4.3.0/src/blosc2/dictionary_column.py +280 -0
- blosc2-4.3.0/src/blosc2/groupby.py +1808 -0
- blosc2-4.3.0/src/blosc2/groupby_ext.pyx +1140 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/indexing.py +6 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/indexing_ext.pyx +27 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/lazyexpr.py +120 -34
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/list_array.py +52 -3
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/ndarray.py +34 -7
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema.py +212 -4
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema_compiler.py +58 -8
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema_validation.py +18 -4
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schema_vectorized.py +24 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/schunk.py +6 -28
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/tree_store.py +451 -81
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/utils.py +61 -35
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/version.py +1 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_arrow_interop.py +84 -1
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_column.py +103 -4
- blosc2-4.3.0/tests/ctable/test_csv_interop.py +529 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_ctable_dataclass_schema.py +98 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_ctable_indexing.py +2 -0
- blosc2-4.3.0/tests/ctable/test_ctable_ndarray_columns.py +231 -0
- blosc2-4.3.0/tests/ctable/test_dictionary_column.py +485 -0
- blosc2-4.3.0/tests/ctable/test_getitem_access.py +145 -0
- blosc2-4.3.0/tests/ctable/test_groupby.py +451 -0
- blosc2-4.3.0/tests/ctable/test_nested_access_storage.py +165 -0
- blosc2-4.3.0/tests/ctable/test_nested_append.py +96 -0
- blosc2-4.3.0/tests/ctable/test_nested_metadata_root.py +93 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_nullable.py +23 -0
- blosc2-4.3.0/tests/ctable/test_object_spec.py +66 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_parquet_interop.py +638 -2
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_specs.py +18 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_table_persistency.py +2 -7
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_varlen_columns.py +10 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_elementwise_funcs.py +2 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_indexing.py +20 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lazyexpr.py +66 -73
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_reductions.py +99 -120
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_batch_array.py +11 -4
- blosc2-4.3.0/tests/test_group_reduce.py +85 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_open.py +11 -15
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_tree_store.py +386 -0
- blosc2-4.2.0/ANNOUNCE.rst +0 -86
- blosc2-4.2.0/doc/reference/ref.rst +0 -13
- blosc2-4.2.0/src/blosc2/ctable_storage.py +0 -605
- blosc2-4.2.0/tests/ctable/test_csv_interop.py +0 -235
- {blosc2-4.2.0 → blosc2-4.3.0}/.gitattributes +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/.gitignore +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/.guix/modules/python-blosc2-package.scm +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/.guix-channel +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/.pre-commit-config.yaml +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/.skills/wasm32-pyodide-dev/SKILL.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/.skills/wasm32-pyodide-dev/references/commands.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/ADD_LAZYFUNCS.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/AGENTS.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/CONTRIBUTING.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/LICENSE.txt +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/README.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/README_DEVELOPERS.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/ROADMAP-TO-4.0.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/code_of_conduct.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-favicon_32x32.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-favicon_64x64.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-logo_128.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/blosc-logo_256.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/_static/css/custom.css +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/code-of-conduct.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/contributing.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/index.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/development/roadmap.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/dsl_syntax.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/index.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/installation.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/overview.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/01.ndarray-basics.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/02.lazyarray-expressions.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/03.lazyarray-udf-kernels.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/03.lazyarray-udf.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/04.reductions.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/05.persistent-reductions.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/06.remote_proxy.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/07.schunk-basics.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/08.schunk-slicing_and_beyond.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/09.ucodecs-ufilters.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/10.prefilters.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/11.objectarray.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/12.batcharray.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/14.indexing-arrays.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/15.indexing-ctables.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/blosc2-pipeline.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/blosc2-pipeline.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/containers/README.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/containers/overview.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/lazyexpr-broadcast.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/proxyconnection.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/3D-cube-plane.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/3D-cube.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/memory-access-2D-x.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/reductions/memory-access-2D-y.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/remote_proxy.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/backward.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/backward.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/forward.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials/images/ucodecs-filters/forward.svg +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/getting_started/tutorials.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/index.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/additional_funcs.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/array.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/array_operations.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/batch_array.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/c2array.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/dict_store.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/embed_store.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/index.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/index_class.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/index_funcs.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/lazyarray.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/linalg.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/list_array.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/low_level.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/msgpack_serialization.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ndarray.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ndfield.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/objectarray.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/proxy.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/proxyndsource.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/proxysource.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/save_load.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/schunk.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/simpleproxy.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/storage.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/tree_store.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/ufuncs.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/reference/utilities.rst +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/doc/release_notes/index.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/batch_array.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/blosc2_hdf5_compression.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/btune.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/c2array-get-slice.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/compress2_decompress2.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/compress_decompress.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/basics.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/computed-columns.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/csv_interop.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/index_on_b2z.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/indexing.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/mutations.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/nullable.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/persistence.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/real_world.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ctable/varlen_columns.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/dict-store.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/embed-store.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/embedded-expr-udf-b2z.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/filler.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/gil.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/mmap-rw.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/animated_plot.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/arange-constructor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/asarray_.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/black-scholes_hist-dsl.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/blosc2_3_10_demo.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/broadcast_expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/buffer.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/bytedelta_filter.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/c2array_expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_fields.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_udf_numba.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/compute_where.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/copy_.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/dsl_save.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/empty_.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/expression_index.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/eye-constructor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/filter_sort_fields.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/formats.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/fromiter-constructor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/general_expressions.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/getitem.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/index_append_maintenance.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/index_sorted_iteration.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/ironpill1.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/iterchunks_info.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/jit-expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/jit-numpy-funcs.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/jit-reduc.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/lazyexpr_where_indexing.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/linspace-constructor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/lists-vs-bools-idx.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/malformed_dsl.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/mandelbrot-dsl.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/mandelbrot-pure-dsl.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/meta.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/ndarray_copy.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/ndmean.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/persistency.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/proxy-carray.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/proxy-ndarray.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_and_enlarge.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_expr_save.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/reduce_string_expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/resize_.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/string_arrays.ipynb +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/work_with_numpy.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/xarray-expression.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ndarray/zfp_codec.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/objectarray.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/pack_array.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/pack_tensor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/postfilter1.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/postfilter2.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/postfilter3.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/prefilter.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ref-object.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/save_tensor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/schunk.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/schunk_roundtrip.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/tree-store-blog.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ucodecs.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/ufilters.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/vlmeta.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/examples/vlstore-lazyudf.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/generate_version.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/guix.scm +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/Complete-Write-Read-B2ND.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/M1-i386-vs-arm64-pack.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/M1-i386-vs-arm64-unpack.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/Read-Partial-Slices-B2ND.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/b2nd-2level-parts.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/eval-expr-full-mem-M2.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/eval-expr-scarce-mem-M2.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-dask-large.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-dask-small.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-expr-large.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/lazyarray-expr.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/linspace-compress.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/linspace-decompress.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/pack-array-cratios.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/reduc-float64-amd.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/images/reduc-float64-log-amd.png +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/changing-default-open-mode.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/computed-column-copilot.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/containers-tutorial.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-direct-expr-indexing.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-getitem-row.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-implementation-log.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-indexes-opsi.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-indexing.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-nulls.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-object-array.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-parquet-metadata.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-persistency.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-schema.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-user-guide.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/ctable-varlen-cols.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/external-js-glue-blosc2-todo.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/external-js-glue.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/materialized-computed-column.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/new-ctable-views.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/phase0-t1-dsl-syntax-inventory.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/tree_store_extensions.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/treestore-ctable-extension.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/plans/wasm32-todo.md +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/pytest.ini +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/scripts/install-codex-skill-wasm32.sh +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/b2objects.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/blosc2_ext.pyx +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/cli/__init__.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/dsl_kernel.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/embed_store.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/exceptions.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/fft.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/info.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/linalg.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/matmul_kernels.c +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/matmul_kernels.h +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/msgpack_utils.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/objectarray.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/proxy.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/ref.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/scalar_array.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/storage.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/src/blosc2/wasm_jit.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/array-api-xfails.txt +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/conftest.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_column_ndarray_like.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_compact.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_construct.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_ctable_computed_cols.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_delete_rows.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_extend_delete.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_row_logic.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_compiler.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_mutations.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_schema_validation.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_select_describe_cov.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_sort_by.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_varlen_schema_compiler.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_vlstring_vlbytes.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ctable/test_where_expressions.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyexpr_v1/a.b2nd +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyexpr_v1/b.b2nd +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyexpr_v1/expr.b2nd +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyudf_v1/a.b2nd +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyudf_v1/b.b2nd +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/data/legacy_lazyudf_v1/expr.b2nd +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_auto_parts.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_buffer.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_c2array_expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_c2array_reductions.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_c2array_udf.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_concat.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_copy.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_dsl_kernels.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_empty.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_evaluate.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_full.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_get_slice_nchunks.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_getitem.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_iterchunks_info.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_jit.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lazyexpr_fields.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lazyudf.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_linalg.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_lossy.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_metalayers.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_mode.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_nans.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_ndarray.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_numpy.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_persistency.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_proxy.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_proxy_c2array.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_proxy_expr.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_resize.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_setitem.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_slice.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_squeeze.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_stringarrays.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_struct_dtype.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_wasm_dsl_jit.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/ndarray/test_zeros.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_b2objects.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_bytes_array.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_comp_info.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_compress2.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_compression_parameters.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_compressors.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_decompress.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_dict_store.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_embed_store.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_iterchunks.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_list_array.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_mmap.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_numexpr_threads.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_objectarray.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_open_c2array.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_pandas_udf_engine.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_pathlib.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_postfilters.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_prefilters.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_proxy_schunk.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_python_blosc.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_constructor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_delete.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_get_slice.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_get_slice_nchunks.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_insert.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_reorder_offsets.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_set_slice.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_schunk_update.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_storage.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_tensor.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_ucodecs.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_ufilters.py +0 -0
- {blosc2-4.2.0 → blosc2-4.3.0}/tests/test_vlmeta.py +0 -0
- {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.
|
|
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,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
|
-
|
|
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
|
{
|