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