scipy 1.15.3__cp313-cp313-macosx_12_0_arm64.whl → 1.16.0rc2__cp313-cp313-macosx_12_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-313-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-313-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-313-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-313-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-313-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-313-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-313-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-313-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-313-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-313-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-313-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-313-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-313-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-313-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-313-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-313-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-313-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-313-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-313-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-313-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-313-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-313-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-313-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-313-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-313-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-313-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-313-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-313-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-313-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-313-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-313-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-313-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-313-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-313-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-313-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-313-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-313-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-313-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-313-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-313-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-313-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-313-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-313-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-313-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-313-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-313-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-313-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-313-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-313-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-313-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-313-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-313-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-313-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-313-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-313-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-313-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-313-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-313-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-313-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-313-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-313-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-313-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-313-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-313-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-313-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-313-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-313-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-313-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-313-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-313-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-313-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-313-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-313-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-313-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-313-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-313-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-313-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-313-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-313-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
scipy/stats/_entropy.py CHANGED
@@ -8,7 +8,8 @@ import math
8
8
  import numpy as np
9
9
  from scipy import special
10
10
  from ._axis_nan_policy import _axis_nan_policy_factory, _broadcast_arrays
11
- from scipy._lib._array_api import array_namespace, xp_moveaxis_to_end
11
+ from scipy._lib._array_api import array_namespace, xp_promote
12
+ from scipy._lib import array_api_extra as xpx
12
13
 
13
14
  __all__ = ['entropy', 'differential_entropy']
14
15
 
@@ -19,7 +20,7 @@ __all__ = ['entropy', 'differential_entropy']
19
20
  2 if ("qk" in kwgs and kwgs["qk"] is not None)
20
21
  else 1
21
22
  ),
22
- n_outputs=1, result_to_tuple=lambda x: (x,), paired=True,
23
+ n_outputs=1, result_to_tuple=lambda x, _: (x,), paired=True,
23
24
  too_small=-1 # entropy doesn't have too small inputs
24
25
  )
25
26
  def entropy(pk: np.typing.ArrayLike,
@@ -169,7 +170,7 @@ def _differential_entropy_is_too_small(samples, kwargs, axis=-1):
169
170
 
170
171
 
171
172
  @_axis_nan_policy_factory(
172
- lambda x: x, n_outputs=1, result_to_tuple=lambda x: (x,),
173
+ lambda x: x, n_outputs=1, result_to_tuple=lambda x, _: (x,),
173
174
  too_small=_differential_entropy_is_too_small
174
175
  )
175
176
  def differential_entropy(
@@ -317,10 +318,8 @@ def differential_entropy(
317
318
 
318
319
  """
319
320
  xp = array_namespace(values)
320
- values = xp.asarray(values)
321
- if xp.isdtype(values.dtype, "integral"): # type: ignore[union-attr]
322
- values = xp.astype(values, xp.asarray(1.).dtype)
323
- values = xp_moveaxis_to_end(values, axis, xp=xp)
321
+ values = xp_promote(values, force_floating=True, xp=xp)
322
+ values = xp.moveaxis(values, axis, -1)
324
323
  n = values.shape[-1] # type: ignore[union-attr]
325
324
 
326
325
  if window_length is None:
@@ -403,9 +402,9 @@ def _ebrahimi_entropy(X, m, *, xp):
403
402
  differences = X[..., 2 * m:] - X[..., : -2 * m:]
404
403
 
405
404
  i = xp.arange(1, n+1, dtype=X.dtype)
406
- ci = xp.ones_like(i)*2
407
- ci[i <= m] = 1 + (i[i <= m] - 1)/m
408
- ci[i >= n - m + 1] = 1 + (n - i[i >= n-m+1])/m
405
+ ci = xp.where(i <= m, 1 + (i - 1)/m, 2.)
406
+ cond = i >= n - m + 1
407
+ ci = xpx.at(ci, cond).set(1 + (n - i[cond])/m)
409
408
 
410
409
  logs = xp.log(n * differences / (ci * m))
411
410
  return xp.mean(logs, axis=-1)
@@ -1,4 +1,5 @@
1
1
  from numpy import arange, newaxis, hstack, prod, array
2
+ from scipy import linalg
2
3
 
3
4
 
4
5
  def _central_diff_weights(Np, ndiv=1):
@@ -54,7 +55,6 @@ def _central_diff_weights(Np, ndiv=1):
54
55
  )
55
56
  if Np % 2 == 0:
56
57
  raise ValueError("The number of points must be odd.")
57
- from scipy import linalg
58
58
 
59
59
  ho = Np >> 1
60
60
  x = arange(-ho, ho + 1.0)
scipy/stats/_hypotests.py CHANGED
@@ -482,7 +482,7 @@ def _cdf_cvm(x, n=None):
482
482
  return y
483
483
 
484
484
 
485
- def _cvm_result_to_tuple(res):
485
+ def _cvm_result_to_tuple(res, _):
486
486
  return res.statistic, res.pvalue
487
487
 
488
488
 
@@ -1725,13 +1725,17 @@ class TukeyHSDResult:
1725
1725
  Method."
1726
1726
  https://www.itl.nist.gov/div898/handbook/prc/section4/prc471.htm,
1727
1727
  28 November 2020.
1728
+ .. [2] P. A. Games and J. F. Howell, "Pairwise Multiple Comparison Procedures
1729
+ with Unequal N's and/or Variances: A Monte Carlo Study," Journal of
1730
+ Educational Statistics, vol. 1, no. 2, pp. 113-125, Jun. 1976,
1731
+ doi: https://doi.org/10.3102/10769986001002113.
1728
1732
  """
1729
1733
 
1730
- def __init__(self, statistic, pvalue, _nobs, _ntreatments, _stand_err):
1734
+ def __init__(self, statistic, pvalue, _ntreatments, _df, _stand_err):
1731
1735
  self.statistic = statistic
1732
1736
  self.pvalue = pvalue
1733
1737
  self._ntreatments = _ntreatments
1734
- self._nobs = _nobs
1738
+ self._df = _df
1735
1739
  self._stand_err = _stand_err
1736
1740
  self._ci = None
1737
1741
  self._ci_cl = None
@@ -1742,7 +1746,7 @@ class TukeyHSDResult:
1742
1746
  # it will be called with the default CL of .95.
1743
1747
  if self._ci is None:
1744
1748
  self.confidence_interval(confidence_level=.95)
1745
- s = ("Tukey's HSD Pairwise Group Comparisons"
1749
+ s = ("Pairwise Group Comparisons"
1746
1750
  f" ({self._ci_cl*100:.1f}% Confidence Interval)\n")
1747
1751
  s += "Comparison Statistic p-value Lower CI Upper CI\n"
1748
1752
  for i in range(self.pvalue.shape[0]):
@@ -1777,6 +1781,10 @@ class TukeyHSDResult:
1777
1781
  Tukey's Method."
1778
1782
  https://www.itl.nist.gov/div898/handbook/prc/section4/prc471.htm,
1779
1783
  28 November 2020.
1784
+ .. [2] P. A. Games and J. F. Howell, "Pairwise Multiple Comparison Procedures
1785
+ with Unequal N's and/or Variances: A Monte Carlo Study," Journal of
1786
+ Educational Statistics, vol. 1, no. 2, pp. 113-125, Jun. 1976,
1787
+ doi: https://doi.org/10.3102/10769986001002113.
1780
1788
 
1781
1789
  Examples
1782
1790
  --------
@@ -1805,28 +1813,29 @@ class TukeyHSDResult:
1805
1813
  raise ValueError("Confidence level must be between 0 and 1.")
1806
1814
  # determine the critical value of the studentized range using the
1807
1815
  # appropriate confidence level, number of treatments, and degrees
1808
- # of freedom as determined by the number of data less the number of
1809
- # treatments. ("Confidence limits for Tukey's method")[1]. Note that
1810
- # in the cases of unequal sample sizes there will be a criterion for
1811
- # each group comparison.
1812
- params = (confidence_level, self._nobs, self._ntreatments - self._nobs)
1816
+ # of freedom. See [1] "Confidence limits for Tukey's method" / [2] p.117
1817
+ # "H0 was rejected if...". Note that in the cases of unequal sample sizes,
1818
+ # there will be a criterion for each group comparison.
1819
+ params = (confidence_level, self._ntreatments, self._df)
1813
1820
  srd = distributions.studentized_range.ppf(*params)
1814
- # also called maximum critical value, the Tukey criterion is the
1821
+ # also called maximum critical value, the confidence_radius is the
1815
1822
  # studentized range critical value * the square root of mean square
1816
1823
  # error over the sample size.
1817
- tukey_criterion = srd * self._stand_err
1824
+ confidence_radius = srd * self._stand_err
1818
1825
  # the confidence levels are determined by the
1819
- # `mean_differences` +- `tukey_criterion`
1820
- upper_conf = self.statistic + tukey_criterion
1821
- lower_conf = self.statistic - tukey_criterion
1826
+ # `mean_differences` +- `confidence_radius`
1827
+ upper_conf = self.statistic + confidence_radius
1828
+ lower_conf = self.statistic - confidence_radius
1822
1829
  self._ci = ConfidenceInterval(low=lower_conf, high=upper_conf)
1823
1830
  self._ci_cl = confidence_level
1824
1831
  return self._ci
1825
1832
 
1826
1833
 
1827
- def _tukey_hsd_iv(args):
1834
+ def _tukey_hsd_iv(args, equal_var):
1828
1835
  if (len(args)) < 2:
1829
1836
  raise ValueError("There must be more than 1 treatment.")
1837
+ if not isinstance(equal_var, bool):
1838
+ raise TypeError("Expected a boolean value for 'equal_var'")
1830
1839
  args = [np.asarray(arg) for arg in args]
1831
1840
  for arg in args:
1832
1841
  if arg.ndim != 1:
@@ -1838,7 +1847,7 @@ def _tukey_hsd_iv(args):
1838
1847
  return args
1839
1848
 
1840
1849
 
1841
- def tukey_hsd(*args):
1850
+ def tukey_hsd(*args, equal_var=True):
1842
1851
  """Perform Tukey's HSD test for equality of means over multiple treatments.
1843
1852
 
1844
1853
  Tukey's honestly significant difference (HSD) test performs pairwise
@@ -1861,6 +1870,10 @@ def tukey_hsd(*args):
1861
1870
  sample1, sample2, ... : array_like
1862
1871
  The sample measurements for each group. There must be at least
1863
1872
  two arguments.
1873
+ equal_var: bool, optional
1874
+ If True (default) and equal sample size, perform Tukey-HSD test [6].
1875
+ If True and unequal sample size, perform Tukey-Kramer test [4]_.
1876
+ If False, perform Games-Howell test [7]_, which does not assume equal variances.
1864
1877
 
1865
1878
  Returns
1866
1879
  -------
@@ -1894,9 +1907,10 @@ def tukey_hsd(*args):
1894
1907
  3. The distributions from which the samples are drawn have the same finite
1895
1908
  variance.
1896
1909
 
1897
- The original formulation of the test was for samples of equal size [6]_.
1898
- In case of unequal sample sizes, the test uses the Tukey-Kramer method
1899
- [4]_.
1910
+ The original formulation of the test was for samples of equal size drawn from
1911
+ populations assumed to have equal variances [6]_. In case of unequal sample sizes,
1912
+ the test uses the Tukey-Kramer method [4]_. When equal variances are not assumed
1913
+ (``equal_var=False``), the test uses the Games-Howell method [7]_.
1900
1914
 
1901
1915
  References
1902
1916
  ----------
@@ -1920,6 +1934,10 @@ def tukey_hsd(*args):
1920
1934
  .. [6] Tukey, John W. "Comparing Individual Means in the Analysis of
1921
1935
  Variance." Biometrics, vol. 5, no. 2, 1949, pp. 99-114. JSTOR,
1922
1936
  www.jstor.org/stable/3001913. Accessed 14 June 2021.
1937
+ .. [7] P. A. Games and J. F. Howell, "Pairwise Multiple Comparison Procedures
1938
+ with Unequal N's and/or Variances: A Monte Carlo Study," Journal of
1939
+ Educational Statistics, vol. 1, no. 2, pp. 113-125, Jun. 1976,
1940
+ doi: https://doi.org/10.3102/10769986001002113.
1923
1941
 
1924
1942
 
1925
1943
  Examples
@@ -1950,14 +1968,14 @@ def tukey_hsd(*args):
1950
1968
 
1951
1969
  >>> res = tukey_hsd(group0, group1, group2)
1952
1970
  >>> print(res)
1953
- Tukey's HSD Pairwise Group Comparisons (95.0% Confidence Interval)
1954
- Comparison Statistic p-value Lower CI Upper CI
1955
- (0 - 1) -4.600 0.014 -8.249 -0.951
1956
- (0 - 2) -0.260 0.980 -3.909 3.389
1957
- (1 - 0) 4.600 0.014 0.951 8.249
1958
- (1 - 2) 4.340 0.020 0.691 7.989
1959
- (2 - 0) 0.260 0.980 -3.389 3.909
1960
- (2 - 1) -4.340 0.020 -7.989 -0.691
1971
+ Pairwise Group Comparisons (95.0% Confidence Interval)
1972
+ Comparison Statistic p-value Lower CI Upper CI
1973
+ (0 - 1) -4.600 0.014 -8.249 -0.951
1974
+ (0 - 2) -0.260 0.980 -3.909 3.389
1975
+ (1 - 0) 4.600 0.014 0.951 8.249
1976
+ (1 - 2) 4.340 0.020 0.691 7.989
1977
+ (2 - 0) 0.260 0.980 -3.389 3.909
1978
+ (2 - 1) -4.340 0.020 -7.989 -0.691
1961
1979
 
1962
1980
  The null hypothesis is that each group has the same mean. The p-value for
1963
1981
  comparisons between ``group0`` and ``group1`` as well as ``group1`` and
@@ -1986,32 +2004,47 @@ def tukey_hsd(*args):
1986
2004
  (2 - 0) -4.620 5.140
1987
2005
  (2 - 1) -9.220 0.540
1988
2006
  """
1989
- args = _tukey_hsd_iv(args)
2007
+ args = _tukey_hsd_iv(args, equal_var)
1990
2008
  ntreatments = len(args)
1991
2009
  means = np.asarray([np.mean(arg) for arg in args])
1992
2010
  nsamples_treatments = np.asarray([a.size for a in args])
1993
2011
  nobs = np.sum(nsamples_treatments)
1994
-
1995
- # determine mean square error [5]. Note that this is sometimes called
1996
- # mean square error within.
1997
- mse = (np.sum([np.var(arg, ddof=1) for arg in args] *
1998
- (nsamples_treatments - 1)) / (nobs - ntreatments))
1999
-
2000
- # The calculation of the standard error differs when treatments differ in
2001
- # size. See ("Unequal sample sizes")[1].
2002
- if np.unique(nsamples_treatments).size == 1:
2003
- # all input groups are the same length, so only one value needs to be
2004
- # calculated [1].
2005
- normalize = 2 / nsamples_treatments[0]
2012
+ vars_ = np.asarray([np.var(arg, ddof=1) for arg in args])
2013
+
2014
+ if equal_var:
2015
+ # determine mean square error [5]. Note that this is sometimes called
2016
+ # mean square error within.
2017
+ mse = (np.sum(vars_ * (nsamples_treatments - 1)) / (nobs - ntreatments))
2018
+
2019
+ # The calculation of the standard error differs when treatments differ in
2020
+ # size. See ("Unequal sample sizes")[1].
2021
+ if np.unique(nsamples_treatments).size == 1:
2022
+ # all input groups are the same length, so only one value needs to be
2023
+ # calculated [1].
2024
+ normalize = 2 / nsamples_treatments[0]
2025
+ else:
2026
+ # to compare groups of differing sizes, we must compute a variance
2027
+ # value for each individual comparison. Use broadcasting to get the
2028
+ # resulting matrix. [3], verified against [4] (page 308).
2029
+ normalize = 1 / nsamples_treatments + 1 / nsamples_treatments[None].T
2030
+
2031
+ # the standard error is used in the computation of the tukey criterion and
2032
+ # finding the p-values.
2033
+ stand_err = np.sqrt(normalize * mse / 2)
2034
+ df = nobs - ntreatments
2006
2035
  else:
2007
- # to compare groups of differing sizes, we must compute a variance
2008
- # value for each individual comparison. Use broadcasting to get the
2009
- # resulting matrix. [3], verified against [4] (page 308).
2010
- normalize = 1 / nsamples_treatments + 1 / nsamples_treatments[None].T
2011
-
2012
- # the standard error is used in the computation of the tukey criterion and
2013
- # finding the p-values.
2014
- stand_err = np.sqrt(normalize * mse / 2)
2036
+ # `stand_err` is the denominator of the Behrens-Fisher statistic ($v$)
2037
+ # with a factor of $\sqrt{2}$. Compare [7] p.116 "t-solution rejects H0 if...",
2038
+ # [7] p. 117 "H0 was rejected", and definition of `t_stat` below.
2039
+ sj2_nj = vars_ / nsamples_treatments
2040
+ si2_ni = sj2_nj[:, np.newaxis]
2041
+ stand_err = np.sqrt(si2_ni + sj2_nj) / 2**0.5
2042
+
2043
+ # `df` is the Welch degree of freedom $\nu$.
2044
+ # See [7] p. 116 "and the degrees of freedom, $\nu$, are given by...".
2045
+ njm1 = nsamples_treatments - 1
2046
+ nim1 = njm1[:, np.newaxis]
2047
+ df = (si2_ni + sj2_nj)**2 / (si2_ni**2 / nim1 + sj2_nj**2 / njm1)
2015
2048
 
2016
2049
  # the mean difference is the test statistic.
2017
2050
  mean_differences = means[None].T - means
@@ -2020,8 +2053,8 @@ def tukey_hsd(*args):
2020
2053
  # studentized range to get the p-value.
2021
2054
  t_stat = np.abs(mean_differences) / stand_err
2022
2055
 
2023
- params = t_stat, ntreatments, nobs - ntreatments
2056
+ params = t_stat, ntreatments, df
2024
2057
  pvalues = distributions.studentized_range.sf(*params)
2025
2058
 
2026
2059
  return TukeyHSDResult(mean_differences, pvalues, ntreatments,
2027
- nobs, stand_err)
2060
+ df, stand_err)
scipy/stats/_kde.py CHANGED
@@ -17,13 +17,9 @@
17
17
  #
18
18
  #-------------------------------------------------------------------------------
19
19
 
20
- # Standard library imports.
21
- import threading
22
- import warnings
23
-
24
20
  # SciPy imports.
25
21
  from scipy import linalg, special
26
- from scipy._lib._util import check_random_state
22
+ from scipy._lib._util import check_random_state, np_vecdot
27
23
 
28
24
  from numpy import (asarray, atleast_2d, reshape, zeros, newaxis, exp, pi,
29
25
  sqrt, ravel, power, atleast_1d, squeeze, sum, transpose,
@@ -31,14 +27,11 @@ from numpy import (asarray, atleast_2d, reshape, zeros, newaxis, exp, pi,
31
27
  import numpy as np
32
28
 
33
29
  # Local imports.
34
- from . import _mvn
35
30
  from ._stats import gaussian_kernel_estimate, gaussian_kernel_estimate_log
36
-
31
+ from ._multivariate import multivariate_normal
37
32
 
38
33
  __all__ = ['gaussian_kde']
39
34
 
40
- MVN_LOCK = threading.Lock()
41
-
42
35
 
43
36
  class gaussian_kde:
44
37
  """Representation of a kernel-density estimate using Gaussian kernels.
@@ -56,9 +49,9 @@ class gaussian_kde:
56
49
  Datapoints to estimate from. In case of univariate data this is a 1-D
57
50
  array, otherwise a 2-D array with shape (# of dims, # of data).
58
51
  bw_method : str, scalar or callable, optional
59
- The method used to calculate the estimator bandwidth. This can be
52
+ The method used to calculate the bandwidth factor. This can be
60
53
  'scott', 'silverman', a scalar constant or a callable. If a scalar,
61
- this will be used directly as `kde.factor`. If a callable, it should
54
+ this will be used directly as `factor`. If a callable, it should
62
55
  take a `gaussian_kde` instance as only parameter and return a scalar.
63
56
  If None (default), 'scott' is used. See Notes for more details.
64
57
  weights : array_like, optional
@@ -78,12 +71,11 @@ class gaussian_kde:
78
71
 
79
72
  .. versionadded:: 1.2.0
80
73
  factor : float
81
- The bandwidth factor, obtained from `kde.covariance_factor`. The square
82
- of `kde.factor` multiplies the covariance matrix of the data in the kde
83
- estimation.
74
+ The bandwidth factor obtained from `covariance_factor`.
84
75
  covariance : ndarray
85
- The covariance matrix of `dataset`, scaled by the calculated bandwidth
86
- (`kde.factor`).
76
+ The kernel covariance matrix; this is the data covariance matrix
77
+ multiplied by the square of the bandwidth factor, e.g.
78
+ ``np.cov(dataset) * factor**2``.
87
79
  inv_cov : ndarray
88
80
  The inverse of `covariance`.
89
81
 
@@ -119,7 +111,8 @@ class gaussian_kde:
119
111
  neff**(-1./(d+4)),
120
112
 
121
113
  with ``neff`` the effective number of datapoints.
122
- Silverman's Rule [2]_, implemented as `silverman_factor`, is::
114
+ Silverman's suggestion for *multivariate* data [2]_, implemented as
115
+ `silverman_factor`, is::
123
116
 
124
117
  (n * (d + 2) / 4.)**(-1. / (d + 4)).
125
118
 
@@ -127,6 +120,10 @@ class gaussian_kde:
127
120
 
128
121
  (neff * (d + 2) / 4.)**(-1. / (d + 4)).
129
122
 
123
+ Note that this is not the same as "Silverman's rule of thumb" [6]_, which
124
+ may be more robust in the univariate case; see documentation of the
125
+ ``set_bandwidth`` method for implementing a custom bandwidth rule.
126
+
130
127
  Good general descriptions of kernel density estimation can be found in [1]_
131
128
  and [2]_, the mathematics for this multi-dimensional implementation can be
132
129
  found in [1]_.
@@ -157,6 +154,8 @@ class gaussian_kde:
157
154
  Analysis, Vol. 36, pp. 279-298, 2001.
158
155
  .. [5] Gray P. G., 1969, Journal of the Royal Statistical Society.
159
156
  Series A (General), 132, 272
157
+ .. [6] Kernel density estimation. *Wikipedia.*
158
+ https://en.wikipedia.org/wiki/Kernel_density_estimation
160
159
 
161
160
  Examples
162
161
  --------
@@ -195,6 +194,16 @@ class gaussian_kde:
195
194
  >>> ax.set_ylim([ymin, ymax])
196
195
  >>> plt.show()
197
196
 
197
+ Compare against manual KDE at a point:
198
+
199
+ >>> point = [1, 2]
200
+ >>> mean = values.T
201
+ >>> cov = kernel.factor**2 * np.cov(values)
202
+ >>> X = stats.multivariate_normal(cov=cov)
203
+ >>> res = kernel.pdf(point)
204
+ >>> ref = X.pdf(point - mean).sum() / len(mean)
205
+ >>> np.allclose(res, ref)
206
+ True
198
207
  """
199
208
  def __init__(self, dataset, bw_method=None, weights=None):
200
209
  self.dataset = atleast_2d(asarray(dataset))
@@ -210,7 +219,7 @@ class gaussian_kde:
210
219
  raise ValueError("`weights` input should be one-dimensional.")
211
220
  if len(self._weights) != self.n:
212
221
  raise ValueError("`weights` input should be of length n")
213
- self._neff = 1/sum(self._weights**2)
222
+ self._neff = 1/np_vecdot(self._weights, self._weights)
214
223
 
215
224
  # This can be converted to a warning once gh-10205 is resolved
216
225
  if self.d > self.n:
@@ -324,8 +333,8 @@ class gaussian_kde:
324
333
  sqrt_det = np.prod(np.diagonal(sum_cov_chol[0]))
325
334
  norm_const = power(2 * pi, sum_cov.shape[0] / 2.0) * sqrt_det
326
335
 
327
- energies = sum(diff * tdiff, axis=0) / 2.0
328
- result = sum(exp(-energies)*self.weights, axis=0) / norm_const
336
+ energies = np_vecdot(diff, tdiff, axis=0) / 2.0
337
+ result = np_vecdot(exp(-energies), self.weights, axis=0) / norm_const
329
338
 
330
339
  return result
331
340
 
@@ -359,12 +368,11 @@ class gaussian_kde:
359
368
  normalized_low = ravel((low - self.dataset) / stdev)
360
369
  normalized_high = ravel((high - self.dataset) / stdev)
361
370
 
362
- value = np.sum(self.weights*(
363
- special.ndtr(normalized_high) -
364
- special.ndtr(normalized_low)))
371
+ delta = special.ndtr(normalized_high) - special.ndtr(normalized_low)
372
+ value = np_vecdot(self.weights, delta)
365
373
  return value
366
374
 
367
- def integrate_box(self, low_bounds, high_bounds, maxpts=None):
375
+ def integrate_box(self, low_bounds, high_bounds, maxpts=None, *, rng=None):
368
376
  """Computes the integral of a pdf over a rectangular interval.
369
377
 
370
378
  Parameters
@@ -375,6 +383,11 @@ class gaussian_kde:
375
383
  A 1-D array containing the upper bounds of integration.
376
384
  maxpts : int, optional
377
385
  The maximum number of points to use for integration.
386
+ rng : `numpy.random.Generator`, optional
387
+ Pseudorandom number generator state. When `rng` is None, a new
388
+ generator is created using entropy from the operating system. Types
389
+ other than `numpy.random.Generator` are passed to
390
+ `numpy.random.default_rng` to instantiate a ``Generator``.
378
391
 
379
392
  Returns
380
393
  -------
@@ -382,20 +395,12 @@ class gaussian_kde:
382
395
  The result of the integral.
383
396
 
384
397
  """
385
- if maxpts is not None:
386
- extra_kwds = {'maxpts': maxpts}
387
- else:
388
- extra_kwds = {}
389
-
390
- with MVN_LOCK:
391
- value, inform = _mvn.mvnun_weighted(low_bounds, high_bounds,
392
- self.dataset, self.weights,
393
- self.covariance, **extra_kwds)
394
- if inform:
395
- msg = f'An integral in _mvn.mvnun requires more points than {self.d * 1000}'
396
- warnings.warn(msg, stacklevel=2)
397
-
398
- return value
398
+ low, high = low_bounds - self.dataset.T, high_bounds - self.dataset.T
399
+ values = multivariate_normal.cdf(
400
+ high, lower_limit=low, cov=self.covariance, maxpts=maxpts,
401
+ rng=rng
402
+ )
403
+ return np_vecdot(values, self.weights, axis=-1)
399
404
 
400
405
  def integrate_kde(self, other):
401
406
  """
@@ -437,8 +442,8 @@ class gaussian_kde:
437
442
  diff = large.dataset - mean
438
443
  tdiff = linalg.cho_solve(sum_cov_chol, diff)
439
444
 
440
- energies = sum(diff * tdiff, axis=0) / 2.0
441
- result += sum(exp(-energies)*large.weights, axis=0)*small.weights[i]
445
+ energies = np_vecdot(diff, tdiff, axis=0) / 2.0
446
+ result += np_vecdot(exp(-energies), large.weights, axis=0)*small.weights[i]
442
447
 
443
448
  sqrt_det = np.prod(np.diagonal(sum_cov_chol[0]))
444
449
  norm_const = power(2 * pi, sum_cov.shape[0] / 2.0) * sqrt_det
@@ -504,14 +509,13 @@ class gaussian_kde:
504
509
 
505
510
  # Default method to calculate bandwidth, can be overwritten by subclass
506
511
  covariance_factor = scotts_factor
507
- covariance_factor.__doc__ = """Computes the coefficient (`kde.factor`) that
508
- multiplies the data covariance matrix to obtain the kernel covariance
509
- matrix. The default is `scotts_factor`. A subclass can overwrite this
512
+ covariance_factor.__doc__ = """Computes the bandwidth factor `factor`.
513
+ The default is `scotts_factor`. A subclass can overwrite this
510
514
  method to provide a different method, or set it through a call to
511
- `kde.set_bandwidth`."""
515
+ `set_bandwidth`."""
512
516
 
513
517
  def set_bandwidth(self, bw_method=None):
514
- """Compute the estimator bandwidth with given method.
518
+ """Compute the bandwidth factor with given method.
515
519
 
516
520
  The new bandwidth calculated after a call to `set_bandwidth` is used
517
521
  for subsequent evaluations of the estimated density.
@@ -519,12 +523,12 @@ class gaussian_kde:
519
523
  Parameters
520
524
  ----------
521
525
  bw_method : str, scalar or callable, optional
522
- The method used to calculate the estimator bandwidth. This can be
526
+ The method used to calculate the bandwidth factor. This can be
523
527
  'scott', 'silverman', a scalar constant or a callable. If a
524
- scalar, this will be used directly as `kde.factor`. If a callable,
528
+ scalar, this will be used directly as `factor`. If a callable,
525
529
  it should take a `gaussian_kde` instance as only parameter and
526
530
  return a scalar. If None (default), nothing happens; the current
527
- `kde.covariance_factor` method is kept.
531
+ `covariance_factor` method is kept.
528
532
 
529
533
  Notes
530
534
  -----
@@ -701,7 +705,7 @@ class gaussian_kde:
701
705
  try:
702
706
  return self._neff
703
707
  except AttributeError:
704
- self._neff = 1/sum(self.weights**2)
708
+ self._neff = 1/np_vecdot(self.weights, self.weights)
705
709
  return self._neff
706
710
 
707
711
 
scipy/stats/_ksstats.py CHANGED
@@ -68,7 +68,7 @@
68
68
  import numpy as np
69
69
  import scipy.special
70
70
  import scipy.special._ufuncs as scu
71
- from scipy._lib._finite_differences import _derivative
71
+ from scipy.stats._finite_differences import _derivative
72
72
 
73
73
  _E128 = 128
74
74
  _EP128 = np.ldexp(np.longdouble(1), _E128)
@@ -10,8 +10,8 @@ from scipy import integrate
10
10
  from scipy.integrate._quadrature import _builtincoeffs
11
11
  from scipy import interpolate
12
12
  from scipy.interpolate import RectBivariateSpline
13
+ import scipy._lib.array_api_extra as xpx
13
14
  import scipy.special as sc
14
- from scipy._lib._util import _lazywhere
15
15
  from .._distn_infrastructure import rv_continuous, _ShapeInfo, rv_continuous_frozen
16
16
  from .._continuous_distns import uniform, expon, _norm_pdf, _norm_cdf
17
17
  from .levyst import Nolan
@@ -456,13 +456,9 @@ def _rvs_Z1(alpha, beta, size=None, random_state=None):
456
456
  return res3
457
457
 
458
458
  def alphanot1func(alpha, beta, TH, aTH, bTH, cosTH, tanTH, W):
459
- res = _lazywhere(
460
- beta == 0,
461
- (alpha, beta, TH, aTH, bTH, cosTH, tanTH, W),
462
- beta0func,
463
- f2=otherwise,
464
- )
465
- return res
459
+ return xpx.apply_where(
460
+ beta == 0, (alpha, beta, TH, aTH, bTH, cosTH, tanTH, W),
461
+ beta0func, otherwise)
466
462
 
467
463
  alpha = np.broadcast_to(alpha, size)
468
464
  beta = np.broadcast_to(beta, size)
@@ -474,13 +470,9 @@ def _rvs_Z1(alpha, beta, size=None, random_state=None):
474
470
  bTH = beta * TH
475
471
  cosTH = np.cos(TH)
476
472
  tanTH = np.tan(TH)
477
- res = _lazywhere(
478
- alpha == 1,
479
- (alpha, beta, TH, aTH, bTH, cosTH, tanTH, W),
480
- alpha1func,
481
- f2=alphanot1func,
482
- )
483
- return res
473
+ return xpx.apply_where(
474
+ alpha == 1, (alpha, beta, TH, aTH, bTH, cosTH, tanTH, W),
475
+ alpha1func, alphanot1func)
484
476
 
485
477
 
486
478
  def _fitstart_S0(data):