scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.whl

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