blosc2 3.3.3__tar.gz → 3.4.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-3.3.3 → blosc2-3.4.0}/.pre-commit-config.yaml +1 -1
- {blosc2-3.3.3 → blosc2-3.4.0}/ANNOUNCE.rst +2 -5
- {blosc2-3.3.3 → blosc2-3.4.0}/CMakeLists.txt +1 -1
- {blosc2-3.3.3 → blosc2-3.4.0}/PKG-INFO +1 -1
- {blosc2-3.3.3 → blosc2-3.4.0}/README_DEVELOPERS.md +14 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/RELEASE_NOTES.md +30 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/python-blosc2.rst +1 -1
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/classes.rst +1 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/ndarray.rst +1 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/proxysource.rst +2 -2
- blosc2-3.4.0/doc/reference/simpleproxy.rst +30 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/storage.rst +2 -0
- blosc2-3.4.0/examples/blosc2_hdf5_compression.py +95 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/jit-numpy-funcs.py +1 -1
- blosc2-3.4.0/examples/ndarray/lazyexpr_where_indexing.py +42 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/pyproject.toml +1 -1
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/__init__.py +1 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/blosc2_ext.pyx +52 -2
- blosc2-3.4.0/src/blosc2/exceptions.py +7 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/lazyexpr.py +141 -41
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/ndarray.py +72 -6
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/proxy.py +75 -5
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/schunk.py +12 -3
- blosc2-3.4.0/src/blosc2/version.py +1 -0
- blosc2-3.4.0/tests/ndarray/test_concatenate.py +64 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_lazyexpr.py +72 -19
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_lazyexpr_fields.py +91 -10
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_reductions.py +74 -1
- blosc2-3.4.0/tests/test_pandas_udf_engine.py +120 -0
- blosc2-3.3.3/src/blosc2/version.py +0 -1
- {blosc2-3.3.3 → blosc2-3.4.0}/.gitignore +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/.guix/modules/python-blosc2-package.scm +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/.guix-channel +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/CONTRIBUTING.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/LICENSE.txt +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/README.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/RELEASING.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/code_of_conduct.md +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/_static/blosc-favicon_32x32.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/_static/blosc-favicon_64x64.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/_static/blosc-logo_128.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/_static/blosc-logo_256.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/_static/css/custom.css +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/conf.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/development/code-of-conduct.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/development/contributing.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/development/index.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/index.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/installation.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/overview.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/01.ndarray-basics.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/02.lazyarray-expressions.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/03.lazyarray-udf.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/04.reductions.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/05.persistent-reductions.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/06.remote_proxy.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/07.schunk-basics.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/08.schunk-slicing_and_beyond.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/10.ucodecs-ufilters.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/11.prefilters.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/12.postfilters.ipynb +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/blosc2-pipeline.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/blosc2-pipeline.svg +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/lazyexpr-broadcast.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/reductions/3D-cube-plane.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/reductions/3D-cube.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/reductions/memory-access-2D-x.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/reductions/memory-access-2D-y.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/remote_proxy.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/backward.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/backward.svg +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.svg +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.svg +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.svg +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.svg +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/forward.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials/images/ucodecs-filters/forward.svg +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/getting_started/tutorials.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/index.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/array_operations.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__getitem__.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__init__.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__len__.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__setitem__.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.append_data.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.decompress_chunk.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.delete_chunk.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.fill_special.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.filler.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.get_chunk.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.get_slice.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.insert_chunk.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.insert_data.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.iterchunks.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.iterchunks_info.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.postfilter.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.prefilter.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.remove_postfilter.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.remove_prefilter.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.to_cframe.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.update_chunk.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.update_data.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/c2array.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/decorators.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/index.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/lazy_functions.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/lazyarray.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/linear_algebra.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/low_level.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/ndfield.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/proxy.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/proxyndsource.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/reduction_functions.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/save_load.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/schunk.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/reference/utilities.rst +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/doc/release_notes/index.md +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/btune.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/c2array-get-slice.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/compress2_decompress2.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/compress_decompress.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/filler.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/gil.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/mmap-rw.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/arange-constructor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/asarray_.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/broadcast_expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/buffer.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/bytedelta_filter.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/c2array_expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/compute_expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/compute_fields.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/compute_udf_numba.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/compute_where.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/copy_.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/empty_.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/eye-constructor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/filter_sort_fields.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/formats.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/fromiter-constructor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/general_expressions.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/getitem.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/iterchunks_info.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/jit-expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/jit-reduc.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/linspace-constructor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/lists-vs-bools-idx.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/meta.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/ndarray_copy.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/ndmean.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/persistency.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/proxy-carray.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/proxy-ndarray.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/reduce_and_enlarge.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/reduce_expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/reduce_expr_save.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/reduce_string_expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/resize_.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/work_with_numpy.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ndarray/zfp_codec.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/pack_array.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/pack_tensor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/postfilter1.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/postfilter2.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/postfilter3.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/prefilter.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/save_tensor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/schunk.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/schunk_roundtrip.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ucodecs.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/ufilters.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/examples/vlmeta.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/generate_version.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/guix.scm +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/Complete-Write-Read-B2ND.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/M1-i386-vs-arm64-pack.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/M1-i386-vs-arm64-unpack.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/Read-Partial-Slices-B2ND.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/b2nd-2level-parts.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/eval-expr-full-mem-M2.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/eval-expr-scarce-mem-M2.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/lazyarray-dask-large.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/lazyarray-dask-small.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/lazyarray-expr-large.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/lazyarray-expr.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/linspace-compress.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/linspace-decompress.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/pack-array-cratios.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/reduc-float64-amd.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/images/reduc-float64-log-amd.png +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/pytest.ini +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/c2array.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/core.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/helpers.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/info.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/src/blosc2/storage.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/conftest.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_auto_parts.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_buffer.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_c2array_expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_c2array_reductions.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_c2array_udf.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_copy.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_empty.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_evaluate.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_full.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_get_slice_nchunks.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_getitem.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_iterchunks_info.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_jit.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_lazyudf.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_lossy.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_matmul.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_metalayers.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_mode.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_nans.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_ndarray.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_numpy.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_persistency.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_proxy.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_proxy_c2array.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_proxy_expr.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_resize.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_setitem.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_slice.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_squeeze.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_struct_dtype.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_transpose.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/ndarray/test_zeros.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_bytes_array.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_comp_info.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_compress2.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_compression_parameters.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_compressors.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_decompress.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_iterchunks.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_mmap.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_open.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_open_c2array.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_pathlib.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_postfilters.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_prefilters.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_proxy_schunk.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_python_blosc.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk_constructor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk_delete.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk_get_slice.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk_get_slice_nchunks.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk_insert.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk_set_slice.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_schunk_update.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_storage.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_tensor.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_ucodecs.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_ufilters.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/tests/test_vlmeta.py +0 -0
- {blosc2-3.3.3 → blosc2-3.4.0}/update_version.py +0 -0
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
Announcing Python-Blosc2 3.
|
|
1
|
+
Announcing Python-Blosc2 3.4.0
|
|
2
2
|
==============================
|
|
3
3
|
|
|
4
|
-
This
|
|
5
|
-
correct chaining of *string* lazy expressions (there is still room for
|
|
6
|
-
improvement). Also, a new version of C-Blosc2 (v2.7.2.dev) that fixes
|
|
7
|
-
mmap issues on Windows is used; thanks to @JanSellner for the fix.
|
|
4
|
+
This release adds significant new functionality in the form of ``concatenate``. We support general concatenation of ndarrays, and offer an optimised path with significant speedups for the case of concatenating arrays with compatible chunk and blockshapes. In addition, there are bug fixes and more functionality for slicing of lazyexprs, and the possibility to jit compile user-defined functions which operate on pandas objects using the blosc2 engine.
|
|
8
5
|
|
|
9
6
|
You can think of Python-Blosc2 3.x as an extension of NumPy/numexpr that:
|
|
10
7
|
|
|
@@ -50,7 +50,7 @@ else()
|
|
|
50
50
|
include(FetchContent)
|
|
51
51
|
FetchContent_Declare(blosc2
|
|
52
52
|
GIT_REPOSITORY https://github.com/Blosc/c-blosc2
|
|
53
|
-
GIT_TAG
|
|
53
|
+
GIT_TAG 1c2f8bb0c914c43e23b751fbcf6642cd7aec09db # v2.18.0 (concatenate added)
|
|
54
54
|
)
|
|
55
55
|
FetchContent_MakeAvailable(blosc2)
|
|
56
56
|
include_directories("${blosc2_SOURCE_DIR}/include")
|
|
@@ -22,6 +22,20 @@ You are done!
|
|
|
22
22
|
pip install . # add -e for editable mode
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
+
There are situations where you may want to build the C-Blosc2 library separately, for example, when debugging issues in the C library. In that case, let's assume you have the C-Blosc2 library installed in `/usr/local`:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
CMAKE_PREFIX_PATH=/usr/local USE_SYSTEM_BLOSC2=1 pip install -e .
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
and then, you can run the tests with:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
LD_LIBRARY_PATH=/usr/local/lib pytest
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
[replace `LD_LIBRARY_PATH` with the appropriate environment variable for your system, such as `DYLD_LIBRARY_PATH` on macOS or `PATH` on Windows, if necessary].
|
|
38
|
+
|
|
25
39
|
That's it! You can now proceed to the testing section.
|
|
26
40
|
|
|
27
41
|
## Testing
|
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
# Release notes
|
|
2
|
+
## Changes from 3.4.0 to 3.4.1
|
|
3
|
+
|
|
4
|
+
XXX version-specific blurb XXX
|
|
5
|
+
|
|
6
|
+
## Changes from 3.3.4 to 3.4.0
|
|
7
|
+
|
|
8
|
+
* Added C-level ``concatenate`` function in response to community request. When possible, uses an optimised path which avoids decompression and recompression, giving a significant performance boost. See PR #423.
|
|
9
|
+
|
|
10
|
+
* Slicing has been added to string-based lazyexprs, so that one may use
|
|
11
|
+
expressions like `expr[1:3] +1` to compute a slice of the expression. This is useful
|
|
12
|
+
for getting a sub-expression of a larger expression, and it works with both
|
|
13
|
+
string-based and lazy expressions. See PR #417.
|
|
14
|
+
|
|
15
|
+
* Relatedly, the behaviour of the `slice` parameter in the `compute()` method of `LazyExpr` has been made more consistent and is now better documented, so that results are as expected. See PR #419.
|
|
16
|
+
|
|
17
|
+
* UDF support for pandas has been added to allow for the use of ``blosc2.jit``. See PR #418. Thanks to [@datapythonista](https://github.com/datapythonista) for the implementation!
|
|
18
|
+
|
|
19
|
+
## Changes from 3.3.3 to 3.3.4
|
|
20
|
+
|
|
21
|
+
* Expand possibilities for chaining string-based lazy expressions to incorporate
|
|
22
|
+
data types which do not have shape attribute, e.g. int, float etc.
|
|
23
|
+
See #406 and PR #411.
|
|
24
|
+
|
|
25
|
+
* Enable slicing within string-based lazy expressions. See PR #414.
|
|
26
|
+
|
|
27
|
+
* Improved casting for string-based lazy expressions.
|
|
28
|
+
|
|
29
|
+
* Documentation improvements, see PR #410.
|
|
30
|
+
|
|
31
|
+
* Compatibility fixes for working with `h5py` files.
|
|
2
32
|
|
|
3
33
|
## Changes from 3.3.2 to 3.3.3
|
|
4
34
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p style="text-align: center; color: black; background-color: rgba(230, 169, 9, 0.65);">
|
|
8
8
|
<a href="https://github.com/Blosc/python-blosc2/blob/main/RELEASE_NOTES.md"
|
|
9
|
-
style="font-size: 1.5em;">Version 3.3.
|
|
9
|
+
style="font-size: 1.5em;">Version 3.3.4 released on 2025-05-22!</a>
|
|
10
10
|
<span style="display: inline-block; width: 20px;"></span>
|
|
11
11
|
<span style="font-family: monospace;">pip install blosc2 -U</span>
|
|
12
12
|
</p>
|
|
@@ -4,8 +4,8 @@ ProxySource
|
|
|
4
4
|
===========
|
|
5
5
|
|
|
6
6
|
Base interface for all supported sources in :ref:`Proxy` and are not NDim objects.
|
|
7
|
-
For example, a file, a memory buffer, a network resource, etc. For
|
|
8
|
-
:ref:`ProxyNDSource`.
|
|
7
|
+
For example, a file, a memory buffer, a network resource, etc. For n-dimemsional
|
|
8
|
+
ones, see :ref:`ProxyNDSource`.
|
|
9
9
|
|
|
10
10
|
.. currentmodule:: blosc2.ProxySource
|
|
11
11
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
.. _SimpleProxy:
|
|
2
|
+
|
|
3
|
+
SimpleProxy
|
|
4
|
+
===========
|
|
5
|
+
|
|
6
|
+
Simple proxy for a NumPy array (or similar) that can be used with the Blosc2 compute engine.
|
|
7
|
+
|
|
8
|
+
This only supports the __getitem__ method. No caching is performed.
|
|
9
|
+
|
|
10
|
+
.. currentmodule:: blosc2.SimpleProxy
|
|
11
|
+
|
|
12
|
+
Methods
|
|
13
|
+
-------
|
|
14
|
+
|
|
15
|
+
.. autosummary::
|
|
16
|
+
:toctree: autofiles/simpleproxy
|
|
17
|
+
:nosignatures:
|
|
18
|
+
|
|
19
|
+
__init__
|
|
20
|
+
__getitem__
|
|
21
|
+
|
|
22
|
+
Attributes
|
|
23
|
+
----------
|
|
24
|
+
|
|
25
|
+
.. autosummary::
|
|
26
|
+
:toctree: autofiles/simpleproxy
|
|
27
|
+
|
|
28
|
+
shape
|
|
29
|
+
dtype
|
|
30
|
+
src
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#######################################################################
|
|
2
|
+
# Copyright (c) 2019-present, Blosc Development Team <blosc@blosc.org>
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
# This source code is licensed under a BSD-style license (found in the
|
|
6
|
+
# LICENSE file in the root directory of this source tree)
|
|
7
|
+
#######################################################################
|
|
8
|
+
|
|
9
|
+
# This shows how to convert a generic .h5 file to a custom blosc2-compressed .h5 file
|
|
10
|
+
# The blosc2 plugin in hdf5plugin doesn't support custom block shapes, and so one
|
|
11
|
+
# has to go a different route for more bespoke compression
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
|
|
15
|
+
import h5py
|
|
16
|
+
import hdf5plugin
|
|
17
|
+
|
|
18
|
+
import blosc2
|
|
19
|
+
|
|
20
|
+
clevel = 5 # compression level, e.g., 0-9, where 0 is no compression and 9 is maximum compression
|
|
21
|
+
fname_in = "kevlar.h5" # input file with the kevlar dataset
|
|
22
|
+
fname_out = "kevlar-blosc2.h5"
|
|
23
|
+
if not os.path.exists(fname_in):
|
|
24
|
+
raise FileNotFoundError(
|
|
25
|
+
f"Input file {fname_in} does not exist\n"
|
|
26
|
+
"Please download it from the kevlar repository at:"
|
|
27
|
+
" http://www.silx.org/pub/pyFAI/pyFAI_UM_2020/data_ID13/kevlar.h5"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# Example 1
|
|
31
|
+
# hdf5plugin supports limited blosc2 compression with certain codecs
|
|
32
|
+
cname = "zstd"
|
|
33
|
+
with h5py.File(fname_in, "r") as fr:
|
|
34
|
+
dset = fr["/entry/data/data"][:]
|
|
35
|
+
with h5py.File(fname_out, "w") as fw:
|
|
36
|
+
g = fw.create_group("/data")
|
|
37
|
+
b2comp = hdf5plugin.Blosc2(cname=cname, clevel=clevel, filters=hdf5plugin.Blosc2.BITSHUFFLE)
|
|
38
|
+
dset_out = g.create_dataset(
|
|
39
|
+
f"cname-{cname}",
|
|
40
|
+
data=dset,
|
|
41
|
+
dtype=dset.dtype,
|
|
42
|
+
chunks=(1,) + dset.shape[1:], # chunk size of 1 frame
|
|
43
|
+
**b2comp,
|
|
44
|
+
)
|
|
45
|
+
print("Successfully compressed file with hdf5plugin")
|
|
46
|
+
|
|
47
|
+
# Example 2
|
|
48
|
+
# For other codecs (e.g grok) or for more custom compression such as with user-defined block shapes, one
|
|
49
|
+
# has to use a more involved route
|
|
50
|
+
blocks = (50, 80, 80)
|
|
51
|
+
chunks = (200, 240, 240)
|
|
52
|
+
cparams = {
|
|
53
|
+
"codec": blosc2.Codec.LZ4,
|
|
54
|
+
"filters": [blosc2.Filter.BITSHUFFLE],
|
|
55
|
+
"splitmode": blosc2.SplitMode.NEVER_SPLIT,
|
|
56
|
+
"clevel": clevel,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if os.path.exists("dset.b2nd"): # don't reload dset to blosc2 if already done so once
|
|
60
|
+
b2im = blosc2.open(urlpath="dset.b2nd", mode="r")
|
|
61
|
+
s, d = b2im.shape, b2im.dtype
|
|
62
|
+
else:
|
|
63
|
+
with h5py.File(fname_in, "r") as fr: # load file and process to blosc2 array
|
|
64
|
+
dset = fr["/entry/data/data"][:]
|
|
65
|
+
b2im = blosc2.asarray(
|
|
66
|
+
dset, chunks=chunks, blocks=blocks, cparams=cparams, urlpath="dset.b2nd", mode="w"
|
|
67
|
+
)
|
|
68
|
+
d = dset.dtype
|
|
69
|
+
del dset
|
|
70
|
+
|
|
71
|
+
# Write to .h5 file #
|
|
72
|
+
with h5py.File(fname_out, "w") as fw:
|
|
73
|
+
g = fw.create_group("/data")
|
|
74
|
+
b2comp = hdf5plugin.Blosc2() # just for identification, no compression algorithm specified
|
|
75
|
+
dset_out = g.create_dataset(
|
|
76
|
+
"cname-customlz4",
|
|
77
|
+
s,
|
|
78
|
+
d,
|
|
79
|
+
chunks=chunks, # chunk size of 1 frame
|
|
80
|
+
**b2comp,
|
|
81
|
+
)
|
|
82
|
+
# Write individual blosc2 chunks directly to hdf5
|
|
83
|
+
# hdf5 requires a cframe, which is only available via blosc2 schunks (not chunks)
|
|
84
|
+
for info in b2im.iterchunks_info():
|
|
85
|
+
ncoords = tuple(n * chunks[i] for i, n in enumerate(info.coords))
|
|
86
|
+
aux = blosc2.empty(
|
|
87
|
+
shape=b2im.chunks, chunks=b2im.chunks, blocks=b2im.blocks, dtype=b2im.dtype
|
|
88
|
+
) # very cheap memory allocation
|
|
89
|
+
aux.schunk.insert_chunk(
|
|
90
|
+
0, b2im.get_chunk(info.nchunk)
|
|
91
|
+
) # insert chunk into blosc2 array so we have schunk wrapper (no decompression required)
|
|
92
|
+
dset_out.id.write_direct_chunk(
|
|
93
|
+
ncoords, aux.schunk.to_cframe()
|
|
94
|
+
) # convert schunk to cframe and write to hdf5
|
|
95
|
+
print("Successfully compressed file with custom parameters")
|
|
@@ -18,7 +18,7 @@ import blosc2
|
|
|
18
18
|
# Create some sample data
|
|
19
19
|
a = blosc2.linspace(0, 1, 10 * 100, dtype="float32", shape=(10, 100))
|
|
20
20
|
b = blosc2.linspace(1, 2, 10 * 100, dtype="float32", shape=(10, 100))
|
|
21
|
-
c = blosc2.linspace(-10, 10,
|
|
21
|
+
c = blosc2.linspace(-10, 10, 100, dtype="float32", shape=(100,))
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
# Example 1: Basic usage of the jit decorator with reduction
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Imports
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
import blosc2
|
|
6
|
+
|
|
7
|
+
N = 1000
|
|
8
|
+
it = ((-x + 1, x - 2, 0.1 * x) for x in range(N))
|
|
9
|
+
sa = blosc2.fromiter(
|
|
10
|
+
it, dtype=[("A", "i4"), ("B", "f4"), ("C", "f8")], shape=(N,), urlpath="sa-1M.b2nd", mode="w"
|
|
11
|
+
)
|
|
12
|
+
expr = sa["(A < B)"]
|
|
13
|
+
A = sa["A"][:]
|
|
14
|
+
B = sa["B"][:]
|
|
15
|
+
C = sa["C"][:]
|
|
16
|
+
temp = sa[:]
|
|
17
|
+
indices = A < B
|
|
18
|
+
idx = np.argmax(indices)
|
|
19
|
+
|
|
20
|
+
# One might think that expr[:10] gives the first 10 elements of the evaluated expression, but this is not the case.
|
|
21
|
+
# It actually computes the expression on the first 10 elements of the operands; since for some elements the condition
|
|
22
|
+
# is False, the result will be shorter than 10 elements.
|
|
23
|
+
# Returns less than 10 elements in general
|
|
24
|
+
sliced = expr.compute(slice(0, 10))
|
|
25
|
+
gotitem = expr[:10]
|
|
26
|
+
np.testing.assert_array_equal(sliced[:], gotitem)
|
|
27
|
+
np.testing.assert_array_equal(gotitem, temp[:10][indices[:10]]) # Equivalent syntax
|
|
28
|
+
# Actually this makes sense since one can understand this as a request to compute on a portion of operands.
|
|
29
|
+
# If one desires a portion of the result, one should compute the whole expression and then slice it.
|
|
30
|
+
|
|
31
|
+
# Get first element for which condition is true
|
|
32
|
+
sliced = expr.compute(idx)
|
|
33
|
+
gotitem = expr[idx]
|
|
34
|
+
# Arrays of one element
|
|
35
|
+
np.testing.assert_array_equal(sliced[()], gotitem)
|
|
36
|
+
np.testing.assert_array_equal(gotitem, temp[idx])
|
|
37
|
+
|
|
38
|
+
# Should return void arrays here.
|
|
39
|
+
sliced = expr.compute(0)
|
|
40
|
+
gotitem = expr[0]
|
|
41
|
+
np.testing.assert_array_equal(sliced[()], gotitem)
|
|
42
|
+
np.testing.assert_array_equal(gotitem, temp[0])
|
|
@@ -507,6 +507,8 @@ cdef extern from "b2nd.h":
|
|
|
507
507
|
int b2nd_squeeze_index(b2nd_array_t *array, const c_bool *index)
|
|
508
508
|
int b2nd_resize(b2nd_array_t *array, const int64_t *new_shape, const int64_t *start)
|
|
509
509
|
int b2nd_copy(b2nd_context_t *ctx, b2nd_array_t *src, b2nd_array_t **array)
|
|
510
|
+
int b2nd_concatenate(b2nd_context_t *ctx, b2nd_array_t *src1, b2nd_array_t *src2,
|
|
511
|
+
int8_t axis, c_bool copy, b2nd_array_t **array)
|
|
510
512
|
int b2nd_from_schunk(blosc2_schunk *schunk, b2nd_array_t **array)
|
|
511
513
|
|
|
512
514
|
void blosc2_unidim_to_multidim(uint8_t ndim, int64_t *shape, int64_t i, int64_t *index)
|
|
@@ -2595,8 +2597,33 @@ cdef class NDArray:
|
|
|
2595
2597
|
|
|
2596
2598
|
|
|
2597
2599
|
cdef b2nd_context_t* create_b2nd_context(shape, chunks, blocks, dtype, kwargs):
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
+
if isinstance(dtype, list) and len(dtype) > 0 and isinstance(dtype[0], tuple):
|
|
2601
|
+
# Extract just the field names and basic dtype info
|
|
2602
|
+
fields = []
|
|
2603
|
+
for field in dtype:
|
|
2604
|
+
name = field[0]
|
|
2605
|
+
field_dtype = field[1]
|
|
2606
|
+
|
|
2607
|
+
# Handle different field formats:
|
|
2608
|
+
# 1. ('name', ('|S10', {'h5py_encoding': 'ascii'})) - h5py style
|
|
2609
|
+
# 2. ('name', '<i4') - standard NumPy style
|
|
2610
|
+
# 3. ('name', '<i4', (shape,)) - NumPy with shape info
|
|
2611
|
+
|
|
2612
|
+
if isinstance(field_dtype, tuple) and len(field_dtype) > 0:
|
|
2613
|
+
# h5py nested representation with metadata dict
|
|
2614
|
+
field_dtype = field_dtype[0]
|
|
2615
|
+
|
|
2616
|
+
# Check if we have shape information as third element
|
|
2617
|
+
if len(field) > 2 and field[2] is not None:
|
|
2618
|
+
# Include the shape information
|
|
2619
|
+
fields.append((name, field_dtype, field[2]))
|
|
2620
|
+
else:
|
|
2621
|
+
fields.append((name, field_dtype))
|
|
2622
|
+
|
|
2623
|
+
dtype = np.dtype(fields)
|
|
2624
|
+
else:
|
|
2625
|
+
dtype = np.dtype(dtype)
|
|
2626
|
+
|
|
2600
2627
|
typesize = dtype.itemsize
|
|
2601
2628
|
if 'cparams' in kwargs:
|
|
2602
2629
|
kwargs['cparams']['typesize'] = typesize
|
|
@@ -2842,3 +2869,26 @@ def schunk_get_slice_nchunks(schunk: SChunk, key):
|
|
|
2842
2869
|
res[i] = chunks_idx[i]
|
|
2843
2870
|
free(chunks_idx)
|
|
2844
2871
|
return res
|
|
2872
|
+
|
|
2873
|
+
|
|
2874
|
+
def concatenate(arr1: NDArray, arr2: NDArray, axis: int, **kwargs):
|
|
2875
|
+
"""
|
|
2876
|
+
Concatenate two NDArray objects along a specified axis.
|
|
2877
|
+
"""
|
|
2878
|
+
cdef c_bool copy = kwargs.pop("copy", True)
|
|
2879
|
+
cdef b2nd_context_t *ctx = create_b2nd_context(arr1.shape, arr1.chunks, arr1.blocks, arr1.dtype, kwargs)
|
|
2880
|
+
if ctx == NULL:
|
|
2881
|
+
raise RuntimeError("Error while creating the context for concatenation")
|
|
2882
|
+
|
|
2883
|
+
cdef b2nd_array_t *array
|
|
2884
|
+
_check_rc(b2nd_concatenate(ctx, arr1.array, arr2.array, axis, copy, &array),
|
|
2885
|
+
"Error while concatenating the arrays")
|
|
2886
|
+
_check_rc(b2nd_free_ctx(ctx), "Error while freeing the context")
|
|
2887
|
+
|
|
2888
|
+
if copy:
|
|
2889
|
+
# We have copied the concatenated data into a new array
|
|
2890
|
+
return blosc2.NDArray(_schunk=PyCapsule_New(array.sc, <char *> "blosc2_schunk*", NULL),
|
|
2891
|
+
_array=PyCapsule_New(array, <char *> "b2nd_array_t*", NULL))
|
|
2892
|
+
else:
|
|
2893
|
+
# Return the first array, which now contains the concatenated data
|
|
2894
|
+
return arr1
|