blosc2 3.3.1__tar.gz → 3.3.2__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.1 → blosc2-3.3.2}/ANNOUNCE.rst +6 -11
- {blosc2-3.3.1 → blosc2-3.3.2}/PKG-INFO +3 -2
- {blosc2-3.3.1 → blosc2-3.3.2}/RELEASE_NOTES.md +15 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/python-blosc2.rst +1 -1
- {blosc2-3.3.1 → blosc2-3.3.2}/pyproject.toml +3 -2
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/core.py +8 -3
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/lazyexpr.py +4 -4
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/ndarray.py +32 -24
- blosc2-3.3.2/src/blosc2/version.py +1 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lazyexpr.py +66 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_transpose.py +27 -32
- blosc2-3.3.1/src/blosc2/version.py +0 -1
- {blosc2-3.3.1 → blosc2-3.3.2}/.gitignore +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/.guix/modules/python-blosc2-package.scm +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/.guix-channel +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/.pre-commit-config.yaml +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/CMakeLists.txt +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/CONTRIBUTING.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/LICENSE.txt +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/README.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/README_DEVELOPERS.md +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/RELEASING.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/code_of_conduct.md +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-favicon_32x32.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-favicon_64x64.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-logo_128.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-logo_256.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/css/custom.css +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/conf.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/development/code-of-conduct.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/development/contributing.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/development/index.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/index.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/installation.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/overview.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/01.ndarray-basics.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/02.lazyarray-expressions.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/03.lazyarray-udf.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/04.reductions.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/05.persistent-reductions.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/06.remote_proxy.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/07.schunk-basics.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/08.schunk-slicing_and_beyond.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/10.ucodecs-ufilters.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/11.prefilters.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/12.postfilters.ipynb +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/blosc2-pipeline.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/blosc2-pipeline.svg +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/lazyexpr-broadcast.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/3D-cube-plane.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/3D-cube.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/memory-access-2D-x.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/memory-access-2D-y.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/remote_proxy.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/backward.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/backward.svg +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.svg +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.svg +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.svg +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.svg +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/forward.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/forward.svg +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/index.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/array_operations.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__getitem__.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__init__.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__len__.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__setitem__.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.append_data.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.decompress_chunk.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.delete_chunk.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.fill_special.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.filler.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.get_chunk.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.get_slice.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.insert_chunk.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.insert_data.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.iterchunks.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.iterchunks_info.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.postfilter.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.prefilter.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.remove_postfilter.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.remove_prefilter.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.to_cframe.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.update_chunk.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.update_data.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/c2array.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/classes.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/decorators.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/index.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/lazy_functions.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/lazyarray.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/linear_algebra.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/low_level.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/ndarray.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/ndfield.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/proxy.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/proxyndsource.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/proxysource.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/reduction_functions.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/save_load.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/schunk.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/storage.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/utilities.rst +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/doc/release_notes/index.md +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/btune.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/c2array-get-slice.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/compress2_decompress2.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/compress_decompress.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/filler.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/gil.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/mmap-rw.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/arange-constructor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/asarray_.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/broadcast_expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/buffer.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/bytedelta_filter.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/c2array_expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_fields.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_udf_numba.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_where.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/copy_.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/empty_.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/eye-constructor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/filter_sort_fields.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/formats.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/fromiter-constructor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/general_expressions.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/getitem.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/iterchunks_info.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/jit-expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/jit-numpy-funcs.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/jit-reduc.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/linspace-constructor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/lists-vs-bools-idx.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/meta.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/ndarray_copy.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/ndmean.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/persistency.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/proxy-carray.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/proxy-ndarray.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_and_enlarge.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_expr_save.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_string_expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/resize_.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/work_with_numpy.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/zfp_codec.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/pack_array.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/pack_tensor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/postfilter1.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/postfilter2.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/postfilter3.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/prefilter.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/save_tensor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/schunk.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/schunk_roundtrip.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ucodecs.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/ufilters.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/examples/vlmeta.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/generate_version.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/guix.scm +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/Complete-Write-Read-B2ND.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/M1-i386-vs-arm64-pack.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/M1-i386-vs-arm64-unpack.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/Read-Partial-Slices-B2ND.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/b2nd-2level-parts.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/eval-expr-full-mem-M2.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/eval-expr-scarce-mem-M2.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-dask-large.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-dask-small.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-expr-large.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-expr.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/linspace-compress.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/linspace-decompress.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/pack-array-cratios.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/reduc-float64-amd.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/images/reduc-float64-log-amd.png +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/pytest.ini +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/__init__.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/blosc2_ext.pyx +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/c2array.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/helpers.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/info.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/proxy.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/schunk.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/storage.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/conftest.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_auto_parts.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_buffer.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_c2array_expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_c2array_reductions.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_c2array_udf.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_copy.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_empty.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_evaluate.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_full.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_get_slice_nchunks.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_getitem.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_iterchunks_info.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_jit.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lazyexpr_fields.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lazyudf.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lossy.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_matmul.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_metalayers.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_mode.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_nans.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_ndarray.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_numpy.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_persistency.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_proxy.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_proxy_c2array.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_proxy_expr.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_reductions.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_resize.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_setitem.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_slice.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_squeeze.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_struct_dtype.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_zeros.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_bytes_array.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_comp_info.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_compress2.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_compression_parameters.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_compressors.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_decompress.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_iterchunks.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_mmap.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_open.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_open_c2array.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_pathlib.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_postfilters.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_prefilters.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_proxy_schunk.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_python_blosc.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_constructor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_delete.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_get_slice.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_get_slice_nchunks.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_insert.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_set_slice.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_update.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_storage.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_tensor.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_ucodecs.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_ufilters.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_vlmeta.py +0 -0
- {blosc2-3.3.1 → blosc2-3.3.2}/update_version.py +0 -0
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
Announcing Python-Blosc2 3.3.
|
|
1
|
+
Announcing Python-Blosc2 3.3.2
|
|
2
2
|
==============================
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
We have also reduced the memory footprint of constructors like ``arange()``,
|
|
11
|
-
``linspace()`` and ``fromiter()`` by a large factor. As an example, a 5 TB
|
|
12
|
-
array of 8-byte floats now uses less than 200 MB of memory instead of
|
|
13
|
-
170 GB previously.
|
|
4
|
+
This is a bugfix release, with some minor optimizations. We fixed
|
|
5
|
+
specially a bug in the determination of chunk shape in constructors
|
|
6
|
+
on CPUs with large L3 cache sizes (like AMD EPYC). We also fixed a
|
|
7
|
+
bug preventing the correct chaining of *string* lazy expressions for
|
|
8
|
+
logical operators (``&``, ``|``, ``^``...).
|
|
14
9
|
|
|
15
10
|
You can think of Python-Blosc2 3.x as an extension of NumPy/numexpr that:
|
|
16
11
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: blosc2
|
|
3
|
-
Version: 3.3.
|
|
3
|
+
Version: 3.3.2
|
|
4
4
|
Summary: A fast & compressed ndarray library with a flexible compute engine.
|
|
5
5
|
Author-Email: Blosc Development Team <blosc@blosc.org>
|
|
6
6
|
Maintainer-Email: Blosc Development Team <blosc@blosc.org>
|
|
@@ -15,12 +15,13 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
15
15
|
Classifier: Operating System :: Microsoft :: Windows
|
|
16
16
|
Classifier: Operating System :: Unix
|
|
17
17
|
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
19
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
20
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
21
22
|
Project-URL: homepage, https://github.com/Blosc/python-blosc2
|
|
22
23
|
Project-URL: documentation, https://www.blosc.org/python-blosc2/python-blosc2.html
|
|
23
|
-
Requires-Python: >=3.
|
|
24
|
+
Requires-Python: >=3.10
|
|
24
25
|
Requires-Dist: numpy>=1.26
|
|
25
26
|
Requires-Dist: ndindex
|
|
26
27
|
Requires-Dist: msgpack
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Release notes
|
|
2
2
|
|
|
3
|
+
## Changes from 3.3.1 to 3.3.2
|
|
4
|
+
|
|
5
|
+
* Fixed a bug in the determination of chunk shape for the `NDArray` constructor.
|
|
6
|
+
This was causing problems when creating `NDArray` instances with a CPU that
|
|
7
|
+
was reporting a L3 cache size close (or exceeding) 2 GB. See PR #392.
|
|
8
|
+
|
|
9
|
+
* Fixed a bug preventing the correct chaining of *string* lazy expressions for
|
|
10
|
+
logical operators (`&`, `|`, `^`...). See PR #391.
|
|
11
|
+
|
|
12
|
+
* More performance optimization for `blosc2.permute_dims`. Thanks to
|
|
13
|
+
Ricardo Sales Piquer (@ricardosp4) for the implementation.
|
|
14
|
+
|
|
15
|
+
* Now, storage defaults (`blosc2.storage_dflts`) are honored, even if no
|
|
16
|
+
`storage=` param is used in constructors.
|
|
17
|
+
|
|
3
18
|
## Changes from 3.3.0 to 3.3.1
|
|
4
19
|
|
|
5
20
|
* In our effort to better adapt to better adapt to the array API
|
|
@@ -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.1 released on 2025-04-20!</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>
|
|
@@ -24,11 +24,12 @@ classifiers = [
|
|
|
24
24
|
"Operating System :: Microsoft :: Windows",
|
|
25
25
|
"Operating System :: Unix",
|
|
26
26
|
"Programming Language :: Python :: 3",
|
|
27
|
+
"Programming Language :: Python :: 3.10",
|
|
27
28
|
"Programming Language :: Python :: 3.11",
|
|
28
29
|
"Programming Language :: Python :: 3.12",
|
|
29
30
|
"Programming Language :: Python :: 3.13",
|
|
30
31
|
]
|
|
31
|
-
requires-python = ">=3.
|
|
32
|
+
requires-python = ">=3.10"
|
|
32
33
|
# Follow guidelines from https://scientific-python.org/specs/spec-0000/
|
|
33
34
|
dependencies = [
|
|
34
35
|
"numpy>=1.26",
|
|
@@ -40,7 +41,7 @@ dependencies = [
|
|
|
40
41
|
"py-cpuinfo; platform_machine != 'wasm32'",
|
|
41
42
|
"requests",
|
|
42
43
|
]
|
|
43
|
-
version = "3.3.
|
|
44
|
+
version = "3.3.2"
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
[project.optional-dependencies]
|
|
@@ -1322,9 +1322,9 @@ def get_chunksize(blocksize, l3_minimum=4 * 2**20, l3_maximum=2**26):
|
|
|
1322
1322
|
if isinstance(l2_cache_size, int) and l3_cache_size > l2_cache_size:
|
|
1323
1323
|
chunksize = l3_cache_size
|
|
1324
1324
|
# When computing expressions, it is convenient to keep chunks for all operands
|
|
1325
|
-
# in L3 cache, so let's divide by
|
|
1325
|
+
# in L3 cache, so let's divide by 5 (4 operands + result is a typical situation
|
|
1326
1326
|
# for moderately complex expressions)
|
|
1327
|
-
chunksize //=
|
|
1327
|
+
chunksize //= 5
|
|
1328
1328
|
|
|
1329
1329
|
# Chunksize should be at least the size of L2
|
|
1330
1330
|
l2_cache_size = cpu_info.get("l2_cache_size", "Not found")
|
|
@@ -1529,7 +1529,7 @@ def compute_chunks_blocks( # noqa: C901
|
|
|
1529
1529
|
# min_blocksize = blosc2.cpu_info["l1_data_cache_size"] * 4
|
|
1530
1530
|
elif platform.system() == "Darwin" and "arm" in platform.machine():
|
|
1531
1531
|
# For Apple Silicon, experiments say we can use 4x the L1 size
|
|
1532
|
-
min_blocksize = blosc2.cpu_info["l1_data_cache_size"] *
|
|
1532
|
+
min_blocksize = blosc2.cpu_info["l1_data_cache_size"] * 4
|
|
1533
1533
|
elif "l1_data_cache_size" in blosc2.cpu_info and isinstance(
|
|
1534
1534
|
blosc2.cpu_info["l1_data_cache_size"], int
|
|
1535
1535
|
):
|
|
@@ -1562,6 +1562,11 @@ def compute_chunks_blocks( # noqa: C901
|
|
|
1562
1562
|
if chunks is None:
|
|
1563
1563
|
blocksize = math.prod(blocks) * itemsize
|
|
1564
1564
|
chunksize = get_chunksize(blocksize)
|
|
1565
|
+
# Make chunksize to be a multiple of the blocksize. This allows for:
|
|
1566
|
+
# 1. Avoid unnecessary padding in chunks
|
|
1567
|
+
# 2. Avoid exceeding the maximum buffer size (see #392)
|
|
1568
|
+
if chunksize % blocksize != 0:
|
|
1569
|
+
chunksize = chunksize // blocksize * blocksize
|
|
1565
1570
|
chunks = compute_partition(chunksize // itemsize, shape, blocks)
|
|
1566
1571
|
|
|
1567
1572
|
return tuple(chunks), tuple(blocks)
|
|
@@ -1481,7 +1481,8 @@ def reduce_slices( # noqa: C901
|
|
|
1481
1481
|
iter_disk = all_ndarray and any_persisted
|
|
1482
1482
|
# Experiments say that iter_disk is faster than the regular path for reductions
|
|
1483
1483
|
# even when all operands are in memory, so no need to check any_persisted
|
|
1484
|
-
# New
|
|
1484
|
+
# New benchmarks are saying the contrary (> 10% slower), so this needs more
|
|
1485
|
+
# investigation
|
|
1485
1486
|
# iter_disk = all_ndarray
|
|
1486
1487
|
else:
|
|
1487
1488
|
# WebAssembly does not support threading, so we cannot use the iter_disk option
|
|
@@ -1919,7 +1920,6 @@ class LazyExpr(LazyArray):
|
|
|
1919
1920
|
if hasattr(value2, "_where_args"):
|
|
1920
1921
|
value2 = value2.compute()
|
|
1921
1922
|
|
|
1922
|
-
self._dtype = infer_dtype(op, value1, value2)
|
|
1923
1923
|
if not isinstance(value1, LazyExpr) and not isinstance(value2, LazyExpr):
|
|
1924
1924
|
# We converted some of the operands to NDArray (where() handling above)
|
|
1925
1925
|
new_operands = {"o0": value1, "o1": value2}
|
|
@@ -2677,8 +2677,8 @@ class LazyExpr(LazyArray):
|
|
|
2677
2677
|
_shape = new_expr.shape
|
|
2678
2678
|
if isinstance(new_expr, blosc2.LazyExpr):
|
|
2679
2679
|
# Restore the original expression and operands
|
|
2680
|
-
new_expr.expression = _expression
|
|
2681
|
-
new_expr.expression_tosave =
|
|
2680
|
+
new_expr.expression = f"({_expression})" # forcibly add parenthesis
|
|
2681
|
+
new_expr.expression_tosave = _expression
|
|
2682
2682
|
new_expr.operands = _operands
|
|
2683
2683
|
new_expr.operands_tosave = operands
|
|
2684
2684
|
else:
|
|
@@ -3624,17 +3624,22 @@ def asarray(array: np.ndarray | blosc2.C2Array, **kwargs: Any) -> NDArray:
|
|
|
3624
3624
|
|
|
3625
3625
|
|
|
3626
3626
|
def _check_ndarray_kwargs(**kwargs): # noqa: C901
|
|
3627
|
-
|
|
3627
|
+
storage = kwargs.get("storage")
|
|
3628
|
+
if storage is not None:
|
|
3628
3629
|
for key in kwargs:
|
|
3629
3630
|
if key in list(blosc2.Storage.__annotations__):
|
|
3630
3631
|
raise AttributeError(
|
|
3631
3632
|
"Cannot pass both `storage` and other kwargs already included in Storage"
|
|
3632
3633
|
)
|
|
3633
|
-
storage = kwargs.get("storage")
|
|
3634
3634
|
if isinstance(storage, blosc2.Storage):
|
|
3635
3635
|
kwargs = {**kwargs, **asdict(storage)}
|
|
3636
3636
|
else:
|
|
3637
3637
|
kwargs = {**kwargs, **storage}
|
|
3638
|
+
else:
|
|
3639
|
+
# Add the default storage values as long as they are not already passed
|
|
3640
|
+
storage_dflts = asdict(blosc2.Storage(urlpath=kwargs.get("urlpath"))) # urlpath can affect defaults
|
|
3641
|
+
not_passed = {k: v for k, v in storage_dflts.items() if k not in kwargs}
|
|
3642
|
+
kwargs = {**kwargs, **not_passed}
|
|
3638
3643
|
|
|
3639
3644
|
supported_keys = [
|
|
3640
3645
|
"chunks",
|
|
@@ -3871,11 +3876,11 @@ def matmul(x1: NDArray, x2: NDArray, **kwargs: Any) -> NDArray:
|
|
|
3871
3876
|
r = x2.chunks[-1]
|
|
3872
3877
|
|
|
3873
3878
|
for row in range(0, n, p):
|
|
3874
|
-
row_end = (row + p
|
|
3879
|
+
row_end = builtins.min(row + p, n)
|
|
3875
3880
|
for col in range(0, m, q):
|
|
3876
|
-
col_end = (col + q
|
|
3881
|
+
col_end = builtins.min(col + q, m)
|
|
3877
3882
|
for aux in range(0, k, r):
|
|
3878
|
-
aux_end = (aux + r
|
|
3883
|
+
aux_end = builtins.min(aux + r, k)
|
|
3879
3884
|
bx1 = x1[row:row_end, aux:aux_end]
|
|
3880
3885
|
bx2 = x2[aux:aux_end, col:col_end]
|
|
3881
3886
|
result[row:row_end, col:col_end] += np.matmul(bx1, bx2)
|
|
@@ -3946,6 +3951,7 @@ def permute_dims(arr: NDArray, axes: tuple[int] | list[int] | None = None, **kwa
|
|
|
3946
3951
|
[[13, 14, 15, 16],
|
|
3947
3952
|
[17, 18, 19, 20],
|
|
3948
3953
|
[21, 22, 23, 24]]])
|
|
3954
|
+
|
|
3949
3955
|
>>> at = blosc2.permute_dims(a, axes=(1, 0, 2))
|
|
3950
3956
|
>>> at[:]
|
|
3951
3957
|
array([[[ 1, 2, 3, 4],
|
|
@@ -3955,37 +3961,39 @@ def permute_dims(arr: NDArray, axes: tuple[int] | list[int] | None = None, **kwa
|
|
|
3955
3961
|
[[ 9, 10, 11, 12],
|
|
3956
3962
|
[21, 22, 23, 24]]])
|
|
3957
3963
|
"""
|
|
3958
|
-
|
|
3959
3964
|
if np.isscalar(arr) or arr.ndim < 2:
|
|
3960
3965
|
return arr
|
|
3961
3966
|
|
|
3967
|
+
ndim = arr.ndim
|
|
3968
|
+
|
|
3962
3969
|
if axes is None:
|
|
3963
|
-
axes = range(
|
|
3970
|
+
axes = tuple(range(ndim))[::-1]
|
|
3964
3971
|
else:
|
|
3965
|
-
|
|
3966
|
-
if sorted(
|
|
3967
|
-
raise ValueError(f"axes {axes} is not a valid permutation of {
|
|
3968
|
-
axes = axes_transformed
|
|
3972
|
+
axes = tuple(axis if axis >= 0 else ndim + axis for axis in axes)
|
|
3973
|
+
if sorted(axes) != list(range(ndim)):
|
|
3974
|
+
raise ValueError(f"axes {axes} is not a valid permutation of {ndim} dimensions")
|
|
3969
3975
|
|
|
3970
3976
|
new_shape = tuple(arr.shape[axis] for axis in axes)
|
|
3971
|
-
if "chunks" not in kwargs:
|
|
3977
|
+
if "chunks" not in kwargs or kwargs["chunks"] is None:
|
|
3972
3978
|
kwargs["chunks"] = tuple(arr.chunks[axis] for axis in axes)
|
|
3973
3979
|
|
|
3974
3980
|
result = blosc2.empty(shape=new_shape, dtype=arr.dtype, **kwargs)
|
|
3975
3981
|
|
|
3976
|
-
|
|
3977
|
-
|
|
3978
|
-
|
|
3979
|
-
|
|
3982
|
+
chunks = arr.chunks
|
|
3983
|
+
shape = arr.shape
|
|
3984
|
+
|
|
3985
|
+
for info in arr.iterchunks_info():
|
|
3986
|
+
coords = info.coords
|
|
3987
|
+
start_stop = [
|
|
3988
|
+
(coord * chunk, builtins.min(chunk * (coord + 1), dim))
|
|
3989
|
+
for coord, chunk, dim in zip(coords, chunks, shape, strict=False)
|
|
3990
|
+
]
|
|
3980
3991
|
|
|
3981
|
-
|
|
3982
|
-
|
|
3992
|
+
src_slice = tuple(slice(start, stop) for start, stop in start_stop)
|
|
3993
|
+
dst_slice = tuple(slice(start_stop[ax][0], start_stop[ax][1]) for ax in axes)
|
|
3983
3994
|
|
|
3984
|
-
|
|
3985
|
-
|
|
3986
|
-
block = arr[block_slices]
|
|
3987
|
-
target_slices = tuple(block_slices[axis] for axis in axes)
|
|
3988
|
-
result[target_slices] = np.transpose(block, axes=axes).copy()
|
|
3995
|
+
transposed = np.transpose(arr[src_slice], axes=axes)
|
|
3996
|
+
result[dst_slice] = np.ascontiguousarray(transposed)
|
|
3989
3997
|
|
|
3990
3998
|
return result
|
|
3991
3999
|
|
|
@@ -4019,7 +4027,7 @@ def transpose(x, **kwargs: Any) -> NDArray:
|
|
|
4019
4027
|
stacklevel=2,
|
|
4020
4028
|
)
|
|
4021
4029
|
|
|
4022
|
-
# If arguments are dimension < 2 they are returned
|
|
4030
|
+
# If arguments are dimension < 2, they are returned
|
|
4023
4031
|
if np.isscalar(x) or x.ndim < 2:
|
|
4024
4032
|
return x
|
|
4025
4033
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.3.2"
|
|
@@ -1220,6 +1220,10 @@ def test_dtype_infer(dtype1, dtype2, scalar):
|
|
|
1220
1220
|
np.testing.assert_allclose(res, nres)
|
|
1221
1221
|
assert res.dtype == nres.dtype
|
|
1222
1222
|
|
|
1223
|
+
# Check dtype not changed by expression creation (bug fix)
|
|
1224
|
+
assert a.dtype == dtype1
|
|
1225
|
+
assert b.dtype == dtype2
|
|
1226
|
+
|
|
1223
1227
|
|
|
1224
1228
|
@pytest.mark.parametrize(
|
|
1225
1229
|
"cfunc", ["np.int8", "np.int16", "np.int32", "np.int64", "np.float32", "np.float64"]
|
|
@@ -1323,6 +1327,8 @@ def test_missing_operator():
|
|
|
1323
1327
|
assert expr2.operands["a"] is not None
|
|
1324
1328
|
assert expr2.operands["b"] is None
|
|
1325
1329
|
# Check that the expression is still there, and can be introspected
|
|
1330
|
+
# Note the added parentheses. The parser automatically adds these,
|
|
1331
|
+
# mainly because of possible operator precedence issues in nested expressions.
|
|
1326
1332
|
assert expr2.expression == "a + b"
|
|
1327
1333
|
# Check that dtype and shape are None
|
|
1328
1334
|
assert expr2.dtype is None
|
|
@@ -1330,3 +1336,63 @@ def test_missing_operator():
|
|
|
1330
1336
|
# Clean up
|
|
1331
1337
|
blosc2.remove_urlpath("a.b2nd")
|
|
1332
1338
|
blosc2.remove_urlpath("expr.b2nd")
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
# Test the chaining of multiple lazy expressions
|
|
1342
|
+
def test_chain_expressions():
|
|
1343
|
+
N = 1_000
|
|
1344
|
+
dtype = "float64"
|
|
1345
|
+
a = blosc2.linspace(0, 1, N * N, dtype=dtype, shape=(N, N))
|
|
1346
|
+
b = blosc2.linspace(1, 2, N * N, dtype=dtype, shape=(N, N))
|
|
1347
|
+
c = blosc2.linspace(0, 1, N, dtype=dtype, shape=(N,))
|
|
1348
|
+
|
|
1349
|
+
le1 = a**3 + blosc2.sin(a**2)
|
|
1350
|
+
le2 = le1 < c
|
|
1351
|
+
le3 = le2 & (b < 0)
|
|
1352
|
+
le1_ = blosc2.lazyexpr("a ** 3 + sin(a ** 2)", {"a": a})
|
|
1353
|
+
le2_ = blosc2.lazyexpr("(le1 < c)", {"le1": le1_, "c": c})
|
|
1354
|
+
le3_ = blosc2.lazyexpr("(le2 & (b < 0))", {"le2": le2_, "b": b})
|
|
1355
|
+
assert (le3_[:] == le3[:]).all()
|
|
1356
|
+
|
|
1357
|
+
# TODO: This test should pass eventually
|
|
1358
|
+
# le1 = a ** 3 + blosc2.sin(a ** 2)
|
|
1359
|
+
# le2 = le1 < c
|
|
1360
|
+
# le3 = (b < 0)
|
|
1361
|
+
# le4 = le2 & le3
|
|
1362
|
+
# le1_ = blosc2.lazyexpr("a ** 3 + sin(a ** 2)", {"a": a})
|
|
1363
|
+
# le2_ = blosc2.lazyexpr("(le1 < c)", {"le1": le1_, "c": c})
|
|
1364
|
+
# le3_ = blosc2.lazyexpr("(b < 0)", {"b": b})
|
|
1365
|
+
# le4_ = blosc2.lazyexpr("(le2 & le3)", {"le2": le2_, "le3": le3_})
|
|
1366
|
+
# assert (le4_[:] == le4[:]).all()
|
|
1367
|
+
|
|
1368
|
+
|
|
1369
|
+
# TODO: Test the chaining of multiple persistent lazy expressions
|
|
1370
|
+
# def test_chain_persistentexpressions():
|
|
1371
|
+
# N = 1_000
|
|
1372
|
+
# dtype = "float64"
|
|
1373
|
+
# a = blosc2.linspace(0, 1, N * N, dtype=dtype, shape=(N, N), urlpath="a.b2nd", mode="w")
|
|
1374
|
+
# b = blosc2.linspace(1, 2, N * N, dtype=dtype, shape=(N, N), urlpath="b.b2nd", mode="w")
|
|
1375
|
+
# c = blosc2.linspace(0, 1, N, dtype=dtype, shape=(N,), urlpath="c.b2nd", mode="w")
|
|
1376
|
+
#
|
|
1377
|
+
# le1 = a ** 3 + blosc2.sin(a ** 2)
|
|
1378
|
+
# le2 = le1 < c
|
|
1379
|
+
# le3 = (b < 0)
|
|
1380
|
+
# le4 = le2 & le3
|
|
1381
|
+
#
|
|
1382
|
+
# le1_ = blosc2.lazyexpr("a ** 3 + sin(a ** 2)", {"a": a})
|
|
1383
|
+
# le1_.save("expr1.b2nd", mode="w")
|
|
1384
|
+
# myle1 = blosc2.open("expr1.b2nd")
|
|
1385
|
+
#
|
|
1386
|
+
# le2_ = blosc2.lazyexpr("(le1 < c)", {"le1": myle1, "c": c})
|
|
1387
|
+
# le2_.save("expr2.b2nd", mode="w")
|
|
1388
|
+
# myle2 = blosc2.open("expr2.b2nd")
|
|
1389
|
+
#
|
|
1390
|
+
# le3_ = blosc2.lazyexpr("(b < 0)", {"b": b})
|
|
1391
|
+
# le3_.save("expr3.b2nd", mode="w")
|
|
1392
|
+
# myle3 = blosc2.open("expr3.b2nd")
|
|
1393
|
+
#
|
|
1394
|
+
# le4_ = blosc2.lazyexpr("(le2 & le3)", {"le2": myle2, "le3": myle3})
|
|
1395
|
+
# le4_.save("expr4.b2nd", mode="w")
|
|
1396
|
+
# myle4 = blosc2.open("expr4.b2nd")
|
|
1397
|
+
# print((myle4[:] == le4[:]).all())
|
|
1398
|
+
#
|
|
@@ -22,21 +22,22 @@ def dtype_fixture(request):
|
|
|
22
22
|
params=[
|
|
23
23
|
((10,), (5,), None),
|
|
24
24
|
((31,), (14,), (9,)),
|
|
25
|
+
((9,), (4,), (3,)),
|
|
25
26
|
]
|
|
26
27
|
)
|
|
27
|
-
def
|
|
28
|
+
def shape_chunks_blocks_1d(request):
|
|
28
29
|
return request.param
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
@pytest.fixture(
|
|
32
33
|
params=[
|
|
33
|
-
((
|
|
34
|
+
((4, 4), (3, 3), (2, 2)),
|
|
34
35
|
((12, 11), (7, 5), (6, 2)),
|
|
35
|
-
((
|
|
36
|
+
((6, 5), (5, 4), (4, 3)),
|
|
36
37
|
pytest.param(((51, 603), (22, 99), (13, 29)), marks=pytest.mark.heavy),
|
|
37
38
|
]
|
|
38
39
|
)
|
|
39
|
-
def
|
|
40
|
+
def shape_chunks_blocks_2d(request):
|
|
40
41
|
return request.param
|
|
41
42
|
|
|
42
43
|
|
|
@@ -44,21 +45,21 @@ def shape_2d_chunks_blocks(request):
|
|
|
44
45
|
params=[
|
|
45
46
|
((4, 5, 2), (3, 4, 2), (3, 2, 1)),
|
|
46
47
|
((12, 10, 10), (11, 9, 7), (9, 7, 3)),
|
|
47
|
-
pytest.param(((37, 63, 55), (12,
|
|
48
|
+
pytest.param(((37, 63, 55), (12, 30, 41), (10, 5, 11)), marks=pytest.mark.heavy),
|
|
48
49
|
]
|
|
49
50
|
)
|
|
50
|
-
def
|
|
51
|
+
def shape_chunks_blocks_3d(request):
|
|
51
52
|
return request.param
|
|
52
53
|
|
|
53
54
|
|
|
54
55
|
@pytest.fixture(
|
|
55
56
|
params=[
|
|
56
|
-
((3, 3, 5, 7), (2, 3, 2, 4), (1,
|
|
57
|
+
((3, 3, 5, 7), (2, 3, 2, 4), (1, 2, 1, 4)),
|
|
57
58
|
((4, 6, 5, 2), (3, 3, 4, 2), (3, 2, 2, 1)),
|
|
58
59
|
pytest.param(((10, 10, 10, 11), (7, 8, 9, 11), (6, 7, 8, 5)), marks=pytest.mark.heavy),
|
|
59
60
|
]
|
|
60
61
|
)
|
|
61
|
-
def
|
|
62
|
+
def shape_chunks_blocks_4d(request):
|
|
62
63
|
return request.param
|
|
63
64
|
|
|
64
65
|
|
|
@@ -79,14 +80,13 @@ def shape_4d_chunks_blocks(request):
|
|
|
79
80
|
},
|
|
80
81
|
)
|
|
81
82
|
def test_scalars(scalar):
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
np.testing.assert_allclose(at, nat)
|
|
83
|
+
scalar_t = blosc2.permute_dims(scalar)
|
|
84
|
+
np_scalar_t = np.transpose(scalar)
|
|
85
|
+
np.testing.assert_allclose(scalar_t, np_scalar_t)
|
|
86
86
|
|
|
87
87
|
|
|
88
|
-
def
|
|
89
|
-
shape, chunks, blocks =
|
|
88
|
+
def test_1d_permute_dims(shape_chunks_blocks_1d, dtype_fixture):
|
|
89
|
+
shape, chunks, blocks = shape_chunks_blocks_1d
|
|
90
90
|
a = blosc2.linspace(0, 1, shape=shape, chunks=chunks, blocks=blocks, dtype=dtype_fixture)
|
|
91
91
|
at = blosc2.permute_dims(a)
|
|
92
92
|
|
|
@@ -100,8 +100,8 @@ def test_1d_transpose(shape_1d_chunks_blocks, dtype_fixture):
|
|
|
100
100
|
"axes",
|
|
101
101
|
list(permutations([0, 1])),
|
|
102
102
|
)
|
|
103
|
-
def
|
|
104
|
-
shape, chunks, blocks =
|
|
103
|
+
def test_2d_permute_dims(shape_chunks_blocks_2d, dtype_fixture, axes):
|
|
104
|
+
shape, chunks, blocks = shape_chunks_blocks_2d
|
|
105
105
|
a = blosc2.linspace(0, 1, shape=shape, chunks=chunks, blocks=blocks, dtype=dtype_fixture)
|
|
106
106
|
at = blosc2.permute_dims(a, axes=axes)
|
|
107
107
|
|
|
@@ -115,8 +115,8 @@ def test_2d_transpose(shape_2d_chunks_blocks, dtype_fixture, axes):
|
|
|
115
115
|
"axes",
|
|
116
116
|
list(permutations([0, 1, 2])),
|
|
117
117
|
)
|
|
118
|
-
def
|
|
119
|
-
shape, chunks, blocks =
|
|
118
|
+
def test_3d_permute_dims(shape_chunks_blocks_3d, dtype_fixture, axes):
|
|
119
|
+
shape, chunks, blocks = shape_chunks_blocks_3d
|
|
120
120
|
a = blosc2.linspace(0, 1, shape=shape, chunks=chunks, blocks=blocks, dtype=dtype_fixture)
|
|
121
121
|
at = blosc2.permute_dims(a, axes=axes)
|
|
122
122
|
|
|
@@ -130,8 +130,8 @@ def test_3d_transpose(shape_3d_chunks_blocks, dtype_fixture, axes):
|
|
|
130
130
|
"axes",
|
|
131
131
|
list(permutations([0, 1, 2, 3])),
|
|
132
132
|
)
|
|
133
|
-
def
|
|
134
|
-
shape, chunks, blocks =
|
|
133
|
+
def test_4d_permute_dims(shape_chunks_blocks_4d, dtype_fixture, axes):
|
|
134
|
+
shape, chunks, blocks = shape_chunks_blocks_4d
|
|
135
135
|
a = blosc2.linspace(0, 1, shape=shape, chunks=chunks, blocks=blocks, dtype=dtype_fixture)
|
|
136
136
|
at = blosc2.permute_dims(a, axes=axes)
|
|
137
137
|
|
|
@@ -150,8 +150,8 @@ def test_4d_transpose(shape_4d_chunks_blocks, dtype_fixture, axes):
|
|
|
150
150
|
"dtype",
|
|
151
151
|
{np.complex64, np.complex128},
|
|
152
152
|
)
|
|
153
|
-
def test_complex(
|
|
154
|
-
shape, chunks, blocks =
|
|
153
|
+
def test_complex(shape_chunks_blocks_3d, dtype, axes):
|
|
154
|
+
shape, chunks, blocks = shape_chunks_blocks_3d
|
|
155
155
|
real_part = blosc2.linspace(0, 1, shape=shape, chunks=chunks, blocks=blocks, dtype=dtype)
|
|
156
156
|
imag_part = blosc2.linspace(1, 0, shape=shape, chunks=chunks, blocks=blocks, dtype=dtype)
|
|
157
157
|
complex_matrix = real_part + 3j * imag_part
|
|
@@ -176,8 +176,8 @@ def test_complex(shape_3d_chunks_blocks, dtype, axes):
|
|
|
176
176
|
(0, -4, 1),
|
|
177
177
|
],
|
|
178
178
|
)
|
|
179
|
-
def test_invalid_axes_raises(
|
|
180
|
-
shape, chunks, blocks =
|
|
179
|
+
def test_invalid_axes_raises(shape_chunks_blocks_3d, axes):
|
|
180
|
+
shape, chunks, blocks = shape_chunks_blocks_3d
|
|
181
181
|
a = blosc2.linspace(0, 1, shape=shape, chunks=chunks, blocks=blocks)
|
|
182
182
|
|
|
183
183
|
with pytest.raises(ValueError, match="not a valid permutation"):
|
|
@@ -186,11 +186,7 @@ def test_invalid_axes_raises(shape_3d_chunks_blocks, axes):
|
|
|
186
186
|
|
|
187
187
|
@pytest.mark.parametrize(
|
|
188
188
|
"shape",
|
|
189
|
-
[
|
|
190
|
-
(2, 3),
|
|
191
|
-
(4, 5, 6),
|
|
192
|
-
(2, 4, 8, 5),
|
|
193
|
-
],
|
|
189
|
+
[(2, 3), (4, 5, 6), (2, 4, 8, 5), (7, 3, 9, 9, 5)],
|
|
194
190
|
)
|
|
195
191
|
def test_matrix_transpose(shape):
|
|
196
192
|
arr = blosc2.linspace(0, 1, shape=shape)
|
|
@@ -223,13 +219,12 @@ def test_disk():
|
|
|
223
219
|
nc = np.transpose(na)
|
|
224
220
|
|
|
225
221
|
np.testing.assert_allclose(c, nc, rtol=1e-6)
|
|
226
|
-
|
|
227
222
|
blosc2.remove_urlpath("a_test.b2nd")
|
|
228
223
|
blosc2.remove_urlpath("c_test.b2nd")
|
|
229
224
|
|
|
230
225
|
|
|
231
|
-
def test_transpose(
|
|
232
|
-
shape, chunks, blocks =
|
|
226
|
+
def test_transpose(shape_chunks_blocks_2d, dtype_fixture):
|
|
227
|
+
shape, chunks, blocks = shape_chunks_blocks_2d
|
|
233
228
|
a = blosc2.linspace(0, 1, shape=shape, chunks=chunks, blocks=blocks, dtype=dtype_fixture)
|
|
234
229
|
with pytest.warns(DeprecationWarning):
|
|
235
230
|
at = blosc2.transpose(a)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "3.3.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/08.schunk-slicing_and_beyond.ipynb
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/3D-cube-plane.png
RENAMED
|
File without changes
|
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/memory-access-2D-x.png
RENAMED
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/memory-access-2D-y.png
RENAMED
|
File without changes
|
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/backward.png
RENAMED
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/backward.svg
RENAMED
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.png
RENAMED
|
File without changes
|
{blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.svg
RENAMED
|
File without changes
|