scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_12_0_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 (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-312-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-312-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-312-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -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)