scipy 1.15.3__cp313-cp313-macosx_14_0_arm64.whl → 1.16.0rc1__cp313-cp313-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. scipy/__config__.py +3 -3
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_deprecation_call.cpython-313-darwin.so +0 -0
  12. scipy/_lib/_test_deprecation_def.cpython-313-darwin.so +0 -0
  13. scipy/_lib/_testutils.py +6 -2
  14. scipy/_lib/_util.py +222 -125
  15. scipy/_lib/array_api_compat/__init__.py +4 -4
  16. scipy/_lib/array_api_compat/_internal.py +19 -6
  17. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  18. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  19. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  20. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  21. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  22. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  23. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  24. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  25. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  26. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  27. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  28. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  29. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  30. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  31. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  32. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  33. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  34. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  35. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  36. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  37. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  38. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  39. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  40. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  41. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  42. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  43. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  44. scipy/_lib/array_api_extra/__init__.py +26 -3
  45. scipy/_lib/array_api_extra/_delegation.py +171 -0
  46. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  47. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  48. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  49. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  50. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  51. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  58. scipy/_lib/array_api_extra/testing.py +359 -0
  59. scipy/_lib/decorator.py +2 -2
  60. scipy/_lib/doccer.py +1 -7
  61. scipy/_lib/messagestream.cpython-313-darwin.so +0 -0
  62. scipy/_lib/pyprima/__init__.py +212 -0
  63. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  64. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  65. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  66. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  67. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  68. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  69. scipy/_lib/pyprima/cobyla/update.py +289 -0
  70. scipy/_lib/pyprima/common/__init__.py +0 -0
  71. scipy/_lib/pyprima/common/_bounds.py +34 -0
  72. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  73. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  74. scipy/_lib/pyprima/common/_project.py +173 -0
  75. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  76. scipy/_lib/pyprima/common/consts.py +47 -0
  77. scipy/_lib/pyprima/common/evaluate.py +99 -0
  78. scipy/_lib/pyprima/common/history.py +38 -0
  79. scipy/_lib/pyprima/common/infos.py +30 -0
  80. scipy/_lib/pyprima/common/linalg.py +435 -0
  81. scipy/_lib/pyprima/common/message.py +290 -0
  82. scipy/_lib/pyprima/common/powalg.py +131 -0
  83. scipy/_lib/pyprima/common/preproc.py +277 -0
  84. scipy/_lib/pyprima/common/present.py +5 -0
  85. scipy/_lib/pyprima/common/ratio.py +54 -0
  86. scipy/_lib/pyprima/common/redrho.py +47 -0
  87. scipy/_lib/pyprima/common/selectx.py +296 -0
  88. scipy/_lib/tests/test__util.py +105 -121
  89. scipy/_lib/tests/test_array_api.py +166 -35
  90. scipy/_lib/tests/test_bunch.py +7 -0
  91. scipy/_lib/tests/test_ccallback.py +2 -10
  92. scipy/_lib/tests/test_public_api.py +13 -0
  93. scipy/cluster/_hierarchy.cpython-313-darwin.so +0 -0
  94. scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
  95. scipy/cluster/_vq.cpython-313-darwin.so +0 -0
  96. scipy/cluster/hierarchy.py +393 -223
  97. scipy/cluster/tests/test_hierarchy.py +273 -335
  98. scipy/cluster/tests/test_vq.py +45 -61
  99. scipy/cluster/vq.py +39 -35
  100. scipy/conftest.py +263 -157
  101. scipy/constants/_constants.py +4 -1
  102. scipy/constants/tests/test_codata.py +2 -2
  103. scipy/constants/tests/test_constants.py +11 -18
  104. scipy/datasets/_download_all.py +15 -1
  105. scipy/datasets/_fetchers.py +7 -1
  106. scipy/datasets/_utils.py +1 -1
  107. scipy/differentiate/_differentiate.py +25 -25
  108. scipy/differentiate/tests/test_differentiate.py +24 -25
  109. scipy/fft/_basic.py +20 -0
  110. scipy/fft/_helper.py +3 -34
  111. scipy/fft/_pocketfft/helper.py +29 -1
  112. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  113. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  114. scipy/fft/_realtransforms.py +13 -0
  115. scipy/fft/tests/test_basic.py +27 -25
  116. scipy/fft/tests/test_fftlog.py +16 -7
  117. scipy/fft/tests/test_helper.py +18 -34
  118. scipy/fft/tests/test_real_transforms.py +8 -10
  119. scipy/fftpack/convolve.cpython-313-darwin.so +0 -0
  120. scipy/fftpack/tests/test_basic.py +2 -4
  121. scipy/fftpack/tests/test_real_transforms.py +8 -9
  122. scipy/integrate/_bvp.py +9 -3
  123. scipy/integrate/_cubature.py +3 -2
  124. scipy/integrate/_dop.cpython-313-darwin.so +0 -0
  125. scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
  126. scipy/integrate/_ode.py +9 -2
  127. scipy/integrate/_quad_vec.py +21 -29
  128. scipy/integrate/_quadpack_py.py +11 -7
  129. scipy/integrate/_quadrature.py +3 -3
  130. scipy/integrate/_rules/_base.py +2 -2
  131. scipy/integrate/_tanhsinh.py +48 -47
  132. scipy/integrate/_test_odeint_banded.cpython-313-darwin.so +0 -0
  133. scipy/integrate/_vode.cpython-313-darwin.so +0 -0
  134. scipy/integrate/tests/test__quad_vec.py +0 -6
  135. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  136. scipy/integrate/tests/test_cubature.py +21 -35
  137. scipy/integrate/tests/test_quadrature.py +6 -8
  138. scipy/integrate/tests/test_tanhsinh.py +56 -48
  139. scipy/interpolate/__init__.py +70 -58
  140. scipy/interpolate/_bary_rational.py +22 -22
  141. scipy/interpolate/_bsplines.py +119 -66
  142. scipy/interpolate/_cubic.py +65 -50
  143. scipy/interpolate/_dfitpack.cpython-313-darwin.so +0 -0
  144. scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
  145. scipy/interpolate/_fitpack2.py +9 -6
  146. scipy/interpolate/_fitpack_impl.py +32 -26
  147. scipy/interpolate/_fitpack_repro.py +23 -19
  148. scipy/interpolate/_interpnd.cpython-313-darwin.so +0 -0
  149. scipy/interpolate/_interpolate.py +30 -12
  150. scipy/interpolate/_ndbspline.py +13 -18
  151. scipy/interpolate/_ndgriddata.py +5 -8
  152. scipy/interpolate/_polyint.py +95 -31
  153. scipy/interpolate/_ppoly.cpython-313-darwin.so +0 -0
  154. scipy/interpolate/_rbf.py +2 -2
  155. scipy/interpolate/_rbfinterp.py +1 -1
  156. scipy/interpolate/_rgi.py +31 -26
  157. scipy/interpolate/_rgi_cython.cpython-313-darwin.so +0 -0
  158. scipy/interpolate/dfitpack.py +0 -20
  159. scipy/interpolate/interpnd.py +1 -2
  160. scipy/interpolate/tests/test_bary_rational.py +2 -2
  161. scipy/interpolate/tests/test_bsplines.py +97 -1
  162. scipy/interpolate/tests/test_fitpack2.py +39 -1
  163. scipy/interpolate/tests/test_interpnd.py +32 -20
  164. scipy/interpolate/tests/test_interpolate.py +48 -4
  165. scipy/interpolate/tests/test_rgi.py +2 -1
  166. scipy/io/_fast_matrix_market/__init__.py +2 -0
  167. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  168. scipy/io/_harwell_boeing/hb.py +7 -11
  169. scipy/io/_idl.py +5 -7
  170. scipy/io/_netcdf.py +15 -5
  171. scipy/io/_test_fortran.cpython-313-darwin.so +0 -0
  172. scipy/io/arff/tests/test_arffread.py +3 -3
  173. scipy/io/matlab/__init__.py +5 -3
  174. scipy/io/matlab/_mio.py +4 -1
  175. scipy/io/matlab/_mio5.py +19 -13
  176. scipy/io/matlab/_mio5_utils.cpython-313-darwin.so +0 -0
  177. scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
  178. scipy/io/matlab/_miobase.py +4 -1
  179. scipy/io/matlab/_streams.cpython-313-darwin.so +0 -0
  180. scipy/io/matlab/tests/test_mio.py +46 -18
  181. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  182. scipy/io/tests/test_mmio.py +7 -1
  183. scipy/io/tests/test_wavfile.py +41 -0
  184. scipy/io/wavfile.py +57 -10
  185. scipy/linalg/_basic.py +113 -86
  186. scipy/linalg/_cythonized_array_utils.cpython-313-darwin.so +0 -0
  187. scipy/linalg/_decomp.py +22 -9
  188. scipy/linalg/_decomp_cholesky.py +28 -13
  189. scipy/linalg/_decomp_cossin.py +45 -30
  190. scipy/linalg/_decomp_interpolative.cpython-313-darwin.so +0 -0
  191. scipy/linalg/_decomp_ldl.py +4 -1
  192. scipy/linalg/_decomp_lu.py +18 -6
  193. scipy/linalg/_decomp_lu_cython.cpython-313-darwin.so +0 -0
  194. scipy/linalg/_decomp_polar.py +2 -0
  195. scipy/linalg/_decomp_qr.py +6 -2
  196. scipy/linalg/_decomp_qz.py +3 -0
  197. scipy/linalg/_decomp_schur.py +3 -1
  198. scipy/linalg/_decomp_svd.py +13 -2
  199. scipy/linalg/_decomp_update.cpython-313-darwin.so +0 -0
  200. scipy/linalg/_expm_frechet.py +4 -0
  201. scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
  202. scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
  203. scipy/linalg/_matfuncs.py +187 -4
  204. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
  205. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  206. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
  207. scipy/linalg/_procrustes.py +2 -0
  208. scipy/linalg/_sketches.py +17 -6
  209. scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
  210. scipy/linalg/_solvers.py +7 -2
  211. scipy/linalg/_special_matrices.py +26 -36
  212. scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
  213. scipy/linalg/cython_lapack.cpython-313-darwin.so +0 -0
  214. scipy/linalg/lapack.py +22 -2
  215. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  216. scipy/linalg/tests/test_basic.py +31 -16
  217. scipy/linalg/tests/test_batch.py +588 -0
  218. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  219. scipy/linalg/tests/test_decomp.py +40 -3
  220. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  221. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  222. scipy/linalg/tests/test_lapack.py +115 -7
  223. scipy/linalg/tests/test_matfuncs.py +157 -102
  224. scipy/linalg/tests/test_procrustes.py +0 -7
  225. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  226. scipy/linalg/tests/test_special_matrices.py +1 -5
  227. scipy/ndimage/__init__.py +1 -0
  228. scipy/ndimage/_cytest.cpython-313-darwin.so +0 -0
  229. scipy/ndimage/_delegators.py +8 -2
  230. scipy/ndimage/_filters.py +433 -5
  231. scipy/ndimage/_interpolation.py +36 -6
  232. scipy/ndimage/_measurements.py +4 -2
  233. scipy/ndimage/_morphology.py +5 -0
  234. scipy/ndimage/_nd_image.cpython-313-darwin.so +0 -0
  235. scipy/ndimage/_ni_docstrings.py +5 -1
  236. scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
  237. scipy/ndimage/_ni_support.py +1 -5
  238. scipy/ndimage/_support_alternative_backends.py +18 -6
  239. scipy/ndimage/tests/test_filters.py +337 -259
  240. scipy/ndimage/tests/test_fourier.py +7 -9
  241. scipy/ndimage/tests/test_interpolation.py +68 -61
  242. scipy/ndimage/tests/test_measurements.py +18 -35
  243. scipy/ndimage/tests/test_morphology.py +143 -131
  244. scipy/ndimage/tests/test_splines.py +1 -3
  245. scipy/optimize/_basinhopping.py +13 -7
  246. scipy/optimize/_bglu_dense.cpython-313-darwin.so +0 -0
  247. scipy/optimize/_bracket.py +17 -24
  248. scipy/optimize/_chandrupatla.py +9 -10
  249. scipy/optimize/_cobyla_py.py +104 -123
  250. scipy/optimize/_constraints.py +14 -10
  251. scipy/optimize/_differentiable_functions.py +371 -230
  252. scipy/optimize/_differentialevolution.py +4 -3
  253. scipy/optimize/_dual_annealing.py +1 -1
  254. scipy/optimize/_elementwise.py +1 -4
  255. scipy/optimize/_lbfgsb_py.py +57 -16
  256. scipy/optimize/_linprog_doc.py +2 -2
  257. scipy/optimize/_linprog_highs.py +2 -2
  258. scipy/optimize/_linprog_ip.py +25 -10
  259. scipy/optimize/_linprog_util.py +14 -16
  260. scipy/optimize/_lsq/common.py +3 -3
  261. scipy/optimize/_lsq/dogbox.py +16 -2
  262. scipy/optimize/_lsq/givens_elimination.cpython-313-darwin.so +0 -0
  263. scipy/optimize/_lsq/least_squares.py +198 -126
  264. scipy/optimize/_lsq/lsq_linear.py +6 -6
  265. scipy/optimize/_lsq/trf.py +35 -8
  266. scipy/optimize/_milp.py +3 -1
  267. scipy/optimize/_minimize.py +105 -36
  268. scipy/optimize/_minpack_py.py +21 -14
  269. scipy/optimize/_moduleTNC.cpython-313-darwin.so +0 -0
  270. scipy/optimize/_nnls.py +20 -21
  271. scipy/optimize/_nonlin.py +34 -3
  272. scipy/optimize/_numdiff.py +288 -110
  273. scipy/optimize/_optimize.py +86 -48
  274. scipy/optimize/_remove_redundancy.py +5 -5
  275. scipy/optimize/_root_scalar.py +1 -1
  276. scipy/optimize/_shgo.py +6 -0
  277. scipy/optimize/_shgo_lib/_complex.py +1 -1
  278. scipy/optimize/_slsqp_py.py +216 -124
  279. scipy/optimize/_slsqplib.cpython-313-darwin.so +0 -0
  280. scipy/optimize/_spectral.py +1 -1
  281. scipy/optimize/_tnc.py +8 -1
  282. scipy/optimize/_trlib/_trlib.cpython-313-darwin.so +0 -0
  283. scipy/optimize/_trustregion.py +20 -6
  284. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  285. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  286. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  287. scipy/optimize/_trustregion_constr/projections.py +12 -8
  288. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  289. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  290. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  291. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  292. scipy/optimize/_trustregion_exact.py +0 -1
  293. scipy/optimize/_zeros.cpython-313-darwin.so +0 -0
  294. scipy/optimize/_zeros_py.py +97 -17
  295. scipy/optimize/cython_optimize/_zeros.cpython-313-darwin.so +0 -0
  296. scipy/optimize/slsqp.py +0 -1
  297. scipy/optimize/tests/test__basinhopping.py +1 -1
  298. scipy/optimize/tests/test__differential_evolution.py +4 -4
  299. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  300. scipy/optimize/tests/test__numdiff.py +66 -22
  301. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  302. scipy/optimize/tests/test__shgo.py +9 -1
  303. scipy/optimize/tests/test_bracket.py +36 -46
  304. scipy/optimize/tests/test_chandrupatla.py +133 -135
  305. scipy/optimize/tests/test_cobyla.py +74 -45
  306. scipy/optimize/tests/test_constraints.py +1 -1
  307. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  308. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  309. scipy/optimize/tests/test_least_squares.py +125 -13
  310. scipy/optimize/tests/test_linear_assignment.py +3 -3
  311. scipy/optimize/tests/test_linprog.py +3 -3
  312. scipy/optimize/tests/test_lsq_linear.py +5 -5
  313. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  314. scipy/optimize/tests/test_minpack.py +4 -4
  315. scipy/optimize/tests/test_nnls.py +43 -3
  316. scipy/optimize/tests/test_nonlin.py +36 -0
  317. scipy/optimize/tests/test_optimize.py +95 -17
  318. scipy/optimize/tests/test_slsqp.py +36 -4
  319. scipy/optimize/tests/test_zeros.py +34 -1
  320. scipy/signal/__init__.py +12 -23
  321. scipy/signal/_delegators.py +568 -0
  322. scipy/signal/_filter_design.py +459 -241
  323. scipy/signal/_fir_filter_design.py +262 -90
  324. scipy/signal/_lti_conversion.py +3 -2
  325. scipy/signal/_ltisys.py +118 -91
  326. scipy/signal/_peak_finding_utils.cpython-313-darwin.so +0 -0
  327. scipy/signal/_polyutils.py +172 -0
  328. scipy/signal/_short_time_fft.py +519 -70
  329. scipy/signal/_signal_api.py +30 -0
  330. scipy/signal/_signaltools.py +719 -399
  331. scipy/signal/_sigtools.cpython-313-darwin.so +0 -0
  332. scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
  333. scipy/signal/_spectral_py.py +221 -50
  334. scipy/signal/_spline_filters.py +108 -68
  335. scipy/signal/_support_alternative_backends.py +73 -0
  336. scipy/signal/_upfirdn.py +4 -1
  337. scipy/signal/_upfirdn_apply.cpython-313-darwin.so +0 -0
  338. scipy/signal/_waveforms.py +2 -11
  339. scipy/signal/_wavelets.py +1 -1
  340. scipy/signal/fir_filter_design.py +1 -0
  341. scipy/signal/spline.py +4 -11
  342. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  343. scipy/signal/tests/test_bsplines.py +114 -79
  344. scipy/signal/tests/test_cont2discrete.py +9 -2
  345. scipy/signal/tests/test_filter_design.py +721 -481
  346. scipy/signal/tests/test_fir_filter_design.py +332 -140
  347. scipy/signal/tests/test_savitzky_golay.py +4 -3
  348. scipy/signal/tests/test_short_time_fft.py +221 -3
  349. scipy/signal/tests/test_signaltools.py +2144 -1348
  350. scipy/signal/tests/test_spectral.py +19 -6
  351. scipy/signal/tests/test_splines.py +161 -96
  352. scipy/signal/tests/test_upfirdn.py +84 -50
  353. scipy/signal/tests/test_waveforms.py +20 -0
  354. scipy/signal/tests/test_windows.py +607 -466
  355. scipy/signal/windows/_windows.py +287 -148
  356. scipy/sparse/__init__.py +23 -4
  357. scipy/sparse/_base.py +270 -108
  358. scipy/sparse/_bsr.py +7 -4
  359. scipy/sparse/_compressed.py +59 -231
  360. scipy/sparse/_construct.py +90 -38
  361. scipy/sparse/_coo.py +115 -181
  362. scipy/sparse/_csc.py +4 -4
  363. scipy/sparse/_csparsetools.cpython-313-darwin.so +0 -0
  364. scipy/sparse/_csr.py +2 -2
  365. scipy/sparse/_data.py +48 -48
  366. scipy/sparse/_dia.py +105 -18
  367. scipy/sparse/_dok.py +0 -23
  368. scipy/sparse/_index.py +4 -4
  369. scipy/sparse/_matrix.py +23 -0
  370. scipy/sparse/_sparsetools.cpython-313-darwin.so +0 -0
  371. scipy/sparse/_sputils.py +37 -22
  372. scipy/sparse/base.py +0 -9
  373. scipy/sparse/bsr.py +0 -14
  374. scipy/sparse/compressed.py +0 -23
  375. scipy/sparse/construct.py +0 -6
  376. scipy/sparse/coo.py +0 -14
  377. scipy/sparse/csc.py +0 -3
  378. scipy/sparse/csgraph/_flow.cpython-313-darwin.so +0 -0
  379. scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
  380. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
  381. scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
  382. scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
  383. scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
  384. scipy/sparse/csgraph/_traversal.cpython-313-darwin.so +0 -0
  385. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  386. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  387. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  388. scipy/sparse/csr.py +0 -5
  389. scipy/sparse/data.py +1 -6
  390. scipy/sparse/dia.py +0 -7
  391. scipy/sparse/dok.py +0 -10
  392. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-darwin.so +0 -0
  393. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  394. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  395. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-darwin.so +0 -0
  396. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  397. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  398. scipy/sparse/linalg/_interface.py +17 -18
  399. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  400. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  401. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  402. scipy/sparse/linalg/_isolve/minres.py +5 -5
  403. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  404. scipy/sparse/linalg/_isolve/utils.py +2 -8
  405. scipy/sparse/linalg/_matfuncs.py +1 -1
  406. scipy/sparse/linalg/_norm.py +1 -1
  407. scipy/sparse/linalg/_propack/_cpropack.cpython-313-darwin.so +0 -0
  408. scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
  409. scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
  410. scipy/sparse/linalg/_propack/_zpropack.cpython-313-darwin.so +0 -0
  411. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  412. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  413. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  414. scipy/sparse/tests/test_base.py +207 -42
  415. scipy/sparse/tests/test_common1d.py +7 -7
  416. scipy/sparse/tests/test_construct.py +1 -1
  417. scipy/sparse/tests/test_coo.py +272 -4
  418. scipy/sparse/tests/test_sparsetools.py +5 -0
  419. scipy/sparse/tests/test_sputils.py +36 -7
  420. scipy/spatial/_ckdtree.cpython-313-darwin.so +0 -0
  421. scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
  422. scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
  423. scipy/spatial/_voronoi.cpython-313-darwin.so +0 -0
  424. scipy/spatial/distance.py +49 -42
  425. scipy/spatial/tests/test_distance.py +3 -1
  426. scipy/spatial/tests/test_kdtree.py +1 -0
  427. scipy/spatial/tests/test_qhull.py +7 -2
  428. scipy/spatial/transform/__init__.py +5 -3
  429. scipy/spatial/transform/_rigid_transform.cpython-313-darwin.so +0 -0
  430. scipy/spatial/transform/_rotation.cpython-313-darwin.so +0 -0
  431. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  432. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  433. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  434. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  435. scipy/special/__init__.py +1 -47
  436. scipy/special/_add_newdocs.py +34 -772
  437. scipy/special/_basic.py +22 -25
  438. scipy/special/_comb.cpython-313-darwin.so +0 -0
  439. scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
  440. scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
  441. scipy/special/_logsumexp.py +67 -58
  442. scipy/special/_orthogonal.pyi +1 -1
  443. scipy/special/_specfun.cpython-313-darwin.so +0 -0
  444. scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
  445. scipy/special/_spherical_bessel.py +4 -4
  446. scipy/special/_support_alternative_backends.py +212 -119
  447. scipy/special/_test_internal.cpython-313-darwin.so +0 -0
  448. scipy/special/_testutils.py +4 -4
  449. scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
  450. scipy/special/_ufuncs.pyi +1 -0
  451. scipy/special/_ufuncs.pyx +215 -1400
  452. scipy/special/_ufuncs_cxx.cpython-313-darwin.so +0 -0
  453. scipy/special/_ufuncs_cxx.pxd +2 -15
  454. scipy/special/_ufuncs_cxx.pyx +5 -44
  455. scipy/special/_ufuncs_cxx_defs.h +2 -16
  456. scipy/special/_ufuncs_defs.h +0 -8
  457. scipy/special/cython_special.cpython-313-darwin.so +0 -0
  458. scipy/special/cython_special.pxd +1 -1
  459. scipy/special/tests/_cython_examples/meson.build +10 -1
  460. scipy/special/tests/test_basic.py +153 -20
  461. scipy/special/tests/test_boost_ufuncs.py +3 -0
  462. scipy/special/tests/test_cdflib.py +35 -11
  463. scipy/special/tests/test_gammainc.py +16 -0
  464. scipy/special/tests/test_hyp2f1.py +2 -2
  465. scipy/special/tests/test_log1mexp.py +85 -0
  466. scipy/special/tests/test_logsumexp.py +206 -64
  467. scipy/special/tests/test_mpmath.py +1 -0
  468. scipy/special/tests/test_nan_inputs.py +1 -1
  469. scipy/special/tests/test_orthogonal.py +17 -18
  470. scipy/special/tests/test_sf_error.py +3 -2
  471. scipy/special/tests/test_sph_harm.py +6 -7
  472. scipy/special/tests/test_support_alternative_backends.py +211 -76
  473. scipy/stats/__init__.py +4 -1
  474. scipy/stats/_ansari_swilk_statistics.cpython-313-darwin.so +0 -0
  475. scipy/stats/_axis_nan_policy.py +4 -3
  476. scipy/stats/_biasedurn.cpython-313-darwin.so +0 -0
  477. scipy/stats/_continued_fraction.py +387 -0
  478. scipy/stats/_continuous_distns.py +277 -310
  479. scipy/stats/_covariance.py +6 -3
  480. scipy/stats/_discrete_distns.py +39 -32
  481. scipy/stats/_distn_infrastructure.py +39 -12
  482. scipy/stats/_distribution_infrastructure.py +900 -238
  483. scipy/stats/_entropy.py +7 -8
  484. scipy/{_lib → stats}/_finite_differences.py +1 -1
  485. scipy/stats/_hypotests.py +82 -49
  486. scipy/stats/_kde.py +53 -49
  487. scipy/stats/_ksstats.py +1 -1
  488. scipy/stats/_levy_stable/__init__.py +7 -15
  489. scipy/stats/_levy_stable/levyst.cpython-313-darwin.so +0 -0
  490. scipy/stats/_morestats.py +112 -67
  491. scipy/stats/_mstats_basic.py +13 -17
  492. scipy/stats/_mstats_extras.py +8 -8
  493. scipy/stats/_multivariate.py +89 -113
  494. scipy/stats/_new_distributions.py +97 -20
  495. scipy/stats/_page_trend_test.py +12 -5
  496. scipy/stats/_probability_distribution.py +265 -43
  497. scipy/stats/_qmc.py +14 -9
  498. scipy/stats/_qmc_cy.cpython-313-darwin.so +0 -0
  499. scipy/stats/_qmvnt.py +16 -95
  500. scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
  501. scipy/stats/_quantile.py +335 -0
  502. scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
  503. scipy/stats/_resampling.py +4 -29
  504. scipy/stats/_sampling.py +1 -1
  505. scipy/stats/_sobol.cpython-313-darwin.so +0 -0
  506. scipy/stats/_stats.cpython-313-darwin.so +0 -0
  507. scipy/stats/_stats_mstats_common.py +19 -2
  508. scipy/stats/_stats_py.py +534 -460
  509. scipy/stats/_unuran/unuran_wrapper.cpython-313-darwin.so +0 -0
  510. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  511. scipy/stats/_variation.py +5 -7
  512. scipy/stats/_wilcoxon.py +13 -7
  513. scipy/stats/tests/common_tests.py +6 -4
  514. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  515. scipy/stats/tests/test_continued_fraction.py +173 -0
  516. scipy/stats/tests/test_continuous.py +379 -60
  517. scipy/stats/tests/test_continuous_basic.py +18 -12
  518. scipy/stats/tests/test_discrete_basic.py +14 -8
  519. scipy/stats/tests/test_discrete_distns.py +16 -16
  520. scipy/stats/tests/test_distributions.py +95 -75
  521. scipy/stats/tests/test_entropy.py +40 -48
  522. scipy/stats/tests/test_fit.py +4 -3
  523. scipy/stats/tests/test_hypotests.py +153 -24
  524. scipy/stats/tests/test_kdeoth.py +109 -41
  525. scipy/stats/tests/test_marray.py +289 -0
  526. scipy/stats/tests/test_morestats.py +79 -47
  527. scipy/stats/tests/test_mstats_basic.py +3 -3
  528. scipy/stats/tests/test_multivariate.py +434 -83
  529. scipy/stats/tests/test_qmc.py +13 -10
  530. scipy/stats/tests/test_quantile.py +199 -0
  531. scipy/stats/tests/test_rank.py +119 -112
  532. scipy/stats/tests/test_resampling.py +47 -56
  533. scipy/stats/tests/test_sampling.py +9 -4
  534. scipy/stats/tests/test_stats.py +799 -939
  535. scipy/stats/tests/test_variation.py +8 -6
  536. scipy/version.py +2 -2
  537. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  538. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +8 -8
  539. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +540 -547
  540. scipy-1.16.0rc1.dist-info/WHEEL +6 -0
  541. scipy/_lib/array_api_extra/_funcs.py +0 -484
  542. scipy/_lib/array_api_extra/_typing.py +0 -8
  543. scipy/interpolate/_bspl.cpython-313-darwin.so +0 -0
  544. scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
  545. scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
  546. scipy/optimize/_slsqp.cpython-313-darwin.so +0 -0
  547. scipy/spatial/qhull_src/COPYING.txt +0 -38
  548. scipy/special/libsf_error_state.dylib +0 -0
  549. scipy/special/tests/test_log_softmax.py +0 -109
  550. scipy/special/tests/test_xsf_cuda.py +0 -114
  551. scipy/special/xsf/binom.h +0 -89
  552. scipy/special/xsf/cdflib.h +0 -100
  553. scipy/special/xsf/cephes/airy.h +0 -307
  554. scipy/special/xsf/cephes/besselpoly.h +0 -51
  555. scipy/special/xsf/cephes/beta.h +0 -257
  556. scipy/special/xsf/cephes/cbrt.h +0 -131
  557. scipy/special/xsf/cephes/chbevl.h +0 -85
  558. scipy/special/xsf/cephes/chdtr.h +0 -193
  559. scipy/special/xsf/cephes/const.h +0 -87
  560. scipy/special/xsf/cephes/ellie.h +0 -293
  561. scipy/special/xsf/cephes/ellik.h +0 -251
  562. scipy/special/xsf/cephes/ellpe.h +0 -107
  563. scipy/special/xsf/cephes/ellpk.h +0 -117
  564. scipy/special/xsf/cephes/expn.h +0 -260
  565. scipy/special/xsf/cephes/gamma.h +0 -398
  566. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  567. scipy/special/xsf/cephes/hyperg.h +0 -361
  568. scipy/special/xsf/cephes/i0.h +0 -149
  569. scipy/special/xsf/cephes/i1.h +0 -158
  570. scipy/special/xsf/cephes/igam.h +0 -421
  571. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  572. scipy/special/xsf/cephes/igami.h +0 -313
  573. scipy/special/xsf/cephes/j0.h +0 -225
  574. scipy/special/xsf/cephes/j1.h +0 -198
  575. scipy/special/xsf/cephes/jv.h +0 -715
  576. scipy/special/xsf/cephes/k0.h +0 -164
  577. scipy/special/xsf/cephes/k1.h +0 -163
  578. scipy/special/xsf/cephes/kn.h +0 -243
  579. scipy/special/xsf/cephes/lanczos.h +0 -112
  580. scipy/special/xsf/cephes/ndtr.h +0 -275
  581. scipy/special/xsf/cephes/poch.h +0 -85
  582. scipy/special/xsf/cephes/polevl.h +0 -167
  583. scipy/special/xsf/cephes/psi.h +0 -194
  584. scipy/special/xsf/cephes/rgamma.h +0 -111
  585. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  586. scipy/special/xsf/cephes/shichi.h +0 -248
  587. scipy/special/xsf/cephes/sici.h +0 -224
  588. scipy/special/xsf/cephes/sindg.h +0 -221
  589. scipy/special/xsf/cephes/tandg.h +0 -139
  590. scipy/special/xsf/cephes/trig.h +0 -58
  591. scipy/special/xsf/cephes/unity.h +0 -186
  592. scipy/special/xsf/cephes/zeta.h +0 -172
  593. scipy/special/xsf/config.h +0 -304
  594. scipy/special/xsf/digamma.h +0 -205
  595. scipy/special/xsf/error.h +0 -57
  596. scipy/special/xsf/evalpoly.h +0 -47
  597. scipy/special/xsf/expint.h +0 -266
  598. scipy/special/xsf/hyp2f1.h +0 -694
  599. scipy/special/xsf/iv_ratio.h +0 -173
  600. scipy/special/xsf/lambertw.h +0 -150
  601. scipy/special/xsf/loggamma.h +0 -163
  602. scipy/special/xsf/sici.h +0 -200
  603. scipy/special/xsf/tools.h +0 -427
  604. scipy/special/xsf/trig.h +0 -164
  605. scipy/special/xsf/wright_bessel.h +0 -843
  606. scipy/special/xsf/zlog1.h +0 -35
  607. scipy/stats/_mvn.cpython-313-darwin.so +0 -0
  608. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -28,6 +28,9 @@ import random
28
28
  from numpy.testing import (assert_equal, assert_array_equal,
29
29
  assert_array_almost_equal, assert_almost_equal, assert_,
30
30
  assert_allclose, suppress_warnings)
31
+ from numpy.exceptions import ComplexWarning
32
+
33
+ from types import GenericAlias
31
34
 
32
35
  import scipy.linalg
33
36
 
@@ -36,14 +39,13 @@ from scipy.sparse import (csc_matrix, csr_matrix, dok_matrix,
36
39
  coo_matrix, lil_matrix, dia_matrix, bsr_matrix,
37
40
  csc_array, csr_array, dok_array,
38
41
  coo_array, lil_array, dia_array, bsr_array,
39
- eye, issparse, SparseEfficiencyWarning, sparray)
42
+ eye, issparse, SparseEfficiencyWarning, sparray, spmatrix)
40
43
  from scipy.sparse._base import _formats
41
44
  from scipy.sparse._sputils import (supported_dtypes, isscalarlike,
42
45
  get_index_dtype, asmatrix, matrix)
43
46
  from scipy.sparse.linalg import splu, expm, inv
44
47
 
45
48
  from scipy._lib.decorator import decorator
46
- from scipy._lib._util import ComplexWarning
47
49
 
48
50
  IS_COLAB = ('google.colab' in sys.modules)
49
51
 
@@ -1021,10 +1023,8 @@ class _TestCommon:
1021
1023
  assert_array_almost_equal(dat.sum(), datsp.sum())
1022
1024
  assert_equal(dat.sum().dtype, datsp.sum().dtype)
1023
1025
  assert_(np.isscalar(datsp.sum(axis=None)))
1024
- assert_array_almost_equal(dat.sum(axis=None),
1025
- datsp.sum(axis=None))
1026
- assert_equal(dat.sum(axis=None).dtype,
1027
- datsp.sum(axis=None).dtype)
1026
+ assert_array_almost_equal(dat.sum(axis=None), datsp.sum(axis=None))
1027
+ assert_equal(dat.sum(axis=None).dtype, datsp.sum(axis=None).dtype)
1028
1028
  assert_array_almost_equal(dat.sum(axis=0), datsp.sum(axis=0))
1029
1029
  assert_equal(dat.sum(axis=0).dtype, datsp.sum(axis=0).dtype)
1030
1030
  assert_array_almost_equal(dat.sum(axis=1), datsp.sum(axis=1))
@@ -1033,6 +1033,8 @@ class _TestCommon:
1033
1033
  assert_equal(dat.sum(axis=-2).dtype, datsp.sum(axis=-2).dtype)
1034
1034
  assert_array_almost_equal(dat.sum(axis=-1), datsp.sum(axis=-1))
1035
1035
  assert_equal(dat.sum(axis=-1).dtype, datsp.sum(axis=-1).dtype)
1036
+ assert_array_almost_equal(dat.sum(axis=(0, 1)), datsp.sum(axis=(0, 1)))
1037
+ assert_equal(dat.sum(axis=(0, 1)).dtype, datsp.sum(axis=(0, 1)).dtype)
1036
1038
 
1037
1039
  for dtype in self.checked_dtypes:
1038
1040
  for j in range(len(matrices)):
@@ -1045,10 +1047,15 @@ class _TestCommon:
1045
1047
  [-6, 7, 9]])
1046
1048
  datsp = self.spcreator(dat)
1047
1049
 
1048
- assert_raises(ValueError, datsp.sum, axis=3)
1049
- assert_raises(TypeError, datsp.sum, axis=(0, 1))
1050
- assert_raises(TypeError, datsp.sum, axis=1.5)
1051
- assert_raises(ValueError, datsp.sum, axis=1, out=out)
1050
+ with assert_raises(ValueError, match="axis out of range"):
1051
+ datsp.sum(axis=3)
1052
+ with assert_raises(ValueError, match="axis out of range"):
1053
+ datsp.sum(axis=(0, 3))
1054
+ with assert_raises(TypeError, match="axis must be an integer"):
1055
+ datsp.sum(axis=1.5)
1056
+ # error msg varies by sparray (1d result) or spmatrix (2d result)
1057
+ with assert_raises(ValueError, match="do.*n.t match.*shape|wrong.*dimensions"):
1058
+ datsp.mean(axis=1, out=out)
1052
1059
 
1053
1060
  def test_sum_dtype(self):
1054
1061
  dat = array([[0, 1, 2],
@@ -1088,9 +1095,9 @@ class _TestCommon:
1088
1095
  assert_array_almost_equal(dat_out, datsp_out)
1089
1096
 
1090
1097
  # check that wrong shape out parameter raises
1091
- with assert_raises(ValueError, match="output parameter.*wrong.*dimension"):
1098
+ with assert_raises(ValueError, match="output parameter"):
1092
1099
  datsp.sum(out=array([0]))
1093
- with assert_raises(ValueError, match="output parameter.*wrong.*dimension"):
1100
+ with assert_raises(ValueError, match="output parameter"):
1094
1101
  datsp.sum(out=array([[0]] if self.is_array_test else 0))
1095
1102
 
1096
1103
  def test_numpy_sum(self):
@@ -1106,6 +1113,21 @@ class _TestCommon:
1106
1113
  assert_array_almost_equal(dat_sum, datsp_sum)
1107
1114
  assert_equal(dat_sum.dtype, datsp_sum.dtype)
1108
1115
 
1116
+ def test_sum_mean_container_type(self):
1117
+ dat = array([[0, 1, 2],
1118
+ [3, -4, 5],
1119
+ [-6, 7, 9]])
1120
+ datsp = self.spcreator(dat)
1121
+
1122
+ assert isscalarlike(datsp.sum())
1123
+ matrix_or_array = ndarray if self.is_array_test else np.matrix
1124
+ assert isinstance(datsp.sum(axis=0), matrix_or_array)
1125
+ assert isinstance(datsp.sum(axis=1), matrix_or_array)
1126
+
1127
+ assert isscalarlike(datsp.mean())
1128
+ assert isinstance(datsp.mean(axis=0), matrix_or_array)
1129
+ assert isinstance(datsp.mean(axis=1), matrix_or_array)
1130
+
1109
1131
  def test_mean(self):
1110
1132
  keep = not self.is_array_test
1111
1133
  def check(dtype):
@@ -1137,21 +1159,31 @@ class _TestCommon:
1137
1159
  dat.mean(axis=-1, keepdims=keep), datsp.mean(axis=-1)
1138
1160
  )
1139
1161
  assert_equal(dat.mean(axis=-1).dtype, datsp.mean(axis=-1).dtype)
1162
+ assert_array_almost_equal(
1163
+ dat.mean(axis=(0, 1), keepdims=keep), datsp.mean(axis=(0, 1))
1164
+ )
1165
+ assert_equal(dat.mean(axis=(0, 1)).dtype, datsp.mean(axis=(0, 1)).dtype)
1166
+
1140
1167
 
1141
1168
  for dtype in self.checked_dtypes:
1142
1169
  check(dtype)
1143
1170
 
1144
- def test_mean_invalid_params(self):
1171
+ def test_mean_invalid_param(self):
1145
1172
  out = self.asdense(np.zeros((1, 3)))
1146
1173
  dat = array([[0, 1, 2],
1147
1174
  [3, -4, 5],
1148
1175
  [-6, 7, 9]])
1149
1176
  datsp = self.spcreator(dat)
1150
1177
 
1151
- assert_raises(ValueError, datsp.mean, axis=3)
1152
- assert_raises(TypeError, datsp.mean, axis=(0, 1))
1153
- assert_raises(TypeError, datsp.mean, axis=1.5)
1154
- assert_raises(ValueError, datsp.mean, axis=1, out=out)
1178
+ with assert_raises(ValueError, match="axis out of range"):
1179
+ datsp.mean(axis=3)
1180
+ with assert_raises(ValueError, match="axis out of range"):
1181
+ datsp.mean(axis=(0, 3))
1182
+ with assert_raises(TypeError, match="axis must be an integer"):
1183
+ datsp.mean(axis=1.5)
1184
+ # error msg varies by sparray (1d result) or spmatrix (2d result)
1185
+ with assert_raises(ValueError, match="do.*n.t match.*shape|wrong.*dimensions"):
1186
+ datsp.mean(axis=1, out=out)
1155
1187
 
1156
1188
  def test_mean_dtype(self):
1157
1189
  dat = array([[0, 1, 2],
@@ -1649,7 +1681,10 @@ class _TestCommon:
1649
1681
  except ValueError:
1650
1682
  assert_raises(ValueError, i.multiply, j)
1651
1683
  continue
1652
- sp_mult = i.multiply(j)
1684
+ try:
1685
+ sp_mult = i.multiply(j)
1686
+ except ValueError:
1687
+ continue
1653
1688
  if issparse(sp_mult):
1654
1689
  assert_almost_equal(sp_mult.toarray(), dense_mult)
1655
1690
  else:
@@ -1695,13 +1730,7 @@ class _TestCommon:
1695
1730
  B = self.spcreator(A)
1696
1731
 
1697
1732
  if self.is_array_test: # sparrays use element-wise power
1698
- # Todo: Add 1+3j to tested exponent list when np1.24 is no longer supported
1699
- # Complex exponents of 0 (our implicit fill value) change in numpy-1.25
1700
- # from `(nan+nanj)` to `0`. Old value makes array element-wise result
1701
- # dense and is hard to check for without any `isnan` method.
1702
- # So while untested here, element-wise complex exponents work with np>=1.25.
1703
- # for exponent in [1, 2, 2.2, 3, 1+3j]:
1704
- for exponent in [1, 2, 2.2, 3]:
1733
+ for exponent in [1, 2, 2.2, 3, 1+3j]:
1705
1734
  ret_sp = B**exponent
1706
1735
  ret_np = A**exponent
1707
1736
  assert_array_equal(ret_sp.toarray(), ret_np)
@@ -2072,8 +2101,8 @@ class _TestCommon:
2072
2101
 
2073
2102
  with suppress_warnings() as sup:
2074
2103
  sup.filter(SparseEfficiencyWarning,
2075
- "Taking maximum .minimum. with > 0 .< 0. number "
2076
- "results to a dense matrix")
2104
+ "Taking (maximum|minimum) with a (positive|negative) number "
2105
+ "results in a dense matrix")
2077
2106
 
2078
2107
  max_s = A.maximum(B)
2079
2108
  min_s = A.minimum(B)
@@ -2366,20 +2395,14 @@ class _TestInplaceArithmetic:
2366
2395
 
2367
2396
  # Matrix multiply from __rmatmul__
2368
2397
  y = a.copy()
2369
- # skip this test if numpy doesn't support __imatmul__ yet.
2370
- # move out of the try/except once numpy 1.24 is no longer supported.
2371
- try:
2372
- y @= b.T
2373
- except TypeError:
2374
- pass
2375
- else:
2376
- x = a.copy()
2377
- y = a.copy()
2378
- with assert_raises(ValueError, match="dimension mismatch"):
2379
- x @= b
2380
- x = x.dot(a.T)
2381
- y @= b.T
2382
- assert_array_equal(x, y)
2398
+ y @= b.T
2399
+ x = a.copy()
2400
+ y = a.copy()
2401
+ with assert_raises(ValueError, match="dimension mismatch"):
2402
+ x @= b
2403
+ x = x.dot(a.T)
2404
+ y @= b.T
2405
+ assert_array_equal(x, y)
2383
2406
 
2384
2407
  # Floor division is not supported
2385
2408
  with assert_raises(TypeError, match="unsupported operand"):
@@ -3720,9 +3743,11 @@ class _TestMinMax:
3720
3743
  X = self.spcreator(np.arange(1, 10).reshape(3, 3))
3721
3744
  assert_equal(X.min(), 1)
3722
3745
  assert_equal(X.min().dtype, X.dtype)
3746
+ assert_equal(X.min(explicit=True), 1)
3723
3747
 
3724
3748
  X = -X
3725
3749
  assert_equal(X.max(), -1)
3750
+ assert_equal(X.max(explicit=True), -1)
3726
3751
 
3727
3752
  # and a fully sparse matrix
3728
3753
  Z = self.spcreator(np.zeros((1, 1)))
@@ -3797,6 +3822,7 @@ class _TestMinMax:
3797
3822
  assert_array_equal(
3798
3823
  X.min(axis=axis).toarray(), D.min(axis=axis, keepdims=keep)
3799
3824
  )
3825
+ assert_equal(X.max(axis=(0, 1)), D.max(axis=(0, 1), keepdims=keep))
3800
3826
 
3801
3827
  for axis in axes_even:
3802
3828
  expected_max = D[-1, :]
@@ -3844,6 +3870,38 @@ class _TestMinMax:
3844
3870
  assert_equal(X.max(axis=axis, explicit=ex).toarray(), D.max(axis=axis))
3845
3871
  assert_equal(X.min(axis=axis, explicit=ex).toarray(), D.min(axis=axis))
3846
3872
 
3873
+ def test_minmax_container_type(self):
3874
+ dat = array([[0, 1, 2],
3875
+ [3, -4, 5],
3876
+ [-6, 7, 9]])
3877
+ datsp = self.spcreator(dat)
3878
+ matrix_or_array = ndarray if self.is_array_test else np.matrix
3879
+ spmatrix_or_sparray = sparray if self.is_array_test else spmatrix
3880
+
3881
+ assert isscalarlike(datsp.min())
3882
+ assert isinstance(datsp.min(axis=0), spmatrix_or_sparray)
3883
+ assert isinstance(datsp.min(axis=1), spmatrix_or_sparray)
3884
+
3885
+ assert isscalarlike(datsp.max())
3886
+ assert isinstance(datsp.max(axis=0), spmatrix_or_sparray)
3887
+ assert isinstance(datsp.max(axis=1), spmatrix_or_sparray)
3888
+
3889
+ assert isscalarlike(datsp.nanmin())
3890
+ assert isinstance(datsp.nanmin(axis=0), spmatrix_or_sparray)
3891
+ assert isinstance(datsp.nanmin(axis=1), spmatrix_or_sparray)
3892
+
3893
+ assert isscalarlike(datsp.nanmax())
3894
+ assert isinstance(datsp.nanmax(axis=0), spmatrix_or_sparray)
3895
+ assert isinstance(datsp.nanmax(axis=1), spmatrix_or_sparray)
3896
+
3897
+ assert isscalarlike(datsp.argmin())
3898
+ assert isinstance(datsp.argmin(axis=0), matrix_or_array)
3899
+ assert isinstance(datsp.argmin(axis=1), matrix_or_array)
3900
+
3901
+ assert isscalarlike(datsp.argmax())
3902
+ assert isinstance(datsp.argmax(axis=0), matrix_or_array)
3903
+ assert isinstance(datsp.argmax(axis=1), matrix_or_array)
3904
+
3847
3905
  def test_nanminmax(self):
3848
3906
  D = self.asdense(np.arange(50).reshape(5,10), dtype=float)
3849
3907
  D[1, :] = 0
@@ -3862,6 +3920,10 @@ class _TestMinMax:
3862
3920
  assert np.isscalar(X_nan_minimum)
3863
3921
  assert X_nan_minimum == np.nanmin(D)
3864
3922
 
3923
+ X_nan_minimum = X.nanmin(axis=(0, 1))
3924
+ assert np.isscalar(X_nan_minimum)
3925
+ assert X_nan_minimum == np.nanmin(D, axis=(0, 1))
3926
+
3865
3927
  axes = [-2, -1, 0, 1]
3866
3928
  for axis in axes:
3867
3929
  X_nan_maxima = X.nanmax(axis=axis)
@@ -3879,11 +3941,12 @@ class _TestMinMax:
3879
3941
  datsp = self.spcreator(dat)
3880
3942
 
3881
3943
  for fname in ('min', 'max'):
3944
+ datfunc = getattr(dat, fname)
3882
3945
  func = getattr(datsp, fname)
3883
3946
  assert_raises(ValueError, func, axis=3)
3884
- assert_raises(TypeError, func, axis=(0, 1))
3885
3947
  assert_raises(TypeError, func, axis=1.5)
3886
3948
  assert_raises(ValueError, func, axis=1, out=1)
3949
+ assert_equal(func(axis=(0, 1)), datfunc(axis=(0, 1)))
3887
3950
 
3888
3951
  def test_numpy_minmax(self):
3889
3952
  # See gh-5987
@@ -3933,6 +3996,13 @@ class _TestMinMax:
3933
3996
  assert_equal(mat.argmax(axis=1), np.argmax(D, axis=1))
3934
3997
  assert_equal(mat.argmin(axis=1), np.argmin(D, axis=1))
3935
3998
 
3999
+ # full matrix with explicit=True
4000
+ mat = self.spcreator(self.asdense(D5))
4001
+ assert_equal(mat.argmax(explicit=True), 5)
4002
+ assert_equal((-mat).argmax(explicit=True), 2)
4003
+ assert_equal(mat.argmin(explicit=True), 2)
4004
+ assert_equal((-mat).argmin(explicit=True), 5)
4005
+
3936
4006
  # zero-size matrices
3937
4007
  D6 = self.spcreator(np.empty((0, 5)))
3938
4008
  D7 = self.spcreator(np.empty((5, 0)))
@@ -4355,6 +4425,12 @@ class TestCSRMatrix(_MatrixMixin, TestCSR):
4355
4425
  with suppress_warnings() as sup:
4356
4426
  sup.filter(SparseEfficiencyWarning, "Changing the sparsity structure")
4357
4427
  return csr_matrix(*args, **kwargs)
4428
+
4429
+ def test_spmatrix_subscriptable(self):
4430
+ result = csr_matrix[np.int8]
4431
+ assert isinstance(result, GenericAlias)
4432
+ assert result.__origin__ is csr_matrix
4433
+ assert result.__args__ == (np.int8,)
4358
4434
 
4359
4435
 
4360
4436
  TestCSRMatrix.init_class()
@@ -4890,6 +4966,17 @@ class TestCOO(sparse_test_class(getset=False,
4890
4966
  # Using __ne__ and nnz instead
4891
4967
  assert_((mat1.reshape((1001, 3000001), order='C') != mat2).nnz == 0)
4892
4968
  assert_((mat2.reshape((3000001, 1001), order='F') != mat1).nnz == 0)
4969
+
4970
+ def test_sparray_subscriptable(self):
4971
+ result = coo_array[np.int8, tuple[int]]
4972
+ assert isinstance(result, GenericAlias)
4973
+ assert result.__origin__ is coo_array
4974
+ assert result.__args__ == (np.int8, tuple[int])
4975
+
4976
+ result = coo_array[np.int8]
4977
+ assert isinstance(result, GenericAlias)
4978
+ assert result.__origin__ is coo_array
4979
+ assert result.__args__ == (np.int8,)
4893
4980
 
4894
4981
 
4895
4982
  class TestCOOMatrix(_MatrixMixin, TestCOO):
@@ -4962,6 +5049,40 @@ class TestDIA(sparse_test_class(getset=False, slicing=False, slicing_assign=Fals
4962
5049
  csc = dia.tocsc()
4963
5050
  assert csc.indices.dtype == np.int32
4964
5051
 
5052
+ def test_add_sparse(self):
5053
+ # test format and cases not covered by common add tests
5054
+ A = diag([1, 2])
5055
+ B = A + diag([3], 1)
5056
+ Asp = dia_matrix(A)
5057
+ Bsp = dia_matrix(B)
5058
+
5059
+ Csp = Asp + Bsp
5060
+ assert isinstance(Csp, dia_matrix)
5061
+ assert_array_equal(Csp.toarray(), A + B)
5062
+
5063
+ Csp = Bsp + Asp
5064
+ assert isinstance(Csp, dia_matrix)
5065
+ assert_array_equal(Csp.toarray(), B + A)
5066
+
5067
+ def test_sub_sparse(self):
5068
+ # test format and cases not covered by common sub tests
5069
+ A = diag([1, 2])
5070
+ B = A + diag([3], 1)
5071
+ Asp = dia_matrix(A)
5072
+ Bsp = dia_matrix(B)
5073
+
5074
+ Csp = Asp - Bsp
5075
+ assert isinstance(Csp, dia_matrix)
5076
+ assert_array_equal(Csp.toarray(), A - B)
5077
+
5078
+ Csp = Bsp - Asp
5079
+ assert isinstance(Csp, dia_matrix)
5080
+ assert_array_equal(Csp.toarray(), B - A)
5081
+
5082
+ Bsp = Bsp.asformat('csr')
5083
+ assert_array_equal((Asp - Bsp).toarray(), A - B)
5084
+ assert_array_equal((Bsp - Asp).toarray(), B - A)
5085
+
4965
5086
  def test_mul_scalar(self):
4966
5087
  # repro for gh-20434
4967
5088
  m = self.dia_container([[1, 2], [0, 4]])
@@ -4973,6 +5094,50 @@ class TestDIA(sparse_test_class(getset=False, slicing=False, slicing_assign=Fals
4973
5094
  assert isinstance(res2, m.__class__)
4974
5095
  assert_array_equal(res2.toarray(), [[3, 6], [0, 12]])
4975
5096
 
5097
+ def test_matmul_dia(self):
5098
+ # test DIA structure of DIA @ DIA:
5099
+
5100
+ # that all and only needed elements are used and produced
5101
+ A = array([[1, 2, 3],
5102
+ [4, 5, 6]])
5103
+ B = array([[11, 12],
5104
+ [13, 14],
5105
+ [15, 16]])
5106
+ Asp = dia_matrix(A)
5107
+ Bsp = dia_matrix(B)
5108
+ Asp.data[Asp.data == 0] = -1 # poison outside elements
5109
+ Bsp.data[Bsp.data == 0] = -1
5110
+ assert_array_equal(Asp.toarray(), A)
5111
+ assert_array_equal(Bsp.toarray(), B)
5112
+
5113
+ C = A @ B
5114
+ Csp = Asp @ Bsp
5115
+ assert isinstance(Csp, dia_matrix)
5116
+ assert_array_equal(Csp.toarray(), C)
5117
+ assert_array_equal(Csp.offsets, [-1, 0, 1])
5118
+ assert_array_equal(Csp.data, dia_matrix(C).data)
5119
+
5120
+ C = B @ A
5121
+ Csp = Bsp @ Asp
5122
+ assert isinstance(Csp, dia_matrix)
5123
+ assert_array_equal(Csp.toarray(), C)
5124
+ assert_array_equal(Csp.offsets, [-2, -1, 0, 1, 2])
5125
+ assert_array_equal(Csp.data, dia_matrix(C).data)
5126
+
5127
+ # short data and that order of input offsets doesn't matter
5128
+ Asp = dia_matrix(([[0., 1., 2.], [3., 4., 5.]], [1, -2]), (5, 5))
5129
+ Bsp = dia_matrix(([[6., 7., 8.], [0., 0., 9.]], [-1, 2]), (5, 5))
5130
+
5131
+ Csp = Asp @ Bsp
5132
+ assert_array_equal(Csp.offsets, array([-3, 0]))
5133
+ assert_array_equal(Csp.data, [[24., 35., 0.],
5134
+ [6., 14., 27.]])
5135
+
5136
+ Csp = Bsp @ Asp
5137
+ assert_array_equal(Csp.offsets, array([-3, 0]))
5138
+ assert_array_equal(Csp.data, [[24., 0., 0.],
5139
+ [27., 6., 14.]])
5140
+
4976
5141
 
4977
5142
  class TestDIAMatrix(_MatrixMixin, TestDIA):
4978
5143
  spcreator = dia_matrix
@@ -4,13 +4,13 @@ import pytest
4
4
 
5
5
  import numpy as np
6
6
  from numpy.testing import assert_equal, assert_allclose
7
+ from numpy.exceptions import ComplexWarning
7
8
 
8
9
  from scipy.sparse import (
9
10
  bsr_array, csc_array, dia_array, lil_array,
10
11
  coo_array, csr_array, dok_array,
11
12
  )
12
13
  from scipy.sparse._sputils import supported_dtypes, matrix
13
- from scipy._lib._util import ComplexWarning
14
14
 
15
15
 
16
16
  sup_complex = np.testing.suppress_warnings()
@@ -136,10 +136,10 @@ class TestCommon1D:
136
136
  dat = np.array([0, 1, 2])
137
137
  datsp = spcreator(dat)
138
138
 
139
- with pytest.raises(ValueError, match='axis must be None, -1 or 0'):
139
+ with pytest.raises(ValueError, match='axis out of range'):
140
140
  datsp.sum(axis=1)
141
- with pytest.raises(TypeError, match='Tuples are not accepted'):
142
- datsp.sum(axis=(0, 1))
141
+ with pytest.raises(ValueError, match='axis out of range'):
142
+ datsp.sum(axis=(0, 3))
143
143
  with pytest.raises(TypeError, match='axis must be an integer'):
144
144
  datsp.sum(axis=1.5)
145
145
  with pytest.raises(ValueError, match='output parameter.*wrong.*dimension'):
@@ -176,11 +176,11 @@ class TestCommon1D:
176
176
  datsp = spcreator(dat)
177
177
  with pytest.raises(ValueError, match='axis out of range'):
178
178
  datsp.mean(axis=3)
179
- with pytest.raises(TypeError, match='Tuples are not accepted'):
180
- datsp.mean(axis=(0, 1))
179
+ with pytest.raises(ValueError, match='axis out of range'):
180
+ datsp.mean(axis=(0, 3))
181
181
  with pytest.raises(TypeError, match='axis must be an integer'):
182
182
  datsp.mean(axis=1.5)
183
- with pytest.raises(ValueError, match='output parameter.*wrong.*dimension'):
183
+ with pytest.raises(ValueError, match='out.*not match shape'):
184
184
  datsp.mean(axis=1, out=out)
185
185
 
186
186
  def test_sum_dtype(self, spcreator):
@@ -673,7 +673,7 @@ class TestConstructUtils:
673
673
  assert isinstance(bmat([[Gm.tocsc(), Gm]], format="csr"), spmatrix)
674
674
  assert isinstance(bmat([[Gm, Gm]], format="csc"), spmatrix)
675
675
 
676
- @pytest.mark.slow
676
+ @pytest.mark.xslow
677
677
  @pytest.mark.thread_unsafe
678
678
  @pytest.mark.xfail_on_32bit("Can't create large array for test")
679
679
  def test_concatenate_int32_overflow(self):