scipy 1.15.3__cp313-cp313t-win_amd64.whl → 1.16.0rc2__cp313-cp313t-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 +7 -7
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp313t-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp313t-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp313t-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp313t-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp313t-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp313t-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp313t-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp313t-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp313t-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp313t-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp313t-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp313t-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp313t-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp313t-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp313t-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp313t-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp313t-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp313t-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp313t-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp313t-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp313t-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp313t-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp313t-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp313t-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp313t-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp313t-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp313t-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp313t-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp313t-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp313t-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp313t-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp313t-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp313t-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp313t-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp313t-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp313t-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp313t-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp313t-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp313t-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp313t-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp313t-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp313t-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp313t-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp313t-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp313t-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp313t-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp313t-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp313t-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp313t-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp313t-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp313t-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp313t-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp313t-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp313t-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp313t-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp313t-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp313t-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp313t-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp313t-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp313t-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp313t-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp313t-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp313t-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp313t-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp313t-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp313t-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp313t-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp313t-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp313t-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp313t-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp313t-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp313t-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp313t-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp313t-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp313t-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp313t-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp313t-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp313t-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp313t-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp313t-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp313t-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp313t-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp313t-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp313t-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp313t-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp313t-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp313t-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp313t-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp313t-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp313t-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp313t-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp313t-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp313t-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp313t-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp313t-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp313t-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp313t-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp313t-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp313t-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp313t-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp313t-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp313t-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp313t-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp313t-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp313t-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp313t-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp313t-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp313t-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp313t-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp313t-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp313t-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp313t-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp313t-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp313t-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp313t-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp313t-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp313t-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp313t-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp313t-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp313t-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp313-cp313t-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313t-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
scipy/stats/_morestats.py CHANGED
@@ -15,15 +15,15 @@ from scipy._lib._util import _rename_parameter, _contains_nan, _get_nan
15
15
  from scipy._lib._array_api import (
16
16
  array_namespace,
17
17
  xp_size,
18
- xp_moveaxis_to_end,
19
18
  xp_vector_norm,
19
+ xp_promote,
20
20
  )
21
21
 
22
22
  from ._ansari_swilk_statistics import gscale, swilk
23
23
  from . import _stats_py, _wilcoxon
24
24
  from ._fit import FitResult
25
25
  from ._stats_py import (find_repeats, _get_pvalue, SignificanceResult, # noqa:F401
26
- _SimpleNormal, _SimpleChi2)
26
+ _SimpleNormal, _SimpleChi2, _length_nonmasked)
27
27
  from .contingency import chi2_contingency
28
28
  from . import distributions
29
29
  from ._distn_infrastructure import rv_generic
@@ -222,7 +222,7 @@ def mvsdist(data):
222
222
 
223
223
 
224
224
  @_axis_nan_policy_factory(
225
- lambda x: x, result_to_tuple=lambda x: (x,), n_outputs=1, default_axis=None
225
+ lambda x: x, result_to_tuple=lambda x, _: (x,), n_outputs=1, default_axis=None
226
226
  )
227
227
  def kstat(data, n=2, *, axis=None):
228
228
  r"""
@@ -309,7 +309,7 @@ def kstat(data, n=2, *, axis=None):
309
309
  data = xp.reshape(data, (-1,))
310
310
  axis = 0
311
311
 
312
- N = data.shape[axis]
312
+ N = _length_nonmasked(data, axis, xp=xp)
313
313
 
314
314
  S = [None] + [xp.sum(data**k, axis=axis) for k in range(1, n + 1)]
315
315
  if n == 1:
@@ -327,7 +327,7 @@ def kstat(data, n=2, *, axis=None):
327
327
 
328
328
 
329
329
  @_axis_nan_policy_factory(
330
- lambda x: x, result_to_tuple=lambda x: (x,), n_outputs=1, default_axis=None
330
+ lambda x: x, result_to_tuple=lambda x, _: (x,), n_outputs=1, default_axis=None
331
331
  )
332
332
  def kstatvar(data, n=2, *, axis=None):
333
333
  r"""Return an unbiased estimator of the variance of the k-statistic.
@@ -375,7 +375,7 @@ def kstatvar(data, n=2, *, axis=None):
375
375
  if axis is None:
376
376
  data = xp.reshape(data, (-1,))
377
377
  axis = 0
378
- N = data.shape[axis]
378
+ N = _length_nonmasked(data, axis, xp=xp)
379
379
 
380
380
  if n == 1:
381
381
  return kstat(data, n=2, axis=axis, _no_deco=True) * 1.0/N
@@ -854,26 +854,24 @@ def ppcc_plot(x, a, b, dist='tukeylambda', plot=None, N=80):
854
854
  return svals, ppcc
855
855
 
856
856
 
857
- def _log_mean(logx):
857
+ def _log_mean(logx, axis):
858
858
  # compute log of mean of x from log(x)
859
- res = special.logsumexp(logx, axis=0) - math.log(logx.shape[0])
860
- return res
859
+ return (
860
+ special.logsumexp(logx, axis=axis, keepdims=True)
861
+ - math.log(logx.shape[axis])
862
+ )
861
863
 
862
864
 
863
- def _log_var(logx, xp):
865
+ def _log_var(logx, xp, axis):
864
866
  # compute log of variance of x from log(x)
865
- logmean = _log_mean(logx)
866
- # get complex dtype with component dtypes same as `logx` dtype;
867
- # see data-apis/array-api#841
868
- dtype = xp.result_type(logx.dtype, xp.complex64)
869
- pij = xp.full(logx.shape, pi * 1j, dtype=dtype)
870
- logxmu = special.logsumexp(xp.stack((logx, logmean + pij)), axis=0)
871
- res = (xp.real(xp.asarray(special.logsumexp(2 * logxmu, axis=0)))
872
- - math.log(logx.shape[0]))
873
- return res
867
+ logmean = xp.broadcast_to(_log_mean(logx, axis=axis), logx.shape)
868
+ ones = xp.ones_like(logx)
869
+ logxmu, _ = special.logsumexp(xp.stack((logx, logmean), axis=0), axis=0,
870
+ b=xp.stack((ones, -ones), axis=0), return_sign=True)
871
+ return special.logsumexp(2 * logxmu, axis=axis) - math.log(logx.shape[axis])
874
872
 
875
873
 
876
- def boxcox_llf(lmb, data):
874
+ def boxcox_llf(lmb, data, *, axis=0, keepdims=False, nan_policy='propagate'):
877
875
  r"""The boxcox log-likelihood function.
878
876
 
879
877
  Parameters
@@ -884,6 +882,26 @@ def boxcox_llf(lmb, data):
884
882
  Data to calculate Box-Cox log-likelihood for. If `data` is
885
883
  multi-dimensional, the log-likelihood is calculated along the first
886
884
  axis.
885
+ axis : int, default: 0
886
+ If an int, the axis of the input along which to compute the statistic.
887
+ The statistic of each axis-slice (e.g. row) of the input will appear in a
888
+ corresponding element of the output.
889
+ If ``None``, the input will be raveled before computing the statistic.
890
+ nan_policy : {'propagate', 'omit', 'raise'
891
+ Defines how to handle input NaNs.
892
+
893
+ - ``propagate``: if a NaN is present in the axis slice (e.g. row) along
894
+ which the statistic is computed, the corresponding entry of the output
895
+ will be NaN.
896
+ - ``omit``: NaNs will be omitted when performing the calculation.
897
+ If insufficient data remains in the axis slice along which the
898
+ statistic is computed, the corresponding entry of the output will be
899
+ NaN.
900
+ - ``raise``: if a NaN is present, a ``ValueError`` will be raised.
901
+ keepdims : bool, default: False
902
+ If this is set to True, the axes which are reduced are left
903
+ in the result as dimensions with size one. With this option,
904
+ the result will broadcast correctly against the input array.
887
905
 
888
906
  Returns
889
907
  -------
@@ -897,14 +915,17 @@ def boxcox_llf(lmb, data):
897
915
 
898
916
  Notes
899
917
  -----
900
- The Box-Cox log-likelihood function is defined here as
918
+ The Box-Cox log-likelihood function :math:`l` is defined here as
901
919
 
902
920
  .. math::
903
921
 
904
- llf = (\lambda - 1) \sum_i(\log(x_i)) -
905
- N/2 \log(\sum_i (y_i - \bar{y})^2 / N),
922
+ l = (\lambda - 1) \sum_i^N \log(x_i) -
923
+ \frac{N}{2} \log\left(\sum_i^N (y_i - \bar{y})^2 / N\right),
906
924
 
907
- where ``y`` is the Box-Cox transformed input data ``x``.
925
+ where :math:`N` is the number of data points ``data`` and :math:`y` is the Box-Cox
926
+ transformed input data.
927
+ This corresponds to the *profile log-likelihood* of the original data :math:`x`
928
+ with some constant terms dropped.
908
929
 
909
930
  Examples
910
931
  --------
@@ -953,32 +974,39 @@ def boxcox_llf(lmb, data):
953
974
  >>> plt.show()
954
975
 
955
976
  """
977
+ # _axis_nan_policy decorator does not currently support these for non-NumPy arrays
978
+ kwargs = {}
979
+ if keepdims is not False:
980
+ kwargs[keepdims] = keepdims
981
+ if nan_policy != 'propagate':
982
+ kwargs[nan_policy] = nan_policy
983
+ return _boxcox_llf(data, lmb=lmb, axis=axis, **kwargs)
984
+
985
+
986
+ @_axis_nan_policy_factory(lambda x: x, n_outputs=1, default_axis=0,
987
+ result_to_tuple=lambda x, _: (x,))
988
+ def _boxcox_llf(data, axis=0, *, lmb):
956
989
  xp = array_namespace(data)
957
- data = xp.asarray(data)
958
- N = data.shape[0]
990
+ lmb, data = xp_promote(lmb, data, force_floating=True, xp=xp)
991
+ N = data.shape[axis]
959
992
  if N == 0:
960
- return xp.nan
961
-
962
- dt = data.dtype
963
- if xp.isdtype(dt, 'integral'):
964
- data = xp.asarray(data, dtype=xp.float64)
965
- dt = xp.float64
993
+ return _get_nan(data, xp=xp)
966
994
 
967
995
  logdata = xp.log(data)
968
996
 
969
997
  # Compute the variance of the transformed data.
970
998
  if lmb == 0:
971
- logvar = xp.log(xp.var(logdata, axis=0))
999
+ logvar = xp.log(xp.var(logdata, axis=axis))
972
1000
  else:
973
1001
  # Transform without the constant offset 1/lmb. The offset does
974
1002
  # not affect the variance, and the subtraction of the offset can
975
1003
  # lead to loss of precision.
976
1004
  # Division by lmb can be factored out to enhance numerical stability.
977
1005
  logx = lmb * logdata
978
- logvar = _log_var(logx, xp) - 2 * math.log(abs(lmb))
1006
+ logvar = _log_var(logx, xp, axis) - 2 * math.log(abs(lmb))
979
1007
 
980
- res = (lmb - 1) * xp.sum(logdata, axis=0) - N/2 * logvar
981
- res = xp.astype(res, dt)
1008
+ res = (lmb - 1) * xp.sum(logdata, axis=axis) - N/2 * logvar
1009
+ res = xp.astype(res, data.dtype, copy=False) # compensate for NumPy <2.0
982
1010
  res = res[()] if res.ndim == 0 else res
983
1011
  return res
984
1012
 
@@ -1082,10 +1110,15 @@ def boxcox(x, lmbda=None, alpha=None, optimizer=None):
1082
1110
 
1083
1111
  Notes
1084
1112
  -----
1085
- The Box-Cox transform is given by::
1113
+ The Box-Cox transform is given by:
1114
+
1115
+ .. math::
1086
1116
 
1087
- y = (x**lmbda - 1) / lmbda, for lmbda != 0
1088
- log(x), for lmbda = 0
1117
+ y =
1118
+ \begin{cases}
1119
+ \frac{x^\lambda - 1}{\lambda}, &\text{for } \lambda \neq 0
1120
+ \log(x), &\text{for } \lambda = 0
1121
+ \end{cases}
1089
1122
 
1090
1123
  `boxcox` requires the input data to be positive. Sometimes a Box-Cox
1091
1124
  transformation provides a shift parameter to achieve this; `boxcox` does
@@ -1097,9 +1130,9 @@ def boxcox(x, lmbda=None, alpha=None, optimizer=None):
1097
1130
 
1098
1131
  .. math::
1099
1132
 
1100
- llf(\hat{\lambda}) - llf(\lambda) < \frac{1}{2}\chi^2(1 - \alpha, 1),
1133
+ l(\hat{\lambda}) - l(\lambda) < \frac{1}{2}\chi^2(1 - \alpha, 1),
1101
1134
 
1102
- with ``llf`` the log-likelihood function and :math:`\chi^2` the chi-squared
1135
+ with :math:`l` the log-likelihood function and :math:`\chi^2` the chi-squared
1103
1136
  function.
1104
1137
 
1105
1138
  References
@@ -1538,12 +1571,24 @@ def yeojohnson(x, lmbda=None):
1538
1571
 
1539
1572
  Notes
1540
1573
  -----
1541
- The Yeo-Johnson transform is given by::
1574
+ The Yeo-Johnson transform is given by:
1542
1575
 
1543
- y = ((x + 1)**lmbda - 1) / lmbda, for x >= 0, lmbda != 0
1544
- log(x + 1), for x >= 0, lmbda = 0
1545
- -((-x + 1)**(2 - lmbda) - 1) / (2 - lmbda), for x < 0, lmbda != 2
1546
- -log(-x + 1), for x < 0, lmbda = 2
1576
+ .. math::
1577
+
1578
+ y =
1579
+ \begin{cases}
1580
+ \frac{(x + 1)^\lambda - 1}{\lambda},
1581
+ &\text{for } x \geq 0, \lambda \neq 0
1582
+ \\
1583
+ \log(x + 1),
1584
+ &\text{for } x \geq 0, \lambda = 0
1585
+ \\
1586
+ -\frac{(-x + 1)^{2 - \lambda} - 1}{2 - \lambda},
1587
+ &\text{for } x < 0, \lambda \neq 2
1588
+ \\
1589
+ -\log(-x + 1),
1590
+ &\text{for } x < 0, \lambda = 2
1591
+ \end{cases}
1547
1592
 
1548
1593
  Unlike `boxcox`, `yeojohnson` does not require the input data to be
1549
1594
  positive.
@@ -1651,15 +1696,18 @@ def yeojohnson_llf(lmb, data):
1651
1696
 
1652
1697
  Notes
1653
1698
  -----
1654
- The Yeo-Johnson log-likelihood function is defined here as
1699
+ The Yeo-Johnson log-likelihood function :math:`l` is defined here as
1655
1700
 
1656
1701
  .. math::
1657
1702
 
1658
- llf = -N/2 \log(\hat{\sigma}^2) + (\lambda - 1)
1659
- \sum_i \text{ sign }(x_i)\log(|x_i| + 1)
1703
+ l = -\frac{N}{2} \log(\hat{\sigma}^2) + (\lambda - 1)
1704
+ \sum_i^N \text{sign}(x_i) \log(|x_i| + 1)
1660
1705
 
1661
- where :math:`\hat{\sigma}^2` is estimated variance of the Yeo-Johnson
1662
- transformed input data ``x``.
1706
+ where :math:`N` is the number of data points :math:`x`=``data`` and
1707
+ :math:`\hat{\sigma}^2` is the estimated variance of the Yeo-Johnson transformed
1708
+ input data :math:`x`.
1709
+ This corresponds to the *profile log-likelihood* of the original data :math:`x`
1710
+ with some constant terms dropped.
1663
1711
 
1664
1712
  .. versionadded:: 1.2.0
1665
1713
 
@@ -2884,7 +2932,7 @@ def bartlett(*samples, axis=0):
2884
2932
  raise ValueError("Must enter at least two input sample vectors.")
2885
2933
 
2886
2934
  samples = _broadcast_arrays(samples, axis=axis, xp=xp)
2887
- samples = [xp_moveaxis_to_end(sample, axis, xp=xp) for sample in samples]
2935
+ samples = [xp.moveaxis(sample, axis, -1) for sample in samples]
2888
2936
 
2889
2937
  Ni = [xp.asarray(sample.shape[-1], dtype=sample.dtype) for sample in samples]
2890
2938
  Ni = [xp.broadcast_to(N, samples[0].shape[:-1]) for N in Ni]
@@ -2893,14 +2941,13 @@ def bartlett(*samples, axis=0):
2893
2941
  ssq = [arr[xp.newaxis, ...] for arr in ssq]
2894
2942
  Ni = xp.concat(Ni, axis=0)
2895
2943
  ssq = xp.concat(ssq, axis=0)
2896
- # sum dtype can be removed when 2023.12 rules kick in
2897
2944
  dtype = Ni.dtype
2898
- Ntot = xp.sum(Ni, axis=0, dtype=dtype)
2945
+ Ntot = xp.sum(Ni, axis=0)
2899
2946
  spsq = xp.sum((Ni - 1)*ssq, axis=0, dtype=dtype) / (Ntot - k)
2900
2947
  numer = ((Ntot - k) * xp.log(spsq)
2901
2948
  - xp.sum((Ni - 1)*xp.log(ssq), axis=0, dtype=dtype))
2902
2949
  denom = (1 + 1/(3*(k - 1))
2903
- * ((xp.sum(1/(Ni - 1), axis=0, dtype=dtype)) - 1/(Ntot - k)))
2950
+ * ((xp.sum(1/(Ni - 1), axis=0)) - 1/(Ntot - k)))
2904
2951
  T = numer / denom
2905
2952
 
2906
2953
  chi2 = _SimpleChi2(xp.asarray(k-1))
@@ -3449,7 +3496,7 @@ def mood(x, y, axis=0, alternative="two-sided"):
3449
3496
  WilcoxonResult = _make_tuple_bunch('WilcoxonResult', ['statistic', 'pvalue'])
3450
3497
 
3451
3498
 
3452
- def wilcoxon_result_unpacker(res):
3499
+ def wilcoxon_result_unpacker(res, _):
3453
3500
  if hasattr(res, 'zstatistic'):
3454
3501
  return res.statistic, res.pvalue, res.zstatistic
3455
3502
  else:
@@ -3870,16 +3917,15 @@ def median_test(*samples, ties='below', correction=True, lambda_=1,
3870
3917
  # Validate the sizes and shapes of the arguments.
3871
3918
  for k, d in enumerate(data):
3872
3919
  if d.size == 0:
3873
- raise ValueError("Sample %d is empty. All samples must "
3874
- "contain at least one value." % (k + 1))
3920
+ raise ValueError(f"Sample {k + 1} is empty. All samples must "
3921
+ f"contain at least one value.")
3875
3922
  if d.ndim != 1:
3876
- raise ValueError("Sample %d has %d dimensions. All "
3877
- "samples must be one-dimensional sequences." %
3878
- (k + 1, d.ndim))
3923
+ raise ValueError(f"Sample {k + 1} has {d.ndim} dimensions. "
3924
+ f"All samples must be one-dimensional sequences.")
3879
3925
 
3880
3926
  cdata = np.concatenate(data)
3881
- contains_nan, nan_policy = _contains_nan(cdata, nan_policy)
3882
- if contains_nan and nan_policy == 'propagate':
3927
+ contains_nan = _contains_nan(cdata, nan_policy)
3928
+ if nan_policy == 'propagate' and contains_nan:
3883
3929
  return MedianTestResult(np.nan, np.nan, np.nan, None)
3884
3930
 
3885
3931
  if contains_nan:
@@ -3920,10 +3966,11 @@ def median_test(*samples, ties='below', correction=True, lambda_=1,
3920
3966
  # check for that case here.
3921
3967
  zero_cols = np.nonzero((table == 0).all(axis=0))[0]
3922
3968
  if len(zero_cols) > 0:
3923
- msg = ("All values in sample %d are equal to the grand "
3924
- "median (%r), so they are ignored, resulting in an "
3925
- "empty sample." % (zero_cols[0] + 1, grand_median))
3926
- raise ValueError(msg)
3969
+ raise ValueError(
3970
+ f"All values in sample {zero_cols[0] + 1} are equal to the grand "
3971
+ f"median ({grand_median!r}), so they are ignored, resulting in an "
3972
+ f"empty sample."
3973
+ )
3927
3974
 
3928
3975
  stat, p, dof, expected = chi2_contingency(table, lambda_=lambda_,
3929
3976
  correction=correction)
@@ -3933,9 +3980,7 @@ def median_test(*samples, ties='below', correction=True, lambda_=1,
3933
3980
  def _circfuncs_common(samples, period, xp=None):
3934
3981
  xp = array_namespace(samples) if xp is None else xp
3935
3982
 
3936
- if xp.isdtype(samples.dtype, 'integral'):
3937
- dtype = xp.asarray(1.).dtype # get default float type
3938
- samples = xp.asarray(samples, dtype=dtype)
3983
+ samples = xp_promote(samples, force_floating=True, xp=xp)
3939
3984
 
3940
3985
  # Recast samples as radians that range between 0 and 2 pi and calculate
3941
3986
  # the sine and cosine
@@ -3948,7 +3993,7 @@ def _circfuncs_common(samples, period, xp=None):
3948
3993
 
3949
3994
  @_axis_nan_policy_factory(
3950
3995
  lambda x: x, n_outputs=1, default_axis=None,
3951
- result_to_tuple=lambda x: (x,)
3996
+ result_to_tuple=lambda x, _: (x,)
3952
3997
  )
3953
3998
  def circmean(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
3954
3999
  r"""Compute the circular mean of a sample of angle observations.
@@ -4041,7 +4086,7 @@ def circmean(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
4041
4086
 
4042
4087
  @_axis_nan_policy_factory(
4043
4088
  lambda x: x, n_outputs=1, default_axis=None,
4044
- result_to_tuple=lambda x: (x,)
4089
+ result_to_tuple=lambda x, _: (x,)
4045
4090
  )
4046
4091
  def circvar(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
4047
4092
  r"""Compute the circular variance of a sample of angle observations.
@@ -4135,7 +4180,7 @@ def circvar(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
4135
4180
 
4136
4181
  @_axis_nan_policy_factory(
4137
4182
  lambda x: x, n_outputs=1, default_axis=None,
4138
- result_to_tuple=lambda x: (x,)
4183
+ result_to_tuple=lambda x, _: (x,)
4139
4184
  )
4140
4185
  def circstd(samples, high=2*pi, low=0, axis=None, nan_policy='propagate', *,
4141
4186
  normalize=False):
@@ -2263,8 +2263,8 @@ def trimmed_stde(a, limits=(0.1,0.1), inclusive=(1,1), axis=None):
2263
2263
  return _trimmed_stde_1D(a.ravel(),lolim,uplim,loinc,upinc)
2264
2264
  else:
2265
2265
  if a.ndim > 2:
2266
- raise ValueError("Array 'a' must be at most two dimensional, "
2267
- "but got a.ndim = %d" % a.ndim)
2266
+ raise ValueError(f"Array 'a' must be at most two dimensional, "
2267
+ f"but got a.ndim = {a.ndim}")
2268
2268
  return ma.apply_along_axis(_trimmed_stde_1D, axis, a,
2269
2269
  lolim,uplim,loinc,upinc)
2270
2270
 
@@ -2641,7 +2641,7 @@ def winsorize(a, limits=None, inclusive=(True, True), inplace=False,
2641
2641
  a[idx[upidx:]] = a[idx[upidx - 1]]
2642
2642
  return a
2643
2643
 
2644
- contains_nan, nan_policy = _contains_nan(a, nan_policy)
2644
+ contains_nan = _contains_nan(a, nan_policy)
2645
2645
  # We are going to modify a: better make a copy
2646
2646
  a = ma.array(a, copy=np.logical_not(inplace))
2647
2647
 
@@ -3016,8 +3016,8 @@ def stde_median(data, axis=None):
3016
3016
  return _stdemed_1D(data)
3017
3017
  else:
3018
3018
  if data.ndim > 2:
3019
- raise ValueError("Array 'data' must be at most two dimensional, "
3020
- "but got data.ndim = %d" % data.ndim)
3019
+ raise ValueError(f"Array 'data' must be at most two dimensional, "
3020
+ f"but got data.ndim = {data.ndim}")
3021
3021
  return ma.apply_along_axis(_stdemed_1D, axis, data)
3022
3022
 
3023
3023
 
@@ -3067,9 +3067,8 @@ def skewtest(a, axis=0, alternative='two-sided'):
3067
3067
  b2 = skew(a,axis)
3068
3068
  n = a.count(axis)
3069
3069
  if np.min(n) < 8:
3070
- raise ValueError(
3071
- "skewtest is not valid with less than 8 samples; %i samples"
3072
- " were given." % np.min(n))
3070
+ raise ValueError(f"skewtest is not valid with less than 8 samples; "
3071
+ f"{np.min(n)} samples were given.")
3073
3072
 
3074
3073
  y = b2 * ma.sqrt(((n+1)*(n+3)) / (6.0*(n-2)))
3075
3074
  beta2 = (3.0*(n*n+27*n-70)*(n+1)*(n+3)) / ((n-2.0)*(n+5)*(n+7)*(n+9))
@@ -3125,14 +3124,11 @@ def kurtosistest(a, axis=0, alternative='two-sided'):
3125
3124
  a, axis = _chk_asarray(a, axis)
3126
3125
  n = a.count(axis=axis)
3127
3126
  if np.min(n) < 5:
3128
- raise ValueError(
3129
- "kurtosistest requires at least 5 observations; %i observations"
3130
- " were given." % np.min(n))
3127
+ raise ValueError(f"kurtosistest requires at least 5 observations; "
3128
+ f"{np.min(n)} observations were given.")
3131
3129
  if np.min(n) < 20:
3132
- warnings.warn(
3133
- "kurtosistest only valid for n>=20 ... continuing anyway, n=%i" % np.min(n),
3134
- stacklevel=2,
3135
- )
3130
+ warnings.warn(f"kurtosistest only valid for n>=20 ... continuing "
3131
+ f"anyway, n={np.min(n)}", stacklevel=2)
3136
3132
 
3137
3133
  b2 = kurtosis(a, axis, fisher=False)
3138
3134
  E = 3.0*(n-1) / (n+1)
@@ -3535,8 +3531,8 @@ def friedmanchisquare(*args):
3535
3531
  data = argstoarray(*args).astype(float)
3536
3532
  k = len(data)
3537
3533
  if k < 3:
3538
- raise ValueError("Less than 3 groups (%i): " % k +
3539
- "the Friedman test is NOT appropriate.")
3534
+ raise ValueError(f"Less than 3 groups ({k}): the Friedman test "
3535
+ f"is NOT appropriate.")
3540
3536
 
3541
3537
  ranked = ma.masked_values(rankdata(data, axis=0), 0)
3542
3538
  if ranked._mask is not nomask:
@@ -114,8 +114,8 @@ def hdquantiles(data, prob=(.25, .5, .75), axis=None, var=False,):
114
114
  result = _hd_1D(data, p, var)
115
115
  else:
116
116
  if data.ndim > 2:
117
- raise ValueError("Array 'data' must be at most two dimensional, "
118
- "but got data.ndim = %d" % data.ndim)
117
+ raise ValueError(f"Array 'data' must be at most two dimensional, "
118
+ f"but got data.ndim = {data.ndim}")
119
119
  result = ma.apply_along_axis(_hd_1D, axis, data, p, var)
120
120
 
121
121
  return ma.fix_invalid(result, copy=False)
@@ -203,8 +203,8 @@ def hdquantiles_sd(data, prob=(.25, .5, .75), axis=None):
203
203
  result = _hdsd_1D(data, p)
204
204
  else:
205
205
  if data.ndim > 2:
206
- raise ValueError("Array 'data' must be at most two dimensional, "
207
- "but got data.ndim = %d" % data.ndim)
206
+ raise ValueError(f"Array 'data' must be at most two dimensional, "
207
+ f"but got data.ndim = {data.ndim}")
208
208
  result = ma.apply_along_axis(_hdsd_1D, axis, data, p)
209
209
 
210
210
  return ma.fix_invalid(result, copy=False).ravel()
@@ -295,8 +295,8 @@ def mjci(data, prob=(0.25, 0.5, 0.75), axis=None):
295
295
 
296
296
  data = ma.array(data, copy=False)
297
297
  if data.ndim > 2:
298
- raise ValueError("Array 'data' must be at most two dimensional, "
299
- "but got data.ndim = %d" % data.ndim)
298
+ raise ValueError(f"Array 'data' must be at most two dimensional, "
299
+ f"but got data.ndim = {data.ndim}")
300
300
 
301
301
  p = np.atleast_1d(np.asarray(prob))
302
302
  # Computes quantiles along axis (or globally)
@@ -384,8 +384,8 @@ def median_cihs(data, alpha=0.05, axis=None):
384
384
  result = _cihs_1D(data, alpha)
385
385
  else:
386
386
  if data.ndim > 2:
387
- raise ValueError("Array 'data' must be at most two dimensional, "
388
- "but got data.ndim = %d" % data.ndim)
387
+ raise ValueError(f"Array 'data' must be at most two dimensional, "
388
+ f"but got data.ndim = {data.ndim}")
389
389
  result = ma.apply_along_axis(_cihs_1D, axis, data, alpha)
390
390
 
391
391
  return result