scipy 1.15.3__cp313-cp313-macosx_12_0_arm64.whl → 1.16.0rc2__cp313-cp313-macosx_12_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/.dylibs/libscipy_openblas.dylib +0 -0
- scipy/__config__.py +8 -8
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
- scipy/cluster/_vq.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-313-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-313-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-313-darwin.so +0 -0
- scipy/integrate/_vode.cpython-313-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-313-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-313-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-313-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-313-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-313-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-313-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-313-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-313-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-313-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-313-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-313-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-313-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-313-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-313-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-313-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-313-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-313-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-313-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-313-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-313-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-313-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-313-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-313-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-313-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-313-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-313-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-313-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-313-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-313-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-313-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-313-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-313-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-313-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-313-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-313-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-313-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-313-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-313-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-313-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-313-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-313-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-313-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-313-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-313-darwin.so +0 -0
- scipy/stats/_stats.cpython-313-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-313-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-313-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 +561 -568
- 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-313-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-313-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-313-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
scipy/sparse/_compressed.py
CHANGED
@@ -3,7 +3,6 @@ __all__ = []
|
|
3
3
|
|
4
4
|
from warnings import warn
|
5
5
|
import itertools
|
6
|
-
import operator
|
7
6
|
|
8
7
|
import numpy as np
|
9
8
|
from scipy._lib._util import _prune_array, copy_if_needed
|
@@ -13,12 +12,14 @@ from ._data import _data_matrix, _minmax_mixin
|
|
13
12
|
from . import _sparsetools
|
14
13
|
from ._sparsetools import (get_csr_submatrix, csr_sample_offsets, csr_todense,
|
15
14
|
csr_sample_values, csr_row_index, csr_row_slice,
|
16
|
-
csr_column_index1, csr_column_index2
|
15
|
+
csr_column_index1, csr_column_index2, csr_diagonal,
|
16
|
+
expandptr, csr_has_canonical_format, csr_eliminate_zeros,
|
17
|
+
csr_sum_duplicates, csr_has_sorted_indices, csr_sort_indices,
|
18
|
+
csr_matmat_maxnnz, csr_matmat)
|
17
19
|
from ._index import IndexMixin
|
18
|
-
from ._sputils import (upcast, upcast_char, to_native,
|
19
|
-
getdtype,
|
20
|
-
get_sum_dtype, check_shape, get_index_dtype, broadcast_shapes
|
21
|
-
is_pydata_spmatrix)
|
20
|
+
from ._sputils import (upcast, upcast_char, to_native, isshape,
|
21
|
+
getdtype, isintlike, downcast_intp_index,
|
22
|
+
get_sum_dtype, check_shape, get_index_dtype, broadcast_shapes)
|
22
23
|
|
23
24
|
|
24
25
|
class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
@@ -238,135 +239,6 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
238
239
|
res.eliminate_zeros()
|
239
240
|
return res
|
240
241
|
|
241
|
-
def __eq__(self, other):
|
242
|
-
# Scalar other.
|
243
|
-
if isscalarlike(other):
|
244
|
-
if np.isnan(other):
|
245
|
-
return self.__class__(self.shape, dtype=np.bool_)
|
246
|
-
|
247
|
-
if other == 0:
|
248
|
-
warn("Comparing a sparse matrix with 0 using == is inefficient"
|
249
|
-
", try using != instead.", SparseEfficiencyWarning,
|
250
|
-
stacklevel=3)
|
251
|
-
all_true = self.__class__(np.ones(self.shape, dtype=np.bool_))
|
252
|
-
inv = self._scalar_binopt(other, operator.ne)
|
253
|
-
return all_true - inv
|
254
|
-
else:
|
255
|
-
return self._scalar_binopt(other, operator.eq)
|
256
|
-
# Dense other.
|
257
|
-
elif isdense(other):
|
258
|
-
return self.todense() == other
|
259
|
-
# Pydata sparse other.
|
260
|
-
elif is_pydata_spmatrix(other):
|
261
|
-
return NotImplemented
|
262
|
-
# Sparse other.
|
263
|
-
elif issparse(other):
|
264
|
-
warn("Comparing sparse matrices using == is inefficient, try using"
|
265
|
-
" != instead.", SparseEfficiencyWarning, stacklevel=3)
|
266
|
-
# TODO sparse broadcasting
|
267
|
-
if self.shape != other.shape:
|
268
|
-
return False
|
269
|
-
elif self.format != other.format:
|
270
|
-
other = other.asformat(self.format)
|
271
|
-
res = self._binopt(other, '_ne_')
|
272
|
-
all_true = self.__class__(np.ones(self.shape, dtype=np.bool_))
|
273
|
-
return all_true - res
|
274
|
-
else:
|
275
|
-
return NotImplemented
|
276
|
-
|
277
|
-
def __ne__(self, other):
|
278
|
-
# Scalar other.
|
279
|
-
if isscalarlike(other):
|
280
|
-
if np.isnan(other):
|
281
|
-
warn("Comparing a sparse matrix with nan using != is"
|
282
|
-
" inefficient", SparseEfficiencyWarning, stacklevel=3)
|
283
|
-
all_true = self.__class__(np.ones(self.shape, dtype=np.bool_))
|
284
|
-
return all_true
|
285
|
-
elif other != 0:
|
286
|
-
warn("Comparing a sparse matrix with a nonzero scalar using !="
|
287
|
-
" is inefficient, try using == instead.",
|
288
|
-
SparseEfficiencyWarning, stacklevel=3)
|
289
|
-
all_true = self.__class__(np.ones(self.shape), dtype=np.bool_)
|
290
|
-
inv = self._scalar_binopt(other, operator.eq)
|
291
|
-
return all_true - inv
|
292
|
-
else:
|
293
|
-
return self._scalar_binopt(other, operator.ne)
|
294
|
-
# Dense other.
|
295
|
-
elif isdense(other):
|
296
|
-
return self.todense() != other
|
297
|
-
# Pydata sparse other.
|
298
|
-
elif is_pydata_spmatrix(other):
|
299
|
-
return NotImplemented
|
300
|
-
# Sparse other.
|
301
|
-
elif issparse(other):
|
302
|
-
# TODO sparse broadcasting
|
303
|
-
if self.shape != other.shape:
|
304
|
-
return True
|
305
|
-
elif self.format != other.format:
|
306
|
-
other = other.asformat(self.format)
|
307
|
-
return self._binopt(other, '_ne_')
|
308
|
-
else:
|
309
|
-
return NotImplemented
|
310
|
-
|
311
|
-
def _inequality(self, other, op, op_name, bad_scalar_msg):
|
312
|
-
# Scalar other.
|
313
|
-
if isscalarlike(other):
|
314
|
-
if 0 == other and op_name in ('_le_', '_ge_'):
|
315
|
-
raise NotImplementedError(" >= and <= don't work with 0.")
|
316
|
-
elif op(0, other):
|
317
|
-
warn(bad_scalar_msg, SparseEfficiencyWarning, stacklevel=3)
|
318
|
-
other_arr = np.empty(self.shape, dtype=np.result_type(other))
|
319
|
-
other_arr.fill(other)
|
320
|
-
other_arr = self.__class__(other_arr)
|
321
|
-
return self._binopt(other_arr, op_name)
|
322
|
-
else:
|
323
|
-
return self._scalar_binopt(other, op)
|
324
|
-
# Dense other.
|
325
|
-
elif isdense(other):
|
326
|
-
return op(self.todense(), other)
|
327
|
-
# Sparse other.
|
328
|
-
elif issparse(other):
|
329
|
-
# TODO sparse broadcasting
|
330
|
-
if self.shape != other.shape:
|
331
|
-
raise ValueError("inconsistent shapes")
|
332
|
-
elif self.format != other.format:
|
333
|
-
other = other.asformat(self.format)
|
334
|
-
if op_name not in ('_ge_', '_le_'):
|
335
|
-
return self._binopt(other, op_name)
|
336
|
-
|
337
|
-
warn("Comparing sparse matrices using >= and <= is inefficient, "
|
338
|
-
"using <, >, or !=, instead.",
|
339
|
-
SparseEfficiencyWarning, stacklevel=3)
|
340
|
-
all_true = self.__class__(np.ones(self.shape, dtype=np.bool_))
|
341
|
-
res = self._binopt(other, '_gt_' if op_name == '_le_' else '_lt_')
|
342
|
-
return all_true - res
|
343
|
-
else:
|
344
|
-
return NotImplemented
|
345
|
-
|
346
|
-
def __lt__(self, other):
|
347
|
-
return self._inequality(other, operator.lt, '_lt_',
|
348
|
-
"Comparing a sparse matrix with a scalar "
|
349
|
-
"greater than zero using < is inefficient, "
|
350
|
-
"try using >= instead.")
|
351
|
-
|
352
|
-
def __gt__(self, other):
|
353
|
-
return self._inequality(other, operator.gt, '_gt_',
|
354
|
-
"Comparing a sparse matrix with a scalar "
|
355
|
-
"less than zero using > is inefficient, "
|
356
|
-
"try using <= instead.")
|
357
|
-
|
358
|
-
def __le__(self, other):
|
359
|
-
return self._inequality(other, operator.le, '_le_',
|
360
|
-
"Comparing a sparse matrix with a scalar "
|
361
|
-
"greater than zero using <= is inefficient, "
|
362
|
-
"try using > instead.")
|
363
|
-
|
364
|
-
def __ge__(self, other):
|
365
|
-
return self._inequality(other, operator.ge, '_ge_',
|
366
|
-
"Comparing a sparse matrix with a scalar "
|
367
|
-
"less than zero using >= is inefficient, "
|
368
|
-
"try using < instead.")
|
369
|
-
|
370
242
|
#################################
|
371
243
|
# Arithmetic operator overrides #
|
372
244
|
#################################
|
@@ -388,12 +260,9 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
388
260
|
def _sub_sparse(self, other):
|
389
261
|
return self._binopt(other, '_minus_')
|
390
262
|
|
391
|
-
def
|
392
|
-
"""
|
393
|
-
#
|
394
|
-
if isscalarlike(other):
|
395
|
-
return self._mul_scalar(other)
|
396
|
-
# Sparse matrix or vector.
|
263
|
+
def _multiply_2d_with_broadcasting(self, other):
|
264
|
+
"""Element-wise multiplication by array/matrix, vector, or scalar."""
|
265
|
+
# Called after checking that other is not scalarlike and self.ndim <=2
|
397
266
|
if issparse(other):
|
398
267
|
if self.shape == other.shape:
|
399
268
|
other = self.__class__(other)
|
@@ -437,7 +306,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
437
306
|
if sN == 1 and sM == oM:
|
438
307
|
new_self = _make_diagonal_csr(self.toarray().ravel(), is_array)
|
439
308
|
return new_self._matmul_sparse(other)
|
440
|
-
raise ValueError("inconsistent shapes")
|
309
|
+
raise ValueError(f"inconsistent shapes {self.shape} and {other.shape}")
|
441
310
|
|
442
311
|
# Assume other is a dense matrix/array, which produces a single-item
|
443
312
|
# object array if other isn't convertible to ndarray.
|
@@ -473,7 +342,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
473
342
|
elif other2d.shape[1] == self.shape[-1]: # Dense 2d matrix.
|
474
343
|
data = np.multiply(ret.data, other2d[:, ret.col])
|
475
344
|
else:
|
476
|
-
raise ValueError("inconsistent shapes")
|
345
|
+
raise ValueError(f"inconsistent shapes {self.shape} and {other.shape}")
|
477
346
|
idx_dtype = self._get_index_dtype(ret.col,
|
478
347
|
maxval=ret.nnz * other2d.shape[0])
|
479
348
|
row = np.repeat(np.arange(other2d.shape[0], dtype=idx_dtype), ret.nnz)
|
@@ -490,7 +359,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
490
359
|
elif other2d.shape[0] == self.shape[0]: # Dense 2d array.
|
491
360
|
data = np.multiply(ret.data[:, None], other2d[ret.row])
|
492
361
|
else:
|
493
|
-
raise ValueError("inconsistent shapes")
|
362
|
+
raise ValueError(f"inconsistent shapes {self.shape} and {other.shape}")
|
494
363
|
idx_dtype = self._get_index_dtype(ret.row,
|
495
364
|
maxval=ret.nnz * other2d.shape[1])
|
496
365
|
row = np.repeat(ret.row.astype(idx_dtype, copy=False), other2d.shape[1])
|
@@ -507,7 +376,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
507
376
|
elif other2d.shape[1] == 1 and self.shape[0] == other2d.shape[0]:
|
508
377
|
data = np.multiply(ret.data, other2d[ret.row].ravel())
|
509
378
|
else:
|
510
|
-
raise ValueError("inconsistent shapes")
|
379
|
+
raise ValueError(f"inconsistent shapes {self.shape} and {other.shape}")
|
511
380
|
ret.data = data.view(np.ndarray).ravel()
|
512
381
|
return ret
|
513
382
|
|
@@ -560,39 +429,40 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
560
429
|
new_shape += (N,)
|
561
430
|
faux_shape = (M if self.ndim == 2 else 1, N if o_ndim == 2 else 1)
|
562
431
|
|
563
|
-
major_dim = self._swap((M, N))[0]
|
564
432
|
other = self.__class__(other) # convert to this format
|
433
|
+
index_arrays = (self.indptr, self.indices, other.indptr, other.indices)
|
565
434
|
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
435
|
+
M, N = self._swap((M, N))
|
436
|
+
s, o = self._swap((self, other))
|
437
|
+
|
438
|
+
idx_dtype = self._get_index_dtype(index_arrays)
|
439
|
+
s_indptr = np.asarray(s.indptr, dtype=idx_dtype)
|
440
|
+
s_indices = np.asarray(s.indices, dtype=idx_dtype)
|
441
|
+
o_indptr = np.asarray(o.indptr, dtype=idx_dtype)
|
442
|
+
o_indices = np.asarray(o.indices, dtype=idx_dtype)
|
443
|
+
|
444
|
+
nnz = csr_matmat_maxnnz(M, N, s_indptr, s_indices, o_indptr, o_indices)
|
575
445
|
if nnz == 0:
|
576
446
|
if new_shape == ():
|
577
447
|
return np.array(0, dtype=upcast(self.dtype, other.dtype))
|
578
448
|
return self.__class__(new_shape, dtype=upcast(self.dtype, other.dtype))
|
579
449
|
|
580
|
-
|
581
|
-
|
582
|
-
|
450
|
+
new_idx_dtype = self._get_index_dtype(index_arrays, maxval=nnz)
|
451
|
+
if new_idx_dtype != idx_dtype:
|
452
|
+
idx_dtype = new_idx_dtype
|
453
|
+
s_indptr = np.asarray(s.indptr, dtype=idx_dtype)
|
454
|
+
s_indices = np.asarray(s.indices, dtype=idx_dtype)
|
455
|
+
o_indptr = np.asarray(o.indptr, dtype=idx_dtype)
|
456
|
+
o_indices = np.asarray(o.indices, dtype=idx_dtype)
|
583
457
|
|
584
|
-
indptr = np.empty(
|
458
|
+
indptr = np.empty(M + 1, dtype=idx_dtype)
|
585
459
|
indices = np.empty(nnz, dtype=idx_dtype)
|
586
460
|
data = np.empty(nnz, dtype=upcast(self.dtype, other.dtype))
|
587
461
|
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
np.asarray(other.indptr, dtype=idx_dtype),
|
593
|
-
np.asarray(other.indices, dtype=idx_dtype),
|
594
|
-
other.data,
|
595
|
-
indptr, indices, data)
|
462
|
+
csr_matmat(M, N,
|
463
|
+
s_indptr, s_indices, s.data,
|
464
|
+
o_indptr, o_indices, o.data,
|
465
|
+
indptr, indices, data)
|
596
466
|
|
597
467
|
if new_shape == ():
|
598
468
|
return np.array(data[0])
|
@@ -604,57 +474,17 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
604
474
|
return res
|
605
475
|
|
606
476
|
def diagonal(self, k=0):
|
607
|
-
|
608
|
-
|
477
|
+
M, N = self._swap(self.shape)
|
478
|
+
k, _ = self._swap((k, -k))
|
479
|
+
|
480
|
+
if k <= -M or k >= N:
|
609
481
|
return np.empty(0, dtype=self.data.dtype)
|
610
|
-
|
611
|
-
|
612
|
-
dtype=upcast(self.dtype))
|
613
|
-
fn(k, self.shape[0], self.shape[1], self.indptr, self.indices,
|
614
|
-
self.data, y)
|
482
|
+
y = np.empty(min(M + min(k, 0), N - max(k, 0)), dtype=upcast(self.dtype))
|
483
|
+
csr_diagonal(k, M, N, self.indptr, self.indices, self.data, y)
|
615
484
|
return y
|
616
485
|
|
617
486
|
diagonal.__doc__ = _spbase.diagonal.__doc__
|
618
487
|
|
619
|
-
#####################
|
620
|
-
# Other binary ops #
|
621
|
-
#####################
|
622
|
-
|
623
|
-
def _maximum_minimum(self, other, npop, op_name, dense_check):
|
624
|
-
if isscalarlike(other):
|
625
|
-
if dense_check(other):
|
626
|
-
warn("Taking maximum (minimum) with > 0 (< 0) number results"
|
627
|
-
" to a dense matrix.", SparseEfficiencyWarning,
|
628
|
-
stacklevel=3)
|
629
|
-
other_arr = np.empty(self.shape, dtype=np.asarray(other).dtype)
|
630
|
-
other_arr.fill(other)
|
631
|
-
other_arr = self.__class__(other_arr)
|
632
|
-
return self._binopt(other_arr, op_name)
|
633
|
-
else:
|
634
|
-
self.sum_duplicates()
|
635
|
-
new_data = npop(self.data, np.asarray(other))
|
636
|
-
mat = self.__class__((new_data, self.indices, self.indptr),
|
637
|
-
dtype=new_data.dtype, shape=self.shape)
|
638
|
-
return mat
|
639
|
-
elif isdense(other):
|
640
|
-
return npop(self.todense(), other)
|
641
|
-
elif issparse(other):
|
642
|
-
return self._binopt(other, op_name)
|
643
|
-
else:
|
644
|
-
raise ValueError("Operands not compatible.")
|
645
|
-
|
646
|
-
def maximum(self, other):
|
647
|
-
return self._maximum_minimum(other, np.maximum,
|
648
|
-
'_maximum_', lambda x: np.asarray(x) > 0)
|
649
|
-
|
650
|
-
maximum.__doc__ = _spbase.maximum.__doc__
|
651
|
-
|
652
|
-
def minimum(self, other):
|
653
|
-
return self._maximum_minimum(other, np.minimum,
|
654
|
-
'_minimum_', lambda x: np.asarray(x) < 0)
|
655
|
-
|
656
|
-
minimum.__doc__ = _spbase.minimum.__doc__
|
657
|
-
|
658
488
|
#####################
|
659
489
|
# Reduce operations #
|
660
490
|
#####################
|
@@ -663,8 +493,8 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
663
493
|
"""Sum the array/matrix over the given axis. If the axis is None, sum
|
664
494
|
over both rows and columns, returning a scalar.
|
665
495
|
"""
|
666
|
-
# The _spbase base class already does axis=
|
667
|
-
# so we only do the case axis=
|
496
|
+
# The _spbase base class already does axis=None and major axis efficiently
|
497
|
+
# so we only do the case axis= minor axis
|
668
498
|
if (self.ndim == 2 and not hasattr(self, 'blocksize') and
|
669
499
|
axis in self._swap(((1, -1), (0, -2)))[0]):
|
670
500
|
# faster than multiplication for large minor axis in CSC/CSR
|
@@ -679,7 +509,6 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
679
509
|
|
680
510
|
return ret.sum(axis=(), dtype=dtype, out=out)
|
681
511
|
else:
|
682
|
-
# _spbase handles the situations when axis is in {None, -2, -1, 0, 1}
|
683
512
|
return _spbase.sum(self, axis=axis, dtype=dtype, out=out)
|
684
513
|
|
685
514
|
sum.__doc__ = _spbase.sum.__doc__
|
@@ -1152,7 +981,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1152
981
|
major_dim, minor_dim = self._swap(self.shape)
|
1153
982
|
minor_indices = self.indices
|
1154
983
|
major_indices = np.empty(len(minor_indices), dtype=self.indices.dtype)
|
1155
|
-
|
984
|
+
expandptr(major_dim, self.indptr, major_indices)
|
1156
985
|
coords = self._swap((major_indices, minor_indices))
|
1157
986
|
|
1158
987
|
return self._coo_container(
|
@@ -1190,7 +1019,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1190
1019
|
This is an *in place* operation.
|
1191
1020
|
"""
|
1192
1021
|
M, N = self._swap(self._shape_as_2d)
|
1193
|
-
|
1022
|
+
csr_eliminate_zeros(M, N, self.indptr, self.indices, self.data)
|
1194
1023
|
self.prune() # nnz may have changed
|
1195
1024
|
|
1196
1025
|
@property
|
@@ -1210,10 +1039,10 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1210
1039
|
# not sorted => not canonical
|
1211
1040
|
self._has_canonical_format = False
|
1212
1041
|
elif not hasattr(self, '_has_canonical_format'):
|
1042
|
+
M = len(self.indptr) - 1
|
1213
1043
|
self.has_canonical_format = bool(
|
1214
|
-
|
1215
|
-
|
1216
|
-
)
|
1044
|
+
csr_has_canonical_format(M, self.indptr, self.indices)
|
1045
|
+
)
|
1217
1046
|
return self._has_canonical_format
|
1218
1047
|
|
1219
1048
|
@has_canonical_format.setter
|
@@ -1232,7 +1061,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1232
1061
|
self.sort_indices()
|
1233
1062
|
|
1234
1063
|
M, N = self._swap(self._shape_as_2d)
|
1235
|
-
|
1064
|
+
csr_sum_duplicates(M, N, self.indptr, self.indices, self.data)
|
1236
1065
|
|
1237
1066
|
self.prune() # nnz may have changed
|
1238
1067
|
self.has_canonical_format = True
|
@@ -1247,10 +1076,10 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1247
1076
|
"""
|
1248
1077
|
# first check to see if result was cached
|
1249
1078
|
if not hasattr(self, '_has_sorted_indices'):
|
1079
|
+
M = len(self.indptr) - 1
|
1250
1080
|
self._has_sorted_indices = bool(
|
1251
|
-
|
1252
|
-
|
1253
|
-
)
|
1081
|
+
csr_has_sorted_indices(M, self.indptr, self.indices)
|
1082
|
+
)
|
1254
1083
|
return self._has_sorted_indices
|
1255
1084
|
|
1256
1085
|
@has_sorted_indices.setter
|
@@ -1272,10 +1101,9 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1272
1101
|
def sort_indices(self):
|
1273
1102
|
"""Sort the indices of this array/matrix *in place*
|
1274
1103
|
"""
|
1275
|
-
|
1276
1104
|
if not self.has_sorted_indices:
|
1277
|
-
|
1278
|
-
|
1105
|
+
M = len(self.indptr) - 1
|
1106
|
+
csr_sort_indices(M, self.indptr, self.indices, self.data)
|
1279
1107
|
self.has_sorted_indices = True
|
1280
1108
|
|
1281
1109
|
def prune(self):
|
@@ -1354,7 +1182,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1354
1182
|
other = self.__class__(other)
|
1355
1183
|
|
1356
1184
|
# e.g. csr_plus_csr, csr_minus_csr, etc.
|
1357
|
-
fn = getattr(_sparsetools,
|
1185
|
+
fn = getattr(_sparsetools, "csr" + op + "csr")
|
1358
1186
|
|
1359
1187
|
maxnnz = self.nnz + other.nnz
|
1360
1188
|
idx_dtype = self._get_index_dtype((self.indptr, self.indices,
|
@@ -1369,7 +1197,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1369
1197
|
else:
|
1370
1198
|
data = np.empty(maxnnz, dtype=upcast(self.dtype, other.dtype))
|
1371
1199
|
|
1372
|
-
M, N = self._shape_as_2d
|
1200
|
+
M, N = self._swap(self._shape_as_2d)
|
1373
1201
|
fn(M, N,
|
1374
1202
|
np.asarray(self.indptr, dtype=idx_dtype),
|
1375
1203
|
np.asarray(self.indices, dtype=idx_dtype),
|
@@ -1389,7 +1217,7 @@ class _cs_matrix(_data_matrix, _minmax_mixin, IndexMixin):
|
|
1389
1217
|
Divide this matrix by a second sparse matrix.
|
1390
1218
|
"""
|
1391
1219
|
if other.shape != self.shape:
|
1392
|
-
raise ValueError(
|
1220
|
+
raise ValueError(f"inconsistent shapes {self.shape} and {other.shape}")
|
1393
1221
|
|
1394
1222
|
r = self._binopt(other, '_eldiv_')
|
1395
1223
|
|