scipy 1.15.3__cp313-cp313-macosx_12_0_arm64.whl → 1.16.0rc2__cp313-cp313-macosx_12_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-313-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-313-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-313-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-313-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-313-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-313-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-313-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-313-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-313-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-313-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-313-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-313-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-313-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-313-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-313-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-313-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-313-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-313-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-313-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-313-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-313-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-313-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-313-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-313-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-313-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-313-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-313-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-313-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-313-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-313-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-313-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-313-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-313-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-313-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-313-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-313-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-313-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-313-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-313-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-313-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-313-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-313-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-313-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-313-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-313-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-313-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-313-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-313-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-313-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-313-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-313-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-313-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-313-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-313-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-313-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-313-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-313-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-313-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-313-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-313-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-313-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-313-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-313-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-313-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-313-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-313-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-313-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-313-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-313-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-313-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-313-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-313-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-313-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-313-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-313-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-313-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-313-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-313-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-313-darwin.so +0 -0
  629. 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):