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.
Files changed (256) hide show
  1. {blosc2-3.3.1 → blosc2-3.3.2}/ANNOUNCE.rst +6 -11
  2. {blosc2-3.3.1 → blosc2-3.3.2}/PKG-INFO +3 -2
  3. {blosc2-3.3.1 → blosc2-3.3.2}/RELEASE_NOTES.md +15 -0
  4. {blosc2-3.3.1 → blosc2-3.3.2}/doc/python-blosc2.rst +1 -1
  5. {blosc2-3.3.1 → blosc2-3.3.2}/pyproject.toml +3 -2
  6. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/core.py +8 -3
  7. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/lazyexpr.py +4 -4
  8. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/ndarray.py +32 -24
  9. blosc2-3.3.2/src/blosc2/version.py +1 -0
  10. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lazyexpr.py +66 -0
  11. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_transpose.py +27 -32
  12. blosc2-3.3.1/src/blosc2/version.py +0 -1
  13. {blosc2-3.3.1 → blosc2-3.3.2}/.gitignore +0 -0
  14. {blosc2-3.3.1 → blosc2-3.3.2}/.guix/modules/python-blosc2-package.scm +0 -0
  15. {blosc2-3.3.1 → blosc2-3.3.2}/.guix-channel +0 -0
  16. {blosc2-3.3.1 → blosc2-3.3.2}/.pre-commit-config.yaml +0 -0
  17. {blosc2-3.3.1 → blosc2-3.3.2}/CMakeLists.txt +0 -0
  18. {blosc2-3.3.1 → blosc2-3.3.2}/CONTRIBUTING.rst +0 -0
  19. {blosc2-3.3.1 → blosc2-3.3.2}/LICENSE.txt +0 -0
  20. {blosc2-3.3.1 → blosc2-3.3.2}/README.rst +0 -0
  21. {blosc2-3.3.1 → blosc2-3.3.2}/README_DEVELOPERS.md +0 -0
  22. {blosc2-3.3.1 → blosc2-3.3.2}/RELEASING.rst +0 -0
  23. {blosc2-3.3.1 → blosc2-3.3.2}/code_of_conduct.md +0 -0
  24. {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-favicon_32x32.png +0 -0
  25. {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-favicon_64x64.png +0 -0
  26. {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-logo_128.png +0 -0
  27. {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/blosc-logo_256.png +0 -0
  28. {blosc2-3.3.1 → blosc2-3.3.2}/doc/_static/css/custom.css +0 -0
  29. {blosc2-3.3.1 → blosc2-3.3.2}/doc/conf.py +0 -0
  30. {blosc2-3.3.1 → blosc2-3.3.2}/doc/development/code-of-conduct.rst +0 -0
  31. {blosc2-3.3.1 → blosc2-3.3.2}/doc/development/contributing.rst +0 -0
  32. {blosc2-3.3.1 → blosc2-3.3.2}/doc/development/index.rst +0 -0
  33. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/index.rst +0 -0
  34. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/installation.rst +0 -0
  35. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/overview.rst +0 -0
  36. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/01.ndarray-basics.ipynb +0 -0
  37. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/02.lazyarray-expressions.ipynb +0 -0
  38. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/03.lazyarray-udf.ipynb +0 -0
  39. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/04.reductions.ipynb +0 -0
  40. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/05.persistent-reductions.ipynb +0 -0
  41. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/06.remote_proxy.ipynb +0 -0
  42. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/07.schunk-basics.ipynb +0 -0
  43. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/08.schunk-slicing_and_beyond.ipynb +0 -0
  44. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/10.ucodecs-ufilters.ipynb +0 -0
  45. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/11.prefilters.ipynb +0 -0
  46. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/12.postfilters.ipynb +0 -0
  47. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/blosc2-pipeline.png +0 -0
  48. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/blosc2-pipeline.svg +0 -0
  49. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/lazyexpr-broadcast.png +0 -0
  50. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/3D-cube-plane.png +0 -0
  51. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/3D-cube.png +0 -0
  52. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/memory-access-2D-x.png +0 -0
  53. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/reductions/memory-access-2D-y.png +0 -0
  54. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/remote_proxy.png +0 -0
  55. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/backward.png +0 -0
  56. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/backward.svg +0 -0
  57. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.png +0 -0
  58. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder.svg +0 -0
  59. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.png +0 -0
  60. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/decoder2.svg +0 -0
  61. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.png +0 -0
  62. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder.svg +0 -0
  63. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.png +0 -0
  64. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/encoder2.svg +0 -0
  65. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/forward.png +0 -0
  66. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials/images/ucodecs-filters/forward.svg +0 -0
  67. {blosc2-3.3.1 → blosc2-3.3.2}/doc/getting_started/tutorials.rst +0 -0
  68. {blosc2-3.3.1 → blosc2-3.3.2}/doc/index.rst +0 -0
  69. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/array_operations.rst +0 -0
  70. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__getitem__.rst +0 -0
  71. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__init__.rst +0 -0
  72. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__len__.rst +0 -0
  73. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.__setitem__.rst +0 -0
  74. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.append_data.rst +0 -0
  75. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.decompress_chunk.rst +0 -0
  76. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.delete_chunk.rst +0 -0
  77. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.fill_special.rst +0 -0
  78. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.filler.rst +0 -0
  79. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.get_chunk.rst +0 -0
  80. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.get_slice.rst +0 -0
  81. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.insert_chunk.rst +0 -0
  82. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.insert_data.rst +0 -0
  83. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.iterchunks.rst +0 -0
  84. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.iterchunks_info.rst +0 -0
  85. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.postfilter.rst +0 -0
  86. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.prefilter.rst +0 -0
  87. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.remove_postfilter.rst +0 -0
  88. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.remove_prefilter.rst +0 -0
  89. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.to_cframe.rst +0 -0
  90. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.update_chunk.rst +0 -0
  91. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/autofiles/schunk/blosc2.schunk.SChunk.update_data.rst +0 -0
  92. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/c2array.rst +0 -0
  93. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/classes.rst +0 -0
  94. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/decorators.rst +0 -0
  95. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/index.rst +0 -0
  96. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/lazy_functions.rst +0 -0
  97. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/lazyarray.rst +0 -0
  98. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/linear_algebra.rst +0 -0
  99. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/low_level.rst +0 -0
  100. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/ndarray.rst +0 -0
  101. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/ndfield.rst +0 -0
  102. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/proxy.rst +0 -0
  103. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/proxyndsource.rst +0 -0
  104. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/proxysource.rst +0 -0
  105. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/reduction_functions.rst +0 -0
  106. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/save_load.rst +0 -0
  107. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/schunk.rst +0 -0
  108. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/storage.rst +0 -0
  109. {blosc2-3.3.1 → blosc2-3.3.2}/doc/reference/utilities.rst +0 -0
  110. {blosc2-3.3.1 → blosc2-3.3.2}/doc/release_notes/index.md +0 -0
  111. {blosc2-3.3.1 → blosc2-3.3.2}/examples/btune.py +0 -0
  112. {blosc2-3.3.1 → blosc2-3.3.2}/examples/c2array-get-slice.py +0 -0
  113. {blosc2-3.3.1 → blosc2-3.3.2}/examples/compress2_decompress2.py +0 -0
  114. {blosc2-3.3.1 → blosc2-3.3.2}/examples/compress_decompress.py +0 -0
  115. {blosc2-3.3.1 → blosc2-3.3.2}/examples/filler.py +0 -0
  116. {blosc2-3.3.1 → blosc2-3.3.2}/examples/gil.py +0 -0
  117. {blosc2-3.3.1 → blosc2-3.3.2}/examples/mmap-rw.py +0 -0
  118. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/arange-constructor.py +0 -0
  119. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/asarray_.py +0 -0
  120. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/broadcast_expr.py +0 -0
  121. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/buffer.py +0 -0
  122. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/bytedelta_filter.py +0 -0
  123. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/c2array_expr.py +0 -0
  124. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_expr.py +0 -0
  125. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_fields.py +0 -0
  126. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_udf_numba.py +0 -0
  127. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/compute_where.py +0 -0
  128. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/copy_.py +0 -0
  129. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/empty_.py +0 -0
  130. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/eye-constructor.py +0 -0
  131. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/filter_sort_fields.py +0 -0
  132. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/formats.py +0 -0
  133. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/fromiter-constructor.py +0 -0
  134. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/general_expressions.py +0 -0
  135. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/getitem.py +0 -0
  136. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/iterchunks_info.py +0 -0
  137. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/jit-expr.py +0 -0
  138. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/jit-numpy-funcs.py +0 -0
  139. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/jit-reduc.py +0 -0
  140. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/linspace-constructor.py +0 -0
  141. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/lists-vs-bools-idx.py +0 -0
  142. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/meta.py +0 -0
  143. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/ndarray_copy.py +0 -0
  144. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/ndmean.py +0 -0
  145. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/persistency.py +0 -0
  146. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/proxy-carray.py +0 -0
  147. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/proxy-ndarray.py +0 -0
  148. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_and_enlarge.py +0 -0
  149. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_expr.py +0 -0
  150. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_expr_save.py +0 -0
  151. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/reduce_string_expr.py +0 -0
  152. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/resize_.py +0 -0
  153. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/work_with_numpy.py +0 -0
  154. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ndarray/zfp_codec.py +0 -0
  155. {blosc2-3.3.1 → blosc2-3.3.2}/examples/pack_array.py +0 -0
  156. {blosc2-3.3.1 → blosc2-3.3.2}/examples/pack_tensor.py +0 -0
  157. {blosc2-3.3.1 → blosc2-3.3.2}/examples/postfilter1.py +0 -0
  158. {blosc2-3.3.1 → blosc2-3.3.2}/examples/postfilter2.py +0 -0
  159. {blosc2-3.3.1 → blosc2-3.3.2}/examples/postfilter3.py +0 -0
  160. {blosc2-3.3.1 → blosc2-3.3.2}/examples/prefilter.py +0 -0
  161. {blosc2-3.3.1 → blosc2-3.3.2}/examples/save_tensor.py +0 -0
  162. {blosc2-3.3.1 → blosc2-3.3.2}/examples/schunk.py +0 -0
  163. {blosc2-3.3.1 → blosc2-3.3.2}/examples/schunk_roundtrip.py +0 -0
  164. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ucodecs.py +0 -0
  165. {blosc2-3.3.1 → blosc2-3.3.2}/examples/ufilters.py +0 -0
  166. {blosc2-3.3.1 → blosc2-3.3.2}/examples/vlmeta.py +0 -0
  167. {blosc2-3.3.1 → blosc2-3.3.2}/generate_version.py +0 -0
  168. {blosc2-3.3.1 → blosc2-3.3.2}/guix.scm +0 -0
  169. {blosc2-3.3.1 → blosc2-3.3.2}/images/Complete-Write-Read-B2ND.png +0 -0
  170. {blosc2-3.3.1 → blosc2-3.3.2}/images/M1-i386-vs-arm64-pack.png +0 -0
  171. {blosc2-3.3.1 → blosc2-3.3.2}/images/M1-i386-vs-arm64-unpack.png +0 -0
  172. {blosc2-3.3.1 → blosc2-3.3.2}/images/Read-Partial-Slices-B2ND.png +0 -0
  173. {blosc2-3.3.1 → blosc2-3.3.2}/images/b2nd-2level-parts.png +0 -0
  174. {blosc2-3.3.1 → blosc2-3.3.2}/images/eval-expr-full-mem-M2.png +0 -0
  175. {blosc2-3.3.1 → blosc2-3.3.2}/images/eval-expr-scarce-mem-M2.png +0 -0
  176. {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-dask-large.png +0 -0
  177. {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-dask-small.png +0 -0
  178. {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-expr-large.png +0 -0
  179. {blosc2-3.3.1 → blosc2-3.3.2}/images/lazyarray-expr.png +0 -0
  180. {blosc2-3.3.1 → blosc2-3.3.2}/images/linspace-compress.png +0 -0
  181. {blosc2-3.3.1 → blosc2-3.3.2}/images/linspace-decompress.png +0 -0
  182. {blosc2-3.3.1 → blosc2-3.3.2}/images/pack-array-cratios.png +0 -0
  183. {blosc2-3.3.1 → blosc2-3.3.2}/images/reduc-float64-amd.png +0 -0
  184. {blosc2-3.3.1 → blosc2-3.3.2}/images/reduc-float64-log-amd.png +0 -0
  185. {blosc2-3.3.1 → blosc2-3.3.2}/pytest.ini +0 -0
  186. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/__init__.py +0 -0
  187. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/blosc2_ext.pyx +0 -0
  188. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/c2array.py +0 -0
  189. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/helpers.py +0 -0
  190. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/info.py +0 -0
  191. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/proxy.py +0 -0
  192. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/schunk.py +0 -0
  193. {blosc2-3.3.1 → blosc2-3.3.2}/src/blosc2/storage.py +0 -0
  194. {blosc2-3.3.1 → blosc2-3.3.2}/tests/conftest.py +0 -0
  195. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_auto_parts.py +0 -0
  196. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_buffer.py +0 -0
  197. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_c2array_expr.py +0 -0
  198. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_c2array_reductions.py +0 -0
  199. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_c2array_udf.py +0 -0
  200. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_copy.py +0 -0
  201. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_empty.py +0 -0
  202. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_evaluate.py +0 -0
  203. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_full.py +0 -0
  204. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_get_slice_nchunks.py +0 -0
  205. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_getitem.py +0 -0
  206. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_iterchunks_info.py +0 -0
  207. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_jit.py +0 -0
  208. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lazyexpr_fields.py +0 -0
  209. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lazyudf.py +0 -0
  210. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_lossy.py +0 -0
  211. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_matmul.py +0 -0
  212. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_metalayers.py +0 -0
  213. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_mode.py +0 -0
  214. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_nans.py +0 -0
  215. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_ndarray.py +0 -0
  216. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_numpy.py +0 -0
  217. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_persistency.py +0 -0
  218. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_proxy.py +0 -0
  219. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_proxy_c2array.py +0 -0
  220. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_proxy_expr.py +0 -0
  221. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_reductions.py +0 -0
  222. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_resize.py +0 -0
  223. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_setitem.py +0 -0
  224. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_slice.py +0 -0
  225. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_squeeze.py +0 -0
  226. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_struct_dtype.py +0 -0
  227. {blosc2-3.3.1 → blosc2-3.3.2}/tests/ndarray/test_zeros.py +0 -0
  228. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_bytes_array.py +0 -0
  229. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_comp_info.py +0 -0
  230. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_compress2.py +0 -0
  231. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_compression_parameters.py +0 -0
  232. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_compressors.py +0 -0
  233. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_decompress.py +0 -0
  234. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_iterchunks.py +0 -0
  235. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_mmap.py +0 -0
  236. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_open.py +0 -0
  237. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_open_c2array.py +0 -0
  238. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_pathlib.py +0 -0
  239. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_postfilters.py +0 -0
  240. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_prefilters.py +0 -0
  241. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_proxy_schunk.py +0 -0
  242. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_python_blosc.py +0 -0
  243. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk.py +0 -0
  244. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_constructor.py +0 -0
  245. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_delete.py +0 -0
  246. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_get_slice.py +0 -0
  247. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_get_slice_nchunks.py +0 -0
  248. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_insert.py +0 -0
  249. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_set_slice.py +0 -0
  250. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_schunk_update.py +0 -0
  251. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_storage.py +0 -0
  252. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_tensor.py +0 -0
  253. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_ucodecs.py +0 -0
  254. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_ufilters.py +0 -0
  255. {blosc2-3.3.1 → blosc2-3.3.2}/tests/test_vlmeta.py +0 -0
  256. {blosc2-3.3.1 → blosc2-3.3.2}/update_version.py +0 -0
@@ -1,16 +1,11 @@
1
- Announcing Python-Blosc2 3.3.1
1
+ Announcing Python-Blosc2 3.3.2
2
2
  ==============================
3
3
 
4
- In our effort to better adapt to better adapt to the array API
5
- (https://data-apis.org/array-api/latest/), we have introduced
6
- permute_dims() and matrix_transpose() functions, and the .T property.
7
- This replaces to previous transpose() function, which is now deprecated.
8
- See PR #384. Thanks to Ricardo Sales Piquer (@ricardosp4).
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.1
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.11
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.0 released on 2025-04-08!</a>
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.11"
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.1"
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 4 (3 operands + result is a typical situation
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 //= 4
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"] * 2
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 benchs are saying the contrary (> 10% slower), so this needs more investigation
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 = expression
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
- if "storage" in kwargs:
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) if (row + p) < n else n
3879
+ row_end = builtins.min(row + p, n)
3875
3880
  for col in range(0, m, q):
3876
- col_end = (col + q) if (col + q) < m else m
3881
+ col_end = builtins.min(col + q, m)
3877
3882
  for aux in range(0, k, r):
3878
- aux_end = (aux + r) if (aux + r) < k else k
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(arr.ndim)[::-1]
3970
+ axes = tuple(range(ndim))[::-1]
3964
3971
  else:
3965
- axes_transformed = tuple(axis if axis >= 0 else arr.ndim + axis for axis in axes)
3966
- if sorted(axes_transformed) != list(range(arr.ndim)):
3967
- raise ValueError(f"axes {axes} is not a valid permutation of {arr.ndim} dimensions")
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
- chunk_slices = [
3977
- [slice(start, builtins.min(dim, start + chunk)) for start in range(0, dim, chunk)]
3978
- for dim, chunk in zip(arr.shape, arr.chunks, strict=False)
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
- block_counts = [len(s) for s in chunk_slices]
3982
- grid = np.indices(block_counts).reshape(len(block_counts), -1).T
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
- for idx in grid:
3985
- block_slices = tuple(chunk_slices[axis][i] for axis, i in enumerate(idx))
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 shape_1d_chunks_blocks(request):
28
+ def shape_chunks_blocks_1d(request):
28
29
  return request.param
29
30
 
30
31
 
31
32
  @pytest.fixture(
32
33
  params=[
33
- ((3, 3), (2, 2), (1, 1)),
34
+ ((4, 4), (3, 3), (2, 2)),
34
35
  ((12, 11), (7, 5), (6, 2)),
35
- ((1, 5), (1, 4), (1, 3)),
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 shape_2d_chunks_blocks(request):
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, 5, 41), (10, 5, 11)), marks=pytest.mark.heavy),
48
+ pytest.param(((37, 63, 55), (12, 30, 41), (10, 5, 11)), marks=pytest.mark.heavy),
48
49
  ]
49
50
  )
50
- def shape_3d_chunks_blocks(request):
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, 1, 1, 4)),
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 shape_4d_chunks_blocks(request):
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
- at = blosc2.permute_dims(scalar)
83
- nat = np.transpose(scalar)
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 test_1d_transpose(shape_1d_chunks_blocks, dtype_fixture):
89
- shape, chunks, blocks = shape_1d_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 test_2d_transpose(shape_2d_chunks_blocks, dtype_fixture, axes):
104
- shape, chunks, blocks = shape_2d_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 test_3d_transpose(shape_3d_chunks_blocks, dtype_fixture, axes):
119
- shape, chunks, blocks = shape_3d_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 test_4d_transpose(shape_4d_chunks_blocks, dtype_fixture, axes):
134
- shape, chunks, blocks = shape_4d_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(shape_3d_chunks_blocks, dtype, axes):
154
- shape, chunks, blocks = shape_3d_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(shape_3d_chunks_blocks, axes):
180
- shape, chunks, blocks = shape_3d_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(shape_2d_chunks_blocks, dtype_fixture):
232
- shape, chunks, blocks = shape_2d_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