scipy 1.16.2__cp314-cp314-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp314-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp314-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp314-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp314-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp314-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp314-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp314-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp314-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp314-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp314-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp314-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp314-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp314-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp314-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp314-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp314-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp314-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp314-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp314-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp314-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp314-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp314-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp314-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp314-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp314-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp314-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp314-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp314-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp314-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp314-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp314-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp314-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp314-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp314-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp314-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp314-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp314-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp314-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp314-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp314-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp314-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp314-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp314-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp314-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp314-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp314-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp314-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp314-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp314-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp314-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp314-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp314-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp314-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp314-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp314-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp314-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp314-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp314-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp314-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp314-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp314-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp314-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp314-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp314-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp314-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp314-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp314-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp314-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp314-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp314-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp314-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp314-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp314-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp314-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp314-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp314-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp314-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp314-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp314-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp314-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp314-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp314-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp314-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp314-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp314-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp314-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp314-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp314-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp314-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp314-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp314-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp314-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp314-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp314-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp314-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp314-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp314-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp314-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp314-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp314-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp314-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp314-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp314-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp314-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp314-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp314-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp314-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp314-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp314-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp314-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp314-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp314-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp314-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp314-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp314-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp314-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp314-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp314-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp314-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp314-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp314-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp314-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp314-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp314-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp314-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp314-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp314-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp314-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp314-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp314-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp314-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp314-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp314-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp314-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp314-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp314-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp314-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp314-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp314-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp314-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp314-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp314-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp314-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp314-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp314-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp314-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp314-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp314-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp314-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp314-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp314-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp314-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp314-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp314-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp314-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp314-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp314-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp314-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp314-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp314-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp314-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp314-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp314-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp314-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp314-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp314-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp314-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp314-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp314-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp314-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp314-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp314-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp314-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp314-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp314-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp314-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp314-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp314-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp314-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp314-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp314-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp314-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp314-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp314-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp314-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp314-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp314-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp314-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp314-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp314-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp314-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp314-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp314-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp314-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp314-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp314-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp314-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp314-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp314-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp314-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp314-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp314-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp314-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp314-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,1388 @@
1
+ # Many scipy.stats functions support `axis` and `nan_policy` parameters.
2
+ # When the two are combined, it can be tricky to get all the behavior just
3
+ # right. This file contains a suite of common tests for scipy.stats functions
4
+ # that support `axis` and `nan_policy` and additional tests for some associated
5
+ # functions in stats._util.
6
+
7
+ from itertools import product, combinations_with_replacement, permutations
8
+ import os
9
+ import re
10
+ import pickle
11
+ import pytest
12
+ import warnings
13
+
14
+ import numpy as np
15
+ from numpy.testing import assert_allclose, assert_equal
16
+ from scipy import stats
17
+ from scipy.stats import norm # type: ignore[attr-defined]
18
+ from scipy.stats._axis_nan_policy import (_masked_arrays_2_sentinel_arrays,
19
+ SmallSampleWarning,
20
+ too_small_nd_omit, too_small_nd_not_omit,
21
+ too_small_1d_omit, too_small_1d_not_omit)
22
+ from scipy._lib._util import AxisError
23
+ from scipy.conftest import skip_xp_invalid_arg
24
+
25
+
26
+ SCIPY_XSLOW = int(os.environ.get('SCIPY_XSLOW', '0'))
27
+
28
+
29
+ def unpack_ttest_result(res):
30
+ low, high = res.confidence_interval()
31
+ return (res.statistic, res.pvalue, res.df, res._standard_error,
32
+ res._estimate, low, high)
33
+
34
+
35
+ def _get_ttest_ci(ttest):
36
+ # get a function that returns the CI bounds of provided `ttest`
37
+ def ttest_ci(*args, **kwargs):
38
+ res = ttest(*args, **kwargs)
39
+ return res.confidence_interval()
40
+ return ttest_ci
41
+
42
+
43
+ def xp_mean_1samp(*args, **kwargs):
44
+ kwargs.pop('_no_deco', None)
45
+ return stats._stats_py._xp_mean(*args, **kwargs)
46
+
47
+
48
+ def xp_mean_2samp(*args, **kwargs):
49
+ kwargs.pop('_no_deco', None)
50
+ weights = args[1]
51
+ return stats._stats_py._xp_mean(args[0], *args[2:], weights=weights, **kwargs)
52
+
53
+
54
+ def xp_var(*args, **kwargs):
55
+ kwargs.pop('_no_deco', None)
56
+ return stats._stats_py._xp_var(*args, **kwargs)
57
+
58
+
59
+ def gstd(*args, **kwargs):
60
+ kwargs.pop('_no_deco', None)
61
+ return stats.gstd(*args, **kwargs)
62
+
63
+
64
+ def combine_pvalues_weighted(*args, **kwargs):
65
+ return stats.combine_pvalues(args[0], *args[2:], weights=args[1],
66
+ method='stouffer', **kwargs)
67
+
68
+
69
+ def weightedtau_weighted(x, y, rank, **kwargs):
70
+ axis = kwargs.get('axis', 0)
71
+ nan_policy = kwargs.get('nan_policy', 'propagate')
72
+ rank = stats.rankdata(rank, axis=axis, nan_policy=nan_policy)
73
+ return stats.weightedtau(x, y, rank, **kwargs)
74
+
75
+
76
+ axis_nan_policy_cases = [
77
+ # function, args, kwds, number of samples, number of outputs,
78
+ # ... paired, unpacker function
79
+ # args, kwds typically aren't needed; just showing that they work
80
+ (stats.kruskal, tuple(), dict(), 3, 2, False, None), # 4 samples is slow
81
+ (stats.ranksums, ('less',), dict(), 2, 2, False, None),
82
+ (stats.mannwhitneyu, tuple(), {'method': 'asymptotic'}, 2, 2, False, None),
83
+ (stats.wilcoxon, ('pratt',), {'mode': 'auto'}, 2, 2, True,
84
+ lambda res: (res.statistic, res.pvalue)),
85
+ (stats.wilcoxon, tuple(), dict(), 1, 2, True,
86
+ lambda res: (res.statistic, res.pvalue)),
87
+ (stats.wilcoxon, tuple(), {'method': 'asymptotic'}, 1, 3, True,
88
+ lambda res: (res.statistic, res.pvalue, res.zstatistic)),
89
+ (stats.gmean, tuple(), dict(), 1, 1, False, lambda x: (x,)),
90
+ (stats.hmean, tuple(), dict(), 1, 1, False, lambda x: (x,)),
91
+ (stats.pmean, (1.42,), dict(), 1, 1, False, lambda x: (x,)),
92
+ (stats.sem, tuple(), dict(), 1, 1, False, lambda x: (x,)),
93
+ (stats.iqr, tuple(), dict(), 1, 1, False, lambda x: (x,)),
94
+ (stats.kurtosis, tuple(), dict(), 1, 1, False, lambda x: (x,)),
95
+ (stats.skew, tuple(), dict(), 1, 1, False, lambda x: (x,)),
96
+ (stats.kstat, tuple(), dict(), 1, 1, False, lambda x: (x,)),
97
+ (stats.kstatvar, tuple(), dict(), 1, 1, False, lambda x: (x,)),
98
+ (stats.moment, tuple(), dict(), 1, 1, False, lambda x: (x,)),
99
+ (stats.moment, tuple(), dict(order=[1, 2]), 1, 2, False, None),
100
+ (stats.jarque_bera, tuple(), dict(), 1, 2, False, None),
101
+ (stats.ttest_1samp, (np.array([0]),), dict(), 1, 7, False,
102
+ unpack_ttest_result),
103
+ (stats.ttest_rel, tuple(), dict(), 2, 7, True, unpack_ttest_result),
104
+ (stats.ttest_ind, tuple(), dict(), 2, 7, False, unpack_ttest_result),
105
+ (_get_ttest_ci(stats.ttest_1samp), (0,), dict(), 1, 2, False, None),
106
+ (_get_ttest_ci(stats.ttest_rel), tuple(), dict(), 2, 2, True, None),
107
+ (_get_ttest_ci(stats.ttest_ind), tuple(), dict(), 2, 2, False, None),
108
+ (stats.mode, tuple(), dict(), 1, 2, True, lambda x: (x.mode, x.count)),
109
+ (stats.differential_entropy, tuple(), dict(), 1, 1, False, lambda x: (x,)),
110
+ (stats.variation, tuple(), dict(), 1, 1, False, lambda x: (x,)),
111
+ (stats.friedmanchisquare, tuple(), dict(), 3, 2, True, None),
112
+ (stats.brunnermunzel, tuple(), dict(distribution='normal'), 2, 2, False, None),
113
+ (stats.mood, tuple(), {}, 2, 2, False, None),
114
+ (stats.shapiro, tuple(), {}, 1, 2, False, None),
115
+ (stats.ks_1samp, (norm().cdf,), dict(), 1, 4, False,
116
+ lambda res: (*res, res.statistic_location, res.statistic_sign)),
117
+ (stats.ks_2samp, tuple(), dict(), 2, 4, False,
118
+ lambda res: (*res, res.statistic_location, res.statistic_sign)),
119
+ (stats.kstest, (norm().cdf,), dict(), 1, 4, False,
120
+ lambda res: (*res, res.statistic_location, res.statistic_sign)),
121
+ (stats.kstest, tuple(), dict(), 2, 4, False,
122
+ lambda res: (*res, res.statistic_location, res.statistic_sign)),
123
+ (stats.levene, tuple(), {}, 2, 2, False, None),
124
+ (stats.fligner, tuple(), {'center': 'trimmed', 'proportiontocut': 0.01},
125
+ 2, 2, False, None),
126
+ (stats.ansari, tuple(), {}, 2, 2, False, None),
127
+ (stats.entropy, tuple(), dict(), 1, 1, False, lambda x: (x,)),
128
+ (stats.entropy, tuple(), dict(), 2, 1, True, lambda x: (x,)),
129
+ (stats.skewtest, tuple(), dict(), 1, 2, False, None),
130
+ (stats.kurtosistest, tuple(), dict(), 1, 2, False, None),
131
+ (stats.normaltest, tuple(), dict(), 1, 2, False, None),
132
+ (stats.cramervonmises, ("norm",), dict(), 1, 2, False,
133
+ lambda res: (res.statistic, res.pvalue)),
134
+ (stats.cramervonmises_2samp, tuple(), dict(), 2, 2, False,
135
+ lambda res: (res.statistic, res.pvalue)),
136
+ (stats.epps_singleton_2samp, tuple(), dict(), 2, 2, False, None),
137
+ (stats.bartlett, tuple(), {}, 2, 2, False, None),
138
+ (stats.tmean, tuple(), {}, 1, 1, False, lambda x: (x,)),
139
+ (stats.tvar, tuple(), {}, 1, 1, False, lambda x: (x,)),
140
+ (stats.tmin, tuple(), {}, 1, 1, False, lambda x: (x,)),
141
+ (stats.tmax, tuple(), {}, 1, 1, False, lambda x: (x,)),
142
+ (stats.tstd, tuple(), {}, 1, 1, False, lambda x: (x,)),
143
+ (stats.tsem, tuple(), {}, 1, 1, False, lambda x: (x,)),
144
+ (stats.circmean, tuple(), dict(), 1, 1, False, lambda x: (x,)),
145
+ (stats.circvar, tuple(), dict(), 1, 1, False, lambda x: (x,)),
146
+ (stats.circstd, tuple(), dict(), 1, 1, False, lambda x: (x,)),
147
+ (stats.f_oneway, tuple(), {}, 2, 2, False, None),
148
+ (stats.f_oneway, tuple(), {'equal_var': False}, 2, 2, False, None),
149
+ (stats.alexandergovern, tuple(), {}, 2, 2, False,
150
+ lambda res: (res.statistic, res.pvalue)),
151
+ (stats.combine_pvalues, tuple(), {}, 1, 2, False, None),
152
+ (stats.lmoment, tuple(), dict(), 1, 4, False, lambda x: tuple(x)),
153
+ (combine_pvalues_weighted, tuple(), {}, 2, 2, True, None),
154
+ (xp_mean_1samp, tuple(), dict(), 1, 1, False, lambda x: (x,)),
155
+ (xp_mean_2samp, tuple(), dict(), 2, 1, True, lambda x: (x,)),
156
+ (xp_var, tuple(), dict(), 1, 1, False, lambda x: (x,)),
157
+ (stats.chatterjeexi, tuple(), dict(), 2, 2, True,
158
+ lambda res: (res.statistic, res.pvalue)),
159
+ (stats.pointbiserialr, tuple(), dict(), 2, 3, True,
160
+ lambda res: (res.statistic, res.pvalue, res.correlation)),
161
+ (stats.kendalltau, tuple(), dict(), 2, 3, True,
162
+ lambda res: (res.statistic, res.pvalue, res.correlation)),
163
+ (stats.weightedtau, tuple(), dict(), 2, 3, True,
164
+ lambda res: (res.statistic, res.pvalue, res.correlation)),
165
+ (weightedtau_weighted, tuple(), dict(), 3, 3, True,
166
+ lambda res: (res.statistic, res.pvalue, res.correlation)),
167
+ (stats.linregress, tuple(), dict(), 2, 6, True,
168
+ lambda res: tuple(res) + (res.intercept_stderr,)),
169
+ (stats.theilslopes, tuple(), dict(), 2, 4, True, tuple),
170
+ (stats.theilslopes, tuple(), dict(), 1, 4, True, tuple),
171
+ (stats.siegelslopes, tuple(), dict(), 2, 2, True, tuple),
172
+ (stats.siegelslopes, tuple(), dict(), 1, 2, True, tuple),
173
+ (gstd, tuple(), dict(), 1, 1, False, lambda x: (x,)),
174
+ (stats.power_divergence, tuple(), dict(), 1, 2, False, None),
175
+ (stats.chisquare, tuple(), dict(), 1, 2, False, None),
176
+ (stats._morestats._boxcox_llf, tuple(), dict(lmb=1.5), 1, 1, False, lambda x: (x,)),
177
+ ]
178
+
179
+ # If the message is one of those expected, put nans in
180
+ # appropriate places of `statistics` and `pvalues`
181
+ too_small_messages = {"Degrees of freedom <= 0 for slice",
182
+ "x and y should have at least 5 elements",
183
+ "Data must be at least length 3",
184
+ "The sample must contain at least two",
185
+ "x and y must contain at least two",
186
+ "division by zero",
187
+ "Mean of empty slice",
188
+ "Data passed to ks_2samp must not be empty",
189
+ "Not enough test observations",
190
+ "Not enough other observations",
191
+ "Not enough observations.",
192
+ "At least one observation is required",
193
+ "zero-size array to reduction operation maximum",
194
+ "`x` and `y` must be of nonzero size.",
195
+ "The exact distribution of the Wilcoxon test",
196
+ "Data input must not be empty",
197
+ "Window length (0) must be positive and less",
198
+ "Window length (1) must be positive and less",
199
+ "Window length (2) must be positive and less",
200
+ "`skewtest` requires at least",
201
+ "`kurtosistest` requires at least",
202
+ "attempt to get argmax of an empty sequence",
203
+ "No array values within given limits",
204
+ "Input sample size must be greater than one.",
205
+ "At least one slice along `axis` has zero length",
206
+ "One or more sample arguments is too small",
207
+ "invalid value encountered",
208
+ "divide by zero encountered",
209
+ "`x` and `y` must have length at least 2.",
210
+ "Inputs must not be empty.",
211
+ "All `x` coordinates are identical.",
212
+ }
213
+
214
+ # If the message is one of these, results of the function may be inaccurate,
215
+ # but NaNs are not to be placed
216
+ inaccuracy_messages = {"Precision loss occurred in moment calculation",
217
+ "Sample size too small for normal approximation."}
218
+
219
+ # For some functions, nan_policy='propagate' should not just return NaNs
220
+ override_propagate_funcs = {stats.mode, weightedtau_weighted, stats.weightedtau}
221
+
222
+ # For some functions, empty arrays produce non-NaN results
223
+ empty_special_case_funcs = {stats.entropy, stats.chisquare, stats.power_divergence}
224
+
225
+ # Some functions don't follow the usual "too small" warning rules
226
+ too_small_special_case_funcs = {stats.entropy, stats.chisquare, stats.power_divergence}
227
+
228
+ def _mixed_data_generator(n_samples, n_repetitions, axis, rng,
229
+ paired=False):
230
+ # generate random samples to check the response of hypothesis tests to
231
+ # samples with different (but broadcastable) shapes and various
232
+ # nan patterns (e.g. all nans, some nans, no nans) along axis-slices
233
+
234
+ data = []
235
+ for i in range(n_samples):
236
+ n_patterns = 6 # number of distinct nan patterns
237
+ n_obs = 20 if paired else 20 + i # observations per axis-slice
238
+ x = np.ones((n_repetitions, n_patterns, n_obs)) * np.nan
239
+
240
+ for j in range(n_repetitions):
241
+ samples = x[j, :, :]
242
+
243
+ # case 0: axis-slice with all nans (0 reals)
244
+ # cases 1-3: axis-slice with 1-3 reals (the rest nans)
245
+ # case 4: axis-slice with mostly (all but two) reals
246
+ # case 5: axis slice with all reals
247
+ for k, n_reals in enumerate([0, 1, 2, 3, n_obs-2, n_obs]):
248
+ # for cases 1-3, need paired nansw to be in the same place
249
+ indices = rng.permutation(n_obs)[:n_reals]
250
+ samples[k, indices] = rng.random(size=n_reals)
251
+
252
+ # permute the axis-slices just to show that order doesn't matter
253
+ samples[:] = rng.permutation(samples, axis=0)
254
+
255
+ # For multi-sample tests, we want to test broadcasting and check
256
+ # that nan policy works correctly for each nan pattern for each input.
257
+ # This takes care of both simultaneously.
258
+ new_shape = [n_repetitions] + [1]*n_samples + [n_obs]
259
+ new_shape[1 + i] = 6
260
+ x = x.reshape(new_shape)
261
+
262
+ x = np.moveaxis(x, -1, axis)
263
+ data.append(x)
264
+ return data
265
+
266
+
267
+ def _homogeneous_data_generator(n_samples, n_repetitions, axis, rng,
268
+ paired=False, all_nans=True):
269
+ # generate random samples to check the response of hypothesis tests to
270
+ # samples with different (but broadcastable) shapes and homogeneous
271
+ # data (all nans or all finite)
272
+ data = []
273
+ for i in range(n_samples):
274
+ n_obs = 20 if paired else 20 + i # observations per axis-slice
275
+ shape = [n_repetitions] + [1]*n_samples + [n_obs]
276
+ shape[1 + i] = 2
277
+ x = np.ones(shape) * np.nan if all_nans else rng.random(shape)
278
+ x = np.moveaxis(x, -1, axis)
279
+ data.append(x)
280
+ return data
281
+
282
+
283
+ def nan_policy_1d(hypotest, data1d, unpacker, *args, n_outputs=2,
284
+ nan_policy='raise', paired=False, _no_deco=True, **kwds):
285
+ # Reference implementation for how `nan_policy` should work for 1d samples
286
+
287
+ if nan_policy == 'raise':
288
+ for sample in data1d:
289
+ if np.any(np.isnan(sample)):
290
+ raise ValueError("The input contains nan values")
291
+
292
+ elif (nan_policy == 'propagate'
293
+ and hypotest not in override_propagate_funcs):
294
+ # For all hypothesis tests tested, returning nans is the right thing.
295
+ # But many hypothesis tests don't propagate correctly (e.g. they treat
296
+ # np.nan the same as np.inf, which doesn't make sense when ranks are
297
+ # involved) so override that behavior here.
298
+ for sample in data1d:
299
+ if np.any(np.isnan(sample)):
300
+ return np.full(n_outputs, np.nan)
301
+
302
+ elif nan_policy == 'omit':
303
+ # manually omit nans (or pairs in which at least one element is nan)
304
+ if not paired:
305
+ data1d = [sample[~np.isnan(sample)] for sample in data1d]
306
+ else:
307
+ nan_mask = np.isnan(data1d[0])
308
+ for sample in data1d[1:]:
309
+ nan_mask = np.logical_or(nan_mask, np.isnan(sample))
310
+ data1d = [sample[~nan_mask] for sample in data1d]
311
+
312
+ return unpacker(hypotest(*data1d, *args, _no_deco=_no_deco, **kwds))
313
+
314
+
315
+ # These three warnings are intentional
316
+ # For `wilcoxon` when the sample size < 50
317
+ @pytest.mark.filterwarnings('ignore:Sample size too small for normal:UserWarning')
318
+ # `kurtosistest` and `normaltest` when sample size < 20
319
+ @pytest.mark.filterwarnings('ignore:`kurtosistest` p-value may be:UserWarning')
320
+ # `foneway`
321
+ @pytest.mark.filterwarnings('ignore:all input arrays have length 1.:RuntimeWarning')
322
+
323
+ # The rest of these may or may not be desirable. They need further investigation
324
+ # to determine whether the function's decorator should define `too_small.
325
+ # `bartlett`, `tvar`, `tstd`, `tsem`
326
+ @pytest.mark.filterwarnings('ignore:Degrees of freedom <= 0 for slice:RuntimeWarning')
327
+ # kstat, kstatvar, ttest_1samp, ttest_rel, ttest_ind, ttest_ci, brunnermunzel
328
+ # mood, levene, fligner, bartlett
329
+ @pytest.mark.filterwarnings('ignore:Invalid value encountered in:RuntimeWarning')
330
+ # kstatvar, ttest_1samp, ttest_rel, ttest_ci, brunnermunzel, levene, bartlett
331
+ @pytest.mark.filterwarnings('ignore:divide by zero encountered:RuntimeWarning')
332
+
333
+ @pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
334
+ "paired", "unpacker"), axis_nan_policy_cases)
335
+ @pytest.mark.parametrize(("nan_policy"), ("propagate", "omit", "raise"))
336
+ @pytest.mark.parametrize(("axis"), (1,))
337
+ @pytest.mark.parametrize(("data_generator"), ("mixed",))
338
+ @pytest.mark.parallel_threads(1)
339
+ def test_axis_nan_policy_fast(hypotest, args, kwds, n_samples, n_outputs,
340
+ paired, unpacker, nan_policy, axis,
341
+ data_generator):
342
+ if hypotest in {stats.cramervonmises_2samp, stats.kruskal} and not SCIPY_XSLOW:
343
+ pytest.skip("Too slow.")
344
+ _axis_nan_policy_test(hypotest, args, kwds, n_samples, n_outputs, paired,
345
+ unpacker, nan_policy, axis, data_generator)
346
+
347
+
348
+ if SCIPY_XSLOW:
349
+ # Takes O(1 min) to run, and even skipping with the `xslow` decorator takes
350
+ # about 3 sec because this is >3,000 tests. So ensure pytest doesn't see
351
+ # them at all unless `SCIPY_XSLOW` is defined.
352
+
353
+ # These three warnings are intentional
354
+ # For `wilcoxon` when the sample size < 50
355
+ @pytest.mark.filterwarnings('ignore:Sample size too small for normal:UserWarning')
356
+ # `kurtosistest` and `normaltest` when sample size < 20
357
+ @pytest.mark.filterwarnings('ignore:`kurtosistest` p-value may be:UserWarning')
358
+ # `foneway`
359
+ @pytest.mark.filterwarnings('ignore:all input arrays have length 1.:RuntimeWarning')
360
+
361
+ # The rest of these may or may not be desirable. They need further investigation
362
+ # to determine whether the function's decorator should define `too_small.
363
+ # `bartlett`, `tvar`, `tstd`, `tsem`
364
+ @pytest.mark.filterwarnings('ignore:Degrees of freedom <= 0 for:RuntimeWarning')
365
+ # kstat, kstatvar, ttest_1samp, ttest_rel, ttest_ind, ttest_ci, brunnermunzel
366
+ # mood, levene, fligner, bartlett
367
+ @pytest.mark.filterwarnings('ignore:Invalid value encountered in:RuntimeWarning')
368
+ # kstatvar, ttest_1samp, ttest_rel, ttest_ci, brunnermunzel, levene, bartlett
369
+ @pytest.mark.filterwarnings('ignore:divide by zero encountered:RuntimeWarning')
370
+
371
+ @pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
372
+ "paired", "unpacker"), axis_nan_policy_cases)
373
+ @pytest.mark.parametrize(("nan_policy"), ("propagate", "omit", "raise"))
374
+ @pytest.mark.parametrize(("axis"), range(-3, 3))
375
+ @pytest.mark.parametrize(("data_generator"),
376
+ ("all_nans", "all_finite", "mixed"))
377
+ def test_axis_nan_policy_full(hypotest, args, kwds, n_samples, n_outputs,
378
+ paired, unpacker, nan_policy, axis,
379
+ data_generator):
380
+ _axis_nan_policy_test(hypotest, args, kwds, n_samples, n_outputs, paired,
381
+ unpacker, nan_policy, axis, data_generator)
382
+
383
+
384
+ def _axis_nan_policy_test(hypotest, args, kwds, n_samples, n_outputs, paired,
385
+ unpacker, nan_policy, axis, data_generator):
386
+ # Tests the 1D and vectorized behavior of hypothesis tests against a
387
+ # reference implementation (nan_policy_1d with np.ndenumerate)
388
+
389
+ # Some hypothesis tests return a non-iterable that needs an `unpacker` to
390
+ # extract the statistic and p-value. For those that don't:
391
+ if not unpacker:
392
+ def unpacker(res):
393
+ return res
394
+
395
+ rng = np.random.default_rng(0)
396
+
397
+ # Generate multi-dimensional test data with all important combinations
398
+ # of patterns of nans along `axis`
399
+ n_repetitions = 3 # number of repetitions of each pattern
400
+ data_gen_kwds = {'n_samples': n_samples, 'n_repetitions': n_repetitions,
401
+ 'axis': axis, 'rng': rng, 'paired': paired}
402
+ if data_generator == 'mixed':
403
+ inherent_size = 6 # number of distinct types of patterns
404
+ data = _mixed_data_generator(**data_gen_kwds)
405
+ elif data_generator == 'all_nans':
406
+ inherent_size = 2 # hard-coded in _homogeneous_data_generator
407
+ data_gen_kwds['all_nans'] = True
408
+ data = _homogeneous_data_generator(**data_gen_kwds)
409
+ elif data_generator == 'all_finite':
410
+ inherent_size = 2 # hard-coded in _homogeneous_data_generator
411
+ data_gen_kwds['all_nans'] = False
412
+ data = _homogeneous_data_generator(**data_gen_kwds)
413
+
414
+ output_shape = [n_repetitions] + [inherent_size]*n_samples
415
+
416
+ # To generate reference behavior to compare against, loop over the axis-
417
+ # slices in data. Make indexing easier by moving `axis` to the end and
418
+ # broadcasting all samples to the same shape.
419
+ data_b = [np.moveaxis(sample, axis, -1) for sample in data]
420
+ data_b = [np.broadcast_to(sample, output_shape + [sample.shape[-1]])
421
+ for sample in data_b]
422
+ res_1d = np.zeros(output_shape + [n_outputs])
423
+
424
+ for i, _ in np.ndenumerate(np.zeros(output_shape)):
425
+ data1d = [sample[i] for sample in data_b]
426
+ contains_nan = any([np.isnan(sample).any() for sample in data1d])
427
+
428
+ # Take care of `nan_policy='raise'`.
429
+ # Afterward, the 1D part of the test is over
430
+ message = "The input contains nan values"
431
+ if nan_policy == 'raise' and contains_nan:
432
+ with pytest.raises(ValueError, match=message):
433
+ nan_policy_1d(hypotest, data1d, unpacker, *args,
434
+ n_outputs=n_outputs,
435
+ nan_policy=nan_policy,
436
+ paired=paired, _no_deco=True, **kwds)
437
+
438
+ with pytest.raises(ValueError, match=message):
439
+ hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
440
+
441
+ continue
442
+
443
+ # Take care of `nan_policy='propagate'` and `nan_policy='omit'`
444
+
445
+ # Get results of simple reference implementation
446
+ try:
447
+ res_1da = nan_policy_1d(hypotest, data1d, unpacker, *args,
448
+ n_outputs=n_outputs,
449
+ nan_policy=nan_policy,
450
+ paired=paired, _no_deco=True, **kwds)
451
+ except (ValueError, RuntimeWarning, ZeroDivisionError, UserWarning) as ea:
452
+ ea_str = str(ea)
453
+ if any([str(ea_str).startswith(msg) for msg in too_small_messages]):
454
+ res_1da = np.full(n_outputs, np.nan)
455
+ else:
456
+ raise
457
+
458
+ # Get results of public function with 1D slices
459
+ # Should warn for all slices
460
+ if (nan_policy == 'omit' and data_generator == "all_nans"
461
+ and hypotest not in too_small_special_case_funcs):
462
+ with pytest.warns(SmallSampleWarning, match=too_small_1d_omit):
463
+ res = hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
464
+ # warning depends on slice
465
+ elif (nan_policy == 'omit' and data_generator == "mixed"
466
+ and hypotest not in too_small_special_case_funcs):
467
+ with np.testing.suppress_warnings() as sup:
468
+ sup.filter(SmallSampleWarning, too_small_1d_omit)
469
+ res = hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
470
+ # shouldn't complain if there are no NaNs
471
+ else:
472
+ res = hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
473
+ res_1db = unpacker(res)
474
+
475
+ assert_allclose(res_1db, res_1da, rtol=1e-15)
476
+ res_1d[i] = res_1db
477
+
478
+ res_1d = np.moveaxis(res_1d, -1, 0)
479
+
480
+ # Perform a vectorized call to the hypothesis test.
481
+
482
+ # If `nan_policy == 'raise'`, check that it raises the appropriate error.
483
+ # Test is done, so return
484
+ if nan_policy == 'raise' and not data_generator == "all_finite":
485
+ message = 'The input contains nan values'
486
+ with pytest.raises(ValueError, match=message):
487
+ hypotest(*data, axis=axis, nan_policy=nan_policy, *args, **kwds)
488
+ return
489
+
490
+ # If `nan_policy == 'omit', we might be left with a small sample.
491
+ # Check for the appropriate warning.
492
+ if (nan_policy == 'omit' and data_generator in {"all_nans", "mixed"}
493
+ and hypotest not in too_small_special_case_funcs):
494
+ with pytest.warns(SmallSampleWarning, match=too_small_nd_omit):
495
+ res = hypotest(*data, axis=axis, nan_policy=nan_policy, *args, **kwds)
496
+ else: # otherwise, there should be no warning
497
+ res = hypotest(*data, axis=axis, nan_policy=nan_policy, *args, **kwds)
498
+
499
+ # Compare against the output against looping over 1D slices
500
+ res_nd = unpacker(res)
501
+
502
+ assert_allclose(res_nd, res_1d, rtol=1e-14)
503
+
504
+
505
+ @pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
506
+ "paired", "unpacker"), axis_nan_policy_cases)
507
+ @pytest.mark.parametrize(("nan_policy"), ("propagate", "omit", "raise"))
508
+ @pytest.mark.parametrize(("data_generator"),
509
+ ("all_nans", "all_finite", "mixed", "empty"))
510
+ @pytest.mark.parallel_threads(1)
511
+ def test_axis_nan_policy_axis_is_None(hypotest, args, kwds, n_samples,
512
+ n_outputs, paired, unpacker, nan_policy,
513
+ data_generator):
514
+ # check for correct behavior when `axis=None`
515
+ if not unpacker:
516
+ def unpacker(res):
517
+ return res
518
+
519
+ rng = np.random.default_rng(0)
520
+
521
+ if data_generator == "empty":
522
+ data = [rng.random((2, 0)) for i in range(n_samples)]
523
+ else:
524
+ data = [rng.random((2, 20)) for i in range(n_samples)]
525
+
526
+ if data_generator == "mixed":
527
+ masks = [rng.random((2, 20)) > 0.9 for i in range(n_samples)]
528
+ for sample, mask in zip(data, masks):
529
+ sample[mask] = np.nan
530
+ elif data_generator == "all_nans":
531
+ data = [sample * np.nan for sample in data]
532
+
533
+ data_raveled = [sample.ravel() for sample in data]
534
+
535
+ if nan_policy == 'raise' and data_generator not in {"all_finite", "empty"}:
536
+ message = 'The input contains nan values'
537
+
538
+ # check for correct behavior whether or not data is 1d to begin with
539
+ with pytest.raises(ValueError, match=message):
540
+ hypotest(*data, axis=None, nan_policy=nan_policy,
541
+ *args, **kwds)
542
+ with pytest.raises(ValueError, match=message):
543
+ hypotest(*data_raveled, axis=None, nan_policy=nan_policy,
544
+ *args, **kwds)
545
+
546
+ return
547
+
548
+ # behavior of reference implementation with 1d input, public function with 1d
549
+ # input, and public function with Nd input and `axis=None` should be consistent.
550
+ # This means:
551
+ # - If the reference version raises an error or emits a warning, it's because
552
+ # the sample is too small, so check that the public function emits an
553
+ # appropriate "too small" warning
554
+ # - Any results returned by the three versions should be the same.
555
+ with warnings.catch_warnings(): # treat warnings as errors
556
+ warnings.simplefilter("error")
557
+
558
+ ea_str, eb_str, ec_str = None, None, None
559
+ try:
560
+ res1da = nan_policy_1d(hypotest, data_raveled, unpacker, *args,
561
+ n_outputs=n_outputs, nan_policy=nan_policy,
562
+ paired=paired, _no_deco=True, **kwds)
563
+ except (RuntimeWarning, ValueError, ZeroDivisionError, UserWarning) as ea:
564
+ res1da = None
565
+ ea_str = str(ea)
566
+
567
+ try:
568
+ res1db = hypotest(*data_raveled, *args, nan_policy=nan_policy, **kwds)
569
+ except SmallSampleWarning as eb:
570
+ eb_str = str(eb)
571
+
572
+ try:
573
+ res1dc = hypotest(*data, *args, axis=None, nan_policy=nan_policy, **kwds)
574
+ except SmallSampleWarning as ec:
575
+ ec_str = str(ec)
576
+
577
+ if ea_str or eb_str or ec_str: # *if* there is some sort of error or warning
578
+ # If the reference implemented generated an error or warning, make sure the
579
+ # message was one of the expected "too small" messages. Note that some
580
+ # functions don't complain at all without the decorator; that's OK, too.
581
+ ok_msg = any([str(ea_str).startswith(msg) for msg in too_small_messages])
582
+ assert (ea_str is None) or ok_msg
583
+
584
+ # make sure the wrapped function emits the *intended* warning
585
+ desired_warnings = {too_small_1d_omit, too_small_1d_not_omit}
586
+ assert str(eb_str) in desired_warnings
587
+ assert str(ec_str) in desired_warnings
588
+
589
+ with warnings.catch_warnings(): # ignore warnings to get return value
590
+ warnings.simplefilter("ignore")
591
+ res1db = hypotest(*data_raveled, *args, nan_policy=nan_policy, **kwds)
592
+ res1dc = hypotest(*data, *args, axis=None, nan_policy=nan_policy, **kwds)
593
+
594
+ # Make sure any results returned by reference/public function are identical
595
+ # and all attributes are *NumPy* scalars
596
+ res1db, res1dc = unpacker(res1db), unpacker(res1dc)
597
+ assert_equal(res1dc, res1db)
598
+ all_results = list(res1db) + list(res1dc)
599
+
600
+ if res1da is not None:
601
+ assert_allclose(res1db, res1da, rtol=1e-15)
602
+ all_results += list(res1da)
603
+
604
+ for item in all_results:
605
+ assert np.issubdtype(item.dtype, np.number)
606
+ assert np.isscalar(item)
607
+
608
+
609
+ # Test keepdims for:
610
+ # - Axis negative, positive, None, and tuple
611
+ # - 1D with no NaNs
612
+ # - 1D with NaN propagation
613
+ # - Zero-sized output
614
+ # We're working on making `stats` quieter, but that's not what this test
615
+ # is about. For now, we expect all sorts of warnings here due to small samples.
616
+ @pytest.mark.filterwarnings('ignore::UserWarning')
617
+ @pytest.mark.filterwarnings('ignore::RuntimeWarning')
618
+ @pytest.mark.parametrize("nan_policy", ("omit", "propagate"))
619
+ @pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
620
+ "paired", "unpacker"), axis_nan_policy_cases)
621
+ @pytest.mark.parametrize(
622
+ ("sample_shape", "axis_cases"),
623
+ (((2, 3, 3, 4), (None, 0, -1, (0, 2), (1, -1), (3, 1, 2, 0))),
624
+ ((10, ), (0, -1)),
625
+ ((20, 0), (0, 1)))
626
+ )
627
+ def test_keepdims(hypotest, args, kwds, n_samples, n_outputs, paired, unpacker,
628
+ sample_shape, axis_cases, nan_policy):
629
+ small_sample_raises = {stats.skewtest, stats.kurtosistest, stats.normaltest,
630
+ stats.differential_entropy}
631
+ if sample_shape == (2, 3, 3, 4) and hypotest in small_sample_raises:
632
+ pytest.skip("Sample too small; test raises error.")
633
+ if hypotest in {weightedtau_weighted}:
634
+ pytest.skip("`rankdata` used in testing doesn't support axis tuple.")
635
+ # test if keepdims parameter works correctly
636
+ if not unpacker:
637
+ def unpacker(res):
638
+ return res
639
+ rng = np.random.default_rng(0)
640
+ data = [rng.random(sample_shape) for _ in range(n_samples)]
641
+ nan_data = [sample.copy() for sample in data]
642
+ nan_mask = [rng.random(sample_shape) < 0.2 for _ in range(n_samples)]
643
+ for sample, mask in zip(nan_data, nan_mask):
644
+ sample[mask] = np.nan
645
+ for axis in axis_cases:
646
+ expected_shape = list(sample_shape)
647
+ if axis is None:
648
+ expected_shape = np.ones(len(sample_shape))
649
+ else:
650
+ if isinstance(axis, int):
651
+ expected_shape[axis] = 1
652
+ else:
653
+ for ax in axis:
654
+ expected_shape[ax] = 1
655
+ expected_shape = tuple(expected_shape)
656
+ res = unpacker(hypotest(*data, *args, axis=axis, keepdims=True,
657
+ **kwds))
658
+ res_base = unpacker(hypotest(*data, *args, axis=axis, keepdims=False,
659
+ **kwds))
660
+ nan_res = unpacker(hypotest(*nan_data, *args, axis=axis,
661
+ keepdims=True, nan_policy=nan_policy,
662
+ **kwds))
663
+ nan_res_base = unpacker(hypotest(*nan_data, *args, axis=axis,
664
+ keepdims=False,
665
+ nan_policy=nan_policy, **kwds))
666
+ for r, r_base, rn, rn_base in zip(res, res_base, nan_res,
667
+ nan_res_base):
668
+ assert r.shape == expected_shape
669
+ r = np.squeeze(r, axis=axis)
670
+ assert_allclose(r, r_base, atol=1e-16)
671
+ assert rn.shape == expected_shape
672
+ rn = np.squeeze(rn, axis=axis)
673
+ # ideally assert_equal, but `combine_pvalues` failed on 32-bit build
674
+ assert_allclose(rn, rn_base, atol=1e-16)
675
+
676
+
677
+ @pytest.mark.parametrize(("fun", "nsamp"),
678
+ [(stats.kstat, 1),
679
+ (stats.kstatvar, 1)])
680
+ def test_hypotest_back_compat_no_axis(fun, nsamp):
681
+ m, n = 8, 9
682
+
683
+ rng = np.random.default_rng(0)
684
+ x = rng.random((nsamp, m, n))
685
+ res = fun(*x)
686
+ res2 = fun(*x, _no_deco=True)
687
+ res3 = fun([xi.ravel() for xi in x])
688
+ assert_equal(res, res2)
689
+ assert_equal(res, res3)
690
+
691
+
692
+ @pytest.mark.parametrize(("axis"), (0, 1, 2))
693
+ def test_axis_nan_policy_decorated_positional_axis(axis):
694
+ # Test for correct behavior of function decorated with
695
+ # _axis_nan_policy_decorator whether `axis` is provided as positional or
696
+ # keyword argument
697
+
698
+ shape = (8, 9, 10)
699
+ rng = np.random.default_rng(0)
700
+ x = rng.random(shape)
701
+ y = rng.random(shape)
702
+ res1 = stats.mannwhitneyu(x, y, True, 'two-sided', axis)
703
+ res2 = stats.mannwhitneyu(x, y, True, 'two-sided', axis=axis)
704
+ assert_equal(res1, res2)
705
+
706
+ message = "mannwhitneyu() got multiple values for argument 'axis'"
707
+ with pytest.raises(TypeError, match=re.escape(message)):
708
+ stats.mannwhitneyu(x, y, True, 'two-sided', axis, axis=axis)
709
+
710
+
711
+ def test_axis_nan_policy_decorated_positional_args():
712
+ # Test for correct behavior of function decorated with
713
+ # _axis_nan_policy_decorator when function accepts *args
714
+
715
+ shape = (3, 8, 9, 10)
716
+ rng = np.random.default_rng(0)
717
+ x = rng.random(shape)
718
+ x[0, 0, 0, 0] = np.nan
719
+ stats.kruskal(*x)
720
+
721
+ message = "kruskal() got an unexpected keyword argument 'samples'"
722
+ with pytest.raises(TypeError, match=re.escape(message)):
723
+ stats.kruskal(samples=x)
724
+
725
+ with pytest.raises(TypeError, match=re.escape(message)):
726
+ stats.kruskal(*x, samples=x)
727
+
728
+
729
+ def test_axis_nan_policy_decorated_keyword_samples():
730
+ # Test for correct behavior of function decorated with
731
+ # _axis_nan_policy_decorator whether samples are provided as positional or
732
+ # keyword arguments
733
+
734
+ shape = (2, 8, 9, 10)
735
+ rng = np.random.default_rng(0)
736
+ x = rng.random(shape)
737
+ x[0, 0, 0, 0] = np.nan
738
+ res1 = stats.mannwhitneyu(*x)
739
+ res2 = stats.mannwhitneyu(x=x[0], y=x[1])
740
+ assert_equal(res1, res2)
741
+
742
+ message = "mannwhitneyu() got multiple values for argument"
743
+ with pytest.raises(TypeError, match=re.escape(message)):
744
+ stats.mannwhitneyu(*x, x=x[0], y=x[1])
745
+
746
+
747
+ @pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
748
+ "paired", "unpacker"), axis_nan_policy_cases)
749
+ def test_axis_nan_policy_decorated_pickled(hypotest, args, kwds, n_samples,
750
+ n_outputs, paired, unpacker):
751
+ if "ttest_ci" in hypotest.__name__:
752
+ pytest.skip("Can't pickle functions defined within functions.")
753
+
754
+ rng = np.random.default_rng(0)
755
+
756
+ # Some hypothesis tests return a non-iterable that needs an `unpacker` to
757
+ # extract the statistic and p-value. For those that don't:
758
+ if not unpacker:
759
+ def unpacker(res):
760
+ return res
761
+
762
+ data = rng.uniform(size=(n_samples, 2, 30))
763
+ pickled_hypotest = pickle.dumps(hypotest)
764
+ unpickled_hypotest = pickle.loads(pickled_hypotest)
765
+ res1 = unpacker(hypotest(*data, *args, axis=-1, **kwds))
766
+ res2 = unpacker(unpickled_hypotest(*data, *args, axis=-1, **kwds))
767
+ assert_allclose(res1, res2, rtol=1e-12)
768
+
769
+
770
+ def test_check_empty_inputs():
771
+ # Test that _check_empty_inputs is doing its job, at least for single-
772
+ # sample inputs. (Multi-sample functionality is tested below.)
773
+ # If the input sample is not empty, it should return None.
774
+ # If the input sample is empty, it should return an array of NaNs or an
775
+ # empty array of appropriate shape. np.mean is used as a reference for the
776
+ # output because, like the statistics calculated by these functions,
777
+ # it works along and "consumes" `axis` but preserves the other axes.
778
+ for i in range(5):
779
+ for combo in combinations_with_replacement([0, 1, 2], i):
780
+ for axis in range(len(combo)):
781
+ samples = (np.zeros(combo),)
782
+ output = stats._axis_nan_policy._check_empty_inputs(samples,
783
+ axis)
784
+ if output is not None:
785
+ with np.testing.suppress_warnings() as sup:
786
+ sup.filter(RuntimeWarning, "Mean of empty slice.")
787
+ sup.filter(RuntimeWarning, "invalid value encountered")
788
+ reference = samples[0].mean(axis=axis)
789
+ np.testing.assert_equal(output, reference)
790
+
791
+
792
+ def _check_arrays_broadcastable(arrays, axis):
793
+ # https://numpy.org/doc/stable/user/basics.broadcasting.html
794
+ # "When operating on two arrays, NumPy compares their shapes element-wise.
795
+ # It starts with the trailing (i.e. rightmost) dimensions and works its
796
+ # way left.
797
+ # Two dimensions are compatible when
798
+ # 1. they are equal, or
799
+ # 2. one of them is 1
800
+ # ...
801
+ # Arrays do not need to have the same number of dimensions."
802
+ # (Clarification: if the arrays are compatible according to the criteria
803
+ # above and an array runs out of dimensions, it is still compatible.)
804
+ # Below, we follow the rules above except ignoring `axis`
805
+
806
+ n_dims = max([arr.ndim for arr in arrays])
807
+ if axis is not None:
808
+ # convert to negative axis
809
+ axis = (-n_dims + axis) if axis >= 0 else axis
810
+
811
+ for dim in range(1, n_dims+1): # we'll index from -1 to -n_dims, inclusive
812
+ if -dim == axis:
813
+ continue # ignore lengths along `axis`
814
+
815
+ dim_lengths = set()
816
+ for arr in arrays:
817
+ if dim <= arr.ndim and arr.shape[-dim] != 1:
818
+ dim_lengths.add(arr.shape[-dim])
819
+
820
+ if len(dim_lengths) > 1:
821
+ return False
822
+ return True
823
+
824
+
825
+ @pytest.mark.slow
826
+ @pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
827
+ "paired", "unpacker"), axis_nan_policy_cases)
828
+ @pytest.mark.parallel_threads(1)
829
+ def test_empty(hypotest, args, kwds, n_samples, n_outputs, paired, unpacker):
830
+ # test for correct output shape when at least one input is empty
831
+ if hypotest in {stats.kruskal, stats.friedmanchisquare} and not SCIPY_XSLOW:
832
+ pytest.skip("Too slow.")
833
+
834
+ if hypotest in override_propagate_funcs:
835
+ reason = "Doesn't follow the usual pattern. Tested separately."
836
+ pytest.skip(reason=reason)
837
+
838
+ if unpacker is None:
839
+ unpacker = lambda res: (res[0], res[1]) # noqa: E731
840
+
841
+ def small_data_generator(n_samples, n_dims):
842
+
843
+ def small_sample_generator(n_dims):
844
+ # return all possible "small" arrays in up to n_dim dimensions
845
+ for i in n_dims:
846
+ # "small" means with size along dimension either 0 or 1
847
+ for combo in combinations_with_replacement([0, 1, 2], i):
848
+ yield np.zeros(combo)
849
+
850
+ # yield all possible combinations of small samples
851
+ gens = [small_sample_generator(n_dims) for i in range(n_samples)]
852
+ yield from product(*gens)
853
+
854
+ n_dims = [1, 2, 3]
855
+ for samples in small_data_generator(n_samples, n_dims):
856
+
857
+ # this test is only for arrays of zero size
858
+ if not any(sample.size == 0 for sample in samples):
859
+ continue
860
+
861
+ max_axis = max(sample.ndim for sample in samples)
862
+
863
+ # need to test for all valid values of `axis` parameter, too
864
+ for axis in range(-max_axis, max_axis):
865
+
866
+ try:
867
+ # After broadcasting, all arrays are the same shape, so
868
+ # the shape of the output should be the same as a single-
869
+ # sample statistic. Use np.mean as a reference.
870
+ concat = stats._stats_py._broadcast_concatenate(samples, axis,
871
+ paired=paired)
872
+ with np.testing.suppress_warnings() as sup:
873
+ sup.filter(RuntimeWarning, "Mean of empty slice.")
874
+ sup.filter(RuntimeWarning, "invalid value encountered")
875
+ expected = np.mean(concat, axis=axis) * np.nan
876
+ mask = np.isnan(expected)
877
+ expected = [np.asarray(expected.copy()) for i in range(n_outputs)]
878
+
879
+ if hypotest in empty_special_case_funcs:
880
+ empty_val = hypotest(*([[]]*len(samples)), *args, **kwds)
881
+ empty_val = list(unpacker(empty_val))
882
+ for i in range(n_outputs):
883
+ expected[i][mask] = empty_val[i]
884
+
885
+ if expected[0].size and hypotest not in too_small_special_case_funcs:
886
+ message = (too_small_1d_not_omit if max_axis == 1
887
+ else too_small_nd_not_omit)
888
+ with pytest.warns(SmallSampleWarning, match=message):
889
+ res = hypotest(*samples, *args, axis=axis, **kwds)
890
+ else:
891
+ with np.testing.suppress_warnings() as sup:
892
+ # f_oneway special case
893
+ sup.filter(SmallSampleWarning, "all input arrays have length 1")
894
+ res = hypotest(*samples, *args, axis=axis, **kwds)
895
+ res = unpacker(res)
896
+
897
+ for i in range(n_outputs):
898
+ assert_equal(res[i], expected[i])
899
+
900
+ except ValueError:
901
+ # confirm that the arrays truly are not broadcastable
902
+ assert not _check_arrays_broadcastable(samples,
903
+ None if paired else axis)
904
+
905
+ # confirm that _both_ `_broadcast_concatenate` and `hypotest`
906
+ # produce this information.
907
+ message = "Array shapes are incompatible for broadcasting."
908
+ with pytest.raises(ValueError, match=message):
909
+ stats._stats_py._broadcast_concatenate(samples, axis, paired)
910
+ with pytest.raises(ValueError, match=message):
911
+ hypotest(*samples, *args, axis=axis, **kwds)
912
+
913
+
914
+ def paired_non_broadcastable_cases():
915
+ for case in axis_nan_policy_cases:
916
+ hypotest, args, kwds, n_samples, n_outputs, paired, unpacker = case
917
+ if n_samples == 1: # broadcasting only needed with >1 sample
918
+ continue
919
+ yield case
920
+
921
+
922
+ @pytest.mark.parametrize("axis", [0, 1])
923
+ @pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
924
+ "paired", "unpacker"),
925
+ paired_non_broadcastable_cases())
926
+ def test_non_broadcastable(hypotest, args, kwds, n_samples, n_outputs, paired,
927
+ unpacker, axis):
928
+ # test for correct error message when shapes are not broadcastable
929
+ rng = np.random.default_rng(91359824598245)
930
+ get_samples = True
931
+ while get_samples:
932
+ samples = [rng.random(size=rng.integers(2, 100, size=2))
933
+ for i in range(n_samples)]
934
+ # if samples are broadcastable, try again
935
+ get_samples = _check_arrays_broadcastable(samples, axis=axis)
936
+
937
+ message = "Array shapes are incompatible for broadcasting."
938
+ with pytest.raises(ValueError, match=message):
939
+ hypotest(*samples, *args, **kwds)
940
+
941
+ if not paired: # there's another test for paired-sample statistics
942
+ return
943
+
944
+ # Previously, paired sample statistics did not raise an error
945
+ # message when the shapes were broadcastable except along `axis`
946
+ # https://github.com/scipy/scipy/pull/19578#pullrequestreview-1766857165
947
+ shape = rng.integers(2, 10, size=2)
948
+ most_samples = [rng.random(size=shape) for i in range(n_samples-1)]
949
+ shape = list(shape)
950
+ shape[axis] += 1
951
+ other_sample = rng.random(size=shape)
952
+ with pytest.raises(ValueError, match=message):
953
+ hypotest(other_sample, *most_samples, *args, **kwds)
954
+
955
+ def test_masked_array_2_sentinel_array():
956
+ # prepare arrays
957
+ np.random.seed(0)
958
+ A = np.random.rand(10, 11, 12)
959
+ B = np.random.rand(12)
960
+ mask = A < 0.5
961
+ A = np.ma.masked_array(A, mask)
962
+
963
+ # set arbitrary elements to special values
964
+ # (these values might have been considered for use as sentinel values)
965
+ max_float = np.finfo(np.float64).max
966
+ max_float2 = np.nextafter(max_float, -np.inf)
967
+ max_float3 = np.nextafter(max_float2, -np.inf)
968
+ A[3, 4, 1] = np.nan
969
+ A[4, 5, 2] = np.inf
970
+ A[5, 6, 3] = max_float
971
+ B[8] = np.nan
972
+ B[7] = np.inf
973
+ B[6] = max_float2
974
+
975
+ # convert masked A to array with sentinel value, don't modify B
976
+ out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([A, B])
977
+ A_out, B_out = out_arrays
978
+
979
+ # check that good sentinel value was chosen (according to intended logic)
980
+ assert (sentinel != max_float) and (sentinel != max_float2)
981
+ assert sentinel == max_float3
982
+
983
+ # check that output arrays are as intended
984
+ A_reference = A.data
985
+ A_reference[A.mask] = sentinel
986
+ np.testing.assert_array_equal(A_out, A_reference)
987
+ assert B_out is B
988
+
989
+
990
+ @skip_xp_invalid_arg
991
+ def test_masked_dtype():
992
+ # When _masked_arrays_2_sentinel_arrays was first added, it always
993
+ # upcast the arrays to np.float64. After gh16662, check expected promotion
994
+ # and that the expected sentinel is found.
995
+
996
+ # these are important because the max of the promoted dtype is the first
997
+ # candidate to be the sentinel value
998
+ max16 = np.iinfo(np.int16).max
999
+ max128c = np.finfo(np.complex128).max
1000
+
1001
+ # a is a regular array, b has masked elements, and c has no masked elements
1002
+ a = np.array([1, 2, max16], dtype=np.int16)
1003
+ b = np.ma.array([1, 2, 1], dtype=np.int8, mask=[0, 1, 0])
1004
+ c = np.ma.array([1, 2, 1], dtype=np.complex128, mask=[0, 0, 0])
1005
+
1006
+ # check integer masked -> sentinel conversion
1007
+ out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([a, b])
1008
+ a_out, b_out = out_arrays
1009
+ assert sentinel == max16-1 # not max16 because max16 was in the data
1010
+ assert b_out.dtype == np.int16 # check expected promotion
1011
+ assert_allclose(b_out, [b[0], sentinel, b[-1]]) # check sentinel placement
1012
+ assert a_out is a # not a masked array, so left untouched
1013
+ assert not isinstance(b_out, np.ma.MaskedArray) # b became regular array
1014
+
1015
+ # similarly with complex
1016
+ out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([b, c])
1017
+ b_out, c_out = out_arrays
1018
+ assert sentinel == max128c # max128c was not in the data
1019
+ assert b_out.dtype == np.complex128 # b got promoted
1020
+ assert_allclose(b_out, [b[0], sentinel, b[-1]]) # check sentinel placement
1021
+ assert not isinstance(b_out, np.ma.MaskedArray) # b became regular array
1022
+ assert not isinstance(c_out, np.ma.MaskedArray) # c became regular array
1023
+
1024
+ # Also, check edge case when a sentinel value cannot be found in the data
1025
+ min8, max8 = np.iinfo(np.int8).min, np.iinfo(np.int8).max
1026
+ a = np.arange(min8, max8+1, dtype=np.int8) # use all possible values
1027
+ mask1 = np.zeros_like(a, dtype=bool)
1028
+ mask0 = np.zeros_like(a, dtype=bool)
1029
+
1030
+ # a masked value can be used as the sentinel
1031
+ mask1[1] = True
1032
+ a1 = np.ma.array(a, mask=mask1)
1033
+ out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([a1])
1034
+ assert sentinel == min8+1
1035
+
1036
+ # unless it's the smallest possible; skipped for simiplicity (see code)
1037
+ mask0[0] = True
1038
+ a0 = np.ma.array(a, mask=mask0)
1039
+ message = "This function replaces masked elements with sentinel..."
1040
+ with pytest.raises(ValueError, match=message):
1041
+ _masked_arrays_2_sentinel_arrays([a0])
1042
+
1043
+ # test that dtype is preserved in functions
1044
+ a = np.ma.array([1, 2, 3], mask=[0, 1, 0], dtype=np.float32)
1045
+ assert stats.gmean(a).dtype == np.float32
1046
+
1047
+
1048
+ def test_masked_stat_1d():
1049
+ # basic test of _axis_nan_policy_factory with 1D masked sample
1050
+ males = [19, 22, 16, 29, 24]
1051
+ females = [20, 11, 17, 12]
1052
+ res = stats.mannwhitneyu(males, females)
1053
+
1054
+ # same result when extra nan is omitted
1055
+ females2 = [20, 11, 17, np.nan, 12]
1056
+ res2 = stats.mannwhitneyu(males, females2, nan_policy='omit')
1057
+ np.testing.assert_array_equal(res2, res)
1058
+
1059
+ # same result when extra element is masked
1060
+ females3 = [20, 11, 17, 1000, 12]
1061
+ mask3 = [False, False, False, True, False]
1062
+ females3 = np.ma.masked_array(females3, mask=mask3)
1063
+ res3 = stats.mannwhitneyu(males, females3)
1064
+ np.testing.assert_array_equal(res3, res)
1065
+
1066
+ # same result when extra nan is omitted and additional element is masked
1067
+ females4 = [20, 11, 17, np.nan, 1000, 12]
1068
+ mask4 = [False, False, False, False, True, False]
1069
+ females4 = np.ma.masked_array(females4, mask=mask4)
1070
+ res4 = stats.mannwhitneyu(males, females4, nan_policy='omit')
1071
+ np.testing.assert_array_equal(res4, res)
1072
+
1073
+ # same result when extra elements, including nan, are masked
1074
+ females5 = [20, 11, 17, np.nan, 1000, 12]
1075
+ mask5 = [False, False, False, True, True, False]
1076
+ females5 = np.ma.masked_array(females5, mask=mask5)
1077
+ res5 = stats.mannwhitneyu(males, females5, nan_policy='propagate')
1078
+ res6 = stats.mannwhitneyu(males, females5, nan_policy='raise')
1079
+ np.testing.assert_array_equal(res5, res)
1080
+ np.testing.assert_array_equal(res6, res)
1081
+
1082
+
1083
+ @pytest.mark.filterwarnings('ignore:After omitting NaNs...')
1084
+ @pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
1085
+ @skip_xp_invalid_arg
1086
+ @pytest.mark.parametrize(("axis"), range(-3, 3))
1087
+ def test_masked_stat_3d(axis):
1088
+ # basic test of _axis_nan_policy_factory with 3D masked sample
1089
+ np.random.seed(0)
1090
+ a = np.random.rand(3, 4, 5)
1091
+ b = np.random.rand(4, 5)
1092
+ c = np.random.rand(4, 1)
1093
+
1094
+ mask_a = a < 0.1
1095
+ mask_c = [False, False, False, True]
1096
+ a_masked = np.ma.masked_array(a, mask=mask_a)
1097
+ c_masked = np.ma.masked_array(c, mask=mask_c)
1098
+
1099
+ a_nans = a.copy()
1100
+ a_nans[mask_a] = np.nan
1101
+ c_nans = c.copy()
1102
+ c_nans[mask_c] = np.nan
1103
+
1104
+ res = stats.kruskal(a_nans, b, c_nans, nan_policy='omit', axis=axis)
1105
+ res2 = stats.kruskal(a_masked, b, c_masked, axis=axis)
1106
+ np.testing.assert_array_equal(res, res2)
1107
+
1108
+
1109
+ @pytest.mark.filterwarnings('ignore:After omitting NaNs...')
1110
+ @pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
1111
+ @skip_xp_invalid_arg
1112
+ def test_mixed_mask_nan_1():
1113
+ # targeted test of _axis_nan_policy_factory with 2D masked sample:
1114
+ # omitting samples with masks and nan_policy='omit' are equivalent
1115
+ # also checks paired-sample sentinel value removal
1116
+ m, n = 3, 20
1117
+ axis = -1
1118
+
1119
+ rng = np.random.RandomState(0)
1120
+ a = rng.rand(m, n)
1121
+ b = rng.rand(m, n)
1122
+ mask_a1 = rng.rand(m, n) < 0.2
1123
+ mask_a2 = rng.rand(m, n) < 0.1
1124
+ mask_b1 = rng.rand(m, n) < 0.15
1125
+ mask_b2 = rng.rand(m, n) < 0.15
1126
+ mask_a1[2, :] = True
1127
+
1128
+ a_nans = a.copy()
1129
+ b_nans = b.copy()
1130
+ a_nans[mask_a1 | mask_a2] = np.nan
1131
+ b_nans[mask_b1 | mask_b2] = np.nan
1132
+
1133
+ a_masked1 = np.ma.masked_array(a, mask=mask_a1)
1134
+ b_masked1 = np.ma.masked_array(b, mask=mask_b1)
1135
+ a_masked1[mask_a2] = np.nan
1136
+ b_masked1[mask_b2] = np.nan
1137
+
1138
+ a_masked2 = np.ma.masked_array(a, mask=mask_a2)
1139
+ b_masked2 = np.ma.masked_array(b, mask=mask_b2)
1140
+ a_masked2[mask_a1] = np.nan
1141
+ b_masked2[mask_b1] = np.nan
1142
+
1143
+ a_masked3 = np.ma.masked_array(a, mask=(mask_a1 | mask_a2))
1144
+ b_masked3 = np.ma.masked_array(b, mask=(mask_b1 | mask_b2))
1145
+
1146
+ res = stats.wilcoxon(a_nans, b_nans, nan_policy='omit', axis=axis)
1147
+ res1 = stats.wilcoxon(a_masked1, b_masked1, nan_policy='omit', axis=axis)
1148
+ res2 = stats.wilcoxon(a_masked2, b_masked2, nan_policy='omit', axis=axis)
1149
+ res3 = stats.wilcoxon(a_masked3, b_masked3, nan_policy='raise', axis=axis)
1150
+ res4 = stats.wilcoxon(a_masked3, b_masked3,
1151
+ nan_policy='propagate', axis=axis)
1152
+
1153
+ np.testing.assert_array_equal(res1, res)
1154
+ np.testing.assert_array_equal(res2, res)
1155
+ np.testing.assert_array_equal(res3, res)
1156
+ np.testing.assert_array_equal(res4, res)
1157
+
1158
+
1159
+ @pytest.mark.filterwarnings('ignore:After omitting NaNs...')
1160
+ @pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
1161
+ @skip_xp_invalid_arg
1162
+ def test_mixed_mask_nan_2():
1163
+ # targeted test of _axis_nan_policy_factory with 2D masked sample:
1164
+ # check for expected interaction between masks and nans
1165
+
1166
+ # Cases here are
1167
+ # [mixed nan/mask, all nans, all masked,
1168
+ # unmasked nan, masked nan, unmasked non-nan]
1169
+ a = [[1, np.nan, 2], [np.nan, np.nan, np.nan], [1, 2, 3],
1170
+ [1, np.nan, 3], [1, np.nan, 3], [1, 2, 3]]
1171
+ mask = [[1, 0, 1], [0, 0, 0], [1, 1, 1],
1172
+ [0, 0, 0], [0, 1, 0], [0, 0, 0]]
1173
+ a_masked = np.ma.masked_array(a, mask=mask)
1174
+ b = [[4, 5, 6]]
1175
+ ref1 = stats.ranksums([1, 3], [4, 5, 6])
1176
+ ref2 = stats.ranksums([1, 2, 3], [4, 5, 6])
1177
+
1178
+ # nan_policy = 'omit'
1179
+ # all elements are removed from first three rows
1180
+ # middle element is removed from fourth and fifth rows
1181
+ # no elements removed from last row
1182
+ res = stats.ranksums(a_masked, b, nan_policy='omit', axis=-1)
1183
+ stat_ref = [np.nan, np.nan, np.nan,
1184
+ ref1.statistic, ref1.statistic, ref2.statistic]
1185
+ p_ref = [np.nan, np.nan, np.nan,
1186
+ ref1.pvalue, ref1.pvalue, ref2.pvalue]
1187
+ np.testing.assert_array_equal(res.statistic, stat_ref)
1188
+ np.testing.assert_array_equal(res.pvalue, p_ref)
1189
+
1190
+ # nan_policy = 'propagate'
1191
+ # nans propagate in first, second, and fourth row
1192
+ # all elements are removed by mask from third row
1193
+ # middle element is removed from fifth row
1194
+ # no elements removed from last row
1195
+ res = stats.ranksums(a_masked, b, nan_policy='propagate', axis=-1)
1196
+ stat_ref = [np.nan, np.nan, np.nan,
1197
+ np.nan, ref1.statistic, ref2.statistic]
1198
+ p_ref = [np.nan, np.nan, np.nan,
1199
+ np.nan, ref1.pvalue, ref2.pvalue]
1200
+ np.testing.assert_array_equal(res.statistic, stat_ref)
1201
+ np.testing.assert_array_equal(res.pvalue, p_ref)
1202
+
1203
+
1204
+ def test_axis_None_vs_tuple():
1205
+ # `axis` `None` should be equivalent to tuple with all axes
1206
+ shape = (3, 8, 9, 10)
1207
+ rng = np.random.default_rng(0)
1208
+ x = rng.random(shape)
1209
+ res = stats.kruskal(*x, axis=None)
1210
+ res2 = stats.kruskal(*x, axis=(0, 1, 2))
1211
+ np.testing.assert_array_equal(res, res2)
1212
+
1213
+
1214
+ def test_axis_None_vs_tuple_with_broadcasting():
1215
+ # `axis` `None` should be equivalent to tuple with all axes,
1216
+ # which should be equivalent to raveling the arrays before passing them
1217
+ rng = np.random.default_rng(0)
1218
+ x = rng.random((5, 1))
1219
+ y = rng.random((1, 5))
1220
+ x2, y2 = np.broadcast_arrays(x, y)
1221
+
1222
+ res0 = stats.mannwhitneyu(x.ravel(), y.ravel())
1223
+ res1 = stats.mannwhitneyu(x, y, axis=None)
1224
+ res2 = stats.mannwhitneyu(x, y, axis=(0, 1))
1225
+ res3 = stats.mannwhitneyu(x2.ravel(), y2.ravel())
1226
+
1227
+ assert res1 == res0
1228
+ assert res2 == res0
1229
+ assert res3 != res0
1230
+
1231
+
1232
+ @pytest.mark.parametrize(("axis"),
1233
+ list(permutations(range(-3, 3), 2)) + [(-4, 1)])
1234
+ def test_other_axis_tuples(axis):
1235
+ # Check that _axis_nan_policy_factory treats all `axis` tuples as expected
1236
+ rng = np.random.default_rng(0)
1237
+ shape_x = (4, 5, 6)
1238
+ shape_y = (1, 6)
1239
+ x = rng.random(shape_x)
1240
+ y = rng.random(shape_y)
1241
+ axis_original = axis
1242
+
1243
+ # convert axis elements to positive
1244
+ axis = tuple([(i if i >= 0 else 3 + i) for i in axis])
1245
+ axis = sorted(axis)
1246
+
1247
+ if len(set(axis)) != len(axis):
1248
+ message = "`axis` must contain only distinct elements"
1249
+ with pytest.raises(AxisError, match=re.escape(message)):
1250
+ stats.mannwhitneyu(x, y, axis=axis_original)
1251
+ return
1252
+
1253
+ if axis[0] < 0 or axis[-1] > 2:
1254
+ message = "`axis` is out of bounds for array of dimension 3"
1255
+ with pytest.raises(AxisError, match=re.escape(message)):
1256
+ stats.mannwhitneyu(x, y, axis=axis_original)
1257
+ return
1258
+
1259
+ res = stats.mannwhitneyu(x, y, axis=axis_original)
1260
+
1261
+ # reference behavior
1262
+ not_axis = {0, 1, 2} - set(axis) # which axis is not part of `axis`
1263
+ not_axis = next(iter(not_axis)) # take it out of the set
1264
+
1265
+ x2 = x
1266
+ shape_y_broadcasted = [1, 1, 6]
1267
+ shape_y_broadcasted[not_axis] = shape_x[not_axis]
1268
+ y2 = np.broadcast_to(y, shape_y_broadcasted)
1269
+
1270
+ m = x2.shape[not_axis]
1271
+ x2 = np.moveaxis(x2, axis, (1, 2))
1272
+ y2 = np.moveaxis(y2, axis, (1, 2))
1273
+ x2 = np.reshape(x2, (m, -1))
1274
+ y2 = np.reshape(y2, (m, -1))
1275
+ res2 = stats.mannwhitneyu(x2, y2, axis=1)
1276
+
1277
+ np.testing.assert_array_equal(res, res2)
1278
+
1279
+
1280
+ @pytest.mark.filterwarnings('ignore:After omitting NaNs...')
1281
+ @pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
1282
+ @skip_xp_invalid_arg
1283
+ @pytest.mark.parametrize(
1284
+ ("weighted_fun_name, unpacker"),
1285
+ [
1286
+ ("gmean", lambda x: x),
1287
+ ("hmean", lambda x: x),
1288
+ ("pmean", lambda x: x),
1289
+ ("combine_pvalues", lambda x: (x.pvalue, x.statistic)),
1290
+ ],
1291
+ )
1292
+ def test_mean_mixed_mask_nan_weights(weighted_fun_name, unpacker):
1293
+ # targeted test of _axis_nan_policy_factory with 2D masked sample:
1294
+ # omitting samples with masks and nan_policy='omit' are equivalent
1295
+ # also checks paired-sample sentinel value removal
1296
+
1297
+ if weighted_fun_name == 'pmean':
1298
+ def weighted_fun(a, **kwargs):
1299
+ return stats.pmean(a, p=0.42, **kwargs)
1300
+ else:
1301
+ weighted_fun = getattr(stats, weighted_fun_name)
1302
+
1303
+ def func(*args, **kwargs):
1304
+ return unpacker(weighted_fun(*args, **kwargs))
1305
+
1306
+ m, n = 3, 20
1307
+ axis = -1
1308
+
1309
+ rng = np.random.default_rng(6541968121)
1310
+ a = rng.uniform(size=(m, n))
1311
+ b = rng.uniform(size=(m, n))
1312
+ mask_a1 = rng.uniform(size=(m, n)) < 0.2
1313
+ mask_a2 = rng.uniform(size=(m, n)) < 0.1
1314
+ mask_b1 = rng.uniform(size=(m, n)) < 0.15
1315
+ mask_b2 = rng.uniform(size=(m, n)) < 0.15
1316
+ mask_a1[2, :] = True
1317
+
1318
+ a_nans = a.copy()
1319
+ b_nans = b.copy()
1320
+ a_nans[mask_a1 | mask_a2] = np.nan
1321
+ b_nans[mask_b1 | mask_b2] = np.nan
1322
+
1323
+ a_masked1 = np.ma.masked_array(a, mask=mask_a1)
1324
+ b_masked1 = np.ma.masked_array(b, mask=mask_b1)
1325
+ a_masked1[mask_a2] = np.nan
1326
+ b_masked1[mask_b2] = np.nan
1327
+
1328
+ a_masked2 = np.ma.masked_array(a, mask=mask_a2)
1329
+ b_masked2 = np.ma.masked_array(b, mask=mask_b2)
1330
+ a_masked2[mask_a1] = np.nan
1331
+ b_masked2[mask_b1] = np.nan
1332
+
1333
+ a_masked3 = np.ma.masked_array(a, mask=(mask_a1 | mask_a2))
1334
+ b_masked3 = np.ma.masked_array(b, mask=(mask_b1 | mask_b2))
1335
+
1336
+ with np.testing.suppress_warnings() as sup:
1337
+ message = 'invalid value encountered'
1338
+ sup.filter(RuntimeWarning, message)
1339
+ res = func(a_nans, weights=b_nans, nan_policy="omit", axis=axis)
1340
+ res1 = func(a_masked1, weights=b_masked1, nan_policy="omit", axis=axis)
1341
+ res2 = func(a_masked2, weights=b_masked2, nan_policy="omit", axis=axis)
1342
+ res3 = func(a_masked3, weights=b_masked3, nan_policy="raise", axis=axis)
1343
+ res4 = func(a_masked3, weights=b_masked3, nan_policy="propagate", axis=axis)
1344
+
1345
+ np.testing.assert_array_equal(res1, res)
1346
+ np.testing.assert_array_equal(res2, res)
1347
+ np.testing.assert_array_equal(res3, res)
1348
+ np.testing.assert_array_equal(res4, res)
1349
+
1350
+
1351
+ def test_raise_invalid_args_g17713():
1352
+ # other cases are handled in:
1353
+ # test_axis_nan_policy_decorated_positional_axis - multiple values for arg
1354
+ # test_axis_nan_policy_decorated_positional_args - unexpected kwd arg
1355
+ message = "got an unexpected keyword argument"
1356
+ with pytest.raises(TypeError, match=message):
1357
+ stats.gmean([1, 2, 3], invalid_arg=True)
1358
+
1359
+ message = " got multiple values for argument"
1360
+ with pytest.raises(TypeError, match=message):
1361
+ stats.gmean([1, 2, 3], a=True)
1362
+
1363
+ message = "missing 1 required positional argument"
1364
+ with pytest.raises(TypeError, match=message):
1365
+ stats.gmean()
1366
+
1367
+ message = "takes from 1 to 4 positional arguments but 5 were given"
1368
+ with pytest.raises(TypeError, match=message):
1369
+ stats.gmean([1, 2, 3], 0, float, [1, 1, 1], 10)
1370
+
1371
+
1372
+ @pytest.mark.parametrize('dtype', [np.int16, np.float32, np.complex128])
1373
+ def test_array_like_input(dtype):
1374
+ # Check that `_axis_nan_policy`-decorated functions work with custom
1375
+ # containers that are coercible to numeric arrays
1376
+
1377
+ class ArrLike:
1378
+ def __init__(self, x, dtype):
1379
+ self._x = x
1380
+ self._dtype = dtype
1381
+
1382
+ def __array__(self, dtype=None, copy=None):
1383
+ return np.asarray(x, dtype=self._dtype)
1384
+
1385
+ x = [1]*2 + [3, 4, 5]
1386
+ res = stats.mode(ArrLike(x, dtype=dtype))
1387
+ assert res.mode == 1
1388
+ assert res.count == 2