scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0rc2__cp312-cp312-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.cp312-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp312-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.cp312-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp312-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.cp312-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp312-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.cp312-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp312-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.cp312-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp312-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.cp312-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp312-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.cp312-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp312-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.cp312-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp312-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.cp312-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp312-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.cp312-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp312-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.cp312-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp312-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.cp312-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp312-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.cp312-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp312-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.cp312-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp312-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.cp312-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp312-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.cp312-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp312-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.cp312-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp312-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.cp312-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp312-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.cp312-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp312-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.cp312-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp312-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.cp312-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp312-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.cp312-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp312-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.cp312-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp312-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.cp312-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp312-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.cp312-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp312-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.cp312-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp312-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.cp312-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp312-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.cp312-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp312-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.cp312-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp312-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.cp312-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp312-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.cp312-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp312-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.cp312-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp312-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.cp312-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp312-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.cp312-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp312-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.cp312-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp312-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.cp312-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp312-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.cp312-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp312-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.cp312-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp312-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp312-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.cp312-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp312-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.cp312-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp312-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.cp312-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp312-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.cp312-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp312-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.cp312-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp312-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.cp312-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp312-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.cp312-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp312-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.cp312-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0rc2-cp312-cp312-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -238,8 +238,10 @@ class TestEstimateGradients2DGlobal:
238
238
  dz = interpnd.estimate_gradients_2d_global(tri, z, tol=1e-6)
239
239
 
240
240
  assert dz.shape == (6, 2)
241
- xp_assert_close(dz, np.array(grad)[None,:] + 0*dz,
242
- rtol=1e-5, atol=1e-5, err_msg="item %d" % j)
241
+ xp_assert_close(
242
+ dz, np.array(grad)[None, :] + 0*dz, rtol=1e-5, atol=1e-5,
243
+ err_msg=f"item {j}"
244
+ )
243
245
 
244
246
  def test_regression_2359(self):
245
247
  # Check regression --- for certain point sets, gradient
@@ -300,17 +302,22 @@ class TestCloughTocher2DInterpolator:
300
302
  ]
301
303
 
302
304
  for j, func in enumerate(funcs):
303
- self._check_accuracy(func, tol=1e-13, atol=1e-7, rtol=1e-7,
304
- err_msg="Function %d" % j)
305
- self._check_accuracy(func, tol=1e-13, atol=1e-7, rtol=1e-7,
306
- alternate=True,
307
- err_msg="Function (alternate) %d" % j)
305
+ self._check_accuracy(
306
+ func, tol=1e-13, atol=1e-7, rtol=1e-7, err_msg=f"Function {j}"
307
+ )
308
+ self._check_accuracy(
309
+ func, tol=1e-13, atol=1e-7, rtol=1e-7, alternate=True,
310
+ err_msg=f"Function (alternate) {j}"
311
+ )
308
312
  # check rescaling
309
- self._check_accuracy(func, tol=1e-13, atol=1e-7, rtol=1e-7,
310
- err_msg="Function (rescaled) %d" % j, rescale=True)
311
- self._check_accuracy(func, tol=1e-13, atol=1e-7, rtol=1e-7,
312
- alternate=True, rescale=True,
313
- err_msg="Function (alternate, rescaled) %d" % j)
313
+ self._check_accuracy(
314
+ func, tol=1e-13, atol=1e-7, rtol=1e-7,
315
+ err_msg=f"Function (rescaled) {j}", rescale=True
316
+ )
317
+ self._check_accuracy(
318
+ func, tol=1e-13, atol=1e-7, rtol=1e-7, alternate=True, rescale=True,
319
+ err_msg=f"Function (alternate, rescaled) {j}"
320
+ )
314
321
 
315
322
  def test_quadratic_smoketest(self):
316
323
  # Should be reasonably accurate for quadratic functions
@@ -322,10 +329,12 @@ class TestCloughTocher2DInterpolator:
322
329
  ]
323
330
 
324
331
  for j, func in enumerate(funcs):
325
- self._check_accuracy(func, tol=1e-9, atol=0.22, rtol=0,
326
- err_msg="Function %d" % j)
327
- self._check_accuracy(func, tol=1e-9, atol=0.22, rtol=0,
328
- err_msg="Function %d" % j, rescale=True)
332
+ self._check_accuracy(
333
+ func, tol=1e-9, atol=0.22, rtol=0, err_msg=f"Function {j}"
334
+ )
335
+ self._check_accuracy(
336
+ func, tol=1e-9, atol=0.22, rtol=0, err_msg=f"Function {j}", rescale=True
337
+ )
329
338
 
330
339
  def test_tri_input(self):
331
340
  # Test at single points
@@ -379,10 +388,13 @@ class TestCloughTocher2DInterpolator:
379
388
  rng.rand(30*30, 2)]
380
389
 
381
390
  for j, func in enumerate(funcs):
382
- self._check_accuracy(func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2,
383
- err_msg="Function %d" % j)
384
- self._check_accuracy(func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2,
385
- err_msg="Function %d" % j, rescale=True)
391
+ self._check_accuracy(
392
+ func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2, err_msg=f"Function {j}"
393
+ )
394
+ self._check_accuracy(
395
+ func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2,
396
+ err_msg=f"Function {j}", rescale=True
397
+ )
386
398
 
387
399
  def test_wrong_ndim(self):
388
400
  x = np.random.randn(30, 3)
@@ -906,6 +906,50 @@ class TestAkima1DInterpolator:
906
906
  yi[:, 1, 1] = 4. * yi_
907
907
  xp_assert_close(ak(xi), yi)
908
908
 
909
+ def test_linear_interpolant_edge_case_1d(self):
910
+ x = np.array([0.0, 1.0], dtype=float)
911
+ y = np.array([0.5, 1.0])
912
+ akima = Akima1DInterpolator(x, y, axis=0, extrapolate=None)
913
+ xp_assert_close(akima(0.45), np.array(0.725))
914
+
915
+ def test_linear_interpolant_edge_case_2d(self):
916
+ x = np.array([0., 1.])
917
+ y = np.column_stack((x, 2. * x, 3. * x, 4. * x))
918
+
919
+ ak = Akima1DInterpolator(x, y)
920
+ xi = np.array([0.5, 1.])
921
+ yi = np.array([[0.5, 1., 1.5, 2. ],
922
+ [1., 2., 3., 4.]])
923
+ xp_assert_close(ak(xi), yi)
924
+
925
+ ak = Akima1DInterpolator(x, y.T, axis=1)
926
+ xp_assert_close(ak(xi), yi.T)
927
+
928
+ def test_linear_interpolant_edge_case_3d(self):
929
+ x = np.arange(0., 2.)
930
+ y_ = np.array([0., 1.])
931
+ y = np.empty((2, 2, 2))
932
+ y[:, 0, 0] = y_
933
+ y[:, 1, 0] = 2. * y_
934
+ y[:, 0, 1] = 3. * y_
935
+ y[:, 1, 1] = 4. * y_
936
+ ak = Akima1DInterpolator(x, y)
937
+ yi_ = np.array([0.5, 1.])
938
+ yi = np.empty((2, 2, 2))
939
+ yi[:, 0, 0] = yi_
940
+ yi[:, 1, 0] = 2. * yi_
941
+ yi[:, 0, 1] = 3. * yi_
942
+ yi[:, 1, 1] = 4. * yi_
943
+ xi = yi_
944
+ xp_assert_close(ak(xi), yi)
945
+
946
+ ak = Akima1DInterpolator(x, y.transpose(1, 0, 2), axis=1)
947
+ xp_assert_close(ak(xi), yi.transpose(1, 0, 2))
948
+
949
+ ak = Akima1DInterpolator(x, y.transpose(2, 1, 0), axis=2)
950
+ xp_assert_close(ak(xi), yi.transpose(2, 1, 0))
951
+
952
+
909
953
  def test_degenerate_case_multidimensional(self):
910
954
  # This test is for issue #5683.
911
955
  x = np.array([0, 1, 2])
@@ -1354,8 +1398,7 @@ class TestPPoly:
1354
1398
 
1355
1399
  xi = np.linspace(0, 1, 200)
1356
1400
  for dx in range(0, 10):
1357
- xp_assert_close(pp(xi, dx), pp.derivative(dx)(xi),
1358
- err_msg="dx=%d" % (dx,))
1401
+ xp_assert_close(pp(xi, dx), pp.derivative(dx)(xi), err_msg=f"dx={dx}")
1359
1402
 
1360
1403
  def test_antiderivative_of_constant(self):
1361
1404
  # https://github.com/scipy/scipy/issues/4216
@@ -1418,8 +1461,9 @@ class TestPPoly:
1418
1461
  r = 1e-13
1419
1462
  endpoint = r*pp2.x[:-1] + (1 - r)*pp2.x[1:]
1420
1463
 
1421
- xp_assert_close(pp2(pp2.x[1:]), pp2(endpoint),
1422
- rtol=1e-7, err_msg="dx=%d k=%d" % (dx, k))
1464
+ xp_assert_close(
1465
+ pp2(pp2.x[1:]), pp2(endpoint), rtol=1e-7, err_msg=f"dx={dx} k={k}"
1466
+ )
1423
1467
 
1424
1468
  def test_antiderivative_vs_spline(self):
1425
1469
  rng = np.random.RandomState(1234)
@@ -4,6 +4,8 @@ import pytest
4
4
  import numpy as np
5
5
 
6
6
  from numpy.testing import assert_warns
7
+ from numpy.exceptions import ComplexWarning
8
+
7
9
  from scipy._lib._array_api import (
8
10
  xp_assert_equal, xp_assert_close, assert_array_almost_equal
9
11
  )
@@ -16,7 +18,6 @@ from scipy.interpolate import (RegularGridInterpolator, interpn,
16
18
  NearestNDInterpolator, LinearNDInterpolator)
17
19
 
18
20
  from scipy.sparse._sputils import matrix
19
- from scipy._lib._util import ComplexWarning
20
21
  from scipy._lib._testutils import _run_concurrent_barrier
21
22
 
22
23
 
@@ -194,6 +194,8 @@ def _get_read_cursor(source, parallelism=None):
194
194
  source = bz2.BZ2File(path, 'rb')
195
195
  ret_stream_to_close = source
196
196
  else:
197
+ if not os.path.exists(path):
198
+ raise FileNotFoundError(f"The source file does not exist: {path}")
197
199
  return _fmm_core.open_read_file(path, parallelism), ret_stream_to_close
198
200
 
199
201
  # Stream object.
@@ -72,20 +72,20 @@ class IntFormat:
72
72
  def __repr__(self):
73
73
  r = "IntFormat("
74
74
  if self.repeat:
75
- r += "%d" % self.repeat
76
- r += "I%d" % self.width
75
+ r += f"{self.repeat}"
76
+ r += f"I{self.width}"
77
77
  if self.min:
78
- r += ".%d" % self.min
78
+ r += f".{self.min}"
79
79
  return r + ")"
80
80
 
81
81
  @property
82
82
  def fortran_format(self):
83
83
  r = "("
84
84
  if self.repeat:
85
- r += "%d" % self.repeat
86
- r += "I%d" % self.width
85
+ r += f"{self.repeat}"
86
+ r += f"I{self.width}"
87
87
  if self.min:
88
- r += ".%d" % self.min
88
+ r += f".{self.min}"
89
89
  return r + ")"
90
90
 
91
91
  @property
@@ -145,20 +145,20 @@ class ExpFormat:
145
145
  def __repr__(self):
146
146
  r = "ExpFormat("
147
147
  if self.repeat:
148
- r += "%d" % self.repeat
149
- r += "E%d.%d" % (self.width, self.significand)
148
+ r += f"{self.repeat}"
149
+ r += f"E{self.width}.{self.significand}"
150
150
  if self.min:
151
- r += "E%d" % self.min
151
+ r += f"E{self.min}"
152
152
  return r + ")"
153
153
 
154
154
  @property
155
155
  def fortran_format(self):
156
156
  r = "("
157
157
  if self.repeat:
158
- r += "%d" % self.repeat
159
- r += "E%d.%d" % (self.width, self.significand)
158
+ r += f"{self.repeat}"
159
+ r += f"E{self.width}.{self.significand}"
160
160
  if self.min:
161
- r += "E%d" % self.min
161
+ r += f"E{self.min}"
162
162
  return r + ")"
163
163
 
164
164
  @property
@@ -200,8 +200,10 @@ class Tokenizer:
200
200
  else:
201
201
  self.curpos = m.end()
202
202
  return Token(self.tokens[i], m.group(), self.curpos)
203
- raise SyntaxError("Unknown character at position %d (%s)"
204
- % (self.curpos, self.data[curpos]))
203
+ raise SyntaxError(
204
+ f"Unknown character at position {self.curpos} "
205
+ f"({self.data[self.curpos]})"
206
+ )
205
207
 
206
208
 
207
209
  # Grammar for fortran format:
@@ -263,8 +265,9 @@ class FortranFormatParser:
263
265
 
264
266
  def _parse_format(self, tokens):
265
267
  if not tokens[0].type == "LPAR":
266
- raise SyntaxError("Expected left parenthesis at position "
267
- "%d (got '%s')" % (0, tokens[0].value))
268
+ raise SyntaxError(
269
+ f"Expected left parenthesis at position {0} (got '{tokens[0].value}')"
270
+ )
268
271
  elif not tokens[-1].type == "RPAR":
269
272
  raise SyntaxError("Expected right parenthesis at position "
270
273
  f"{len(tokens)} (got '{tokens[-1].value}')")
@@ -189,9 +189,10 @@ class HBInfo:
189
189
  nnon_zeros = _expect_int(line[42:56])
190
190
  nelementals = _expect_int(line[56:70])
191
191
  if not nelementals == 0:
192
- raise ValueError("Unexpected value %d for nltvl (last entry of line 3)"
193
- % nelementals)
194
-
192
+ raise ValueError(
193
+ f"Unexpected value {nelementals} for nltvl (last entry of line 3)"
194
+ )
195
+
195
196
  # Fourth line
196
197
  line = fid.readline().strip("\n")
197
198
 
@@ -282,18 +283,13 @@ class HBInfo:
282
283
  """Gives the header corresponding to this instance as a string."""
283
284
  header = [self.title.ljust(72) + self.key.ljust(8)]
284
285
 
285
- header.append("%14d%14d%14d%14d" %
286
- (self.total_nlines, self.pointer_nlines,
287
- self.indices_nlines, self.values_nlines))
288
- header.append("%14s%14d%14d%14d%14d" %
289
- (self.mxtype.fortran_format.ljust(14), self.nrows,
290
- self.ncols, self.nnon_zeros, 0))
286
+ header.append(f"{self.total_nlines:14d}{self.pointer_nlines:14d}{self.indices_nlines:14d}{self.values_nlines:14d}")
287
+ header.append(f"{self.mxtype.fortran_format.ljust(14):14s}{self.nrows:14d}{self.ncols:14d}{self.nnon_zeros:14d}{0:14d}")
291
288
 
292
289
  pffmt = self.pointer_format.fortran_format
293
290
  iffmt = self.indices_format.fortran_format
294
291
  vffmt = self.values_format.fortran_format
295
- header.append("%16s%16s%20s" %
296
- (pffmt.ljust(16), iffmt.ljust(16), vffmt.ljust(20)))
292
+ header.append(f"{pffmt.ljust(16):16s}{iffmt.ljust(16):16s}{vffmt.ljust(20):20s}")
297
293
  return "\n".join(header)
298
294
 
299
295
 
scipy/io/_idl.py CHANGED
@@ -217,7 +217,7 @@ def _read_data(f, dtype):
217
217
  elif dtype == 15:
218
218
  return _read_uint64(f)
219
219
  else:
220
- raise Exception("Unknown IDL type: %i - please report this" % dtype)
220
+ raise Exception(f"Unknown IDL type: {dtype} - please report this")
221
221
 
222
222
 
223
223
  def _read_structure(f, array_desc, struct_desc):
@@ -238,8 +238,7 @@ def _read_structure(f, array_desc, struct_desc):
238
238
  dtype.append(((col['name'].lower(), col['name']),
239
239
  DTYPE_DICT[col['typecode']]))
240
240
  else:
241
- raise Exception("Variable type %i not implemented" %
242
- col['typecode'])
241
+ raise Exception(f"Variable type {col['typecode']} not implemented")
243
242
 
244
243
  structure = np.rec.recarray((nrows, ), dtype=dtype)
245
244
 
@@ -324,7 +323,7 @@ def _read_record(f):
324
323
  _skip_bytes(f, 4)
325
324
 
326
325
  if record['rectype'] not in RECTYPE_DICT:
327
- raise Exception("Unknown RECTYPE: %i" % record['rectype'])
326
+ raise Exception(f"Unknown RECTYPE: {record['rectype']}")
328
327
 
329
328
  record['rectype'] = RECTYPE_DICT[record['rectype']]
330
329
 
@@ -482,8 +481,7 @@ def _read_arraydesc(f):
482
481
  arraydesc['dims'].append(_read_long(f))
483
482
 
484
483
  else:
485
-
486
- raise Exception("Unknown ARRSTART: %i" % arraydesc['arrstart'])
484
+ raise Exception(f"Unknown ARRSTART: {arraydesc['arrstart']}")
487
485
 
488
486
  return arraydesc
489
487
 
@@ -902,7 +900,7 @@ def readsav(file_name, idict=None, python_dict=False,
902
900
 
903
901
  for rt in set(rectypes):
904
902
  if rt != 'END_MARKER':
905
- print(" - %i are of type %s" % (rectypes.count(rt), rt))
903
+ print(f" - {rectypes.count(rt)} are of type {rt}")
906
904
  print("-"*50)
907
905
 
908
906
  if 'VARIABLE' in rectypes:
scipy/io/_netcdf.py CHANGED
@@ -132,9 +132,13 @@ class netcdf_file:
132
132
 
133
133
  Notes
134
134
  -----
135
+ This module is derived from
136
+ `pupynere <https://bitbucket.org/robertodealmeida/pupynere/>`_.
135
137
  The major advantage of this module over other modules is that it doesn't
136
- require the code to be linked to the NetCDF libraries. This module is
137
- derived from `pupynere <https://bitbucket.org/robertodealmeida/pupynere/>`_.
138
+ require the code to be linked to the NetCDF libraries. However, for a more
139
+ recent version of the NetCDF standard and additional features, please consider
140
+ the permissively-licensed
141
+ `netcdf4-python <https://unidata.github.io/netcdf4-python/>`_.
138
142
 
139
143
  NetCDF files are a self-describing binary data format. The file contains
140
144
  metadata that describes the dimensions and variables in the file. More
@@ -563,7 +567,7 @@ class netcdf_file:
563
567
  types = [(int, NC_INT), (float, NC_FLOAT), (str, NC_CHAR)]
564
568
 
565
569
  # bytes index into scalars in py3k. Check for "string" types
566
- if isinstance(values, (str, bytes)):
570
+ if isinstance(values, str | bytes):
567
571
  sample = values
568
572
  else:
569
573
  try:
@@ -682,8 +686,8 @@ class netcdf_file:
682
686
  actual_size = reduce(mul, (1,) + shape[1:]) * size
683
687
  padding = -actual_size % 4
684
688
  if padding:
685
- dtypes['names'].append('_padding_%d' % var)
686
- dtypes['formats'].append('(%d,)>b' % padding)
689
+ dtypes['names'].append(f'_padding_{var}')
690
+ dtypes['formats'].append(f'({padding},)>b')
687
691
 
688
692
  # Data will be set later.
689
693
  data = None
@@ -856,6 +860,12 @@ class netcdf_variable:
856
860
  --------
857
861
  isrec, shape
858
862
 
863
+ Notes
864
+ -----
865
+ For a more recent version of the NetCDF standard and additional features, please
866
+ consider the permissively-licensed
867
+ `netcdf4-python <https://unidata.github.io/netcdf4-python/>`_.
868
+
859
869
  """
860
870
  def __init__(self, data, typecode, size, shape, dimensions,
861
871
  attributes=None,
Binary file
@@ -40,8 +40,8 @@ expected_types = ['numeric', 'numeric', 'numeric', 'numeric', 'nominal']
40
40
  missing = pjoin(data_path, 'missing.arff')
41
41
  expect_missing_raw = np.array([[1, 5], [2, 4], [np.nan, np.nan]])
42
42
  expect_missing = np.empty(3, [('yop', float), ('yap', float)])
43
- expect_missing['yop'] = expect_missing_raw[:, 0] # type: ignore[call-overload]
44
- expect_missing['yap'] = expect_missing_raw[:, 1] # type: ignore[call-overload]
43
+ expect_missing['yop'] = expect_missing_raw[:, 0]
44
+ expect_missing['yap'] = expect_missing_raw[:, 1]
45
45
 
46
46
 
47
47
  class TestData:
@@ -147,7 +147,7 @@ class TestHeader:
147
147
  # Test numerical attributes
148
148
  assert_(len(attrs) == 5)
149
149
  for i in range(4):
150
- assert_(attrs[i].name == 'attr%d' % i)
150
+ assert_(attrs[i].name == f'attr{i}')
151
151
  assert_(attrs[i].type_name == 'numeric')
152
152
 
153
153
  # Test nominal attribute
@@ -14,6 +14,7 @@ and writing MATLAB files.
14
14
  MatReadError - Exception indicating a read issue
15
15
  MatReadWarning - Warning class for read issues
16
16
  MatWriteError - Exception indicating a write issue
17
+ MatWriteWarning - Warning class for write issues
17
18
  mat_struct - Class used when ``struct_as_record=False``
18
19
  varmats_from_mat - Pull variables out of mat 5 file as a sequence of mat file objects
19
20
 
@@ -38,7 +39,7 @@ namespace also exist in this namespace:
38
39
 
39
40
  Notes
40
41
  -----
41
- MATLAB(R) is a registered trademark of The MathWorks, Inc., 3 Apple Hill
42
+ MATLAB® is a registered trademark of The MathWorks, Inc., 3 Apple Hill
42
43
  Drive, Natick, MA 01760-2098, USA.
43
44
 
44
45
  """
@@ -47,7 +48,7 @@ from ._mio import loadmat, savemat, whosmat
47
48
  from ._mio5 import MatlabFunction, varmats_from_mat
48
49
  from ._mio5_params import MatlabObject, MatlabOpaque, mat_struct
49
50
  from ._miobase import (matfile_version, MatReadError, MatReadWarning,
50
- MatWriteError)
51
+ MatWriteError, MatWriteWarning)
51
52
 
52
53
  # Deprecated namespaces, to be removed in v2.0.0
53
54
  from .import (mio, mio5, mio5_params, mio4, byteordercodes,
@@ -56,7 +57,8 @@ from .import (mio, mio5, mio5_params, mio4, byteordercodes,
56
57
  __all__ = [
57
58
  'loadmat', 'savemat', 'whosmat', 'MatlabObject',
58
59
  'matfile_version', 'MatReadError', 'MatReadWarning',
59
- 'MatWriteError', 'mat_struct', 'MatlabOpaque', 'MatlabFunction', 'varmats_from_mat',
60
+ 'MatWriteError', 'MatWriteWarning', 'mat_struct', 'MatlabOpaque',
61
+ 'MatlabFunction', 'varmats_from_mat',
60
62
  ]
61
63
 
62
64
  from scipy._lib._testutils import PytestTester
scipy/io/matlab/_mio.py CHANGED
@@ -267,7 +267,10 @@ def savemat(file_name, mdict,
267
267
  True``).
268
268
  Can also pass open file_like object.
269
269
  mdict : dict
270
- Dictionary from which to save matfile variables.
270
+ Dictionary from which to save matfile variables. Note that if this dict
271
+ has a key starting with ``_`` or a sub-dict has a key starting with ``_``
272
+ or a digit, these key's items will not be saved in the mat file and
273
+ `MatWriteWarning` will be issued.
271
274
  appendmat : bool, optional
272
275
  True (the default) to append the .mat extension to the end of the
273
276
  given filename, if not already present.
scipy/io/matlab/_mio5.py CHANGED
@@ -87,7 +87,7 @@ from ._byteordercodes import native_code, swapped_code
87
87
 
88
88
  from ._miobase import (MatFileReader, docfiller, matdims, read_dtype,
89
89
  arr_to_chars, arr_dtype_number, MatWriteError,
90
- MatReadError, MatReadWarning)
90
+ MatReadError, MatReadWarning, MatWriteWarning)
91
91
 
92
92
  # Reader object for matlab 5 format variables
93
93
  from ._mio5_utils import VarReader5
@@ -221,7 +221,7 @@ class MatFile5Reader(MatFileReader):
221
221
  hdict['__header__'] = hdr['description'].item().strip(b' \t\n\000')
222
222
  v_major = hdr['version'] >> 8
223
223
  v_minor = hdr['version'] & 0xFF
224
- hdict['__version__'] = '%d.%d' % (v_major, v_minor)
224
+ hdict['__version__'] = f'{v_major}.{v_minor}'
225
225
  return hdict
226
226
 
227
227
  def initialize_read(self):
@@ -267,7 +267,7 @@ class MatFile5Reader(MatFileReader):
267
267
  check_stream_limit = False
268
268
  self._matrix_reader.set_stream(self.mat_stream)
269
269
  if not mdtype == miMATRIX:
270
- raise TypeError('Expecting miMATRIX type here, got %d' % mdtype)
270
+ raise TypeError(f'Expecting miMATRIX type here, got {mdtype}')
271
271
  header = self._matrix_reader.read_header(check_stream_limit)
272
272
  return header, next_pos
273
273
 
@@ -482,10 +482,14 @@ def to_writeable(source):
482
482
  dtype = []
483
483
  values = []
484
484
  for field, value in source.items():
485
- if (isinstance(field, str) and
486
- field[0] not in '_0123456789'):
487
- dtype.append((str(field), object))
488
- values.append(value)
485
+ if isinstance(field, str):
486
+ if field[0] not in '_0123456789':
487
+ dtype.append((str(field), object))
488
+ values.append(value)
489
+ else:
490
+ msg = (f"Starting field name with a underscore "
491
+ f"or a digit ({field}) is ignored")
492
+ warnings.warn(msg, MatWriteWarning, stacklevel=2)
489
493
  if dtype:
490
494
  return np.array([tuple(values)], dtype)
491
495
  else:
@@ -512,7 +516,7 @@ NDT_ARRAY_FLAGS = MDTYPES[native_code]['dtypes']['array_flags']
512
516
  class VarWriter5:
513
517
  ''' Generic matlab matrix writing class '''
514
518
  mat_tag = np.zeros((), NDT_TAG_FULL)
515
- mat_tag['mdtype'] = miMATRIX # type: ignore[call-overload]
519
+ mat_tag['mdtype'] = miMATRIX
516
520
 
517
521
  def __init__(self, file_writer):
518
522
  self.file_stream = file_writer.file_stream
@@ -789,12 +793,11 @@ class VarWriter5:
789
793
  length = max([len(fieldname) for fieldname in fieldnames])+1
790
794
  max_length = (self.long_field_names and 64) or 32
791
795
  if length > max_length:
792
- raise ValueError("Field names are restricted to %d characters" %
793
- (max_length-1))
796
+ raise ValueError(
797
+ f"Field names are restricted to {max_length - 1} characters"
798
+ )
794
799
  self.write_element(np.array([length], dtype='i4'))
795
- self.write_element(
796
- np.array(fieldnames, dtype='S%d' % (length)),
797
- mdtype=miINT8)
800
+ self.write_element(np.array(fieldnames, dtype=f'S{length}'), mdtype=miINT8)
798
801
  A = np.atleast_2d(arr).flatten('F')
799
802
  for el in A:
800
803
  for f in fieldnames:
@@ -879,6 +882,9 @@ class MatFile5Writer:
879
882
  self._matrix_writer = VarWriter5(self)
880
883
  for name, var in mdict.items():
881
884
  if name[0] == '_':
885
+ msg = (f"Starting field name with a "
886
+ f"underscore ({name}) is ignored")
887
+ warnings.warn(msg, MatWriteWarning, stacklevel=2)
882
888
  continue
883
889
  is_global = name in self.global_vars
884
890
  if self.do_compression:
@@ -14,7 +14,7 @@ from scipy._lib import doccer
14
14
  from . import _byteordercodes as boc
15
15
 
16
16
  __all__ = [
17
- 'MatReadError', 'MatReadWarning', 'MatWriteError',
17
+ 'MatReadError', 'MatReadWarning', 'MatWriteError', 'MatWriteWarning',
18
18
  ]
19
19
 
20
20
  class MatReadError(Exception):
@@ -28,6 +28,9 @@ class MatWriteError(Exception):
28
28
  class MatReadWarning(UserWarning):
29
29
  """Warning class for read issues."""
30
30
 
31
+ class MatWriteWarning(UserWarning):
32
+ """Warning class for write issues."""
33
+
31
34
 
32
35
  doc_dict = \
33
36
  {'file_arg':