scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.whl
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.
- scipy/__config__.py +3 -3
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-313t-darwin.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
- scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
- scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-313t-darwin.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-313t-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-313t-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-313t-darwin.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
- scipy-1.16.0rc2.dist-info/WHEEL +6 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dylib +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
scipy/sparse/__init__.py
CHANGED
@@ -32,6 +32,9 @@ SciPy 2-D sparse array package for numeric data.
|
|
32
32
|
- Sparse arrays use array style *slicing* operations, returning scalars,
|
33
33
|
1D, or 2D sparse arrays. If you need 2D results, use an appropriate index.
|
34
34
|
E.g. ``A[:, i, None]`` or ``A[:, [i]]``.
|
35
|
+
- All index arrays for a given sparse array should be of same dtype.
|
36
|
+
For example, for CSR format, ``indices`` and ``indptr`` should have
|
37
|
+
the same dtype. For COO, each array in `coords` should have same dtype.
|
35
38
|
|
36
39
|
The construction utilities (`eye`, `kron`, `random`, `diags`, etc.)
|
37
40
|
have appropriate replacements (see :ref:`sparse-construction-functions`).
|
@@ -253,7 +256,7 @@ is the same:
|
|
253
256
|
Now we can compute norm of the error with:
|
254
257
|
|
255
258
|
>>> err = norm(x-x_)
|
256
|
-
>>> err < 1e-
|
259
|
+
>>> err < 1e-9
|
257
260
|
True
|
258
261
|
|
259
262
|
It should be small :)
|
@@ -296,6 +299,7 @@ sorted indices are required (e.g., when passing data to other libraries).
|
|
296
299
|
# Nathan Bell, and Jake Vanderplas.
|
297
300
|
|
298
301
|
import warnings as _warnings
|
302
|
+
import importlib as _importlib
|
299
303
|
|
300
304
|
from ._base import *
|
301
305
|
from ._csr import *
|
@@ -311,8 +315,6 @@ from ._matrix import spmatrix
|
|
311
315
|
from ._matrix_io import *
|
312
316
|
from ._sputils import get_index_dtype, safely_cast_index_arrays
|
313
317
|
|
314
|
-
# For backward compatibility with v0.19.
|
315
|
-
from . import csgraph
|
316
318
|
|
317
319
|
# Deprecated namespaces, to be removed in v2.0.0
|
318
320
|
from . import (
|
@@ -320,12 +322,29 @@ from . import (
|
|
320
322
|
lil, sparsetools, sputils
|
321
323
|
)
|
322
324
|
|
323
|
-
|
325
|
+
_submodules = ["csgraph", "linalg"]
|
326
|
+
|
327
|
+
__all__ = [s for s in dir() if not s.startswith('_')] + _submodules
|
324
328
|
|
325
329
|
# Filter PendingDeprecationWarning for np.matrix introduced with numpy 1.15
|
326
330
|
msg = 'the matrix subclass is not the recommended way'
|
327
331
|
_warnings.filterwarnings('ignore', message=msg)
|
328
332
|
|
333
|
+
def __dir__():
|
334
|
+
return __all__
|
335
|
+
|
336
|
+
|
337
|
+
def __getattr__(name):
|
338
|
+
if name in _submodules:
|
339
|
+
return _importlib.import_module(f'scipy.sparse.{name}')
|
340
|
+
else:
|
341
|
+
try:
|
342
|
+
return globals()[name]
|
343
|
+
except KeyError:
|
344
|
+
raise AttributeError(
|
345
|
+
f"Module 'scipy.sparse' has no attribute '{name}'"
|
346
|
+
)
|
347
|
+
|
329
348
|
from scipy._lib._testutils import PytestTester
|
330
349
|
test = PytestTester(__name__)
|
331
350
|
del PytestTester
|
scipy/sparse/_base.py
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
"""Base class for sparse matrices"""
|
2
2
|
|
3
|
+
from warnings import warn
|
4
|
+
import math
|
3
5
|
import numpy as np
|
6
|
+
import operator
|
4
7
|
|
5
8
|
from ._sputils import (asmatrix, check_reshape_kwargs, check_shape,
|
6
|
-
get_sum_dtype, isdense, isscalarlike,
|
7
|
-
matrix, validateaxis, getdtype)
|
9
|
+
get_sum_dtype, isdense, isscalarlike, _todata,
|
10
|
+
matrix, validateaxis, getdtype, is_pydata_spmatrix)
|
11
|
+
from scipy._lib._sparse import SparseABC, issparse
|
8
12
|
|
9
13
|
from ._matrix import spmatrix
|
10
14
|
|
@@ -13,6 +17,7 @@ __all__ = ['isspmatrix', 'issparse', 'sparray',
|
|
13
17
|
|
14
18
|
|
15
19
|
class SparseWarning(Warning):
|
20
|
+
"""General warning for :mod:`scipy.sparse`."""
|
16
21
|
pass
|
17
22
|
|
18
23
|
|
@@ -21,6 +26,9 @@ class SparseFormatWarning(SparseWarning):
|
|
21
26
|
|
22
27
|
|
23
28
|
class SparseEfficiencyWarning(SparseWarning):
|
29
|
+
"""The warning emitted when the operation is
|
30
|
+
inefficient for sparse matrices.
|
31
|
+
"""
|
24
32
|
pass
|
25
33
|
|
26
34
|
|
@@ -58,7 +66,23 @@ _ufuncs_with_fixed_point_at_zero = frozenset([
|
|
58
66
|
MAXPRINT = 50
|
59
67
|
|
60
68
|
|
61
|
-
|
69
|
+
# helper dicts to manipulate comparison operators
|
70
|
+
# We negate operators (with warning) when all implicit values would be True
|
71
|
+
op_neg = {operator.eq: operator.ne, operator.ne: operator.eq,
|
72
|
+
operator.lt: operator.ge, operator.ge: operator.lt,
|
73
|
+
operator.gt: operator.le, operator.le: operator.gt}
|
74
|
+
|
75
|
+
|
76
|
+
# We use symbolic version of operators in warning messages.
|
77
|
+
op_sym = {operator.eq: '==', operator.ge: '>=', operator.le: '<=',
|
78
|
+
operator.ne: '!=', operator.gt: '>', operator.lt: '<'}
|
79
|
+
|
80
|
+
|
81
|
+
# `_spbase` is a subclass of `SparseABC`.
|
82
|
+
# This allows other submodules to check for instances of sparse subclasses
|
83
|
+
# via `scipy._lib._sparse.issparse`, without introducing
|
84
|
+
# an import dependency on `scipy.sparse`.
|
85
|
+
class _spbase(SparseABC):
|
62
86
|
""" This class provides a base class for all sparse arrays. It
|
63
87
|
cannot be instantiated. Most of the work is provided by subclasses.
|
64
88
|
"""
|
@@ -133,7 +157,7 @@ class _spbase:
|
|
133
157
|
|
134
158
|
Parameters
|
135
159
|
----------
|
136
|
-
shape :
|
160
|
+
shape : tuple of ints
|
137
161
|
The new shape should be compatible with the original shape.
|
138
162
|
order : {'C', 'F'}, optional
|
139
163
|
Read the elements using this index order. 'C' means to read and
|
@@ -465,18 +489,94 @@ class _spbase:
|
|
465
489
|
####################################################################
|
466
490
|
|
467
491
|
def multiply(self, other):
|
468
|
-
"""
|
492
|
+
"""Element-wise multiplication by another array/matrix."""
|
469
493
|
if isscalarlike(other):
|
470
494
|
return self._mul_scalar(other)
|
471
|
-
|
495
|
+
|
496
|
+
if self.ndim < 3:
|
497
|
+
return self.tocsr()._multiply_2d_with_broadcasting(other)
|
498
|
+
|
499
|
+
if not (issparse(other) or isdense(other)):
|
500
|
+
# If it's a list or whatever, treat it like an array
|
501
|
+
other_a = np.asanyarray(other)
|
502
|
+
if other_a.ndim == 0 and other_a.dtype == np.object_:
|
503
|
+
# numpy creates a 0d object array if all else fails.
|
504
|
+
# Not interpretable as an array; return NotImplemented so
|
505
|
+
# other's __rmul__ can kick in if that's implemented.
|
506
|
+
return NotImplemented
|
507
|
+
# Allow custom sparse class indicated by attr sparse gh-6520
|
508
|
+
try:
|
509
|
+
other.shape
|
510
|
+
except AttributeError:
|
511
|
+
other = other_a
|
512
|
+
|
513
|
+
if self.shape != other.shape:
|
514
|
+
raise ValueError("inconsistent shapes: >2D multiply() does not yet "
|
515
|
+
"support broadcasting")
|
516
|
+
|
517
|
+
# self is >2D so must be COO
|
518
|
+
if isdense(other):
|
519
|
+
data = np.multiply(self.data, other[self.coords])
|
520
|
+
result = self.copy()
|
521
|
+
result.data = data.view(np.ndarray).ravel()
|
522
|
+
return result
|
523
|
+
|
524
|
+
elif issparse(other):
|
525
|
+
csr_self = self.reshape(1, -1).tocsr()
|
526
|
+
csr_other = other.reshape(1, -1).tocsr()
|
527
|
+
return csr_self._binopt(csr_other, '_elmul_').reshape(self.shape)
|
528
|
+
|
529
|
+
else:
|
530
|
+
# Not scalar, dense or sparse. Return NotImplemented so that
|
531
|
+
# other's __rmul__ can kick in if that's implemented.
|
532
|
+
return NotImplemented
|
533
|
+
|
534
|
+
def _maximum_minimum(self, other, np_op):
|
535
|
+
if not (issparse(other) or isdense(other) or isscalarlike(other)):
|
536
|
+
# If it's a list or whatever, treat it like an array
|
537
|
+
other_a = np.asanyarray(other)
|
538
|
+
if other_a.ndim == 0 and other_a.dtype == np.object_:
|
539
|
+
# numpy creates a 0d object array if all else fails.
|
540
|
+
# We don't know how to handle it either.
|
541
|
+
raise NotImplementedError('maximum or minimum with an unrecognized '
|
542
|
+
'array type is not supported')
|
543
|
+
# Allow custom sparse class indicated by attr sparse gh-6520
|
544
|
+
try:
|
545
|
+
other.shape
|
546
|
+
except AttributeError:
|
547
|
+
other = other_a
|
548
|
+
|
549
|
+
if isscalarlike(other):
|
550
|
+
if np_op(0, other):
|
551
|
+
pos_neg = 'positive' if np_op == np.maximum else 'negative'
|
552
|
+
warn(f"Taking {np_op.__name__} with a {pos_neg} number results in a"
|
553
|
+
" dense matrix.", SparseEfficiencyWarning, stacklevel=3)
|
554
|
+
return self.__class__(np_op(self.toarray(), other))
|
555
|
+
else:
|
556
|
+
csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
|
557
|
+
result = csr_self._scalar_binopt(other, np_op)
|
558
|
+
return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
|
559
|
+
elif isdense(other):
|
560
|
+
return np_op(self.todense(), other)
|
561
|
+
elif issparse(other):
|
562
|
+
if self.shape != other.shape:
|
563
|
+
raise ValueError(f"inconsistent shapes {self.shape=} {other.shape=}")
|
564
|
+
if self.ndim < 3: # shape is same so other.ndim < 3
|
565
|
+
return self.tocsr()._binopt(other, f'_{np_op.__name__}_')
|
566
|
+
csr_self = self.reshape(1, -1).tocsr()
|
567
|
+
csr_other = other.reshape(1, -1).tocsr()
|
568
|
+
result = csr_self._binopt(csr_other, f'_{np_op.__name__}_')
|
569
|
+
return result.tocoo().reshape(self.shape)
|
570
|
+
else:
|
571
|
+
raise ValueError("Operands not compatible.")
|
472
572
|
|
473
573
|
def maximum(self, other):
|
474
574
|
"""Element-wise maximum between this and another array/matrix."""
|
475
|
-
return self.
|
575
|
+
return self._maximum_minimum(other, np.maximum)
|
476
576
|
|
477
577
|
def minimum(self, other):
|
478
578
|
"""Element-wise minimum between this and another array/matrix."""
|
479
|
-
return self.
|
579
|
+
return self._maximum_minimum(other, np.minimum)
|
480
580
|
|
481
581
|
def dot(self, other):
|
482
582
|
"""Ordinary dot product
|
@@ -506,23 +606,96 @@ class _spbase:
|
|
506
606
|
else:
|
507
607
|
return self.tocsr()._broadcast_to(shape, copy)
|
508
608
|
|
609
|
+
def _comparison(self, other, op):
|
610
|
+
# We convert to CSR format and use methods _binopt or _scalar_binopt
|
611
|
+
# If ndim>2 we reshape to 2D, compare and then reshape back to nD
|
612
|
+
if not (issparse(other) or isdense(other) or isscalarlike(other)):
|
613
|
+
if is_pydata_spmatrix(other):
|
614
|
+
# cannot compare with pydata other, but it might compare with us.
|
615
|
+
return NotImplemented
|
616
|
+
# If it's a list or whatever, treat it like an array
|
617
|
+
other_a = np.asanyarray(other)
|
618
|
+
if other_a.ndim == 0 and other_a.dtype == np.object_:
|
619
|
+
# numpy creates a 0d object array if all else fails.
|
620
|
+
# Not interpretable as an array; return NotImplemented so
|
621
|
+
# other's dunder methods can kick in if implemented.
|
622
|
+
return NotImplemented
|
623
|
+
# Allow custom sparse class indicated by attr sparse gh-6520
|
624
|
+
try:
|
625
|
+
other.shape
|
626
|
+
except AttributeError:
|
627
|
+
other = other_a
|
628
|
+
|
629
|
+
if isscalarlike(other):
|
630
|
+
if not op(0, other):
|
631
|
+
if np.isnan(other): # op is not `ne`, so results are all False.
|
632
|
+
return self.__class__(self.shape, dtype=np.bool_)
|
633
|
+
else:
|
634
|
+
csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
|
635
|
+
res = csr_self._scalar_binopt(other, op)
|
636
|
+
return res if self.ndim < 3 else res.tocoo().reshape(self.shape)
|
637
|
+
else:
|
638
|
+
warn(f"Comparing a sparse matrix with {other} using {op_sym[op]} "
|
639
|
+
f"is inefficient. Try using {op_sym[op_neg[op]]} instead.",
|
640
|
+
SparseEfficiencyWarning, stacklevel=3)
|
641
|
+
if np.isnan(other):
|
642
|
+
# op is `ne` cuz op(0, other) and isnan(other). Return all True.
|
643
|
+
return self.__class__(np.ones(self.shape, dtype=np.bool_))
|
644
|
+
|
645
|
+
# op is eq, le, or ge. Use negated op and then negate.
|
646
|
+
csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
|
647
|
+
inv = csr_self._scalar_binopt(other, op_neg[op])
|
648
|
+
all_true = csr_self.__class__(np.ones(csr_self.shape, dtype=np.bool_))
|
649
|
+
result = all_true - inv
|
650
|
+
return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
|
651
|
+
|
652
|
+
elif isdense(other):
|
653
|
+
return op(self.todense(), other)
|
654
|
+
|
655
|
+
elif issparse(other):
|
656
|
+
# TODO sparse broadcasting
|
657
|
+
if self.shape != other.shape:
|
658
|
+
# eq and ne return True or False instead of an array when the shapes
|
659
|
+
# don't match. Numpy doesn't do this. Is this what we want?
|
660
|
+
if op in (operator.eq, operator.ne):
|
661
|
+
return op is operator.ne
|
662
|
+
raise ValueError("inconsistent shape")
|
663
|
+
|
664
|
+
csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
|
665
|
+
csr_other = (other if other.ndim < 3 else other.reshape(1, -1)).tocsr()
|
666
|
+
if not op(0, 0):
|
667
|
+
result = csr_self._binopt(csr_other, f'_{op.__name__}_')
|
668
|
+
return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
|
669
|
+
else:
|
670
|
+
# result will not be sparse. Use negated op and then negate.
|
671
|
+
warn(f"Comparing two sparse matrices using {op_sym[op]} "
|
672
|
+
f"is inefficient. Try using {op_sym[op_neg[op]]} instead.",
|
673
|
+
SparseEfficiencyWarning, stacklevel=3)
|
674
|
+
inv = csr_self._binopt(csr_other, f'_{op_neg[op].__name__}_')
|
675
|
+
all_true = csr_self.__class__(np.ones(csr_self.shape, dtype=np.bool_))
|
676
|
+
result = all_true - inv
|
677
|
+
return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
|
678
|
+
else:
|
679
|
+
# cannot compare with other, but it might compare with us.
|
680
|
+
return NotImplemented
|
681
|
+
|
509
682
|
def __eq__(self, other):
|
510
|
-
return self.
|
683
|
+
return self._comparison(other, operator.eq)
|
511
684
|
|
512
685
|
def __ne__(self, other):
|
513
|
-
return self.
|
686
|
+
return self._comparison(other, operator.ne)
|
514
687
|
|
515
688
|
def __lt__(self, other):
|
516
|
-
return self.
|
689
|
+
return self._comparison(other, operator.lt)
|
517
690
|
|
518
691
|
def __gt__(self, other):
|
519
|
-
return self.
|
692
|
+
return self._comparison(other, operator.gt)
|
520
693
|
|
521
694
|
def __le__(self, other):
|
522
|
-
return self.
|
695
|
+
return self._comparison(other, operator.le)
|
523
696
|
|
524
697
|
def __ge__(self, other):
|
525
|
-
return self.
|
698
|
+
return self._comparison(other, operator.ge)
|
526
699
|
|
527
700
|
def __abs__(self):
|
528
701
|
return abs(self.tocsr())
|
@@ -637,12 +810,12 @@ class _spbase:
|
|
637
810
|
|
638
811
|
# If it's a list or whatever, treat it like an array
|
639
812
|
other_a = np.asanyarray(other)
|
640
|
-
|
641
813
|
if other_a.ndim == 0 and other_a.dtype == np.object_:
|
814
|
+
# numpy creates a 0d object array if all else fails.
|
642
815
|
# Not interpretable as an array; return NotImplemented so that
|
643
816
|
# other's __rmatmul__ can kick in if that's implemented.
|
644
817
|
return NotImplemented
|
645
|
-
|
818
|
+
# Allow custom sparse class indicated by attr sparse gh-6520
|
646
819
|
try:
|
647
820
|
other.shape
|
648
821
|
except AttributeError:
|
@@ -742,6 +915,21 @@ class _spbase:
|
|
742
915
|
####################
|
743
916
|
|
744
917
|
def _divide(self, other, true_divide=False, rdivide=False):
|
918
|
+
# Do we need to continue to support true_divide and divide?
|
919
|
+
if not (issparse(other) or isdense(other) or isscalarlike(other)):
|
920
|
+
# If it's a list or whatever, treat it like an array
|
921
|
+
other_a = np.asanyarray(other)
|
922
|
+
if other_a.ndim == 0 and other_a.dtype == np.object_:
|
923
|
+
# numpy creates a 0d object array if all else fails.
|
924
|
+
# Not interpretable as an array; return NotImplemented so that
|
925
|
+
# other's __rdiv__ can kick in if that's implemented.
|
926
|
+
return NotImplemented
|
927
|
+
# Allow custom sparse class indicated by attr sparse gh-6520
|
928
|
+
try:
|
929
|
+
other.shape
|
930
|
+
except AttributeError:
|
931
|
+
other = other_a
|
932
|
+
|
745
933
|
if isscalarlike(other):
|
746
934
|
if rdivide:
|
747
935
|
if true_divide:
|
@@ -777,12 +965,16 @@ class _spbase:
|
|
777
965
|
if rdivide:
|
778
966
|
return other._divide(self, true_divide, rdivide=False)
|
779
967
|
|
780
|
-
|
968
|
+
csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
|
969
|
+
csr_other = (other if self.ndim < 3 else other.reshape(1, -1)).tocsr()
|
781
970
|
if true_divide and np.can_cast(self.dtype, np.float64):
|
782
|
-
|
971
|
+
result = csr_self.astype(np.float64)._divide_sparse(csr_other)
|
783
972
|
else:
|
784
|
-
|
973
|
+
result = csr_self._divide_sparse(csr_other)
|
974
|
+
return result if self.ndim < 3 else result.reshape(self.shape)
|
785
975
|
else:
|
976
|
+
# not scalar, dense or sparse. Return NotImplemented so
|
977
|
+
# other's __rdiv__ can kick in if that's implemented.
|
786
978
|
return NotImplemented
|
787
979
|
|
788
980
|
def __truediv__(self, other):
|
@@ -1133,44 +1325,44 @@ class _spbase:
|
|
1133
1325
|
numpy.matrix.sum : NumPy's implementation of 'sum' for matrices
|
1134
1326
|
|
1135
1327
|
"""
|
1136
|
-
validateaxis(axis)
|
1328
|
+
axis = validateaxis(axis, ndim=self.ndim)
|
1137
1329
|
|
1138
1330
|
# Mimic numpy's casting.
|
1139
1331
|
res_dtype = get_sum_dtype(self.dtype)
|
1140
1332
|
|
1141
|
-
|
1142
|
-
if axis not in (None, -1, 0):
|
1143
|
-
raise ValueError("axis must be None, -1 or 0")
|
1144
|
-
res = self @ np.ones(self.shape, dtype=res_dtype)
|
1145
|
-
return res.sum(dtype=dtype, out=out)
|
1146
|
-
|
1147
|
-
# We use multiplication by a matrix of ones to achieve this.
|
1148
|
-
# For some sparse array formats more efficient methods are
|
1149
|
-
# possible -- these should override this function.
|
1150
|
-
M, N = self.shape
|
1151
|
-
|
1333
|
+
# Note: all valid 1D axis values are canonically `None`.
|
1152
1334
|
if axis is None:
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
axis += 2
|
1160
|
-
|
1161
|
-
# axis = 0 or 1 now
|
1162
|
-
if axis == 0:
|
1163
|
-
# sum over columns
|
1164
|
-
ret = self._ascontainer(
|
1165
|
-
np.ones((1, M), dtype=res_dtype)
|
1166
|
-
) @ self
|
1335
|
+
if self.nnz == 0:
|
1336
|
+
return np.sum(self._ascontainer([0]), dtype=dtype or res_dtype, out=out)
|
1337
|
+
return np.sum(self._ascontainer(_todata(self)), dtype=dtype, out=out)
|
1338
|
+
elif isspmatrix(self):
|
1339
|
+
# Ensure spmatrix sums stay 2D
|
1340
|
+
new_shape = (1, self.shape[1]) if axis == (0,) else (self.shape[0], 1)
|
1167
1341
|
else:
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1342
|
+
new_shape = tuple(self.shape[i] for i in range(self.ndim) if i not in axis)
|
1343
|
+
|
1344
|
+
if out is None:
|
1345
|
+
# create out array with desired dtype
|
1346
|
+
out = self._ascontainer(np.zeros(new_shape, dtype=dtype or res_dtype))
|
1347
|
+
else:
|
1348
|
+
if out.shape != new_shape:
|
1349
|
+
raise ValueError("out dimensions do not match shape")
|
1350
|
+
|
1351
|
+
if self.ndim > 2:
|
1352
|
+
return self._sum_nd(axis, res_dtype, out)
|
1172
1353
|
|
1173
|
-
|
1354
|
+
# We use multiplication by a matrix of ones to sum.
|
1355
|
+
# For some sparse array formats more efficient methods are
|
1356
|
+
# possible -- these should override this function.
|
1357
|
+
if axis == (0,):
|
1358
|
+
ones = self._ascontainer(np.ones((1, self.shape[0]), dtype=res_dtype))
|
1359
|
+
# sets dtype while loading into out
|
1360
|
+
out[...] = (ones @ self).reshape(new_shape)
|
1361
|
+
else: # axis == (1,)
|
1362
|
+
ones = self._ascontainer(np.ones((self.shape[1], 1), dtype=res_dtype))
|
1363
|
+
# sets dtype while loading into out
|
1364
|
+
out[...] = (self @ ones).reshape(new_shape)
|
1365
|
+
return out
|
1174
1366
|
|
1175
1367
|
def mean(self, axis=None, dtype=None, out=None):
|
1176
1368
|
"""
|
@@ -1209,43 +1401,24 @@ class _spbase:
|
|
1209
1401
|
numpy.matrix.mean : NumPy's implementation of 'mean' for matrices
|
1210
1402
|
|
1211
1403
|
"""
|
1212
|
-
validateaxis(axis)
|
1404
|
+
axis = validateaxis(axis, ndim=self.ndim)
|
1213
1405
|
|
1214
|
-
res_dtype = self.dtype.type
|
1215
1406
|
integral = (np.issubdtype(self.dtype, np.integer) or
|
1216
1407
|
np.issubdtype(self.dtype, np.bool_))
|
1217
1408
|
|
1218
|
-
# output dtype
|
1219
|
-
if dtype is None:
|
1220
|
-
if integral:
|
1221
|
-
res_dtype = np.float64
|
1222
|
-
else:
|
1223
|
-
res_dtype = np.dtype(dtype).type
|
1224
|
-
|
1225
1409
|
# intermediate dtype for summation
|
1226
|
-
inter_dtype = np.float64 if integral else
|
1410
|
+
inter_dtype = np.float64 if integral else self.dtype
|
1227
1411
|
inter_self = self.astype(inter_dtype)
|
1228
1412
|
|
1229
|
-
if self.ndim == 1:
|
1230
|
-
if axis not in (None, -1, 0):
|
1231
|
-
raise ValueError("axis must be None, -1 or 0")
|
1232
|
-
res = inter_self / self.shape[-1]
|
1233
|
-
return res.sum(dtype=res_dtype, out=out)
|
1234
|
-
|
1235
1413
|
if axis is None:
|
1236
|
-
|
1237
|
-
.sum(dtype=res_dtype, out=out)
|
1238
|
-
|
1239
|
-
if axis < 0:
|
1240
|
-
axis += 2
|
1241
|
-
|
1242
|
-
# axis = 0 or 1 now
|
1243
|
-
if axis == 0:
|
1244
|
-
return (inter_self * (1.0 / self.shape[0])).sum(
|
1245
|
-
axis=0, dtype=res_dtype, out=out)
|
1414
|
+
denom = math.prod(self.shape)
|
1246
1415
|
else:
|
1247
|
-
|
1248
|
-
|
1416
|
+
denom = math.prod(self.shape[ax] for ax in axis)
|
1417
|
+
res = (inter_self * (1.0 / denom)).sum(axis=axis, dtype=inter_dtype, out=out)
|
1418
|
+
if dtype is not None and out is None:
|
1419
|
+
return res.astype(dtype, copy=False)
|
1420
|
+
return res
|
1421
|
+
|
1249
1422
|
|
1250
1423
|
def diagonal(self, k=0):
|
1251
1424
|
"""Returns the kth diagonal of the array/matrix.
|
@@ -1381,42 +1554,31 @@ class _spbase:
|
|
1381
1554
|
class sparray:
|
1382
1555
|
"""A namespace class to separate sparray from spmatrix"""
|
1383
1556
|
|
1557
|
+
@classmethod
|
1558
|
+
def __class_getitem__(cls, arg, /):
|
1559
|
+
"""
|
1560
|
+
Return a parametrized wrapper around the `~scipy.sparse.sparray` type.
|
1384
1561
|
|
1385
|
-
|
1386
|
-
|
1562
|
+
.. versionadded:: 1.16.0
|
1387
1563
|
|
1388
|
-
|
1389
|
-
|
1564
|
+
Returns
|
1565
|
+
-------
|
1566
|
+
alias : types.GenericAlias
|
1567
|
+
A parametrized `~scipy.sparse.sparray` type.
|
1390
1568
|
|
1391
|
-
|
1392
|
-
|
1393
|
-
|
1394
|
-
|
1569
|
+
Examples
|
1570
|
+
--------
|
1571
|
+
>>> import numpy as np
|
1572
|
+
>>> from scipy.sparse import coo_array
|
1395
1573
|
|
1396
|
-
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1574
|
+
>>> coo_array[np.int8, tuple[int]]
|
1575
|
+
scipy.sparse._coo.coo_array[numpy.int8, tuple[int]]
|
1576
|
+
"""
|
1577
|
+
from types import GenericAlias
|
1578
|
+
return GenericAlias(cls, arg)
|
1400
1579
|
|
1401
|
-
Notes
|
1402
|
-
-----
|
1403
|
-
Use `isinstance(x, sp.sparse.sparray)` to check between an array or matrix.
|
1404
|
-
Use `a.format` to check the sparse format, e.g. `a.format == 'csr'`.
|
1405
1580
|
|
1406
|
-
|
1407
|
-
--------
|
1408
|
-
>>> import numpy as np
|
1409
|
-
>>> from scipy.sparse import csr_array, csr_matrix, issparse
|
1410
|
-
>>> issparse(csr_matrix([[5]]))
|
1411
|
-
True
|
1412
|
-
>>> issparse(csr_array([[5]]))
|
1413
|
-
True
|
1414
|
-
>>> issparse(np.array([[5]]))
|
1415
|
-
False
|
1416
|
-
>>> issparse(5)
|
1417
|
-
False
|
1418
|
-
"""
|
1419
|
-
return isinstance(x, _spbase)
|
1581
|
+
sparray.__doc__ = _spbase.__doc__
|
1420
1582
|
|
1421
1583
|
|
1422
1584
|
def isspmatrix(x):
|
scipy/sparse/_bsr.py
CHANGED
@@ -172,8 +172,9 @@ class _bsr_base(_cs_matrix, _minmax_mixin):
|
|
172
172
|
|
173
173
|
# check index pointer
|
174
174
|
if (len(self.indptr) != M//R + 1):
|
175
|
-
raise ValueError(
|
176
|
-
|
175
|
+
raise ValueError(
|
176
|
+
f"index pointer size ({len(self.indptr)}) should be ({M//R + 1})"
|
177
|
+
)
|
177
178
|
if (self.indptr[0] != 0):
|
178
179
|
raise ValueError("index pointer should start with 0")
|
179
180
|
|
@@ -190,8 +191,10 @@ class _bsr_base(_cs_matrix, _minmax_mixin):
|
|
190
191
|
# check format validity (more expensive)
|
191
192
|
if self.nnz > 0:
|
192
193
|
if self.indices.max() >= N//C:
|
193
|
-
raise ValueError(
|
194
|
-
|
194
|
+
raise ValueError(
|
195
|
+
f"column index values must be < {N//C}"
|
196
|
+
f" (now max {self.indices.max()})"
|
197
|
+
)
|
195
198
|
if self.indices.min() < 0:
|
196
199
|
raise ValueError("column index values must be >= 0")
|
197
200
|
if np.diff(self.indptr).min() < 0:
|