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