scipy 1.15.3__cp311-cp311-win_amd64.whl → 1.16.0rc2__cp311-cp311-win_amd64.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 (759) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp311-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp311-win_amd64.pyd +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.cp311-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp311-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp311-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp311-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp311-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp311-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp311-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp311-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp311-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp311-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp311-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp311-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp311-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp311-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp311-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp311-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp311-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp311-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +263 -157
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp311-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp311-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp311-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp311-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp311-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp311-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp311-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp311-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp311-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp311-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp311-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp311-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp311-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp311-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp311-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp311-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp311-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp311-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp311-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp311-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp311-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp311-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp311-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp311-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp311-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp311-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp311-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp311-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp311-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp311-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp311-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp311-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp311-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp311-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp311-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp311-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp311-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp311-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp311-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp311-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp311-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp311-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp311-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp311-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp311-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp311-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp311-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp311-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp311-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp311-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp311-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp311-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp311-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp311-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp311-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp311-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp311-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp311-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/cython_blas.cp311-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp311-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp311-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp311-win_amd64.pyd +0 -0
  271. scipy/linalg/lapack.py +22 -2
  272. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  273. scipy/linalg/tests/test_basic.py +31 -16
  274. scipy/linalg/tests/test_batch.py +588 -0
  275. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  276. scipy/linalg/tests/test_decomp.py +40 -3
  277. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  278. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  279. scipy/linalg/tests/test_lapack.py +115 -7
  280. scipy/linalg/tests/test_matfuncs.py +157 -102
  281. scipy/linalg/tests/test_procrustes.py +0 -7
  282. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  283. scipy/linalg/tests/test_special_matrices.py +1 -5
  284. scipy/ndimage/__init__.py +1 -0
  285. scipy/ndimage/_ctest.cp311-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp311-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp311-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp311-win_amd64.pyd +0 -0
  289. scipy/ndimage/_delegators.py +8 -2
  290. scipy/ndimage/_filters.py +453 -5
  291. scipy/ndimage/_interpolation.py +36 -6
  292. scipy/ndimage/_measurements.py +4 -2
  293. scipy/ndimage/_morphology.py +5 -0
  294. scipy/ndimage/_nd_image.cp311-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp311-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp311-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp311-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.pyd +0 -0
  302. scipy/ndimage/_support_alternative_backends.py +18 -6
  303. scipy/ndimage/tests/test_filters.py +370 -259
  304. scipy/ndimage/tests/test_fourier.py +7 -9
  305. scipy/ndimage/tests/test_interpolation.py +68 -61
  306. scipy/ndimage/tests/test_measurements.py +18 -35
  307. scipy/ndimage/tests/test_morphology.py +143 -131
  308. scipy/ndimage/tests/test_splines.py +1 -3
  309. scipy/odr/__odrpack.cp311-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp311-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp311-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp311-win_amd64.pyd +0 -0
  314. scipy/optimize/_bracket.py +17 -24
  315. scipy/optimize/_chandrupatla.py +9 -10
  316. scipy/optimize/_cobyla_py.py +104 -123
  317. scipy/optimize/_constraints.py +14 -10
  318. scipy/optimize/_differentiable_functions.py +371 -230
  319. scipy/optimize/_differentialevolution.py +4 -3
  320. scipy/optimize/_direct.cp311-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp311-win_amd64.pyd +0 -0
  322. scipy/optimize/_dual_annealing.py +1 -1
  323. scipy/optimize/_elementwise.py +1 -4
  324. scipy/optimize/_group_columns.cp311-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp311-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp311-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp311-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp311-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp311-win_amd64.pyd +0 -0
  332. scipy/optimize/_lbfgsb_py.py +57 -16
  333. scipy/optimize/_linprog_doc.py +2 -2
  334. scipy/optimize/_linprog_highs.py +2 -2
  335. scipy/optimize/_linprog_ip.py +25 -10
  336. scipy/optimize/_linprog_util.py +14 -16
  337. scipy/optimize/_lsap.cp311-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp311-win_amd64.pyd +0 -0
  339. scipy/optimize/_lsq/common.py +3 -3
  340. scipy/optimize/_lsq/dogbox.py +16 -2
  341. scipy/optimize/_lsq/givens_elimination.cp311-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp311-win_amd64.pyd +0 -0
  343. scipy/optimize/_lsq/least_squares.py +198 -126
  344. scipy/optimize/_lsq/lsq_linear.py +6 -6
  345. scipy/optimize/_lsq/trf.py +35 -8
  346. scipy/optimize/_milp.py +3 -1
  347. scipy/optimize/_minimize.py +105 -36
  348. scipy/optimize/_minpack.cp311-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp311-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp311-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp311-win_amd64.pyd +0 -0
  353. scipy/optimize/_nnls.py +20 -21
  354. scipy/optimize/_nonlin.py +34 -3
  355. scipy/optimize/_numdiff.py +288 -110
  356. scipy/optimize/_optimize.py +86 -48
  357. scipy/optimize/_pava_pybind.cp311-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp311-win_amd64.pyd +0 -0
  359. scipy/optimize/_remove_redundancy.py +5 -5
  360. scipy/optimize/_root_scalar.py +1 -1
  361. scipy/optimize/_shgo.py +6 -0
  362. scipy/optimize/_shgo_lib/_complex.py +1 -1
  363. scipy/optimize/_slsqp_py.py +216 -124
  364. scipy/optimize/_slsqplib.cp311-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp311-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp311-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp311-win_amd64.pyd +0 -0
  370. scipy/optimize/_trustregion.py +20 -6
  371. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  372. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  373. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  374. scipy/optimize/_trustregion_constr/projections.py +12 -8
  375. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  376. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  377. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  378. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  379. scipy/optimize/_trustregion_exact.py +0 -1
  380. scipy/optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp311-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.pyd +0 -0
  385. scipy/optimize/slsqp.py +0 -1
  386. scipy/optimize/tests/test__basinhopping.py +1 -1
  387. scipy/optimize/tests/test__differential_evolution.py +4 -4
  388. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  389. scipy/optimize/tests/test__numdiff.py +66 -22
  390. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  391. scipy/optimize/tests/test__shgo.py +9 -1
  392. scipy/optimize/tests/test_bracket.py +36 -46
  393. scipy/optimize/tests/test_chandrupatla.py +133 -135
  394. scipy/optimize/tests/test_cobyla.py +74 -45
  395. scipy/optimize/tests/test_constraints.py +1 -1
  396. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  397. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  398. scipy/optimize/tests/test_least_squares.py +125 -13
  399. scipy/optimize/tests/test_linear_assignment.py +3 -3
  400. scipy/optimize/tests/test_linprog.py +3 -3
  401. scipy/optimize/tests/test_lsq_linear.py +6 -6
  402. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  403. scipy/optimize/tests/test_minpack.py +4 -4
  404. scipy/optimize/tests/test_nnls.py +43 -3
  405. scipy/optimize/tests/test_nonlin.py +36 -0
  406. scipy/optimize/tests/test_optimize.py +95 -17
  407. scipy/optimize/tests/test_slsqp.py +36 -4
  408. scipy/optimize/tests/test_zeros.py +34 -1
  409. scipy/signal/__init__.py +12 -23
  410. scipy/signal/_delegators.py +568 -0
  411. scipy/signal/_filter_design.py +459 -241
  412. scipy/signal/_fir_filter_design.py +262 -90
  413. scipy/signal/_lti_conversion.py +3 -2
  414. scipy/signal/_ltisys.py +118 -91
  415. scipy/signal/_max_len_seq_inner.cp311-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp311-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp311-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp311-win_amd64.pyd +0 -0
  419. scipy/signal/_polyutils.py +172 -0
  420. scipy/signal/_short_time_fft.py +519 -70
  421. scipy/signal/_signal_api.py +30 -0
  422. scipy/signal/_signaltools.py +719 -399
  423. scipy/signal/_sigtools.cp311-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp311-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp311-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp311-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp311-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp311-win_amd64.pyd +0 -0
  430. scipy/signal/_spline_filters.py +108 -68
  431. scipy/signal/_support_alternative_backends.py +73 -0
  432. scipy/signal/_upfirdn.py +4 -1
  433. scipy/signal/_upfirdn_apply.cp311-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp311-win_amd64.pyd +0 -0
  435. scipy/signal/_waveforms.py +2 -11
  436. scipy/signal/_wavelets.py +1 -1
  437. scipy/signal/fir_filter_design.py +1 -0
  438. scipy/signal/spline.py +4 -11
  439. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  440. scipy/signal/tests/test_bsplines.py +114 -79
  441. scipy/signal/tests/test_cont2discrete.py +9 -2
  442. scipy/signal/tests/test_filter_design.py +721 -481
  443. scipy/signal/tests/test_fir_filter_design.py +332 -140
  444. scipy/signal/tests/test_savitzky_golay.py +4 -3
  445. scipy/signal/tests/test_short_time_fft.py +221 -3
  446. scipy/signal/tests/test_signaltools.py +2144 -1348
  447. scipy/signal/tests/test_spectral.py +50 -6
  448. scipy/signal/tests/test_splines.py +161 -96
  449. scipy/signal/tests/test_upfirdn.py +84 -50
  450. scipy/signal/tests/test_waveforms.py +20 -0
  451. scipy/signal/tests/test_windows.py +607 -466
  452. scipy/signal/windows/_windows.py +287 -148
  453. scipy/sparse/__init__.py +23 -4
  454. scipy/sparse/_base.py +270 -108
  455. scipy/sparse/_bsr.py +7 -4
  456. scipy/sparse/_compressed.py +59 -231
  457. scipy/sparse/_construct.py +90 -38
  458. scipy/sparse/_coo.py +115 -181
  459. scipy/sparse/_csc.py +4 -4
  460. scipy/sparse/_csparsetools.cp311-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp311-win_amd64.pyd +0 -0
  462. scipy/sparse/_csr.py +2 -2
  463. scipy/sparse/_data.py +48 -48
  464. scipy/sparse/_dia.py +105 -18
  465. scipy/sparse/_dok.py +0 -23
  466. scipy/sparse/_index.py +4 -4
  467. scipy/sparse/_matrix.py +23 -0
  468. scipy/sparse/_sparsetools.cp311-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp311-win_amd64.pyd +0 -0
  470. scipy/sparse/_sputils.py +37 -22
  471. scipy/sparse/base.py +0 -9
  472. scipy/sparse/bsr.py +0 -14
  473. scipy/sparse/compressed.py +0 -23
  474. scipy/sparse/construct.py +0 -6
  475. scipy/sparse/coo.py +0 -14
  476. scipy/sparse/csc.py +0 -3
  477. scipy/sparse/csgraph/_flow.cp311-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp311-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp311-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp311-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp311-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp311-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp311-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp311-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp311-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp311-win_amd64.pyd +0 -0
  491. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  492. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  493. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  494. scipy/sparse/csr.py +0 -5
  495. scipy/sparse/data.py +1 -6
  496. scipy/sparse/dia.py +0 -7
  497. scipy/sparse/dok.py +0 -10
  498. scipy/sparse/linalg/_dsolve/_superlu.cp311-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp311-win_amd64.pyd +0 -0
  500. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  501. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  502. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_amd64.pyd +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  505. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  506. scipy/sparse/linalg/_interface.py +17 -18
  507. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  508. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  509. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  510. scipy/sparse/linalg/_isolve/minres.py +5 -5
  511. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  512. scipy/sparse/linalg/_isolve/utils.py +2 -8
  513. scipy/sparse/linalg/_matfuncs.py +1 -1
  514. scipy/sparse/linalg/_norm.py +1 -1
  515. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.pyd +0 -0
  523. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  524. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  525. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  526. scipy/sparse/tests/test_base.py +214 -42
  527. scipy/sparse/tests/test_common1d.py +7 -7
  528. scipy/sparse/tests/test_construct.py +1 -1
  529. scipy/sparse/tests/test_coo.py +272 -4
  530. scipy/sparse/tests/test_sparsetools.py +5 -0
  531. scipy/sparse/tests/test_sputils.py +36 -7
  532. scipy/spatial/_ckdtree.cp311-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp311-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp311-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp311-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp311-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp311-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp311-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp311-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp311-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp311-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp311-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp311-win_amd64.pyd +0 -0
  544. scipy/spatial/distance.py +49 -42
  545. scipy/spatial/tests/test_distance.py +15 -1
  546. scipy/spatial/tests/test_kdtree.py +1 -0
  547. scipy/spatial/tests/test_qhull.py +7 -2
  548. scipy/spatial/transform/__init__.py +5 -3
  549. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp311-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp311-win_amd64.pyd +0 -0
  553. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  554. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  555. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  556. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  557. scipy/special/__init__.py +1 -47
  558. scipy/special/_add_newdocs.py +34 -772
  559. scipy/special/_basic.py +22 -25
  560. scipy/special/_comb.cp311-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp311-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp311-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp311-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp311-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp311-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp311-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp311-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp311-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp311-win_amd64.pyd +0 -0
  572. scipy/special/_spherical_bessel.py +4 -4
  573. scipy/special/_support_alternative_backends.py +212 -119
  574. scipy/special/_test_internal.cp311-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp311-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp311-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp311-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp311-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp311-win_amd64.pyd +0 -0
  583. scipy/special/_ufuncs_cxx.pxd +2 -15
  584. scipy/special/_ufuncs_cxx.pyx +5 -44
  585. scipy/special/_ufuncs_cxx_defs.h +2 -16
  586. scipy/special/_ufuncs_defs.h +0 -8
  587. scipy/special/cython_special.cp311-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp311-win_amd64.pyd +0 -0
  589. scipy/special/cython_special.pxd +1 -1
  590. scipy/special/tests/_cython_examples/meson.build +10 -1
  591. scipy/special/tests/test_basic.py +153 -20
  592. scipy/special/tests/test_boost_ufuncs.py +3 -0
  593. scipy/special/tests/test_cdflib.py +35 -11
  594. scipy/special/tests/test_gammainc.py +16 -0
  595. scipy/special/tests/test_hyp2f1.py +2 -2
  596. scipy/special/tests/test_log1mexp.py +85 -0
  597. scipy/special/tests/test_logsumexp.py +206 -64
  598. scipy/special/tests/test_mpmath.py +1 -0
  599. scipy/special/tests/test_nan_inputs.py +1 -1
  600. scipy/special/tests/test_orthogonal.py +17 -18
  601. scipy/special/tests/test_sf_error.py +3 -2
  602. scipy/special/tests/test_sph_harm.py +6 -7
  603. scipy/special/tests/test_support_alternative_backends.py +211 -76
  604. scipy/stats/__init__.py +4 -1
  605. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp311-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp311-win_amd64.pyd +0 -0
  610. scipy/stats/_continued_fraction.py +387 -0
  611. scipy/stats/_continuous_distns.py +277 -310
  612. scipy/stats/_correlation.py +1 -1
  613. scipy/stats/_covariance.py +6 -3
  614. scipy/stats/_discrete_distns.py +39 -32
  615. scipy/stats/_distn_infrastructure.py +39 -12
  616. scipy/stats/_distribution_infrastructure.py +900 -238
  617. scipy/stats/_entropy.py +9 -10
  618. scipy/{_lib → stats}/_finite_differences.py +1 -1
  619. scipy/stats/_hypotests.py +83 -50
  620. scipy/stats/_kde.py +53 -49
  621. scipy/stats/_ksstats.py +1 -1
  622. scipy/stats/_levy_stable/__init__.py +7 -15
  623. scipy/stats/_levy_stable/levyst.cp311-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp311-win_amd64.pyd +0 -0
  625. scipy/stats/_morestats.py +118 -73
  626. scipy/stats/_mstats_basic.py +13 -17
  627. scipy/stats/_mstats_extras.py +8 -8
  628. scipy/stats/_multivariate.py +89 -113
  629. scipy/stats/_new_distributions.py +97 -20
  630. scipy/stats/_page_trend_test.py +12 -5
  631. scipy/stats/_probability_distribution.py +265 -43
  632. scipy/stats/_qmc.py +14 -9
  633. scipy/stats/_qmc_cy.cp311-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp311-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp311-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp311-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp311-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp311-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp311-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp311-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp311-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp311-win_amd64.pyd +0 -0
  647. scipy/stats/_stats_mstats_common.py +21 -2
  648. scipy/stats/_stats_py.py +550 -476
  649. scipy/stats/_stats_pythran.cp311-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp311-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.pyd +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  654. scipy/stats/_variation.py +6 -8
  655. scipy/stats/_wilcoxon.py +13 -7
  656. scipy/stats/tests/common_tests.py +6 -4
  657. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  658. scipy/stats/tests/test_continued_fraction.py +173 -0
  659. scipy/stats/tests/test_continuous.py +379 -60
  660. scipy/stats/tests/test_continuous_basic.py +18 -12
  661. scipy/stats/tests/test_discrete_basic.py +14 -8
  662. scipy/stats/tests/test_discrete_distns.py +16 -16
  663. scipy/stats/tests/test_distributions.py +95 -75
  664. scipy/stats/tests/test_entropy.py +40 -48
  665. scipy/stats/tests/test_fit.py +4 -3
  666. scipy/stats/tests/test_hypotests.py +153 -24
  667. scipy/stats/tests/test_kdeoth.py +109 -41
  668. scipy/stats/tests/test_marray.py +289 -0
  669. scipy/stats/tests/test_morestats.py +79 -47
  670. scipy/stats/tests/test_mstats_basic.py +3 -3
  671. scipy/stats/tests/test_multivariate.py +434 -83
  672. scipy/stats/tests/test_qmc.py +13 -10
  673. scipy/stats/tests/test_quantile.py +199 -0
  674. scipy/stats/tests/test_rank.py +119 -112
  675. scipy/stats/tests/test_resampling.py +47 -56
  676. scipy/stats/tests/test_sampling.py +9 -4
  677. scipy/stats/tests/test_stats.py +799 -939
  678. scipy/stats/tests/test_variation.py +8 -6
  679. scipy/version.py +2 -2
  680. scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  683. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
  684. scipy/_lib/array_api_extra/_funcs.py +0 -484
  685. scipy/_lib/array_api_extra/_typing.py +0 -8
  686. scipy/interpolate/_bspl.cp311-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp311-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp311-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp311-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp311-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp311-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp311-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp311-win_amd64.pyd +0 -0
  694. scipy/spatial/qhull_src/COPYING.txt +0 -38
  695. scipy/special/libsf_error_state.dll +0 -0
  696. scipy/special/libsf_error_state.dll.a +0 -0
  697. scipy/special/tests/test_log_softmax.py +0 -109
  698. scipy/special/tests/test_xsf_cuda.py +0 -114
  699. scipy/special/xsf/binom.h +0 -89
  700. scipy/special/xsf/cdflib.h +0 -100
  701. scipy/special/xsf/cephes/airy.h +0 -307
  702. scipy/special/xsf/cephes/besselpoly.h +0 -51
  703. scipy/special/xsf/cephes/beta.h +0 -257
  704. scipy/special/xsf/cephes/cbrt.h +0 -131
  705. scipy/special/xsf/cephes/chbevl.h +0 -85
  706. scipy/special/xsf/cephes/chdtr.h +0 -193
  707. scipy/special/xsf/cephes/const.h +0 -87
  708. scipy/special/xsf/cephes/ellie.h +0 -293
  709. scipy/special/xsf/cephes/ellik.h +0 -251
  710. scipy/special/xsf/cephes/ellpe.h +0 -107
  711. scipy/special/xsf/cephes/ellpk.h +0 -117
  712. scipy/special/xsf/cephes/expn.h +0 -260
  713. scipy/special/xsf/cephes/gamma.h +0 -398
  714. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  715. scipy/special/xsf/cephes/hyperg.h +0 -361
  716. scipy/special/xsf/cephes/i0.h +0 -149
  717. scipy/special/xsf/cephes/i1.h +0 -158
  718. scipy/special/xsf/cephes/igam.h +0 -421
  719. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  720. scipy/special/xsf/cephes/igami.h +0 -313
  721. scipy/special/xsf/cephes/j0.h +0 -225
  722. scipy/special/xsf/cephes/j1.h +0 -198
  723. scipy/special/xsf/cephes/jv.h +0 -715
  724. scipy/special/xsf/cephes/k0.h +0 -164
  725. scipy/special/xsf/cephes/k1.h +0 -163
  726. scipy/special/xsf/cephes/kn.h +0 -243
  727. scipy/special/xsf/cephes/lanczos.h +0 -112
  728. scipy/special/xsf/cephes/ndtr.h +0 -275
  729. scipy/special/xsf/cephes/poch.h +0 -85
  730. scipy/special/xsf/cephes/polevl.h +0 -167
  731. scipy/special/xsf/cephes/psi.h +0 -194
  732. scipy/special/xsf/cephes/rgamma.h +0 -111
  733. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  734. scipy/special/xsf/cephes/shichi.h +0 -248
  735. scipy/special/xsf/cephes/sici.h +0 -224
  736. scipy/special/xsf/cephes/sindg.h +0 -221
  737. scipy/special/xsf/cephes/tandg.h +0 -139
  738. scipy/special/xsf/cephes/trig.h +0 -58
  739. scipy/special/xsf/cephes/unity.h +0 -186
  740. scipy/special/xsf/cephes/zeta.h +0 -172
  741. scipy/special/xsf/config.h +0 -304
  742. scipy/special/xsf/digamma.h +0 -205
  743. scipy/special/xsf/error.h +0 -57
  744. scipy/special/xsf/evalpoly.h +0 -47
  745. scipy/special/xsf/expint.h +0 -266
  746. scipy/special/xsf/hyp2f1.h +0 -694
  747. scipy/special/xsf/iv_ratio.h +0 -173
  748. scipy/special/xsf/lambertw.h +0 -150
  749. scipy/special/xsf/loggamma.h +0 -163
  750. scipy/special/xsf/sici.h +0 -200
  751. scipy/special/xsf/tools.h +0 -427
  752. scipy/special/xsf/trig.h +0 -164
  753. scipy/special/xsf/wright_bessel.h +0 -843
  754. scipy/special/xsf/zlog1.h +0 -35
  755. scipy/stats/_mvn.cp311-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp311-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp311-cp311-win_amd64.whl → /scipy-1.16.0rc2-cp311-cp311-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/sparse/__init__.py CHANGED
@@ -32,6 +32,9 @@ SciPy 2-D sparse array package for numeric data.
32
32
  - Sparse arrays use array style *slicing* operations, returning scalars,
33
33
  1D, or 2D sparse arrays. If you need 2D results, use an appropriate index.
34
34
  E.g. ``A[:, i, None]`` or ``A[:, [i]]``.
35
+ - All index arrays for a given sparse array should be of same dtype.
36
+ For example, for CSR format, ``indices`` and ``indptr`` should have
37
+ the same dtype. For COO, each array in `coords` should have same dtype.
35
38
 
36
39
  The construction utilities (`eye`, `kron`, `random`, `diags`, etc.)
37
40
  have appropriate replacements (see :ref:`sparse-construction-functions`).
@@ -253,7 +256,7 @@ is the same:
253
256
  Now we can compute norm of the error with:
254
257
 
255
258
  >>> err = norm(x-x_)
256
- >>> err < 1e-10
259
+ >>> err < 1e-9
257
260
  True
258
261
 
259
262
  It should be small :)
@@ -296,6 +299,7 @@ sorted indices are required (e.g., when passing data to other libraries).
296
299
  # Nathan Bell, and Jake Vanderplas.
297
300
 
298
301
  import warnings as _warnings
302
+ import importlib as _importlib
299
303
 
300
304
  from ._base import *
301
305
  from ._csr import *
@@ -311,8 +315,6 @@ from ._matrix import spmatrix
311
315
  from ._matrix_io import *
312
316
  from ._sputils import get_index_dtype, safely_cast_index_arrays
313
317
 
314
- # For backward compatibility with v0.19.
315
- from . import csgraph
316
318
 
317
319
  # Deprecated namespaces, to be removed in v2.0.0
318
320
  from . import (
@@ -320,12 +322,29 @@ from . import (
320
322
  lil, sparsetools, sputils
321
323
  )
322
324
 
323
- __all__ = [s for s in dir() if not s.startswith('_')]
325
+ _submodules = ["csgraph", "linalg"]
326
+
327
+ __all__ = [s for s in dir() if not s.startswith('_')] + _submodules
324
328
 
325
329
  # Filter PendingDeprecationWarning for np.matrix introduced with numpy 1.15
326
330
  msg = 'the matrix subclass is not the recommended way'
327
331
  _warnings.filterwarnings('ignore', message=msg)
328
332
 
333
+ def __dir__():
334
+ return __all__
335
+
336
+
337
+ def __getattr__(name):
338
+ if name in _submodules:
339
+ return _importlib.import_module(f'scipy.sparse.{name}')
340
+ else:
341
+ try:
342
+ return globals()[name]
343
+ except KeyError:
344
+ raise AttributeError(
345
+ f"Module 'scipy.sparse' has no attribute '{name}'"
346
+ )
347
+
329
348
  from scipy._lib._testutils import PytestTester
330
349
  test = PytestTester(__name__)
331
350
  del PytestTester
scipy/sparse/_base.py CHANGED
@@ -1,10 +1,14 @@
1
1
  """Base class for sparse matrices"""
2
2
 
3
+ from warnings import warn
4
+ import math
3
5
  import numpy as np
6
+ import operator
4
7
 
5
8
  from ._sputils import (asmatrix, check_reshape_kwargs, check_shape,
6
- get_sum_dtype, isdense, isscalarlike,
7
- matrix, validateaxis, getdtype)
9
+ get_sum_dtype, isdense, isscalarlike, _todata,
10
+ matrix, validateaxis, getdtype, is_pydata_spmatrix)
11
+ from scipy._lib._sparse import SparseABC, issparse
8
12
 
9
13
  from ._matrix import spmatrix
10
14
 
@@ -13,6 +17,7 @@ __all__ = ['isspmatrix', 'issparse', 'sparray',
13
17
 
14
18
 
15
19
  class SparseWarning(Warning):
20
+ """General warning for :mod:`scipy.sparse`."""
16
21
  pass
17
22
 
18
23
 
@@ -21,6 +26,9 @@ class SparseFormatWarning(SparseWarning):
21
26
 
22
27
 
23
28
  class SparseEfficiencyWarning(SparseWarning):
29
+ """The warning emitted when the operation is
30
+ inefficient for sparse matrices.
31
+ """
24
32
  pass
25
33
 
26
34
 
@@ -58,7 +66,23 @@ _ufuncs_with_fixed_point_at_zero = frozenset([
58
66
  MAXPRINT = 50
59
67
 
60
68
 
61
- class _spbase:
69
+ # helper dicts to manipulate comparison operators
70
+ # We negate operators (with warning) when all implicit values would be True
71
+ op_neg = {operator.eq: operator.ne, operator.ne: operator.eq,
72
+ operator.lt: operator.ge, operator.ge: operator.lt,
73
+ operator.gt: operator.le, operator.le: operator.gt}
74
+
75
+
76
+ # We use symbolic version of operators in warning messages.
77
+ op_sym = {operator.eq: '==', operator.ge: '>=', operator.le: '<=',
78
+ operator.ne: '!=', operator.gt: '>', operator.lt: '<'}
79
+
80
+
81
+ # `_spbase` is a subclass of `SparseABC`.
82
+ # This allows other submodules to check for instances of sparse subclasses
83
+ # via `scipy._lib._sparse.issparse`, without introducing
84
+ # an import dependency on `scipy.sparse`.
85
+ class _spbase(SparseABC):
62
86
  """ This class provides a base class for all sparse arrays. It
63
87
  cannot be instantiated. Most of the work is provided by subclasses.
64
88
  """
@@ -133,7 +157,7 @@ class _spbase:
133
157
 
134
158
  Parameters
135
159
  ----------
136
- shape : length-2 tuple of ints
160
+ shape : tuple of ints
137
161
  The new shape should be compatible with the original shape.
138
162
  order : {'C', 'F'}, optional
139
163
  Read the elements using this index order. 'C' means to read and
@@ -465,18 +489,94 @@ class _spbase:
465
489
  ####################################################################
466
490
 
467
491
  def multiply(self, other):
468
- """Point-wise multiplication by another array/matrix."""
492
+ """Element-wise multiplication by another array/matrix."""
469
493
  if isscalarlike(other):
470
494
  return self._mul_scalar(other)
471
- return self.tocsr().multiply(other)
495
+
496
+ if self.ndim < 3:
497
+ return self.tocsr()._multiply_2d_with_broadcasting(other)
498
+
499
+ if not (issparse(other) or isdense(other)):
500
+ # If it's a list or whatever, treat it like an array
501
+ other_a = np.asanyarray(other)
502
+ if other_a.ndim == 0 and other_a.dtype == np.object_:
503
+ # numpy creates a 0d object array if all else fails.
504
+ # Not interpretable as an array; return NotImplemented so
505
+ # other's __rmul__ can kick in if that's implemented.
506
+ return NotImplemented
507
+ # Allow custom sparse class indicated by attr sparse gh-6520
508
+ try:
509
+ other.shape
510
+ except AttributeError:
511
+ other = other_a
512
+
513
+ if self.shape != other.shape:
514
+ raise ValueError("inconsistent shapes: >2D multiply() does not yet "
515
+ "support broadcasting")
516
+
517
+ # self is >2D so must be COO
518
+ if isdense(other):
519
+ data = np.multiply(self.data, other[self.coords])
520
+ result = self.copy()
521
+ result.data = data.view(np.ndarray).ravel()
522
+ return result
523
+
524
+ elif issparse(other):
525
+ csr_self = self.reshape(1, -1).tocsr()
526
+ csr_other = other.reshape(1, -1).tocsr()
527
+ return csr_self._binopt(csr_other, '_elmul_').reshape(self.shape)
528
+
529
+ else:
530
+ # Not scalar, dense or sparse. Return NotImplemented so that
531
+ # other's __rmul__ can kick in if that's implemented.
532
+ return NotImplemented
533
+
534
+ def _maximum_minimum(self, other, np_op):
535
+ if not (issparse(other) or isdense(other) or isscalarlike(other)):
536
+ # If it's a list or whatever, treat it like an array
537
+ other_a = np.asanyarray(other)
538
+ if other_a.ndim == 0 and other_a.dtype == np.object_:
539
+ # numpy creates a 0d object array if all else fails.
540
+ # We don't know how to handle it either.
541
+ raise NotImplementedError('maximum or minimum with an unrecognized '
542
+ 'array type is not supported')
543
+ # Allow custom sparse class indicated by attr sparse gh-6520
544
+ try:
545
+ other.shape
546
+ except AttributeError:
547
+ other = other_a
548
+
549
+ if isscalarlike(other):
550
+ if np_op(0, other):
551
+ pos_neg = 'positive' if np_op == np.maximum else 'negative'
552
+ warn(f"Taking {np_op.__name__} with a {pos_neg} number results in a"
553
+ " dense matrix.", SparseEfficiencyWarning, stacklevel=3)
554
+ return self.__class__(np_op(self.toarray(), other))
555
+ else:
556
+ csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
557
+ result = csr_self._scalar_binopt(other, np_op)
558
+ return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
559
+ elif isdense(other):
560
+ return np_op(self.todense(), other)
561
+ elif issparse(other):
562
+ if self.shape != other.shape:
563
+ raise ValueError(f"inconsistent shapes {self.shape=} {other.shape=}")
564
+ if self.ndim < 3: # shape is same so other.ndim < 3
565
+ return self.tocsr()._binopt(other, f'_{np_op.__name__}_')
566
+ csr_self = self.reshape(1, -1).tocsr()
567
+ csr_other = other.reshape(1, -1).tocsr()
568
+ result = csr_self._binopt(csr_other, f'_{np_op.__name__}_')
569
+ return result.tocoo().reshape(self.shape)
570
+ else:
571
+ raise ValueError("Operands not compatible.")
472
572
 
473
573
  def maximum(self, other):
474
574
  """Element-wise maximum between this and another array/matrix."""
475
- return self.tocsr().maximum(other)
575
+ return self._maximum_minimum(other, np.maximum)
476
576
 
477
577
  def minimum(self, other):
478
578
  """Element-wise minimum between this and another array/matrix."""
479
- return self.tocsr().minimum(other)
579
+ return self._maximum_minimum(other, np.minimum)
480
580
 
481
581
  def dot(self, other):
482
582
  """Ordinary dot product
@@ -506,23 +606,96 @@ class _spbase:
506
606
  else:
507
607
  return self.tocsr()._broadcast_to(shape, copy)
508
608
 
609
+ def _comparison(self, other, op):
610
+ # We convert to CSR format and use methods _binopt or _scalar_binopt
611
+ # If ndim>2 we reshape to 2D, compare and then reshape back to nD
612
+ if not (issparse(other) or isdense(other) or isscalarlike(other)):
613
+ if is_pydata_spmatrix(other):
614
+ # cannot compare with pydata other, but it might compare with us.
615
+ return NotImplemented
616
+ # If it's a list or whatever, treat it like an array
617
+ other_a = np.asanyarray(other)
618
+ if other_a.ndim == 0 and other_a.dtype == np.object_:
619
+ # numpy creates a 0d object array if all else fails.
620
+ # Not interpretable as an array; return NotImplemented so
621
+ # other's dunder methods can kick in if implemented.
622
+ return NotImplemented
623
+ # Allow custom sparse class indicated by attr sparse gh-6520
624
+ try:
625
+ other.shape
626
+ except AttributeError:
627
+ other = other_a
628
+
629
+ if isscalarlike(other):
630
+ if not op(0, other):
631
+ if np.isnan(other): # op is not `ne`, so results are all False.
632
+ return self.__class__(self.shape, dtype=np.bool_)
633
+ else:
634
+ csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
635
+ res = csr_self._scalar_binopt(other, op)
636
+ return res if self.ndim < 3 else res.tocoo().reshape(self.shape)
637
+ else:
638
+ warn(f"Comparing a sparse matrix with {other} using {op_sym[op]} "
639
+ f"is inefficient. Try using {op_sym[op_neg[op]]} instead.",
640
+ SparseEfficiencyWarning, stacklevel=3)
641
+ if np.isnan(other):
642
+ # op is `ne` cuz op(0, other) and isnan(other). Return all True.
643
+ return self.__class__(np.ones(self.shape, dtype=np.bool_))
644
+
645
+ # op is eq, le, or ge. Use negated op and then negate.
646
+ csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
647
+ inv = csr_self._scalar_binopt(other, op_neg[op])
648
+ all_true = csr_self.__class__(np.ones(csr_self.shape, dtype=np.bool_))
649
+ result = all_true - inv
650
+ return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
651
+
652
+ elif isdense(other):
653
+ return op(self.todense(), other)
654
+
655
+ elif issparse(other):
656
+ # TODO sparse broadcasting
657
+ if self.shape != other.shape:
658
+ # eq and ne return True or False instead of an array when the shapes
659
+ # don't match. Numpy doesn't do this. Is this what we want?
660
+ if op in (operator.eq, operator.ne):
661
+ return op is operator.ne
662
+ raise ValueError("inconsistent shape")
663
+
664
+ csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
665
+ csr_other = (other if other.ndim < 3 else other.reshape(1, -1)).tocsr()
666
+ if not op(0, 0):
667
+ result = csr_self._binopt(csr_other, f'_{op.__name__}_')
668
+ return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
669
+ else:
670
+ # result will not be sparse. Use negated op and then negate.
671
+ warn(f"Comparing two sparse matrices using {op_sym[op]} "
672
+ f"is inefficient. Try using {op_sym[op_neg[op]]} instead.",
673
+ SparseEfficiencyWarning, stacklevel=3)
674
+ inv = csr_self._binopt(csr_other, f'_{op_neg[op].__name__}_')
675
+ all_true = csr_self.__class__(np.ones(csr_self.shape, dtype=np.bool_))
676
+ result = all_true - inv
677
+ return result if self.ndim < 3 else result.tocoo().reshape(self.shape)
678
+ else:
679
+ # cannot compare with other, but it might compare with us.
680
+ return NotImplemented
681
+
509
682
  def __eq__(self, other):
510
- return self.tocsr().__eq__(other)
683
+ return self._comparison(other, operator.eq)
511
684
 
512
685
  def __ne__(self, other):
513
- return self.tocsr().__ne__(other)
686
+ return self._comparison(other, operator.ne)
514
687
 
515
688
  def __lt__(self, other):
516
- return self.tocsr().__lt__(other)
689
+ return self._comparison(other, operator.lt)
517
690
 
518
691
  def __gt__(self, other):
519
- return self.tocsr().__gt__(other)
692
+ return self._comparison(other, operator.gt)
520
693
 
521
694
  def __le__(self, other):
522
- return self.tocsr().__le__(other)
695
+ return self._comparison(other, operator.le)
523
696
 
524
697
  def __ge__(self, other):
525
- return self.tocsr().__ge__(other)
698
+ return self._comparison(other, operator.ge)
526
699
 
527
700
  def __abs__(self):
528
701
  return abs(self.tocsr())
@@ -637,12 +810,12 @@ class _spbase:
637
810
 
638
811
  # If it's a list or whatever, treat it like an array
639
812
  other_a = np.asanyarray(other)
640
-
641
813
  if other_a.ndim == 0 and other_a.dtype == np.object_:
814
+ # numpy creates a 0d object array if all else fails.
642
815
  # Not interpretable as an array; return NotImplemented so that
643
816
  # other's __rmatmul__ can kick in if that's implemented.
644
817
  return NotImplemented
645
-
818
+ # Allow custom sparse class indicated by attr sparse gh-6520
646
819
  try:
647
820
  other.shape
648
821
  except AttributeError:
@@ -742,6 +915,21 @@ class _spbase:
742
915
  ####################
743
916
 
744
917
  def _divide(self, other, true_divide=False, rdivide=False):
918
+ # Do we need to continue to support true_divide and divide?
919
+ if not (issparse(other) or isdense(other) or isscalarlike(other)):
920
+ # If it's a list or whatever, treat it like an array
921
+ other_a = np.asanyarray(other)
922
+ if other_a.ndim == 0 and other_a.dtype == np.object_:
923
+ # numpy creates a 0d object array if all else fails.
924
+ # Not interpretable as an array; return NotImplemented so that
925
+ # other's __rdiv__ can kick in if that's implemented.
926
+ return NotImplemented
927
+ # Allow custom sparse class indicated by attr sparse gh-6520
928
+ try:
929
+ other.shape
930
+ except AttributeError:
931
+ other = other_a
932
+
745
933
  if isscalarlike(other):
746
934
  if rdivide:
747
935
  if true_divide:
@@ -777,12 +965,16 @@ class _spbase:
777
965
  if rdivide:
778
966
  return other._divide(self, true_divide, rdivide=False)
779
967
 
780
- self_csr = self.tocsr()
968
+ csr_self = (self if self.ndim < 3 else self.reshape(1, -1)).tocsr()
969
+ csr_other = (other if self.ndim < 3 else other.reshape(1, -1)).tocsr()
781
970
  if true_divide and np.can_cast(self.dtype, np.float64):
782
- return self_csr.astype(np.float64)._divide_sparse(other)
971
+ result = csr_self.astype(np.float64)._divide_sparse(csr_other)
783
972
  else:
784
- return self_csr._divide_sparse(other)
973
+ result = csr_self._divide_sparse(csr_other)
974
+ return result if self.ndim < 3 else result.reshape(self.shape)
785
975
  else:
976
+ # not scalar, dense or sparse. Return NotImplemented so
977
+ # other's __rdiv__ can kick in if that's implemented.
786
978
  return NotImplemented
787
979
 
788
980
  def __truediv__(self, other):
@@ -1133,44 +1325,44 @@ class _spbase:
1133
1325
  numpy.matrix.sum : NumPy's implementation of 'sum' for matrices
1134
1326
 
1135
1327
  """
1136
- validateaxis(axis)
1328
+ axis = validateaxis(axis, ndim=self.ndim)
1137
1329
 
1138
1330
  # Mimic numpy's casting.
1139
1331
  res_dtype = get_sum_dtype(self.dtype)
1140
1332
 
1141
- if self.ndim == 1:
1142
- if axis not in (None, -1, 0):
1143
- raise ValueError("axis must be None, -1 or 0")
1144
- res = self @ np.ones(self.shape, dtype=res_dtype)
1145
- return res.sum(dtype=dtype, out=out)
1146
-
1147
- # We use multiplication by a matrix of ones to achieve this.
1148
- # For some sparse array formats more efficient methods are
1149
- # possible -- these should override this function.
1150
- M, N = self.shape
1151
-
1333
+ # Note: all valid 1D axis values are canonically `None`.
1152
1334
  if axis is None:
1153
- # sum over rows and columns
1154
- return (
1155
- self @ self._ascontainer(np.ones((N, 1), dtype=res_dtype))
1156
- ).sum(dtype=dtype, out=out)
1157
-
1158
- if axis < 0:
1159
- axis += 2
1160
-
1161
- # axis = 0 or 1 now
1162
- if axis == 0:
1163
- # sum over columns
1164
- ret = self._ascontainer(
1165
- np.ones((1, M), dtype=res_dtype)
1166
- ) @ self
1335
+ if self.nnz == 0:
1336
+ return np.sum(self._ascontainer([0]), dtype=dtype or res_dtype, out=out)
1337
+ return np.sum(self._ascontainer(_todata(self)), dtype=dtype, out=out)
1338
+ elif isspmatrix(self):
1339
+ # Ensure spmatrix sums stay 2D
1340
+ new_shape = (1, self.shape[1]) if axis == (0,) else (self.shape[0], 1)
1167
1341
  else:
1168
- # sum over rows
1169
- ret = self @ self._ascontainer(
1170
- np.ones((N, 1), dtype=res_dtype)
1171
- )
1342
+ new_shape = tuple(self.shape[i] for i in range(self.ndim) if i not in axis)
1343
+
1344
+ if out is None:
1345
+ # create out array with desired dtype
1346
+ out = self._ascontainer(np.zeros(new_shape, dtype=dtype or res_dtype))
1347
+ else:
1348
+ if out.shape != new_shape:
1349
+ raise ValueError("out dimensions do not match shape")
1350
+
1351
+ if self.ndim > 2:
1352
+ return self._sum_nd(axis, res_dtype, out)
1172
1353
 
1173
- return ret.sum(axis=axis, dtype=dtype, out=out)
1354
+ # We use multiplication by a matrix of ones to sum.
1355
+ # For some sparse array formats more efficient methods are
1356
+ # possible -- these should override this function.
1357
+ if axis == (0,):
1358
+ ones = self._ascontainer(np.ones((1, self.shape[0]), dtype=res_dtype))
1359
+ # sets dtype while loading into out
1360
+ out[...] = (ones @ self).reshape(new_shape)
1361
+ else: # axis == (1,)
1362
+ ones = self._ascontainer(np.ones((self.shape[1], 1), dtype=res_dtype))
1363
+ # sets dtype while loading into out
1364
+ out[...] = (self @ ones).reshape(new_shape)
1365
+ return out
1174
1366
 
1175
1367
  def mean(self, axis=None, dtype=None, out=None):
1176
1368
  """
@@ -1209,43 +1401,24 @@ class _spbase:
1209
1401
  numpy.matrix.mean : NumPy's implementation of 'mean' for matrices
1210
1402
 
1211
1403
  """
1212
- validateaxis(axis)
1404
+ axis = validateaxis(axis, ndim=self.ndim)
1213
1405
 
1214
- res_dtype = self.dtype.type
1215
1406
  integral = (np.issubdtype(self.dtype, np.integer) or
1216
1407
  np.issubdtype(self.dtype, np.bool_))
1217
1408
 
1218
- # output dtype
1219
- if dtype is None:
1220
- if integral:
1221
- res_dtype = np.float64
1222
- else:
1223
- res_dtype = np.dtype(dtype).type
1224
-
1225
1409
  # intermediate dtype for summation
1226
- inter_dtype = np.float64 if integral else res_dtype
1410
+ inter_dtype = np.float64 if integral else self.dtype
1227
1411
  inter_self = self.astype(inter_dtype)
1228
1412
 
1229
- if self.ndim == 1:
1230
- if axis not in (None, -1, 0):
1231
- raise ValueError("axis must be None, -1 or 0")
1232
- res = inter_self / self.shape[-1]
1233
- return res.sum(dtype=res_dtype, out=out)
1234
-
1235
1413
  if axis is None:
1236
- return (inter_self / (self.shape[0] * self.shape[1]))\
1237
- .sum(dtype=res_dtype, out=out)
1238
-
1239
- if axis < 0:
1240
- axis += 2
1241
-
1242
- # axis = 0 or 1 now
1243
- if axis == 0:
1244
- return (inter_self * (1.0 / self.shape[0])).sum(
1245
- axis=0, dtype=res_dtype, out=out)
1414
+ denom = math.prod(self.shape)
1246
1415
  else:
1247
- return (inter_self * (1.0 / self.shape[1])).sum(
1248
- axis=1, dtype=res_dtype, out=out)
1416
+ denom = math.prod(self.shape[ax] for ax in axis)
1417
+ res = (inter_self * (1.0 / denom)).sum(axis=axis, dtype=inter_dtype, out=out)
1418
+ if dtype is not None and out is None:
1419
+ return res.astype(dtype, copy=False)
1420
+ return res
1421
+
1249
1422
 
1250
1423
  def diagonal(self, k=0):
1251
1424
  """Returns the kth diagonal of the array/matrix.
@@ -1381,42 +1554,31 @@ class _spbase:
1381
1554
  class sparray:
1382
1555
  """A namespace class to separate sparray from spmatrix"""
1383
1556
 
1557
+ @classmethod
1558
+ def __class_getitem__(cls, arg, /):
1559
+ """
1560
+ Return a parametrized wrapper around the `~scipy.sparse.sparray` type.
1384
1561
 
1385
- sparray.__doc__ = _spbase.__doc__
1386
-
1562
+ .. versionadded:: 1.16.0
1387
1563
 
1388
- def issparse(x):
1389
- """Is `x` of a sparse array or sparse matrix type?
1564
+ Returns
1565
+ -------
1566
+ alias : types.GenericAlias
1567
+ A parametrized `~scipy.sparse.sparray` type.
1390
1568
 
1391
- Parameters
1392
- ----------
1393
- x
1394
- object to check for being a sparse array or sparse matrix
1569
+ Examples
1570
+ --------
1571
+ >>> import numpy as np
1572
+ >>> from scipy.sparse import coo_array
1395
1573
 
1396
- Returns
1397
- -------
1398
- bool
1399
- True if `x` is a sparse array or a sparse matrix, False otherwise
1574
+ >>> coo_array[np.int8, tuple[int]]
1575
+ scipy.sparse._coo.coo_array[numpy.int8, tuple[int]]
1576
+ """
1577
+ from types import GenericAlias
1578
+ return GenericAlias(cls, arg)
1400
1579
 
1401
- Notes
1402
- -----
1403
- Use `isinstance(x, sp.sparse.sparray)` to check between an array or matrix.
1404
- Use `a.format` to check the sparse format, e.g. `a.format == 'csr'`.
1405
1580
 
1406
- Examples
1407
- --------
1408
- >>> import numpy as np
1409
- >>> from scipy.sparse import csr_array, csr_matrix, issparse
1410
- >>> issparse(csr_matrix([[5]]))
1411
- True
1412
- >>> issparse(csr_array([[5]]))
1413
- True
1414
- >>> issparse(np.array([[5]]))
1415
- False
1416
- >>> issparse(5)
1417
- False
1418
- """
1419
- return isinstance(x, _spbase)
1581
+ sparray.__doc__ = _spbase.__doc__
1420
1582
 
1421
1583
 
1422
1584
  def isspmatrix(x):
scipy/sparse/_bsr.py CHANGED
@@ -172,8 +172,9 @@ class _bsr_base(_cs_matrix, _minmax_mixin):
172
172
 
173
173
  # check index pointer
174
174
  if (len(self.indptr) != M//R + 1):
175
- raise ValueError("index pointer size (%d) should be (%d)" %
176
- (len(self.indptr), M//R + 1))
175
+ raise ValueError(
176
+ f"index pointer size ({len(self.indptr)}) should be ({M//R + 1})"
177
+ )
177
178
  if (self.indptr[0] != 0):
178
179
  raise ValueError("index pointer should start with 0")
179
180
 
@@ -190,8 +191,10 @@ class _bsr_base(_cs_matrix, _minmax_mixin):
190
191
  # check format validity (more expensive)
191
192
  if self.nnz > 0:
192
193
  if self.indices.max() >= N//C:
193
- raise ValueError("column index values must be < %d (now max %d)"
194
- % (N//C, self.indices.max()))
194
+ raise ValueError(
195
+ f"column index values must be < {N//C}"
196
+ f" (now max {self.indices.max()})"
197
+ )
195
198
  if self.indices.min() < 0:
196
199
  raise ValueError("column index values must be >= 0")
197
200
  if np.diff(self.indptr).min() < 0: