scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp313-cp313-musllinux_1_2_aarch64.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 (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +263 -157
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-313-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-313-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-313-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-313-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-313-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-313-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-313-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-313-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-313-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-313-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-313-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-313-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-313-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-313-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-313-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-313-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-313-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-313-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -9,9 +9,9 @@ from pytest import raises as assert_raises
9
9
 
10
10
  def test_kde_1d():
11
11
  #some basic tests comparing to normal distribution
12
- np.random.seed(8765678)
12
+ rng = np.random.default_rng(8765678)
13
13
  n_basesample = 500
14
- xn = np.random.randn(n_basesample)
14
+ xn = rng.normal(0, 1, n_basesample)
15
15
  xnmean = xn.mean()
16
16
  xnstd = xn.std(ddof=1)
17
17
 
@@ -19,7 +19,15 @@ def test_kde_1d():
19
19
  gkde = stats.gaussian_kde(xn)
20
20
 
21
21
  # evaluate the density function for the kde for some points
22
- xs = np.linspace(-7,7,501)
22
+ xx = np.asarray([0.1, 0.5, 0.9])
23
+ loc, scale = gkde.dataset, np.sqrt(gkde.covariance)
24
+ assert_allclose(
25
+ gkde(xx),
26
+ stats.norm.pdf(xx[:, None], loc=loc, scale=scale).sum(axis=-1) / gkde.n,
27
+ rtol=5e-14
28
+ )
29
+
30
+ xs = np.linspace(-7, 7, 501)
23
31
  kdepdf = gkde.evaluate(xs)
24
32
  normpdf = stats.norm.pdf(xs, loc=xnmean, scale=xnstd)
25
33
  intervall = xs[1] - xs[0]
@@ -40,10 +48,10 @@ def test_kde_1d():
40
48
 
41
49
  def test_kde_1d_weighted():
42
50
  #some basic tests comparing to normal distribution
43
- np.random.seed(8765678)
51
+ rng = np.random.default_rng(8765678)
44
52
  n_basesample = 500
45
- xn = np.random.randn(n_basesample)
46
- wn = np.random.rand(n_basesample)
53
+ xn = rng.normal(0, 1, n_basesample)
54
+ wn = rng.random(n_basesample)
47
55
  xnmean = np.average(xn, weights=wn)
48
56
  xnstd = np.sqrt(np.average((xn-xnmean)**2, weights=wn))
49
57
 
@@ -51,7 +59,18 @@ def test_kde_1d_weighted():
51
59
  gkde = stats.gaussian_kde(xn, weights=wn)
52
60
 
53
61
  # evaluate the density function for the kde for some points
54
- xs = np.linspace(-7,7,501)
62
+ # evaluate the density function for the kde for some points
63
+ xx = np.asarray([0.1, 0.5, 0.9])
64
+ loc, scale = gkde.dataset, np.sqrt(gkde.covariance)
65
+
66
+ pdf = stats.norm.pdf
67
+ assert_allclose(
68
+ gkde(xx),
69
+ np.sum(pdf(xx[:, None], loc=loc, scale=scale) * gkde.weights, axis=-1),
70
+ rtol=5e-14
71
+ )
72
+
73
+ xs = np.linspace(-7, 7, 501)
55
74
  kdepdf = gkde.evaluate(xs)
56
75
  normpdf = stats.norm.pdf(xs, loc=xnmean, scale=xnstd)
57
76
  intervall = xs[1] - xs[0]
@@ -70,21 +89,45 @@ def test_kde_1d_weighted():
70
89
  (kdepdf*normpdf).sum()*intervall, decimal=2)
71
90
 
72
91
 
73
- @pytest.mark.xslow
74
- def test_kde_2d():
92
+ @pytest.mark.parametrize("n_basesample",
93
+ [
94
+ 20,
95
+ pytest.param(500, marks=[pytest.mark.xslow])
96
+ ]
97
+ )
98
+ def test_kde_2d(n_basesample):
75
99
  #some basic tests comparing to normal distribution
76
- np.random.seed(8765678)
77
- n_basesample = 500
100
+ rng = np.random.default_rng(8765678)
78
101
 
79
102
  mean = np.array([1.0, 3.0])
80
103
  covariance = np.array([[1.0, 2.0], [2.0, 6.0]])
81
104
 
82
105
  # Need transpose (shape (2, 500)) for kde
83
- xn = np.random.multivariate_normal(mean, covariance, size=n_basesample).T
106
+ xn = rng.multivariate_normal(mean, covariance, size=n_basesample).T
84
107
 
85
108
  # get kde for original sample
86
109
  gkde = stats.gaussian_kde(xn)
87
110
 
111
+ # evaluate vs multivariate normal, using the KDE definition
112
+ xx = np.asarray([[1, 2], [3, 4], [5, 6]])
113
+ arg = xx[:, None, :] - gkde.dataset.T
114
+ pdf = stats.multivariate_normal.pdf
115
+ assert_allclose(
116
+ gkde(xx.T),
117
+ pdf(arg, cov=gkde.covariance).sum(axis=-1) / gkde.n,
118
+ rtol=5e-14
119
+ )
120
+
121
+ # ... and cdf
122
+ cdf = stats.multivariate_normal.cdf
123
+ lo, hi = [-1, -2], [0, 0]
124
+ lo_, hi_ = lo - gkde.dataset.T, hi - gkde.dataset.T
125
+ assert_allclose(
126
+ gkde.integrate_box(lo, hi, rng=rng),
127
+ cdf(hi_, lower_limit=lo_, cov=gkde.covariance, rng=rng).sum(axis=-1) / gkde.n,
128
+ rtol=5e-7
129
+ )
130
+
88
131
  # evaluate the density function for the kde for some points
89
132
  x, y = np.mgrid[-7:7:500j, -7:7:500j]
90
133
  grid_coords = np.vstack([x.ravel(), y.ravel()])
@@ -99,8 +142,8 @@ def test_kde_2d():
99
142
 
100
143
  small = -1e100
101
144
  large = 1e100
102
- prob1 = gkde.integrate_box([small, mean[1]], [large, large])
103
- prob2 = gkde.integrate_box([small, small], [large, mean[1]])
145
+ prob1 = gkde.integrate_box([small, mean[1]], [large, large], rng=rng)
146
+ prob2 = gkde.integrate_box([small, small], [large, mean[1]], rng=rng)
104
147
 
105
148
  assert_almost_equal(prob1, 0.5, decimal=1)
106
149
  assert_almost_equal(prob2, 0.5, decimal=1)
@@ -110,22 +153,48 @@ def test_kde_2d():
110
153
  (kdepdf*normpdf).sum()*(intervall**2), decimal=2)
111
154
 
112
155
 
113
- @pytest.mark.xslow
114
- def test_kde_2d_weighted():
156
+ @pytest.mark.parametrize("n_basesample",
157
+ [
158
+ 20,
159
+ pytest.param(500, marks=[pytest.mark.xslow])
160
+ ]
161
+ )
162
+ def test_kde_2d_weighted(n_basesample):
115
163
  #some basic tests comparing to normal distribution
116
- np.random.seed(8765678)
117
- n_basesample = 500
164
+ rng = np.random.RandomState(8765678)
118
165
 
119
166
  mean = np.array([1.0, 3.0])
120
167
  covariance = np.array([[1.0, 2.0], [2.0, 6.0]])
121
168
 
122
169
  # Need transpose (shape (2, 500)) for kde
123
- xn = np.random.multivariate_normal(mean, covariance, size=n_basesample).T
124
- wn = np.random.rand(n_basesample)
170
+ xn = rng.multivariate_normal(mean, covariance, size=n_basesample).T
171
+ wn = rng.rand(n_basesample)
125
172
 
126
173
  # get kde for original sample
127
174
  gkde = stats.gaussian_kde(xn, weights=wn)
128
175
 
176
+
177
+ # evaluate vs multivariate normal, using the kde definition
178
+ xx = np.asarray([[1, 2], [3, 4], [5, 6]])
179
+ arg = xx[:, None, :] - gkde.dataset.T
180
+ pdf = stats.multivariate_normal.pdf
181
+ assert_allclose(
182
+ gkde(xx.T),
183
+ np.sum(pdf(arg, cov=gkde.covariance) * gkde.weights, axis=-1),
184
+ rtol=5e-14
185
+ )
186
+
187
+ # ... and cdf
188
+ cdf = stats.multivariate_normal.cdf
189
+ lo, hi = [-1, -2], [0, 0]
190
+ lo_, hi_ = lo - gkde.dataset.T, hi - gkde.dataset.T
191
+ assert_allclose(
192
+ gkde.integrate_box(lo, hi, rng=rng),
193
+ np.sum(cdf(hi_, lower_limit=lo_, cov=gkde.covariance, rng=rng) *
194
+ gkde.weights, axis=-1),
195
+ rtol=5e-6
196
+ )
197
+
129
198
  # evaluate the density function for the kde for some points
130
199
  x, y = np.mgrid[-7:7:500j, -7:7:500j]
131
200
  grid_coords = np.vstack([x.ravel(), y.ravel()])
@@ -140,8 +209,8 @@ def test_kde_2d_weighted():
140
209
 
141
210
  small = -1e100
142
211
  large = 1e100
143
- prob1 = gkde.integrate_box([small, mean[1]], [large, large])
144
- prob2 = gkde.integrate_box([small, small], [large, mean[1]])
212
+ prob1 = gkde.integrate_box([small, mean[1]], [large, large], rng=rng)
213
+ prob2 = gkde.integrate_box([small, small], [large, mean[1]], rng=rng)
145
214
 
146
215
  assert_almost_equal(prob1, 0.5, decimal=1)
147
216
  assert_almost_equal(prob2, 0.5, decimal=1)
@@ -156,9 +225,9 @@ def test_kde_bandwidth_method():
156
225
  """Same as default, just check that it works."""
157
226
  return np.power(kde_obj.n, -1./(kde_obj.d+4))
158
227
 
159
- np.random.seed(8765678)
228
+ rng = np.random.default_rng(8765678)
160
229
  n_basesample = 50
161
- xn = np.random.randn(n_basesample)
230
+ xn = rng.normal(0, 1, n_basesample)
162
231
 
163
232
  # Default
164
233
  gkde = stats.gaussian_kde(xn)
@@ -182,9 +251,9 @@ def test_kde_bandwidth_method_weighted():
182
251
  """Same as default, just check that it works."""
183
252
  return np.power(kde_obj.neff, -1./(kde_obj.d+4))
184
253
 
185
- np.random.seed(8765678)
254
+ rng = np.random.default_rng(8765678)
186
255
  n_basesample = 50
187
- xn = np.random.randn(n_basesample)
256
+ xn = rng.normal(0, 1, n_basesample)
188
257
 
189
258
  # Default
190
259
  gkde = stats.gaussian_kde(xn)
@@ -347,9 +416,9 @@ def test_pdf_logpdf_validation():
347
416
 
348
417
 
349
418
  def test_pdf_logpdf():
350
- np.random.seed(1)
419
+ rng = np.random.default_rng(1)
351
420
  n_basesample = 50
352
- xn = np.random.randn(n_basesample)
421
+ xn = rng.normal(0, 1, n_basesample)
353
422
 
354
423
  # Default
355
424
  gkde = stats.gaussian_kde(xn)
@@ -371,10 +440,10 @@ def test_pdf_logpdf():
371
440
 
372
441
 
373
442
  def test_pdf_logpdf_weighted():
374
- np.random.seed(1)
443
+ rng = np.random.default_rng(1)
375
444
  n_basesample = 50
376
- xn = np.random.randn(n_basesample)
377
- wn = np.random.rand(n_basesample)
445
+ xn = rng.normal(0, 1, n_basesample)
446
+ wn = rng.random(n_basesample)
378
447
 
379
448
  # Default
380
449
  gkde = stats.gaussian_kde(xn, weights=wn)
@@ -492,10 +561,10 @@ def test_marginal_iv():
492
561
  def test_logpdf_overflow():
493
562
  # regression test for gh-12988; testing against linalg instability for
494
563
  # very high dimensionality kde
495
- np.random.seed(1)
564
+ rng = np.random.default_rng(1)
496
565
  n_dimensions = 2500
497
566
  n_samples = 5000
498
- xn = np.array([np.random.randn(n_samples) + (n) for n in range(
567
+ xn = np.array([rng.normal(0, 1, n_samples) + (n) for n in range(
499
568
  0, n_dimensions)])
500
569
 
501
570
  # Default
@@ -508,9 +577,9 @@ def test_logpdf_overflow():
508
577
 
509
578
  def test_weights_intact():
510
579
  # regression test for gh-9709: weights are not modified
511
- np.random.seed(12345)
512
- vals = np.random.lognormal(size=100)
513
- weights = np.random.choice([1.0, 10.0, 100], size=vals.size)
580
+ rng = np.random.default_rng(12345)
581
+ vals = rng.lognormal(size=100)
582
+ weights = rng.choice([1.0, 10.0, 100], size=vals.size)
514
583
  orig_weights = weights.copy()
515
584
 
516
585
  stats.gaussian_kde(np.log10(vals), weights=weights)
@@ -519,7 +588,6 @@ def test_weights_intact():
519
588
 
520
589
  def test_weights_integer():
521
590
  # integer weights are OK, cf gh-9709 (comment)
522
- np.random.seed(12345)
523
591
  values = [0.2, 13.5, 21.0, 75.0, 99.0]
524
592
  weights = [1, 2, 4, 8, 16] # a list of integers
525
593
  pdf_i = stats.gaussian_kde(values, weights=weights)
@@ -558,11 +626,11 @@ def test_seed():
558
626
  rng = np.random.default_rng(1234)
559
627
  gkde_trail.resample(n_sample, seed=rng)
560
628
 
561
- np.random.seed(8765678)
629
+ rng = np.random.default_rng(8765678)
562
630
  n_basesample = 500
563
- wn = np.random.rand(n_basesample)
631
+ wn = rng.random(n_basesample)
564
632
  # Test 1D case
565
- xn_1d = np.random.randn(n_basesample)
633
+ xn_1d = rng.normal(0, 1, n_basesample)
566
634
 
567
635
  gkde_1d = stats.gaussian_kde(xn_1d)
568
636
  test_seed_sub(gkde_1d)
@@ -572,7 +640,7 @@ def test_seed():
572
640
  # Test 2D case
573
641
  mean = np.array([1.0, 3.0])
574
642
  covariance = np.array([[1.0, 2.0], [2.0, 6.0]])
575
- xn_2d = np.random.multivariate_normal(mean, covariance, size=n_basesample).T
643
+ xn_2d = rng.multivariate_normal(mean, covariance, size=n_basesample).T
576
644
 
577
645
  gkde_2d = stats.gaussian_kde(xn_2d)
578
646
  test_seed_sub(gkde_2d)
@@ -0,0 +1,289 @@
1
+ import pytest
2
+ import numpy as np
3
+ from scipy import stats
4
+
5
+ from scipy._lib._array_api import xp_assert_close, xp_assert_equal
6
+ from scipy.stats._stats_py import _xp_mean, _xp_var, _length_nonmasked
7
+ from scipy.stats._axis_nan_policy import _axis_nan_policy_factory
8
+
9
+
10
+ marray = pytest.importorskip('marray')
11
+ skip_backend = pytest.mark.skip_xp_backends
12
+
13
+
14
+ def get_arrays(n_arrays, *, dtype='float64', xp=np, shape=(7, 8), seed=84912165484321):
15
+ mxp = marray._get_namespace(xp)
16
+ rng = np.random.default_rng(seed)
17
+
18
+ datas, masks = [], []
19
+ for i in range(n_arrays):
20
+ data = rng.random(size=shape)
21
+ if dtype.startswith('complex'):
22
+ data = 10*data * 10j*rng.standard_normal(size=shape)
23
+ data = data.astype(dtype)
24
+ datas.append(data)
25
+ mask = rng.random(size=shape) > 0.75
26
+ masks.append(mask)
27
+
28
+ marrays = []
29
+ nan_arrays = []
30
+ for array, mask in zip(datas, masks):
31
+ marrays.append(mxp.asarray(array, mask=mask))
32
+ nan_array = array.copy()
33
+ nan_array[mask] = xp.nan
34
+ nan_arrays.append(nan_array)
35
+
36
+ return mxp, marrays, nan_arrays
37
+
38
+
39
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
40
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
41
+ @skip_backend('torch', reason="marray#99")
42
+ @pytest.mark.parametrize('fun, kwargs', [(stats.gmean, {}),
43
+ (stats.hmean, {}),
44
+ (stats.pmean, {'p': 2})])
45
+ @pytest.mark.parametrize('axis', [0, 1])
46
+ def test_xmean(fun, kwargs, axis, xp):
47
+ mxp, marrays, narrays = get_arrays(2, xp=xp)
48
+ res = fun(marrays[0], weights=marrays[1], axis=axis, **kwargs)
49
+ ref = fun(narrays[0], weights=narrays[1], nan_policy='omit', axis=axis, **kwargs)
50
+ xp_assert_close(res.data, xp.asarray(ref))
51
+
52
+
53
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
54
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
55
+ @skip_backend('torch', reason="marray#99")
56
+ @pytest.mark.parametrize('axis', [0, 1, None])
57
+ @pytest.mark.parametrize('keepdims', [False, True])
58
+ def test_xp_mean(axis, keepdims, xp):
59
+ mxp, marrays, narrays = get_arrays(2, xp=xp)
60
+ kwargs = dict(axis=axis, keepdims=keepdims)
61
+ res = _xp_mean(marrays[0], weights=marrays[1], **kwargs)
62
+ ref = _xp_mean(narrays[0], weights=narrays[1], nan_policy='omit', **kwargs)
63
+ xp_assert_close(res.data, xp.asarray(ref))
64
+
65
+
66
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
67
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
68
+ @skip_backend('torch', reason="array-api-compat#242")
69
+ @pytest.mark.parametrize('fun, kwargs',
70
+ [(stats.moment, {'order': 2}),
71
+ (stats.skew, {}),
72
+ (stats.skew, {'bias': False}),
73
+ (stats.kurtosis, {}),
74
+ (stats.kurtosis, {'bias': False}),
75
+ (stats.sem, {}),
76
+ (stats.kstat, {'n': 1}),
77
+ (stats.kstat, {'n': 2}),
78
+ (stats.kstat, {'n': 3}),
79
+ (stats.kstat, {'n': 4}),
80
+ (stats.kstatvar, {'n': 1}),
81
+ (stats.kstatvar, {'n': 2}),
82
+ (stats.circmean, {}),
83
+ (stats.circvar, {}),
84
+ (stats.circstd, {}),
85
+ (_xp_var, {}),
86
+ (stats.tmean, {'limits': (0.1, 0.9)}),
87
+ (stats.tvar, {'limits': (0.1, 0.9)}),
88
+ (stats.tmin, {'lowerlimit': 0.5}),
89
+ (stats.tmax, {'upperlimit': 0.5}),
90
+ (stats.tstd, {'limits': (0.1, 0.9)}),
91
+ (stats.tsem, {'limits': (0.1, 0.9)}),
92
+ ])
93
+ @pytest.mark.parametrize('axis', [0, 1, None])
94
+ def test_several(fun, kwargs, axis, xp):
95
+ mxp, marrays, narrays = get_arrays(1, xp=xp)
96
+ kwargs = dict(axis=axis) | kwargs
97
+ res = fun(marrays[0], **kwargs)
98
+ ref = fun(narrays[0], nan_policy='omit', **kwargs)
99
+ xp_assert_close(res.data, xp.asarray(ref))
100
+
101
+
102
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
103
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
104
+ @skip_backend('torch', reason="array-api-compat#242")
105
+ @pytest.mark.parametrize('axis', [0, 1])
106
+ @pytest.mark.parametrize('kwargs', [{}])
107
+ def test_describe(axis, kwargs, xp):
108
+ mxp, marrays, narrays = get_arrays(1, xp=xp)
109
+ kwargs = dict(axis=axis) | kwargs
110
+ res = stats.describe(marrays[0], **kwargs)
111
+ ref = stats.describe(narrays[0], nan_policy='omit', **kwargs)
112
+ xp_assert_close(res.nobs.data, xp.asarray(ref.nobs))
113
+ xp_assert_close(res.minmax[0].data, xp.asarray(ref.minmax[0].data))
114
+ xp_assert_close(res.minmax[1].data, xp.asarray(ref.minmax[1].data))
115
+ xp_assert_close(res.variance.data, xp.asarray(ref.variance.data))
116
+ xp_assert_close(res.skewness.data, xp.asarray(ref.skewness.data))
117
+ xp_assert_close(res.kurtosis.data, xp.asarray(ref.kurtosis.data))
118
+
119
+
120
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
121
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
122
+ @skip_backend('torch', reason="array-api-compat#242")
123
+ @pytest.mark.parametrize('fun', [stats.zscore, stats.gzscore, stats.zmap])
124
+ @pytest.mark.parametrize('axis', [0, 1, None])
125
+ def test_zscore(fun, axis, xp):
126
+ mxp, marrays, narrays = (get_arrays(2, xp=xp) if fun == stats.zmap
127
+ else get_arrays(1, xp=xp))
128
+ res = fun(*marrays, axis=axis)
129
+ ref = xp.asarray(fun(*narrays, nan_policy='omit', axis=axis))
130
+ xp_assert_close(res.data[~res.mask], ref[~xp.isnan(ref)])
131
+ xp_assert_equal(res.mask, marrays[0].mask)
132
+
133
+
134
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
135
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
136
+ @skip_backend('torch', reason="array-api-compat#242")
137
+ @skip_backend('cupy', reason="special functions won't work")
138
+ @pytest.mark.parametrize('f_name', ['ttest_1samp', 'ttest_rel', 'ttest_ind'])
139
+ @pytest.mark.parametrize('axis', [0, 1, None])
140
+ def test_ttest(f_name, axis, xp):
141
+ f = getattr(stats, f_name)
142
+ mxp, marrays, narrays = get_arrays(2, xp=xp)
143
+ if f_name == 'ttest_1samp':
144
+ marrays[1] = mxp.mean(marrays[1], axis=axis, keepdims=axis is not None)
145
+ narrays[1] = np.nanmean(narrays[1], axis=axis, keepdims=axis is not None)
146
+ res = f(*marrays, axis=axis)
147
+ ref = f(*narrays, nan_policy='omit', axis=axis)
148
+ xp_assert_close(res.statistic.data, xp.asarray(ref.statistic))
149
+ xp_assert_close(res.pvalue.data, xp.asarray(ref.pvalue))
150
+ res_ci = res.confidence_interval()
151
+ ref_ci = ref.confidence_interval()
152
+ xp_assert_close(res_ci.low.data, xp.asarray(ref_ci.low))
153
+ xp_assert_close(res_ci.high.data, xp.asarray(ref_ci.high))
154
+
155
+
156
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
157
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
158
+ @skip_backend('torch', reason="array-api-compat#242")
159
+ @skip_backend('cupy', reason="special functions won't work")
160
+ @pytest.mark.filterwarnings("ignore::scipy.stats._axis_nan_policy.SmallSampleWarning")
161
+ @pytest.mark.parametrize('f_name', ['skewtest', 'kurtosistest',
162
+ 'normaltest', 'jarque_bera'])
163
+ @pytest.mark.parametrize('axis', [0, 1, None])
164
+ def test_normality_tests(f_name, axis, xp):
165
+ f = getattr(stats, f_name)
166
+ mxp, marrays, narrays = get_arrays(1, xp=xp, shape=(10, 11))
167
+
168
+ res = f(*marrays, axis=axis)
169
+ ref = f(*narrays, nan_policy='omit', axis=axis)
170
+
171
+ xp_assert_close(res.statistic.data, xp.asarray(ref.statistic))
172
+ xp_assert_close(res.pvalue.data, xp.asarray(ref.pvalue))
173
+
174
+
175
+ def pd_nsamples(kwargs):
176
+ return 2 if kwargs.get('f_exp', None) is not None else 1
177
+
178
+
179
+ @_axis_nan_policy_factory(lambda *args: tuple(args), paired=True, n_samples=pd_nsamples)
180
+ def power_divergence_ref(f_obs, f_exp=None, *, ddof, lambda_, axis=0):
181
+ return stats.power_divergence(f_obs, f_exp, axis=axis, ddof=ddof, lambda_=lambda_)
182
+
183
+
184
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
185
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
186
+ @skip_backend('torch', reason="array-api-compat#242")
187
+ @skip_backend('cupy', reason="special functions won't work")
188
+ @pytest.mark.parametrize('lambda_', ['pearson', 'log-likelihood', 'freeman-tukey',
189
+ 'mod-log-likelihood', 'neyman', 'cressie-read',
190
+ 'chisquare'])
191
+ @pytest.mark.parametrize('ddof', [0, 1])
192
+ @pytest.mark.parametrize('axis', [0, 1, None])
193
+ def test_power_divergence_chisquare(lambda_, ddof, axis, xp):
194
+ mxp, marrays, narrays = get_arrays(2, xp=xp, shape=(5, 6))
195
+
196
+ kwargs = dict(axis=axis, ddof=ddof)
197
+ if lambda_ == 'chisquare':
198
+ lambda_ = "pearson"
199
+ def f(*args, **kwargs):
200
+ return stats.chisquare(*args, **kwargs)
201
+ else:
202
+ def f(*args, **kwargs):
203
+ return stats.power_divergence(*args, lambda_=lambda_, **kwargs)
204
+
205
+ # test 1-arg
206
+ res = f(marrays[0], **kwargs)
207
+ ref = power_divergence_ref(narrays[0], nan_policy='omit', lambda_=lambda_, **kwargs)
208
+
209
+ xp_assert_close(res.statistic.data, xp.asarray(ref[0]))
210
+ xp_assert_close(res.pvalue.data, xp.asarray(ref[1]))
211
+
212
+ # test 2-arg
213
+ common_mask = np.isnan(narrays[0]) | np.isnan(narrays[1])
214
+ normalize = (np.nansum(narrays[1] * ~common_mask, axis=axis, keepdims=True)
215
+ / np.nansum(narrays[0] * ~common_mask, axis=axis, keepdims=True))
216
+ marrays[0] *= xp.asarray(normalize)
217
+ narrays[0] *= normalize
218
+
219
+ res = f(*marrays, **kwargs)
220
+ ref = power_divergence_ref(*narrays, nan_policy='omit', lambda_=lambda_, **kwargs)
221
+
222
+ xp_assert_close(res.statistic.data, xp.asarray(ref[0]))
223
+ xp_assert_close(res.pvalue.data, xp.asarray(ref[1]))
224
+
225
+
226
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
227
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
228
+ @skip_backend('torch', reason="array-api-compat#242")
229
+ @skip_backend('cupy', reason="special functions won't work")
230
+ @pytest.mark.parametrize('method', ['fisher', 'pearson', 'mudholkar_george',
231
+ 'tippett', 'stouffer'])
232
+ @pytest.mark.parametrize('axis', [0, 1, None])
233
+ def test_combine_pvalues(method, axis, xp):
234
+ mxp, marrays, narrays = get_arrays(2, xp=xp, shape=(10, 11))
235
+
236
+ kwargs = dict(method=method, axis=axis)
237
+ res = stats.combine_pvalues(marrays[0], **kwargs)
238
+ ref = stats.combine_pvalues(narrays[0], nan_policy='omit', **kwargs)
239
+
240
+ xp_assert_close(res.statistic.data, xp.asarray(ref.statistic))
241
+ xp_assert_close(res.pvalue.data, xp.asarray(ref.pvalue))
242
+
243
+ if method != 'stouffer':
244
+ return
245
+
246
+ res = stats.combine_pvalues(marrays[0], weights=marrays[1], **kwargs)
247
+ ref = stats.combine_pvalues(narrays[0], weights=narrays[1],
248
+ nan_policy='omit', **kwargs)
249
+
250
+ xp_assert_close(res.statistic.data, xp.asarray(ref.statistic))
251
+ xp_assert_close(res.pvalue.data, xp.asarray(ref.pvalue))
252
+
253
+
254
+ @skip_backend('dask.array', reason='Arrays need `device` attribute: dask/dask#11711')
255
+ @skip_backend('jax.numpy', reason="JAX doesn't allow item assignment.")
256
+ @skip_backend('torch', reason="array-api-compat#242")
257
+ @skip_backend('cupy', reason="special functions won't work")
258
+ def test_ttest_ind_from_stats(xp):
259
+ shape = (10, 11)
260
+ mxp, marrays, narrays = get_arrays(6, xp=xp, shape=shape)
261
+ mask = np.astype(np.sum(np.stack([np.isnan(arg) for arg in narrays]), axis=0), bool)
262
+ narrays = [arg[~mask] for arg in narrays]
263
+ marrays[2], marrays[5] = marrays[2] * 100, marrays[5] * 100
264
+ narrays[2], narrays[5] = narrays[2] * 100, narrays[5] * 100
265
+
266
+ res = stats.ttest_ind_from_stats(*marrays)
267
+ ref = stats.ttest_ind_from_stats(*narrays)
268
+
269
+ mask = xp.asarray(mask)
270
+ assert xp.any(mask) and xp.any(~mask)
271
+ xp_assert_close(res.statistic.data[~mask], xp.asarray(ref.statistic))
272
+ xp_assert_close(res.pvalue.data[~mask], xp.asarray(ref.pvalue))
273
+ xp_assert_close(res.statistic.mask, mask)
274
+ xp_assert_close(res.pvalue.mask, mask)
275
+ assert res.statistic.shape == shape
276
+ assert res.pvalue.shape == shape
277
+
278
+ def test_length_nonmasked_marray_iterable_axis_raises():
279
+ xp = marray._get_namespace(np)
280
+
281
+ data = [[1.0, 2.0], [3.0, 4.0]]
282
+ mask = [[False, False], [True, False]]
283
+ marr = xp.asarray(data, mask=mask)
284
+
285
+ # Axis tuples are not currently supported for MArray input.
286
+ # This test can be removed after support is added.
287
+ with pytest.raises(NotImplementedError,
288
+ match="`axis` must be an integer or None for use with `MArray`"):
289
+ _length_nonmasked(marr, axis=(0, 1), xp=xp)