scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-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.
Files changed (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-312-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-312-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-312-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
scipy/sparse/_data.py CHANGED
@@ -124,7 +124,7 @@ class _data_matrix(_spbase):
124
124
 
125
125
  data = self._deduped_data()
126
126
  if dtype is not None:
127
- data = data.astype(dtype)
127
+ data = data.astype(dtype, copy=False)
128
128
  return self._with_data(data ** n)
129
129
 
130
130
  ###########################
@@ -172,9 +172,8 @@ class _minmax_mixin:
172
172
  """
173
173
 
174
174
  def _min_or_max_axis(self, axis, min_or_max, explicit):
175
+ # already checked that self.shape[axis] is not zero
175
176
  N = self.shape[axis]
176
- if N == 0:
177
- raise ValueError("zero-size array to reduction operation")
178
177
  M = self.shape[1 - axis]
179
178
  idx_dtype = self._get_index_dtype(maxval=M)
180
179
 
@@ -208,13 +207,9 @@ class _minmax_mixin:
208
207
 
209
208
  def _min_or_max(self, axis, out, min_or_max, explicit):
210
209
  if out is not None:
211
- raise ValueError("Sparse arrays do not support an 'out' parameter.")
210
+ raise ValueError("Sparse min/max does not support an 'out' parameter.")
212
211
 
213
- validateaxis(axis)
214
- if self.ndim == 1:
215
- if axis not in (None, 0, -1):
216
- raise ValueError("axis out of range")
217
- axis = None # avoid calling special axis case. no impact on 1d
212
+ axis = validateaxis(axis, ndim=self.ndim)
218
213
 
219
214
  if axis is None:
220
215
  if 0 in self.shape:
@@ -228,21 +223,15 @@ class _minmax_mixin:
228
223
  m = min_or_max(zero, m)
229
224
  return m
230
225
 
231
- if axis < 0:
232
- axis += 2
233
-
234
- if (axis == 0) or (axis == 1):
235
- return self._min_or_max_axis(axis, min_or_max, explicit)
236
- else:
237
- raise ValueError("axis out of range")
238
-
239
- def _arg_min_or_max_axis(self, axis, argmin_or_argmax, compare, explicit):
240
- if self.shape[axis] == 0:
241
- raise ValueError("Cannot apply the operation along a zero-sized dimension.")
226
+ if any(self.shape[d] == 0 for d in axis):
227
+ raise ValueError("zero-size array to reduction operation")
242
228
 
243
- if axis < 0:
244
- axis += 2
229
+ if self.ndim == 2:
230
+ # note: 2D ensures that len(axis)==1 so we pass in the int axis[0]
231
+ return self._min_or_max_axis(axis[0], min_or_max, explicit)
232
+ return self._min_or_max_axis_nd(axis, min_or_max, explicit)
245
233
 
234
+ def _argminmax_axis(self, axis, argminmax, compare, explicit):
246
235
  zero = self.dtype.type(0)
247
236
 
248
237
  mat = self.tocsc() if axis == 0 else self.tocsr()
@@ -256,7 +245,7 @@ class _minmax_mixin:
256
245
  p, q = mat.indptr[i:i + 2]
257
246
  data = mat.data[p:q]
258
247
  indices = mat.indices[p:q]
259
- extreme_index = argmin_or_argmax(data)
248
+ extreme_index = argminmax(data)
260
249
  extreme_value = data[extreme_index]
261
250
  if explicit:
262
251
  if q - p > 0:
@@ -279,26 +268,31 @@ class _minmax_mixin:
279
268
 
280
269
  return self._ascontainer(ret)
281
270
 
282
- def _arg_min_or_max(self, axis, out, argmin_or_argmax, compare, explicit):
271
+ def _argminmax(self, axis, out, argminmax, compare, explicit):
283
272
  if out is not None:
284
- raise ValueError("Sparse types do not support an 'out' parameter.")
273
+ minmax = "argmin" if argminmax == np.argmin else "argmax"
274
+ raise ValueError(f"Sparse {minmax} does not support an 'out' parameter.")
285
275
 
286
- validateaxis(axis)
287
-
288
- if self.ndim == 1:
289
- if axis not in (None, 0, -1):
290
- raise ValueError("axis out of range")
291
- axis = None # avoid calling special axis case. no impact on 1d
276
+ axis = validateaxis(axis, ndim=self.ndim)
292
277
 
293
278
  if axis is not None:
294
- return self._arg_min_or_max_axis(axis, argmin_or_argmax, compare, explicit)
279
+ if any(self.shape[i] == 0 for i in axis):
280
+ minmax = "argmin" if argminmax == np.argmin else "argmax"
281
+ raise ValueError(f"Cannot apply {minmax} along a zero-sized dimension.")
282
+
283
+ if self.ndim == 2:
284
+ # note: 2D ensures that len(axis)==1 so we pass in the int axis[0]
285
+ return self._argminmax_axis(axis[0], argminmax, compare, explicit)
286
+ return self._argminmax_axis_nd(axis, argminmax, compare, explicit)
295
287
 
296
288
  if 0 in self.shape:
297
- raise ValueError("Cannot apply the operation to an empty matrix.")
289
+ minmax = "argmin" if argminmax == np.argmin else "argmax"
290
+ raise ValueError(f"Cannot apply {minmax} to an empty matrix.")
298
291
 
299
292
  if self.nnz == 0:
300
293
  if explicit:
301
- raise ValueError("Cannot apply the operation to zero matrix "
294
+ minmax = "argmin" if argminmax == np.argmin else "argmax"
295
+ raise ValueError(f"Cannot apply {minmax} to zero matrix "
302
296
  "when explicit=True.")
303
297
  return 0
304
298
 
@@ -306,28 +300,34 @@ class _minmax_mixin:
306
300
  mat = self.tocoo()
307
301
  # Convert to canonical form: no duplicates, sorted indices.
308
302
  mat.sum_duplicates()
309
- extreme_index = argmin_or_argmax(mat.data)
303
+ extreme_index = argminmax(mat.data)
310
304
  if explicit:
311
305
  return extreme_index
312
306
  extreme_value = mat.data[extreme_index]
313
- num_col = mat.shape[-1]
314
307
 
308
+ if mat.ndim > 2:
309
+ mat = mat.reshape(-1)
315
310
  # If the min value is less than zero, or max is greater than zero,
316
311
  # then we do not need to worry about implicit zeros.
317
- if compare(extreme_value, zero):
312
+ # And we use a "cheap test" for the rare case of no implicit zeros.
313
+ maxnnz = math.prod(self.shape)
314
+ if compare(extreme_value, zero) or mat.nnz == maxnnz:
318
315
  # cast to Python int to avoid overflow and RuntimeError
319
- return int(mat.row[extreme_index]) * num_col + int(mat.col[extreme_index])
320
-
321
- # Cheap test for the rare case where we have no implicit zeros.
322
- size = math.prod(self.shape)
323
- if size == mat.nnz:
316
+ if mat.ndim == 1: # includes nD case that was reshaped above
317
+ return int(mat.col[extreme_index])
318
+ # ndim == 2
319
+ num_col = mat.shape[-1]
324
320
  return int(mat.row[extreme_index]) * num_col + int(mat.col[extreme_index])
325
321
 
326
322
  # At this stage, any implicit zero could be the min or max value.
327
323
  # After sum_duplicates(), the `row` and `col` arrays are guaranteed to
328
324
  # be sorted in C-order, which means the linearized indices are sorted.
329
- linear_indices = mat.row * num_col + mat.col
330
- first_implicit_zero_index = _find_missing_index(linear_indices, size)
325
+ if mat.ndim == 1: # includes nD case that was reshaped above
326
+ linear_indices = mat.coords[-1]
327
+ else: # ndim == 2
328
+ num_col = mat.shape[-1]
329
+ linear_indices = mat.row * num_col + mat.col
330
+ first_implicit_zero_index = _find_missing_index(linear_indices, maxnnz)
331
331
  if extreme_value == zero:
332
332
  return min(first_implicit_zero_index, extreme_index)
333
333
  return first_implicit_zero_index
@@ -524,7 +524,7 @@ class _minmax_mixin:
524
524
 
525
525
  explicit : {False, True} optional (default: False)
526
526
  When set to True, only explicitly stored elements will be considered.
527
- If axis is not None and a row/column has no stored elements, argmax
527
+ If axis is not None and an axis has no stored elements, argmax
528
528
  is undefined, so the index ``0`` is returned for that row/column.
529
529
 
530
530
  .. versionadded:: 1.15.0
@@ -534,7 +534,7 @@ class _minmax_mixin:
534
534
  ind : numpy.matrix or int
535
535
  Indices of maximum elements. If matrix, its size along `axis` is 1.
536
536
  """
537
- return self._arg_min_or_max(axis, out, np.argmax, np.greater, explicit)
537
+ return self._argminmax(axis, out, np.argmax, np.greater, explicit)
538
538
 
539
539
  def argmin(self, axis=None, out=None, *, explicit=False):
540
540
  """Return indices of minimum elements along an axis.
@@ -556,7 +556,7 @@ class _minmax_mixin:
556
556
 
557
557
  explicit : {False, True} optional (default: False)
558
558
  When set to True, only explicitly stored elements will be considered.
559
- If axis is not None and a row/column has no stored elements, argmin
559
+ If axis is not None and an axis has no stored elements, argmin
560
560
  is undefined, so the index ``0`` is returned for that row/column.
561
561
 
562
562
  .. versionadded:: 1.15.0
@@ -566,4 +566,4 @@ class _minmax_mixin:
566
566
  ind : numpy.matrix or int
567
567
  Indices of minimum elements. If matrix, its size along `axis` is 1.
568
568
  """
569
- return self._arg_min_or_max(axis, out, np.argmin, np.less, explicit)
569
+ return self._argminmax(axis, out, np.argmin, np.less, explicit)
scipy/sparse/_dia.py CHANGED
@@ -11,9 +11,10 @@ from ._matrix import spmatrix
11
11
  from ._base import issparse, _formats, _spbase, sparray
12
12
  from ._data import _data_matrix
13
13
  from ._sputils import (
14
- isshape, upcast_char, getdtype, get_sum_dtype, validateaxis, check_shape
14
+ isdense, isscalarlike, isshape, upcast_char, getdtype, get_sum_dtype,
15
+ validateaxis, check_shape
15
16
  )
16
- from ._sparsetools import dia_matvec
17
+ from ._sparsetools import dia_matmat, dia_matvec, dia_matvecs
17
18
 
18
19
 
19
20
  class _dia_base(_data_matrix):
@@ -89,10 +90,10 @@ class _dia_base(_data_matrix):
89
90
  raise ValueError('data array must have rank 2')
90
91
 
91
92
  if self.data.shape[0] != len(self.offsets):
92
- raise ValueError('number of diagonals (%d) '
93
- 'does not match the number of offsets (%d)'
94
- % (self.data.shape[0], len(self.offsets)))
95
-
93
+ raise ValueError(
94
+ f'number of diagonals ({self.data.shape[0]}) does not match the number '
95
+ f'of offsets ({len(self.offsets)})'
96
+ )
96
97
  if len(np.unique(self.offsets)) != len(self.offsets):
97
98
  raise ValueError('offset array contains duplicate values')
98
99
 
@@ -142,16 +143,13 @@ class _dia_base(_data_matrix):
142
143
  _getnnz.__doc__ = _spbase._getnnz.__doc__
143
144
 
144
145
  def sum(self, axis=None, dtype=None, out=None):
145
- validateaxis(axis)
146
-
147
- if axis is not None and axis < 0:
148
- axis += 2
146
+ axis = validateaxis(axis)
149
147
 
150
148
  res_dtype = get_sum_dtype(self.dtype)
151
149
  num_rows, num_cols = self.shape
152
150
  ret = None
153
151
 
154
- if axis == 0:
152
+ if axis == (0,):
155
153
  mask = self._data_mask()
156
154
  x = (self.data * mask).sum(axis=0)
157
155
  if x.shape[0] == num_cols:
@@ -161,7 +159,7 @@ class _dia_base(_data_matrix):
161
159
  res[:x.shape[0]] = x
162
160
  ret = self._ascontainer(res, dtype=res_dtype)
163
161
 
164
- else:
162
+ else: # axis is None or (1,)
165
163
  row_sums = np.zeros((num_rows, 1), dtype=res_dtype)
166
164
  one = np.ones(num_cols, dtype=res_dtype)
167
165
  dia_matvec(num_rows, num_cols, len(self.offsets),
@@ -178,14 +176,15 @@ class _dia_base(_data_matrix):
178
176
 
179
177
  sum.__doc__ = _spbase.sum.__doc__
180
178
 
181
- def _add_sparse(self, other):
179
+ def _add_sparse(self, other, sub=False):
182
180
  # If other is not DIA format, let them handle us instead.
183
181
  if not isinstance(other, _dia_base):
184
182
  return other._add_sparse(self)
185
183
 
186
184
  # Fast path for exact equality of the sparsity structure.
187
185
  if np.array_equal(self.offsets, other.offsets):
188
- return self._with_data(self.data + other.data)
186
+ return self._with_data(self.data - other.data if sub else
187
+ self.data + other.data)
189
188
 
190
189
  # Find the union of the offsets (which will be sorted and unique).
191
190
  new_offsets = np.union1d(self.offsets, other.offsets)
@@ -198,26 +197,91 @@ class _dia_base(_data_matrix):
198
197
  # permutation of the existing offsets and the diagonal lengths match.
199
198
  if self_d == other_d and len(new_offsets) == len(self.offsets):
200
199
  new_data = self.data[_invert_index(self_idx)]
201
- new_data[other_idx, :] += other.data
200
+ if sub:
201
+ new_data[other_idx, :] -= other.data
202
+ else:
203
+ new_data[other_idx, :] += other.data
202
204
  elif self_d == other_d and len(new_offsets) == len(other.offsets):
203
- new_data = other.data[_invert_index(other_idx)]
205
+ if sub:
206
+ new_data = -other.data[_invert_index(other_idx)]
207
+ else:
208
+ new_data = other.data[_invert_index(other_idx)]
204
209
  new_data[self_idx, :] += self.data
205
210
  else:
206
211
  # Maximum diagonal length of the result.
207
212
  d = min(self.shape[0] + new_offsets[-1], self.shape[1])
208
213
 
209
- # Add all diagonals to a freshly-allocated data array.
214
+ # Add all diagonals to a freshly allocated data array.
210
215
  new_data = np.zeros(
211
216
  (len(new_offsets), d),
212
217
  dtype=np.result_type(self.data, other.data),
213
218
  )
214
219
  new_data[self_idx, :self_d] += self.data[:, :d]
215
- new_data[other_idx, :other_d] += other.data[:, :d]
220
+ if sub:
221
+ new_data[other_idx, :other_d] -= other.data[:, :d]
222
+ else:
223
+ new_data[other_idx, :other_d] += other.data[:, :d]
216
224
  return self._dia_container((new_data, new_offsets), shape=self.shape)
217
225
 
226
+ def _sub_sparse(self, other):
227
+ # If other is not DIA format, use default handler.
228
+ if not isinstance(other, _dia_base):
229
+ return super()._sub_sparse(other)
230
+
231
+ return self._add_sparse(other, sub=True)
232
+
218
233
  def _mul_scalar(self, other):
219
234
  return self._with_data(self.data * other)
220
235
 
236
+ def multiply(self, other):
237
+ if isscalarlike(other):
238
+ return self._mul_scalar(other)
239
+
240
+ if isdense(other):
241
+ if other.ndim > 2:
242
+ return self.toarray() * other
243
+
244
+ # Use default handler for pathological cases.
245
+ if 0 in self.shape or 1 in self.shape or 0 in other.shape:
246
+ return super().multiply(other)
247
+
248
+ other = np.atleast_2d(other)
249
+ other_rows, other_cols = other.shape
250
+ rows, cols = self.shape
251
+ L = min(self.data.shape[1], cols)
252
+ data = self.data[:, :L].astype(np.result_type(self.data, other))
253
+ if other_rows == 1:
254
+ data *= other[0, :L]
255
+ elif other_rows != rows:
256
+ raise ValueError('inconsistent shapes')
257
+ else:
258
+ j = np.arange(L)
259
+ if L > rows:
260
+ i = (j - self.offsets[:, None]) % rows
261
+ else: # can use faster method
262
+ i = j - self.offsets[:, None] % rows
263
+ if other_cols == 1:
264
+ j = 0
265
+ elif other_cols != cols:
266
+ raise ValueError('inconsistent shapes')
267
+ data *= other[i, j]
268
+ return self._with_data(data)
269
+
270
+ # If other is not DIA format or needs broadcasting (unreasonable
271
+ # use case for DIA anyway), use default handler.
272
+ if not isinstance(other, _dia_base) or other.shape != self.shape:
273
+ return super().multiply(other)
274
+
275
+ # Find common offsets (unique diagonals don't contribute)
276
+ # and indices corresponding to them in multiplicand and multiplier.
277
+ offsets, self_idx, other_idx = \
278
+ np.intersect1d(self.offsets, other.offsets,
279
+ assume_unique=True, return_indices=True)
280
+ # Only overlapping length of diagonals can have non-zero products.
281
+ L = min(self.data.shape[1], other.data.shape[1])
282
+ data = self.data[self_idx, :L] * other.data[other_idx, :L]
283
+ return self._dia_container((data, offsets), shape=self.shape)
284
+
221
285
  def _matmul_vector(self, other):
222
286
  x = other
223
287
 
@@ -233,6 +297,29 @@ class _dia_base(_data_matrix):
233
297
 
234
298
  return y
235
299
 
300
+ def _matmul_multivector(self, other):
301
+ res = np.zeros((self.shape[0], other.shape[1]),
302
+ dtype=np.result_type(self.data, other))
303
+ dia_matvecs(*self.shape, *self.data.shape, self.offsets, self.data,
304
+ other.shape[1], other, res)
305
+ return res
306
+
307
+ def _matmul_sparse(self, other):
308
+ # If other is not DIA format, use default handler.
309
+ if not isinstance(other, _dia_base):
310
+ return super()._matmul_sparse(other)
311
+
312
+ # If any dimension is zero, return empty array immediately.
313
+ if 0 in self.shape or 0 in other.shape:
314
+ return self._dia_container((self.shape[0], other.shape[1]))
315
+
316
+ offsets, data = dia_matmat(*self.shape, *self.data.shape,
317
+ self.offsets, self.data,
318
+ other.shape[1], *other.data.shape,
319
+ other.offsets, other.data)
320
+ return self._dia_container((data.reshape(len(offsets), -1), offsets),
321
+ (self.shape[0], other.shape[1]))
322
+
236
323
  def _setdiag(self, values, k=0):
237
324
  M, N = self.shape
238
325
 
scipy/sparse/_dok.py CHANGED
@@ -5,7 +5,6 @@ __docformat__ = "restructuredtext en"
5
5
  __all__ = ['dok_array', 'dok_matrix', 'isspmatrix_dok']
6
6
 
7
7
  import itertools
8
- from warnings import warn
9
8
  import numpy as np
10
9
 
11
10
  from ._matrix import spmatrix
@@ -421,28 +420,6 @@ class _dok_base(_spbase, IndexMixin, dict):
421
420
 
422
421
  transpose.__doc__ = _spbase.transpose.__doc__
423
422
 
424
- def conjtransp(self):
425
- """DEPRECATED: Return the conjugate transpose.
426
-
427
- .. deprecated:: 1.14.0
428
-
429
- `conjtransp` is deprecated and will be removed in v1.16.0.
430
- Use ``.T.conj()`` instead.
431
- """
432
- msg = ("`conjtransp` is deprecated and will be removed in v1.16.0. "
433
- "Use `.T.conj()` instead.")
434
- warn(msg, DeprecationWarning, stacklevel=2)
435
-
436
- if self.ndim == 1:
437
- new = self.tocoo()
438
- new.data = new.data.conjugate()
439
- return new
440
-
441
- M, N = self.shape
442
- new = self._dok_container((N, M), dtype=self.dtype)
443
- new._dict = {(right, left): np.conj(val) for (left, right), val in self.items()}
444
- return new
445
-
446
423
  def copy(self):
447
424
  new = self._dok_container(self.shape, dtype=self.dtype)
448
425
  new._dict.update(self._dict)
scipy/sparse/_index.py CHANGED
@@ -329,12 +329,12 @@ class IndexMixin:
329
329
  # Check bounds
330
330
  max_indx = x.max()
331
331
  if max_indx >= length:
332
- raise IndexError('index (%d) out of range' % max_indx)
332
+ raise IndexError(f'index ({max_indx}) out of range')
333
333
 
334
334
  min_indx = x.min()
335
335
  if min_indx < 0:
336
336
  if min_indx < -length:
337
- raise IndexError('index (%d) out of range' % min_indx)
337
+ raise IndexError(f'index ({min_indx}) out of range')
338
338
  if x is idx or not x.flags.owndata:
339
339
  x = x.copy()
340
340
  x[x < 0] += length
@@ -346,7 +346,7 @@ class IndexMixin:
346
346
  M, N = self.shape
347
347
  i = int(i)
348
348
  if i < -M or i >= M:
349
- raise IndexError('index (%d) out of range' % i)
349
+ raise IndexError(f'index ({i}) out of range')
350
350
  if i < 0:
351
351
  i += M
352
352
  return self._get_intXslice(i, slice(None))
@@ -357,7 +357,7 @@ class IndexMixin:
357
357
  M, N = self.shape
358
358
  i = int(i)
359
359
  if i < -N or i >= N:
360
- raise IndexError('index (%d) out of range' % i)
360
+ raise IndexError(f'index ({i}) out of range')
361
361
  if i < 0:
362
362
  i += N
363
363
  return self._get_sliceXint(slice(None), i)
scipy/sparse/_matrix.py CHANGED
@@ -144,3 +144,26 @@ class spmatrix:
144
144
  `numpy.matrix` object that shares the same memory.
145
145
  """
146
146
  return super().todense(order, out)
147
+
148
+ @classmethod
149
+ def __class_getitem__(cls, arg, /):
150
+ """
151
+ Return a parametrized wrapper around the `~scipy.sparse.spmatrix` type.
152
+
153
+ .. versionadded:: 1.16.0
154
+
155
+ Returns
156
+ -------
157
+ alias : types.GenericAlias
158
+ A parametrized `~scipy.sparse.spmatrix` type.
159
+
160
+ Examples
161
+ --------
162
+ >>> import numpy as np
163
+ >>> from scipy.sparse import coo_matrix
164
+
165
+ >>> coo_matrix[np.int8]
166
+ scipy.sparse._coo.coo_matrix[numpy.int8]
167
+ """
168
+ from types import GenericAlias
169
+ return GenericAlias(cls, arg)
scipy/sparse/_sputils.py CHANGED
@@ -134,7 +134,7 @@ def getdtype(dtype, a=None, default=None):
134
134
 
135
135
  if newdtype not in supported_dtypes:
136
136
  supported_dtypes_fmt = ", ".join(t.__name__ for t in supported_dtypes)
137
- raise ValueError(f"scipy.sparse does not support dtype {newdtype.name}. "
137
+ raise ValueError(f"scipy.sparse does not support dtype {newdtype}. "
138
138
  f"The only supported types are: {supported_dtypes_fmt}.")
139
139
  return newdtype
140
140
 
@@ -403,27 +403,42 @@ def isdense(x) -> bool:
403
403
  return isinstance(x, np.ndarray)
404
404
 
405
405
 
406
- def validateaxis(axis) -> None:
406
+ def validateaxis(axis, *, ndim=2) -> tuple[int, ...] | None:
407
407
  if axis is None:
408
- return
409
- axis_type = type(axis)
410
-
411
- # In NumPy, you can pass in tuples for 'axis', but they are
412
- # not very useful for sparse matrices given their limited
413
- # dimensions, so let's make it explicit that they are not
414
- # allowed to be passed in
415
- if isinstance(axis, tuple):
416
- raise TypeError("Tuples are not accepted for the 'axis' parameter. "
417
- "Please pass in one of the following: "
418
- "{-2, -1, 0, 1, None}.")
419
-
420
- # If not a tuple, check that the provided axis is actually
421
- # an integer and raise a TypeError similar to NumPy's
422
- if not np.issubdtype(np.dtype(axis_type), np.integer):
423
- raise TypeError(f"axis must be an integer, not {axis_type.__name__}")
424
-
425
- if not (-2 <= axis <= 1):
426
- raise ValueError("axis out of range")
408
+ return None
409
+
410
+ if axis == ():
411
+ raise ValueError(
412
+ "sparse does not accept 0D axis (). Either use toarray (for dense) "
413
+ "or copy (for sparse)."
414
+ )
415
+
416
+ if not isinstance(axis, tuple):
417
+ # If not a tuple, check that the provided axis is actually
418
+ # an integer and raise a TypeError similar to NumPy's
419
+ if not np.issubdtype(np.dtype(type(axis)), np.integer):
420
+ raise TypeError(f'axis must be an integer/tuple of ints, not {type(axis)}')
421
+ axis = (axis,)
422
+
423
+ canon_axis = []
424
+ for ax in axis:
425
+ if not isintlike(ax):
426
+ raise TypeError(f"axis must be an integer. (given {ax})")
427
+ if ax < 0:
428
+ ax += ndim
429
+ if ax < 0 or ax >= ndim:
430
+ raise ValueError("axis out of range for ndim")
431
+ canon_axis.append(ax)
432
+
433
+ len_axis = len(canon_axis)
434
+ if len_axis != len(set(canon_axis)):
435
+ raise ValueError("duplicate value in axis")
436
+ elif len_axis > ndim:
437
+ raise ValueError("axis tuple has too many elements")
438
+ elif len_axis == ndim:
439
+ return None
440
+ else:
441
+ return tuple(canon_axis)
427
442
 
428
443
 
429
444
  def check_shape(args, current_shape=None, *, allow_nd=(2,)) -> tuple[int, ...]:
@@ -509,7 +524,7 @@ def broadcast_shapes(*shapes):
509
524
  """
510
525
  if not shapes:
511
526
  return ()
512
- shapes = [shp if isinstance(shp, (tuple, list)) else (shp,) for shp in shapes]
527
+ shapes = [shp if isinstance(shp, tuple | list) else (shp,) for shp in shapes]
513
528
  big_shp = max(shapes, key=len)
514
529
  out = list(big_shp)
515
530
  for shp in shapes:
scipy/sparse/base.py CHANGED
@@ -6,20 +6,11 @@ from scipy._lib.deprecation import _sub_module_deprecation
6
6
 
7
7
 
8
8
  __all__ = [ # noqa: F822
9
- 'MAXPRINT',
10
9
  'SparseEfficiencyWarning',
11
- 'SparseFormatWarning',
12
10
  'SparseWarning',
13
- 'asmatrix',
14
- 'check_reshape_kwargs',
15
- 'check_shape',
16
- 'get_sum_dtype',
17
- 'isdense',
18
- 'isscalarlike',
19
11
  'issparse',
20
12
  'isspmatrix',
21
13
  'spmatrix',
22
- 'validateaxis',
23
14
  ]
24
15
 
25
16
 
scipy/sparse/bsr.py CHANGED
@@ -6,23 +6,9 @@ from scipy._lib.deprecation import _sub_module_deprecation
6
6
 
7
7
 
8
8
  __all__ = [ # noqa: F822
9
- 'bsr_matmat',
10
9
  'bsr_matrix',
11
- 'bsr_matvec',
12
- 'bsr_matvecs',
13
- 'bsr_sort_indices',
14
- 'bsr_tocsr',
15
- 'bsr_transpose',
16
- 'check_shape',
17
- 'csr_matmat_maxnnz',
18
- 'getdata',
19
- 'getdtype',
20
- 'isshape',
21
10
  'isspmatrix_bsr',
22
11
  'spmatrix',
23
- 'to_native',
24
- 'upcast',
25
- 'warn',
26
12
  ]
27
13
 
28
14
 
@@ -6,30 +6,7 @@ from scipy._lib.deprecation import _sub_module_deprecation
6
6
 
7
7
 
8
8
  __all__ = [ # noqa: F822
9
- 'IndexMixin',
10
9
  'SparseEfficiencyWarning',
11
- 'check_shape',
12
- 'csr_column_index1',
13
- 'csr_column_index2',
14
- 'csr_row_index',
15
- 'csr_row_slice',
16
- 'csr_sample_offsets',
17
- 'csr_sample_values',
18
- 'csr_todense',
19
- 'downcast_intp_index',
20
- 'get_csr_submatrix',
21
- 'get_sum_dtype',
22
- 'getdtype',
23
- 'is_pydata_spmatrix',
24
- 'isdense',
25
- 'isintlike',
26
- 'isscalarlike',
27
- 'isshape',
28
- 'operator',
29
- 'to_native',
30
- 'upcast',
31
- 'upcast_char',
32
- 'warn',
33
10
  ]
34
11
 
35
12