scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. scipy/__config__.py +3 -3
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
  12. scipy/_lib/_testutils.py +6 -2
  13. scipy/_lib/_util.py +222 -125
  14. scipy/_lib/array_api_compat/__init__.py +4 -4
  15. scipy/_lib/array_api_compat/_internal.py +19 -6
  16. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  17. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  18. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  19. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  20. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  21. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  22. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  23. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  24. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  25. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  26. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  27. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  28. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  29. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  30. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  31. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  32. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  33. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  34. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  35. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  36. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  37. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  38. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  39. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  40. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  41. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  42. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  43. scipy/_lib/array_api_extra/__init__.py +26 -3
  44. scipy/_lib/array_api_extra/_delegation.py +171 -0
  45. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  46. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  47. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  48. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  49. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  50. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  51. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  57. scipy/_lib/array_api_extra/testing.py +359 -0
  58. scipy/_lib/decorator.py +2 -2
  59. scipy/_lib/doccer.py +1 -7
  60. scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
  61. scipy/_lib/pyprima/__init__.py +212 -0
  62. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  63. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  64. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  65. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  66. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  67. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  68. scipy/_lib/pyprima/cobyla/update.py +289 -0
  69. scipy/_lib/pyprima/common/__init__.py +0 -0
  70. scipy/_lib/pyprima/common/_bounds.py +34 -0
  71. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  72. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  73. scipy/_lib/pyprima/common/_project.py +173 -0
  74. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  75. scipy/_lib/pyprima/common/consts.py +47 -0
  76. scipy/_lib/pyprima/common/evaluate.py +99 -0
  77. scipy/_lib/pyprima/common/history.py +38 -0
  78. scipy/_lib/pyprima/common/infos.py +30 -0
  79. scipy/_lib/pyprima/common/linalg.py +435 -0
  80. scipy/_lib/pyprima/common/message.py +290 -0
  81. scipy/_lib/pyprima/common/powalg.py +131 -0
  82. scipy/_lib/pyprima/common/preproc.py +277 -0
  83. scipy/_lib/pyprima/common/present.py +5 -0
  84. scipy/_lib/pyprima/common/ratio.py +54 -0
  85. scipy/_lib/pyprima/common/redrho.py +47 -0
  86. scipy/_lib/pyprima/common/selectx.py +296 -0
  87. scipy/_lib/tests/test__util.py +105 -121
  88. scipy/_lib/tests/test_array_api.py +166 -35
  89. scipy/_lib/tests/test_bunch.py +7 -0
  90. scipy/_lib/tests/test_ccallback.py +2 -10
  91. scipy/_lib/tests/test_public_api.py +13 -0
  92. scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
  93. scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
  94. scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
  95. scipy/cluster/hierarchy.py +393 -223
  96. scipy/cluster/tests/test_hierarchy.py +273 -335
  97. scipy/cluster/tests/test_vq.py +45 -61
  98. scipy/cluster/vq.py +39 -35
  99. scipy/conftest.py +263 -157
  100. scipy/constants/_constants.py +4 -1
  101. scipy/constants/tests/test_codata.py +2 -2
  102. scipy/constants/tests/test_constants.py +11 -18
  103. scipy/datasets/_download_all.py +15 -1
  104. scipy/datasets/_fetchers.py +7 -1
  105. scipy/datasets/_utils.py +1 -1
  106. scipy/differentiate/_differentiate.py +25 -25
  107. scipy/differentiate/tests/test_differentiate.py +24 -25
  108. scipy/fft/_basic.py +20 -0
  109. scipy/fft/_helper.py +3 -34
  110. scipy/fft/_pocketfft/helper.py +29 -1
  111. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  112. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  113. scipy/fft/_realtransforms.py +13 -0
  114. scipy/fft/tests/test_basic.py +27 -25
  115. scipy/fft/tests/test_fftlog.py +16 -7
  116. scipy/fft/tests/test_helper.py +18 -34
  117. scipy/fft/tests/test_real_transforms.py +8 -10
  118. scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
  119. scipy/fftpack/tests/test_basic.py +2 -4
  120. scipy/fftpack/tests/test_real_transforms.py +8 -9
  121. scipy/integrate/_bvp.py +9 -3
  122. scipy/integrate/_cubature.py +3 -2
  123. scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
  124. scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
  125. scipy/integrate/_ode.py +9 -2
  126. scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
  127. scipy/integrate/_quad_vec.py +21 -29
  128. scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
  129. scipy/integrate/_quadpack_py.py +11 -7
  130. scipy/integrate/_quadrature.py +3 -3
  131. scipy/integrate/_rules/_base.py +2 -2
  132. scipy/integrate/_tanhsinh.py +48 -47
  133. scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
  134. scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
  135. scipy/integrate/tests/test__quad_vec.py +0 -6
  136. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  137. scipy/integrate/tests/test_cubature.py +21 -35
  138. scipy/integrate/tests/test_quadrature.py +6 -8
  139. scipy/integrate/tests/test_tanhsinh.py +56 -48
  140. scipy/interpolate/__init__.py +70 -58
  141. scipy/interpolate/_bary_rational.py +22 -22
  142. scipy/interpolate/_bsplines.py +119 -66
  143. scipy/interpolate/_cubic.py +65 -50
  144. scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
  145. scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
  146. scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
  147. scipy/interpolate/_fitpack2.py +9 -6
  148. scipy/interpolate/_fitpack_impl.py +32 -26
  149. scipy/interpolate/_fitpack_repro.py +23 -19
  150. scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
  151. scipy/interpolate/_interpolate.py +30 -12
  152. scipy/interpolate/_ndbspline.py +13 -18
  153. scipy/interpolate/_ndgriddata.py +5 -8
  154. scipy/interpolate/_polyint.py +95 -31
  155. scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
  156. scipy/interpolate/_rbf.py +2 -2
  157. scipy/interpolate/_rbfinterp.py +1 -1
  158. scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
  159. scipy/interpolate/_rgi.py +31 -26
  160. scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
  161. scipy/interpolate/dfitpack.py +0 -20
  162. scipy/interpolate/interpnd.py +1 -2
  163. scipy/interpolate/tests/test_bary_rational.py +2 -2
  164. scipy/interpolate/tests/test_bsplines.py +97 -1
  165. scipy/interpolate/tests/test_fitpack2.py +39 -1
  166. scipy/interpolate/tests/test_interpnd.py +32 -20
  167. scipy/interpolate/tests/test_interpolate.py +48 -4
  168. scipy/interpolate/tests/test_rgi.py +2 -1
  169. scipy/io/_fast_matrix_market/__init__.py +2 -0
  170. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  171. scipy/io/_harwell_boeing/hb.py +7 -11
  172. scipy/io/_idl.py +5 -7
  173. scipy/io/_netcdf.py +15 -5
  174. scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
  175. scipy/io/arff/tests/test_arffread.py +3 -3
  176. scipy/io/matlab/__init__.py +5 -3
  177. scipy/io/matlab/_mio.py +4 -1
  178. scipy/io/matlab/_mio5.py +19 -13
  179. scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
  180. scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
  181. scipy/io/matlab/_miobase.py +4 -1
  182. scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
  183. scipy/io/matlab/tests/test_mio.py +46 -18
  184. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  185. scipy/io/tests/test_mmio.py +7 -1
  186. scipy/io/tests/test_wavfile.py +41 -0
  187. scipy/io/wavfile.py +57 -10
  188. scipy/linalg/_basic.py +113 -86
  189. scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
  190. scipy/linalg/_decomp.py +22 -9
  191. scipy/linalg/_decomp_cholesky.py +28 -13
  192. scipy/linalg/_decomp_cossin.py +45 -30
  193. scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
  194. scipy/linalg/_decomp_ldl.py +4 -1
  195. scipy/linalg/_decomp_lu.py +18 -6
  196. scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
  197. scipy/linalg/_decomp_polar.py +2 -0
  198. scipy/linalg/_decomp_qr.py +6 -2
  199. scipy/linalg/_decomp_qz.py +3 -0
  200. scipy/linalg/_decomp_schur.py +3 -1
  201. scipy/linalg/_decomp_svd.py +13 -2
  202. scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
  203. scipy/linalg/_expm_frechet.py +4 -0
  204. scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
  205. scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
  206. scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
  207. scipy/linalg/_matfuncs.py +187 -4
  208. scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
  209. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
  210. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  211. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
  212. scipy/linalg/_procrustes.py +2 -0
  213. scipy/linalg/_sketches.py +17 -6
  214. scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
  215. scipy/linalg/_solvers.py +7 -2
  216. scipy/linalg/_special_matrices.py +26 -36
  217. scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
  218. scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
  219. scipy/linalg/lapack.py +22 -2
  220. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  221. scipy/linalg/tests/test_basic.py +31 -16
  222. scipy/linalg/tests/test_batch.py +588 -0
  223. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  224. scipy/linalg/tests/test_decomp.py +40 -3
  225. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  226. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  227. scipy/linalg/tests/test_lapack.py +115 -7
  228. scipy/linalg/tests/test_matfuncs.py +157 -102
  229. scipy/linalg/tests/test_procrustes.py +0 -7
  230. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  231. scipy/linalg/tests/test_special_matrices.py +1 -5
  232. scipy/ndimage/__init__.py +1 -0
  233. scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
  234. scipy/ndimage/_delegators.py +8 -2
  235. scipy/ndimage/_filters.py +453 -5
  236. scipy/ndimage/_interpolation.py +36 -6
  237. scipy/ndimage/_measurements.py +4 -2
  238. scipy/ndimage/_morphology.py +5 -0
  239. scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
  240. scipy/ndimage/_ni_docstrings.py +5 -1
  241. scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
  242. scipy/ndimage/_ni_support.py +1 -5
  243. scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
  244. scipy/ndimage/_support_alternative_backends.py +18 -6
  245. scipy/ndimage/tests/test_filters.py +370 -259
  246. scipy/ndimage/tests/test_fourier.py +7 -9
  247. scipy/ndimage/tests/test_interpolation.py +68 -61
  248. scipy/ndimage/tests/test_measurements.py +18 -35
  249. scipy/ndimage/tests/test_morphology.py +143 -131
  250. scipy/ndimage/tests/test_splines.py +1 -3
  251. scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
  252. scipy/optimize/_basinhopping.py +13 -7
  253. scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
  254. scipy/optimize/_bracket.py +17 -24
  255. scipy/optimize/_chandrupatla.py +9 -10
  256. scipy/optimize/_cobyla_py.py +104 -123
  257. scipy/optimize/_constraints.py +14 -10
  258. scipy/optimize/_differentiable_functions.py +371 -230
  259. scipy/optimize/_differentialevolution.py +4 -3
  260. scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
  261. scipy/optimize/_dual_annealing.py +1 -1
  262. scipy/optimize/_elementwise.py +1 -4
  263. scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
  264. scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
  265. scipy/optimize/_lbfgsb_py.py +57 -16
  266. scipy/optimize/_linprog_doc.py +2 -2
  267. scipy/optimize/_linprog_highs.py +2 -2
  268. scipy/optimize/_linprog_ip.py +25 -10
  269. scipy/optimize/_linprog_util.py +14 -16
  270. scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
  271. scipy/optimize/_lsq/common.py +3 -3
  272. scipy/optimize/_lsq/dogbox.py +16 -2
  273. scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
  274. scipy/optimize/_lsq/least_squares.py +198 -126
  275. scipy/optimize/_lsq/lsq_linear.py +6 -6
  276. scipy/optimize/_lsq/trf.py +35 -8
  277. scipy/optimize/_milp.py +3 -1
  278. scipy/optimize/_minimize.py +105 -36
  279. scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
  280. scipy/optimize/_minpack_py.py +21 -14
  281. scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
  282. scipy/optimize/_nnls.py +20 -21
  283. scipy/optimize/_nonlin.py +34 -3
  284. scipy/optimize/_numdiff.py +288 -110
  285. scipy/optimize/_optimize.py +86 -48
  286. scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
  287. scipy/optimize/_remove_redundancy.py +5 -5
  288. scipy/optimize/_root_scalar.py +1 -1
  289. scipy/optimize/_shgo.py +6 -0
  290. scipy/optimize/_shgo_lib/_complex.py +1 -1
  291. scipy/optimize/_slsqp_py.py +216 -124
  292. scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
  293. scipy/optimize/_spectral.py +1 -1
  294. scipy/optimize/_tnc.py +8 -1
  295. scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
  296. scipy/optimize/_trustregion.py +20 -6
  297. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  298. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  299. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  300. scipy/optimize/_trustregion_constr/projections.py +12 -8
  301. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  302. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  303. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  304. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  305. scipy/optimize/_trustregion_exact.py +0 -1
  306. scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
  307. scipy/optimize/_zeros_py.py +97 -17
  308. scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
  309. scipy/optimize/slsqp.py +0 -1
  310. scipy/optimize/tests/test__basinhopping.py +1 -1
  311. scipy/optimize/tests/test__differential_evolution.py +4 -4
  312. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  313. scipy/optimize/tests/test__numdiff.py +66 -22
  314. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  315. scipy/optimize/tests/test__shgo.py +9 -1
  316. scipy/optimize/tests/test_bracket.py +36 -46
  317. scipy/optimize/tests/test_chandrupatla.py +133 -135
  318. scipy/optimize/tests/test_cobyla.py +74 -45
  319. scipy/optimize/tests/test_constraints.py +1 -1
  320. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  321. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  322. scipy/optimize/tests/test_least_squares.py +125 -13
  323. scipy/optimize/tests/test_linear_assignment.py +3 -3
  324. scipy/optimize/tests/test_linprog.py +3 -3
  325. scipy/optimize/tests/test_lsq_linear.py +6 -6
  326. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  327. scipy/optimize/tests/test_minpack.py +4 -4
  328. scipy/optimize/tests/test_nnls.py +43 -3
  329. scipy/optimize/tests/test_nonlin.py +36 -0
  330. scipy/optimize/tests/test_optimize.py +95 -17
  331. scipy/optimize/tests/test_slsqp.py +36 -4
  332. scipy/optimize/tests/test_zeros.py +34 -1
  333. scipy/signal/__init__.py +12 -23
  334. scipy/signal/_delegators.py +568 -0
  335. scipy/signal/_filter_design.py +459 -241
  336. scipy/signal/_fir_filter_design.py +262 -90
  337. scipy/signal/_lti_conversion.py +3 -2
  338. scipy/signal/_ltisys.py +118 -91
  339. scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
  340. scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
  341. scipy/signal/_polyutils.py +172 -0
  342. scipy/signal/_short_time_fft.py +519 -70
  343. scipy/signal/_signal_api.py +30 -0
  344. scipy/signal/_signaltools.py +719 -399
  345. scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
  346. scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
  347. scipy/signal/_spectral_py.py +230 -50
  348. scipy/signal/_spline.cpython-313t-darwin.so +0 -0
  349. scipy/signal/_spline_filters.py +108 -68
  350. scipy/signal/_support_alternative_backends.py +73 -0
  351. scipy/signal/_upfirdn.py +4 -1
  352. scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
  353. scipy/signal/_waveforms.py +2 -11
  354. scipy/signal/_wavelets.py +1 -1
  355. scipy/signal/fir_filter_design.py +1 -0
  356. scipy/signal/spline.py +4 -11
  357. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  358. scipy/signal/tests/test_bsplines.py +114 -79
  359. scipy/signal/tests/test_cont2discrete.py +9 -2
  360. scipy/signal/tests/test_filter_design.py +721 -481
  361. scipy/signal/tests/test_fir_filter_design.py +332 -140
  362. scipy/signal/tests/test_savitzky_golay.py +4 -3
  363. scipy/signal/tests/test_short_time_fft.py +221 -3
  364. scipy/signal/tests/test_signaltools.py +2144 -1348
  365. scipy/signal/tests/test_spectral.py +50 -6
  366. scipy/signal/tests/test_splines.py +161 -96
  367. scipy/signal/tests/test_upfirdn.py +84 -50
  368. scipy/signal/tests/test_waveforms.py +20 -0
  369. scipy/signal/tests/test_windows.py +607 -466
  370. scipy/signal/windows/_windows.py +287 -148
  371. scipy/sparse/__init__.py +23 -4
  372. scipy/sparse/_base.py +270 -108
  373. scipy/sparse/_bsr.py +7 -4
  374. scipy/sparse/_compressed.py +59 -231
  375. scipy/sparse/_construct.py +90 -38
  376. scipy/sparse/_coo.py +115 -181
  377. scipy/sparse/_csc.py +4 -4
  378. scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
  379. scipy/sparse/_csr.py +2 -2
  380. scipy/sparse/_data.py +48 -48
  381. scipy/sparse/_dia.py +105 -18
  382. scipy/sparse/_dok.py +0 -23
  383. scipy/sparse/_index.py +4 -4
  384. scipy/sparse/_matrix.py +23 -0
  385. scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
  386. scipy/sparse/_sputils.py +37 -22
  387. scipy/sparse/base.py +0 -9
  388. scipy/sparse/bsr.py +0 -14
  389. scipy/sparse/compressed.py +0 -23
  390. scipy/sparse/construct.py +0 -6
  391. scipy/sparse/coo.py +0 -14
  392. scipy/sparse/csc.py +0 -3
  393. scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
  394. scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
  395. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
  396. scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
  397. scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
  398. scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
  399. scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
  400. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  401. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  402. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  403. scipy/sparse/csr.py +0 -5
  404. scipy/sparse/data.py +1 -6
  405. scipy/sparse/dia.py +0 -7
  406. scipy/sparse/dok.py +0 -10
  407. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
  408. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  409. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  410. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
  411. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  412. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  413. scipy/sparse/linalg/_interface.py +17 -18
  414. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  415. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  416. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  417. scipy/sparse/linalg/_isolve/minres.py +5 -5
  418. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  419. scipy/sparse/linalg/_isolve/utils.py +2 -8
  420. scipy/sparse/linalg/_matfuncs.py +1 -1
  421. scipy/sparse/linalg/_norm.py +1 -1
  422. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
  423. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
  426. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  427. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  428. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  429. scipy/sparse/tests/test_base.py +214 -42
  430. scipy/sparse/tests/test_common1d.py +7 -7
  431. scipy/sparse/tests/test_construct.py +1 -1
  432. scipy/sparse/tests/test_coo.py +272 -4
  433. scipy/sparse/tests/test_sparsetools.py +5 -0
  434. scipy/sparse/tests/test_sputils.py +36 -7
  435. scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
  436. scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
  437. scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
  438. scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
  439. scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
  440. scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
  441. scipy/spatial/distance.py +49 -42
  442. scipy/spatial/tests/test_distance.py +15 -1
  443. scipy/spatial/tests/test_kdtree.py +1 -0
  444. scipy/spatial/tests/test_qhull.py +7 -2
  445. scipy/spatial/transform/__init__.py +5 -3
  446. scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
  447. scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
  448. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  449. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  450. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  451. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  452. scipy/special/__init__.py +1 -47
  453. scipy/special/_add_newdocs.py +34 -772
  454. scipy/special/_basic.py +22 -25
  455. scipy/special/_comb.cpython-313t-darwin.so +0 -0
  456. scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
  457. scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
  458. scipy/special/_logsumexp.py +67 -58
  459. scipy/special/_orthogonal.pyi +1 -1
  460. scipy/special/_specfun.cpython-313t-darwin.so +0 -0
  461. scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
  462. scipy/special/_spherical_bessel.py +4 -4
  463. scipy/special/_support_alternative_backends.py +212 -119
  464. scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
  465. scipy/special/_testutils.py +4 -4
  466. scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
  467. scipy/special/_ufuncs.pyi +1 -0
  468. scipy/special/_ufuncs.pyx +215 -1400
  469. scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
  470. scipy/special/_ufuncs_cxx.pxd +2 -15
  471. scipy/special/_ufuncs_cxx.pyx +5 -44
  472. scipy/special/_ufuncs_cxx_defs.h +2 -16
  473. scipy/special/_ufuncs_defs.h +0 -8
  474. scipy/special/cython_special.cpython-313t-darwin.so +0 -0
  475. scipy/special/cython_special.pxd +1 -1
  476. scipy/special/tests/_cython_examples/meson.build +10 -1
  477. scipy/special/tests/test_basic.py +153 -20
  478. scipy/special/tests/test_boost_ufuncs.py +3 -0
  479. scipy/special/tests/test_cdflib.py +35 -11
  480. scipy/special/tests/test_gammainc.py +16 -0
  481. scipy/special/tests/test_hyp2f1.py +2 -2
  482. scipy/special/tests/test_log1mexp.py +85 -0
  483. scipy/special/tests/test_logsumexp.py +206 -64
  484. scipy/special/tests/test_mpmath.py +1 -0
  485. scipy/special/tests/test_nan_inputs.py +1 -1
  486. scipy/special/tests/test_orthogonal.py +17 -18
  487. scipy/special/tests/test_sf_error.py +3 -2
  488. scipy/special/tests/test_sph_harm.py +6 -7
  489. scipy/special/tests/test_support_alternative_backends.py +211 -76
  490. scipy/stats/__init__.py +4 -1
  491. scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
  492. scipy/stats/_axis_nan_policy.py +5 -12
  493. scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
  494. scipy/stats/_continued_fraction.py +387 -0
  495. scipy/stats/_continuous_distns.py +277 -310
  496. scipy/stats/_correlation.py +1 -1
  497. scipy/stats/_covariance.py +6 -3
  498. scipy/stats/_discrete_distns.py +39 -32
  499. scipy/stats/_distn_infrastructure.py +39 -12
  500. scipy/stats/_distribution_infrastructure.py +900 -238
  501. scipy/stats/_entropy.py +9 -10
  502. scipy/{_lib → stats}/_finite_differences.py +1 -1
  503. scipy/stats/_hypotests.py +83 -50
  504. scipy/stats/_kde.py +53 -49
  505. scipy/stats/_ksstats.py +1 -1
  506. scipy/stats/_levy_stable/__init__.py +7 -15
  507. scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
  508. scipy/stats/_morestats.py +118 -73
  509. scipy/stats/_mstats_basic.py +13 -17
  510. scipy/stats/_mstats_extras.py +8 -8
  511. scipy/stats/_multivariate.py +89 -113
  512. scipy/stats/_new_distributions.py +97 -20
  513. scipy/stats/_page_trend_test.py +12 -5
  514. scipy/stats/_probability_distribution.py +265 -43
  515. scipy/stats/_qmc.py +14 -9
  516. scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
  517. scipy/stats/_qmvnt.py +16 -95
  518. scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
  519. scipy/stats/_quantile.py +335 -0
  520. scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
  521. scipy/stats/_resampling.py +4 -29
  522. scipy/stats/_sampling.py +1 -1
  523. scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
  524. scipy/stats/_stats.cpython-313t-darwin.so +0 -0
  525. scipy/stats/_stats_mstats_common.py +21 -2
  526. scipy/stats/_stats_py.py +550 -476
  527. scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
  528. scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
  529. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  530. scipy/stats/_variation.py +6 -8
  531. scipy/stats/_wilcoxon.py +13 -7
  532. scipy/stats/tests/common_tests.py +6 -4
  533. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  534. scipy/stats/tests/test_continued_fraction.py +173 -0
  535. scipy/stats/tests/test_continuous.py +379 -60
  536. scipy/stats/tests/test_continuous_basic.py +18 -12
  537. scipy/stats/tests/test_discrete_basic.py +14 -8
  538. scipy/stats/tests/test_discrete_distns.py +16 -16
  539. scipy/stats/tests/test_distributions.py +95 -75
  540. scipy/stats/tests/test_entropy.py +40 -48
  541. scipy/stats/tests/test_fit.py +4 -3
  542. scipy/stats/tests/test_hypotests.py +153 -24
  543. scipy/stats/tests/test_kdeoth.py +109 -41
  544. scipy/stats/tests/test_marray.py +289 -0
  545. scipy/stats/tests/test_morestats.py +79 -47
  546. scipy/stats/tests/test_mstats_basic.py +3 -3
  547. scipy/stats/tests/test_multivariate.py +434 -83
  548. scipy/stats/tests/test_qmc.py +13 -10
  549. scipy/stats/tests/test_quantile.py +199 -0
  550. scipy/stats/tests/test_rank.py +119 -112
  551. scipy/stats/tests/test_resampling.py +47 -56
  552. scipy/stats/tests/test_sampling.py +9 -4
  553. scipy/stats/tests/test_stats.py +799 -939
  554. scipy/stats/tests/test_variation.py +8 -6
  555. scipy/version.py +2 -2
  556. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  557. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
  559. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  560. scipy/_lib/array_api_extra/_funcs.py +0 -484
  561. scipy/_lib/array_api_extra/_typing.py +0 -8
  562. scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
  563. scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
  564. scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
  565. scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
  566. scipy/spatial/qhull_src/COPYING.txt +0 -38
  567. scipy/special/libsf_error_state.dylib +0 -0
  568. scipy/special/tests/test_log_softmax.py +0 -109
  569. scipy/special/tests/test_xsf_cuda.py +0 -114
  570. scipy/special/xsf/binom.h +0 -89
  571. scipy/special/xsf/cdflib.h +0 -100
  572. scipy/special/xsf/cephes/airy.h +0 -307
  573. scipy/special/xsf/cephes/besselpoly.h +0 -51
  574. scipy/special/xsf/cephes/beta.h +0 -257
  575. scipy/special/xsf/cephes/cbrt.h +0 -131
  576. scipy/special/xsf/cephes/chbevl.h +0 -85
  577. scipy/special/xsf/cephes/chdtr.h +0 -193
  578. scipy/special/xsf/cephes/const.h +0 -87
  579. scipy/special/xsf/cephes/ellie.h +0 -293
  580. scipy/special/xsf/cephes/ellik.h +0 -251
  581. scipy/special/xsf/cephes/ellpe.h +0 -107
  582. scipy/special/xsf/cephes/ellpk.h +0 -117
  583. scipy/special/xsf/cephes/expn.h +0 -260
  584. scipy/special/xsf/cephes/gamma.h +0 -398
  585. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  586. scipy/special/xsf/cephes/hyperg.h +0 -361
  587. scipy/special/xsf/cephes/i0.h +0 -149
  588. scipy/special/xsf/cephes/i1.h +0 -158
  589. scipy/special/xsf/cephes/igam.h +0 -421
  590. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  591. scipy/special/xsf/cephes/igami.h +0 -313
  592. scipy/special/xsf/cephes/j0.h +0 -225
  593. scipy/special/xsf/cephes/j1.h +0 -198
  594. scipy/special/xsf/cephes/jv.h +0 -715
  595. scipy/special/xsf/cephes/k0.h +0 -164
  596. scipy/special/xsf/cephes/k1.h +0 -163
  597. scipy/special/xsf/cephes/kn.h +0 -243
  598. scipy/special/xsf/cephes/lanczos.h +0 -112
  599. scipy/special/xsf/cephes/ndtr.h +0 -275
  600. scipy/special/xsf/cephes/poch.h +0 -85
  601. scipy/special/xsf/cephes/polevl.h +0 -167
  602. scipy/special/xsf/cephes/psi.h +0 -194
  603. scipy/special/xsf/cephes/rgamma.h +0 -111
  604. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  605. scipy/special/xsf/cephes/shichi.h +0 -248
  606. scipy/special/xsf/cephes/sici.h +0 -224
  607. scipy/special/xsf/cephes/sindg.h +0 -221
  608. scipy/special/xsf/cephes/tandg.h +0 -139
  609. scipy/special/xsf/cephes/trig.h +0 -58
  610. scipy/special/xsf/cephes/unity.h +0 -186
  611. scipy/special/xsf/cephes/zeta.h +0 -172
  612. scipy/special/xsf/config.h +0 -304
  613. scipy/special/xsf/digamma.h +0 -205
  614. scipy/special/xsf/error.h +0 -57
  615. scipy/special/xsf/evalpoly.h +0 -47
  616. scipy/special/xsf/expint.h +0 -266
  617. scipy/special/xsf/hyp2f1.h +0 -694
  618. scipy/special/xsf/iv_ratio.h +0 -173
  619. scipy/special/xsf/lambertw.h +0 -150
  620. scipy/special/xsf/loggamma.h +0 -163
  621. scipy/special/xsf/sici.h +0 -200
  622. scipy/special/xsf/tools.h +0 -427
  623. scipy/special/xsf/trig.h +0 -164
  624. scipy/special/xsf/wright_bessel.h +0 -843
  625. scipy/special/xsf/zlog1.h +0 -35
  626. scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
  627. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -4,142 +4,171 @@ These are functions that are just aliases of existing functions in NumPy.
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- from typing import TYPE_CHECKING
8
- if TYPE_CHECKING:
9
- from typing import Optional, Sequence, Tuple, Union
10
- from ._typing import ndarray, Device, Dtype
11
-
12
- from typing import NamedTuple
13
7
  import inspect
8
+ from typing import TYPE_CHECKING, Any, NamedTuple, Optional, Sequence, cast
9
+
10
+ from ._helpers import _check_device, array_namespace
11
+ from ._helpers import device as _get_device
12
+ from ._helpers import is_cupy_namespace as _is_cupy_namespace
13
+ from ._typing import Array, Device, DType, Namespace
14
14
 
15
- from ._helpers import array_namespace, _check_device, device, is_torch_array, is_cupy_namespace
15
+ if TYPE_CHECKING:
16
+ # TODO: import from typing (requires Python >=3.13)
17
+ from typing_extensions import TypeIs
16
18
 
17
19
  # These functions are modified from the NumPy versions.
18
20
 
19
- # Creation functions add the device keyword (which does nothing for NumPy)
21
+ # Creation functions add the device keyword (which does nothing for NumPy and Dask)
22
+
20
23
 
21
24
  def arange(
22
- start: Union[int, float],
25
+ start: float,
23
26
  /,
24
- stop: Optional[Union[int, float]] = None,
25
- step: Union[int, float] = 1,
27
+ stop: float | None = None,
28
+ step: float = 1,
26
29
  *,
27
- xp,
28
- dtype: Optional[Dtype] = None,
29
- device: Optional[Device] = None,
30
- **kwargs
31
- ) -> ndarray:
30
+ xp: Namespace,
31
+ dtype: DType | None = None,
32
+ device: Device | None = None,
33
+ **kwargs: object,
34
+ ) -> Array:
32
35
  _check_device(xp, device)
33
36
  return xp.arange(start, stop=stop, step=step, dtype=dtype, **kwargs)
34
37
 
38
+
35
39
  def empty(
36
- shape: Union[int, Tuple[int, ...]],
37
- xp,
40
+ shape: int | tuple[int, ...],
41
+ xp: Namespace,
38
42
  *,
39
- dtype: Optional[Dtype] = None,
40
- device: Optional[Device] = None,
41
- **kwargs
42
- ) -> ndarray:
43
+ dtype: DType | None = None,
44
+ device: Device | None = None,
45
+ **kwargs: object,
46
+ ) -> Array:
43
47
  _check_device(xp, device)
44
48
  return xp.empty(shape, dtype=dtype, **kwargs)
45
49
 
50
+
46
51
  def empty_like(
47
- x: ndarray, /, xp, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None,
48
- **kwargs
49
- ) -> ndarray:
52
+ x: Array,
53
+ /,
54
+ xp: Namespace,
55
+ *,
56
+ dtype: DType | None = None,
57
+ device: Device | None = None,
58
+ **kwargs: object,
59
+ ) -> Array:
50
60
  _check_device(xp, device)
51
61
  return xp.empty_like(x, dtype=dtype, **kwargs)
52
62
 
63
+
53
64
  def eye(
54
65
  n_rows: int,
55
- n_cols: Optional[int] = None,
66
+ n_cols: int | None = None,
56
67
  /,
57
68
  *,
58
- xp,
69
+ xp: Namespace,
59
70
  k: int = 0,
60
- dtype: Optional[Dtype] = None,
61
- device: Optional[Device] = None,
62
- **kwargs,
63
- ) -> ndarray:
71
+ dtype: DType | None = None,
72
+ device: Device | None = None,
73
+ **kwargs: object,
74
+ ) -> Array:
64
75
  _check_device(xp, device)
65
76
  return xp.eye(n_rows, M=n_cols, k=k, dtype=dtype, **kwargs)
66
77
 
78
+
67
79
  def full(
68
- shape: Union[int, Tuple[int, ...]],
69
- fill_value: Union[int, float],
70
- xp,
80
+ shape: int | tuple[int, ...],
81
+ fill_value: complex,
82
+ xp: Namespace,
71
83
  *,
72
- dtype: Optional[Dtype] = None,
73
- device: Optional[Device] = None,
74
- **kwargs,
75
- ) -> ndarray:
84
+ dtype: DType | None = None,
85
+ device: Device | None = None,
86
+ **kwargs: object,
87
+ ) -> Array:
76
88
  _check_device(xp, device)
77
89
  return xp.full(shape, fill_value, dtype=dtype, **kwargs)
78
90
 
91
+
79
92
  def full_like(
80
- x: ndarray,
93
+ x: Array,
81
94
  /,
82
- fill_value: Union[int, float],
95
+ fill_value: complex,
83
96
  *,
84
- xp,
85
- dtype: Optional[Dtype] = None,
86
- device: Optional[Device] = None,
87
- **kwargs,
88
- ) -> ndarray:
97
+ xp: Namespace,
98
+ dtype: DType | None = None,
99
+ device: Device | None = None,
100
+ **kwargs: object,
101
+ ) -> Array:
89
102
  _check_device(xp, device)
90
103
  return xp.full_like(x, fill_value, dtype=dtype, **kwargs)
91
104
 
105
+
92
106
  def linspace(
93
- start: Union[int, float],
94
- stop: Union[int, float],
107
+ start: float,
108
+ stop: float,
95
109
  /,
96
110
  num: int,
97
111
  *,
98
- xp,
99
- dtype: Optional[Dtype] = None,
100
- device: Optional[Device] = None,
112
+ xp: Namespace,
113
+ dtype: DType | None = None,
114
+ device: Device | None = None,
101
115
  endpoint: bool = True,
102
- **kwargs,
103
- ) -> ndarray:
116
+ **kwargs: object,
117
+ ) -> Array:
104
118
  _check_device(xp, device)
105
119
  return xp.linspace(start, stop, num, dtype=dtype, endpoint=endpoint, **kwargs)
106
120
 
121
+
107
122
  def ones(
108
- shape: Union[int, Tuple[int, ...]],
109
- xp,
123
+ shape: int | tuple[int, ...],
124
+ xp: Namespace,
110
125
  *,
111
- dtype: Optional[Dtype] = None,
112
- device: Optional[Device] = None,
113
- **kwargs,
114
- ) -> ndarray:
126
+ dtype: DType | None = None,
127
+ device: Device | None = None,
128
+ **kwargs: object,
129
+ ) -> Array:
115
130
  _check_device(xp, device)
116
131
  return xp.ones(shape, dtype=dtype, **kwargs)
117
132
 
133
+
118
134
  def ones_like(
119
- x: ndarray, /, xp, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None,
120
- **kwargs,
121
- ) -> ndarray:
135
+ x: Array,
136
+ /,
137
+ xp: Namespace,
138
+ *,
139
+ dtype: DType | None = None,
140
+ device: Device | None = None,
141
+ **kwargs: object,
142
+ ) -> Array:
122
143
  _check_device(xp, device)
123
144
  return xp.ones_like(x, dtype=dtype, **kwargs)
124
145
 
146
+
125
147
  def zeros(
126
- shape: Union[int, Tuple[int, ...]],
127
- xp,
148
+ shape: int | tuple[int, ...],
149
+ xp: Namespace,
128
150
  *,
129
- dtype: Optional[Dtype] = None,
130
- device: Optional[Device] = None,
131
- **kwargs,
132
- ) -> ndarray:
151
+ dtype: DType | None = None,
152
+ device: Device | None = None,
153
+ **kwargs: object,
154
+ ) -> Array:
133
155
  _check_device(xp, device)
134
156
  return xp.zeros(shape, dtype=dtype, **kwargs)
135
157
 
158
+
136
159
  def zeros_like(
137
- x: ndarray, /, xp, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None,
138
- **kwargs,
139
- ) -> ndarray:
160
+ x: Array,
161
+ /,
162
+ xp: Namespace,
163
+ *,
164
+ dtype: DType | None = None,
165
+ device: Device | None = None,
166
+ **kwargs: object,
167
+ ) -> Array:
140
168
  _check_device(xp, device)
141
169
  return xp.zeros_like(x, dtype=dtype, **kwargs)
142
170
 
171
+
143
172
  # np.unique() is split into four functions in the array API:
144
173
  # unique_all, unique_counts, unique_inverse, and unique_values (this is done
145
174
  # to remove polymorphic return types).
@@ -147,35 +176,37 @@ def zeros_like(
147
176
  # The functions here return namedtuples (np.unique() returns a normal
148
177
  # tuple).
149
178
 
179
+
150
180
  # Note that these named tuples aren't actually part of the standard namespace,
151
181
  # but I don't see any issue with exporting the names here regardless.
152
182
  class UniqueAllResult(NamedTuple):
153
- values: ndarray
154
- indices: ndarray
155
- inverse_indices: ndarray
156
- counts: ndarray
183
+ values: Array
184
+ indices: Array
185
+ inverse_indices: Array
186
+ counts: Array
157
187
 
158
188
 
159
189
  class UniqueCountsResult(NamedTuple):
160
- values: ndarray
161
- counts: ndarray
190
+ values: Array
191
+ counts: Array
162
192
 
163
193
 
164
194
  class UniqueInverseResult(NamedTuple):
165
- values: ndarray
166
- inverse_indices: ndarray
195
+ values: Array
196
+ inverse_indices: Array
167
197
 
168
198
 
169
- def _unique_kwargs(xp):
199
+ def _unique_kwargs(xp: Namespace) -> dict[str, bool]:
170
200
  # Older versions of NumPy and CuPy do not have equal_nan. Rather than
171
201
  # trying to parse version numbers, just check if equal_nan is in the
172
202
  # signature.
173
203
  s = inspect.signature(xp.unique)
174
- if 'equal_nan' in s.parameters:
175
- return {'equal_nan': False}
204
+ if "equal_nan" in s.parameters:
205
+ return {"equal_nan": False}
176
206
  return {}
177
207
 
178
- def unique_all(x: ndarray, /, xp) -> UniqueAllResult:
208
+
209
+ def unique_all(x: Array, /, xp: Namespace) -> UniqueAllResult:
179
210
  kwargs = _unique_kwargs(xp)
180
211
  values, indices, inverse_indices, counts = xp.unique(
181
212
  x,
@@ -195,20 +226,16 @@ def unique_all(x: ndarray, /, xp) -> UniqueAllResult:
195
226
  )
196
227
 
197
228
 
198
- def unique_counts(x: ndarray, /, xp) -> UniqueCountsResult:
229
+ def unique_counts(x: Array, /, xp: Namespace) -> UniqueCountsResult:
199
230
  kwargs = _unique_kwargs(xp)
200
231
  res = xp.unique(
201
- x,
202
- return_counts=True,
203
- return_index=False,
204
- return_inverse=False,
205
- **kwargs
232
+ x, return_counts=True, return_index=False, return_inverse=False, **kwargs
206
233
  )
207
234
 
208
235
  return UniqueCountsResult(*res)
209
236
 
210
237
 
211
- def unique_inverse(x: ndarray, /, xp) -> UniqueInverseResult:
238
+ def unique_inverse(x: Array, /, xp: Namespace) -> UniqueInverseResult:
212
239
  kwargs = _unique_kwargs(xp)
213
240
  values, inverse_indices = xp.unique(
214
241
  x,
@@ -223,7 +250,7 @@ def unique_inverse(x: ndarray, /, xp) -> UniqueInverseResult:
223
250
  return UniqueInverseResult(values, inverse_indices)
224
251
 
225
252
 
226
- def unique_values(x: ndarray, /, xp) -> ndarray:
253
+ def unique_values(x: Array, /, xp: Namespace) -> Array:
227
254
  kwargs = _unique_kwargs(xp)
228
255
  return xp.unique(
229
256
  x,
@@ -233,56 +260,58 @@ def unique_values(x: ndarray, /, xp) -> ndarray:
233
260
  **kwargs,
234
261
  )
235
262
 
236
- def astype(x: ndarray, dtype: Dtype, /, *, copy: bool = True) -> ndarray:
237
- if not copy and dtype == x.dtype:
238
- return x
239
- return x.astype(dtype=dtype, copy=copy)
240
263
 
241
264
  # These functions have different keyword argument names
242
265
 
266
+
243
267
  def std(
244
- x: ndarray,
268
+ x: Array,
245
269
  /,
246
- xp,
270
+ xp: Namespace,
247
271
  *,
248
- axis: Optional[Union[int, Tuple[int, ...]]] = None,
249
- correction: Union[int, float] = 0.0, # correction instead of ddof
272
+ axis: int | tuple[int, ...] | None = None,
273
+ correction: float = 0.0, # correction instead of ddof
250
274
  keepdims: bool = False,
251
- **kwargs,
252
- ) -> ndarray:
275
+ **kwargs: object,
276
+ ) -> Array:
253
277
  return xp.std(x, axis=axis, ddof=correction, keepdims=keepdims, **kwargs)
254
278
 
279
+
255
280
  def var(
256
- x: ndarray,
281
+ x: Array,
257
282
  /,
258
- xp,
283
+ xp: Namespace,
259
284
  *,
260
- axis: Optional[Union[int, Tuple[int, ...]]] = None,
261
- correction: Union[int, float] = 0.0, # correction instead of ddof
285
+ axis: int | tuple[int, ...] | None = None,
286
+ correction: float = 0.0, # correction instead of ddof
262
287
  keepdims: bool = False,
263
- **kwargs,
264
- ) -> ndarray:
288
+ **kwargs: object,
289
+ ) -> Array:
265
290
  return xp.var(x, axis=axis, ddof=correction, keepdims=keepdims, **kwargs)
266
291
 
292
+
267
293
  # cumulative_sum is renamed from cumsum, and adds the include_initial keyword
268
294
  # argument
269
295
 
296
+
270
297
  def cumulative_sum(
271
- x: ndarray,
298
+ x: Array,
272
299
  /,
273
- xp,
300
+ xp: Namespace,
274
301
  *,
275
- axis: Optional[int] = None,
276
- dtype: Optional[Dtype] = None,
302
+ axis: int | None = None,
303
+ dtype: DType | None = None,
277
304
  include_initial: bool = False,
278
- **kwargs
279
- ) -> ndarray:
305
+ **kwargs: object,
306
+ ) -> Array:
280
307
  wrapped_xp = array_namespace(x)
281
308
 
282
309
  # TODO: The standard is not clear about what should happen when x.ndim == 0.
283
310
  if axis is None:
284
311
  if x.ndim > 1:
285
- raise ValueError("axis must be specified in cumulative_sum for more than one dimension")
312
+ raise ValueError(
313
+ "axis must be specified in cumulative_sum for more than one dimension"
314
+ )
286
315
  axis = 0
287
316
 
288
317
  res = xp.cumsum(x, axis=axis, dtype=dtype, **kwargs)
@@ -292,25 +321,69 @@ def cumulative_sum(
292
321
  initial_shape = list(x.shape)
293
322
  initial_shape[axis] = 1
294
323
  res = xp.concatenate(
295
- [wrapped_xp.zeros(shape=initial_shape, dtype=res.dtype, device=device(res)), res],
324
+ [
325
+ wrapped_xp.zeros(
326
+ shape=initial_shape, dtype=res.dtype, device=_get_device(res)
327
+ ),
328
+ res,
329
+ ],
330
+ axis=axis,
331
+ )
332
+ return res
333
+
334
+
335
+ def cumulative_prod(
336
+ x: Array,
337
+ /,
338
+ xp: Namespace,
339
+ *,
340
+ axis: int | None = None,
341
+ dtype: DType | None = None,
342
+ include_initial: bool = False,
343
+ **kwargs: object,
344
+ ) -> Array:
345
+ wrapped_xp = array_namespace(x)
346
+
347
+ if axis is None:
348
+ if x.ndim > 1:
349
+ raise ValueError(
350
+ "axis must be specified in cumulative_prod for more than one dimension"
351
+ )
352
+ axis = 0
353
+
354
+ res = xp.cumprod(x, axis=axis, dtype=dtype, **kwargs)
355
+
356
+ # np.cumprod does not support include_initial
357
+ if include_initial:
358
+ initial_shape = list(x.shape)
359
+ initial_shape[axis] = 1
360
+ res = xp.concatenate(
361
+ [
362
+ wrapped_xp.ones(
363
+ shape=initial_shape, dtype=res.dtype, device=_get_device(res)
364
+ ),
365
+ res,
366
+ ],
296
367
  axis=axis,
297
368
  )
298
369
  return res
299
370
 
371
+
300
372
  # The min and max argument names in clip are different and not optional in numpy, and type
301
373
  # promotion behavior is different.
302
374
  def clip(
303
- x: ndarray,
375
+ x: Array,
304
376
  /,
305
- min: Optional[Union[int, float, ndarray]] = None,
306
- max: Optional[Union[int, float, ndarray]] = None,
377
+ min: float | Array | None = None,
378
+ max: float | Array | None = None,
307
379
  *,
308
- xp,
380
+ xp: Namespace,
309
381
  # TODO: np.clip has other ufunc kwargs
310
- out: Optional[ndarray] = None,
311
- ) -> ndarray:
312
- def _isscalar(a):
382
+ out: Array | None = None,
383
+ ) -> Array:
384
+ def _isscalar(a: object) -> TypeIs[int | float | None]:
313
385
  return isinstance(a, (int, float, type(None)))
386
+
314
387
  min_shape = () if _isscalar(min) else min.shape
315
388
  max_shape = () if _isscalar(max) else max.shape
316
389
 
@@ -335,44 +408,51 @@ def clip(
335
408
  # but an answer of 0 might be preferred. See
336
409
  # https://github.com/numpy/numpy/issues/24976 for more discussion on this issue.
337
410
 
338
-
339
411
  # At least handle the case of Python integers correctly (see
340
412
  # https://github.com/numpy/numpy/pull/26892).
341
- if type(min) is int and min <= wrapped_xp.iinfo(x.dtype).min:
342
- min = None
343
- if type(max) is int and max >= wrapped_xp.iinfo(x.dtype).max:
344
- max = None
413
+ if wrapped_xp.isdtype(x.dtype, "integral"):
414
+ if type(min) is int and min <= wrapped_xp.iinfo(x.dtype).min:
415
+ min = None
416
+ if type(max) is int and max >= wrapped_xp.iinfo(x.dtype).max:
417
+ max = None
345
418
 
419
+ dev = _get_device(x)
346
420
  if out is None:
347
- out = wrapped_xp.asarray(xp.broadcast_to(x, result_shape),
348
- copy=True, device=device(x))
421
+ out = wrapped_xp.empty(result_shape, dtype=x.dtype, device=dev)
422
+ assert out is not None # workaround for a type-narrowing issue in pyright
423
+ out[()] = x
424
+
349
425
  if min is not None:
350
- if is_torch_array(x) and x.dtype == xp.float64 and _isscalar(min):
351
- # Avoid loss of precision due to torch defaulting to float32
352
- min = wrapped_xp.asarray(min, dtype=xp.float64)
353
- a = xp.broadcast_to(wrapped_xp.asarray(min, device=device(x)), result_shape)
426
+ a = wrapped_xp.asarray(min, dtype=x.dtype, device=dev)
427
+ a = xp.broadcast_to(a, result_shape)
354
428
  ia = (out < a) | xp.isnan(a)
355
- # torch requires an explicit cast here
356
- out[ia] = wrapped_xp.astype(a[ia], out.dtype)
429
+ out[ia] = a[ia]
430
+
357
431
  if max is not None:
358
- if is_torch_array(x) and x.dtype == xp.float64 and _isscalar(max):
359
- max = wrapped_xp.asarray(max, dtype=xp.float64)
360
- b = xp.broadcast_to(wrapped_xp.asarray(max, device=device(x)), result_shape)
432
+ b = wrapped_xp.asarray(max, dtype=x.dtype, device=dev)
433
+ b = xp.broadcast_to(b, result_shape)
361
434
  ib = (out > b) | xp.isnan(b)
362
- out[ib] = wrapped_xp.astype(b[ib], out.dtype)
435
+ out[ib] = b[ib]
436
+
363
437
  # Return a scalar for 0-D
364
438
  return out[()]
365
439
 
440
+
366
441
  # Unlike transpose(), the axes argument to permute_dims() is required.
367
- def permute_dims(x: ndarray, /, axes: Tuple[int, ...], xp) -> ndarray:
442
+ def permute_dims(x: Array, /, axes: tuple[int, ...], xp: Namespace) -> Array:
368
443
  return xp.transpose(x, axes)
369
444
 
445
+
370
446
  # np.reshape calls the keyword argument 'newshape' instead of 'shape'
371
- def reshape(x: ndarray,
372
- /,
373
- shape: Tuple[int, ...],
374
- xp, copy: Optional[bool] = None,
375
- **kwargs) -> ndarray:
447
+ def reshape(
448
+ x: Array,
449
+ /,
450
+ shape: tuple[int, ...],
451
+ xp: Namespace,
452
+ *,
453
+ copy: Optional[bool] = None,
454
+ **kwargs: object,
455
+ ) -> Array:
376
456
  if copy is True:
377
457
  x = x.copy()
378
458
  elif copy is False:
@@ -381,17 +461,24 @@ def reshape(x: ndarray,
381
461
  return y
382
462
  return xp.reshape(x, shape, **kwargs)
383
463
 
464
+
384
465
  # The descending keyword is new in sort and argsort, and 'kind' replaced with
385
466
  # 'stable'
386
467
  def argsort(
387
- x: ndarray, /, xp, *, axis: int = -1, descending: bool = False, stable: bool = True,
388
- **kwargs,
389
- ) -> ndarray:
468
+ x: Array,
469
+ /,
470
+ xp: Namespace,
471
+ *,
472
+ axis: int = -1,
473
+ descending: bool = False,
474
+ stable: bool = True,
475
+ **kwargs: object,
476
+ ) -> Array:
390
477
  # Note: this keyword argument is different, and the default is different.
391
478
  # We set it in kwargs like this because numpy.sort uses kind='quicksort'
392
479
  # as the default whereas cupy.sort uses kind=None.
393
480
  if stable:
394
- kwargs['kind'] = "stable"
481
+ kwargs["kind"] = "stable"
395
482
  if not descending:
396
483
  res = xp.argsort(x, axis=axis, **kwargs)
397
484
  else:
@@ -408,69 +495,87 @@ def argsort(
408
495
  res = max_i - res
409
496
  return res
410
497
 
498
+
411
499
  def sort(
412
- x: ndarray, /, xp, *, axis: int = -1, descending: bool = False, stable: bool = True,
413
- **kwargs,
414
- ) -> ndarray:
500
+ x: Array,
501
+ /,
502
+ xp: Namespace,
503
+ *,
504
+ axis: int = -1,
505
+ descending: bool = False,
506
+ stable: bool = True,
507
+ **kwargs: object,
508
+ ) -> Array:
415
509
  # Note: this keyword argument is different, and the default is different.
416
510
  # We set it in kwargs like this because numpy.sort uses kind='quicksort'
417
511
  # as the default whereas cupy.sort uses kind=None.
418
512
  if stable:
419
- kwargs['kind'] = "stable"
513
+ kwargs["kind"] = "stable"
420
514
  res = xp.sort(x, axis=axis, **kwargs)
421
515
  if descending:
422
516
  res = xp.flip(res, axis=axis)
423
517
  return res
424
518
 
519
+
425
520
  # nonzero should error for zero-dimensional arrays
426
- def nonzero(x: ndarray, /, xp, **kwargs) -> Tuple[ndarray, ...]:
521
+ def nonzero(x: Array, /, xp: Namespace, **kwargs: object) -> tuple[Array, ...]:
427
522
  if x.ndim == 0:
428
523
  raise ValueError("nonzero() does not support zero-dimensional arrays")
429
524
  return xp.nonzero(x, **kwargs)
430
525
 
526
+
431
527
  # ceil, floor, and trunc return integers for integer inputs
432
528
 
433
- def ceil(x: ndarray, /, xp, **kwargs) -> ndarray:
529
+
530
+ def ceil(x: Array, /, xp: Namespace, **kwargs: object) -> Array:
434
531
  if xp.issubdtype(x.dtype, xp.integer):
435
532
  return x
436
533
  return xp.ceil(x, **kwargs)
437
534
 
438
- def floor(x: ndarray, /, xp, **kwargs) -> ndarray:
535
+
536
+ def floor(x: Array, /, xp: Namespace, **kwargs: object) -> Array:
439
537
  if xp.issubdtype(x.dtype, xp.integer):
440
538
  return x
441
539
  return xp.floor(x, **kwargs)
442
540
 
443
- def trunc(x: ndarray, /, xp, **kwargs) -> ndarray:
541
+
542
+ def trunc(x: Array, /, xp: Namespace, **kwargs: object) -> Array:
444
543
  if xp.issubdtype(x.dtype, xp.integer):
445
544
  return x
446
545
  return xp.trunc(x, **kwargs)
447
546
 
547
+
448
548
  # linear algebra functions
449
549
 
450
- def matmul(x1: ndarray, x2: ndarray, /, xp, **kwargs) -> ndarray:
550
+
551
+ def matmul(x1: Array, x2: Array, /, xp: Namespace, **kwargs: object) -> Array:
451
552
  return xp.matmul(x1, x2, **kwargs)
452
553
 
554
+
453
555
  # Unlike transpose, matrix_transpose only transposes the last two axes.
454
- def matrix_transpose(x: ndarray, /, xp) -> ndarray:
556
+ def matrix_transpose(x: Array, /, xp: Namespace) -> Array:
455
557
  if x.ndim < 2:
456
558
  raise ValueError("x must be at least 2-dimensional for matrix_transpose")
457
559
  return xp.swapaxes(x, -1, -2)
458
560
 
459
- def tensordot(x1: ndarray,
460
- x2: ndarray,
461
- /,
462
- xp,
463
- *,
464
- axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2,
465
- **kwargs,
466
- ) -> ndarray:
561
+
562
+ def tensordot(
563
+ x1: Array,
564
+ x2: Array,
565
+ /,
566
+ xp: Namespace,
567
+ *,
568
+ axes: int | tuple[Sequence[int], Sequence[int]] = 2,
569
+ **kwargs: object,
570
+ ) -> Array:
467
571
  return xp.tensordot(x1, x2, axes=axes, **kwargs)
468
572
 
469
- def vecdot(x1: ndarray, x2: ndarray, /, xp, *, axis: int = -1) -> ndarray:
573
+
574
+ def vecdot(x1: Array, x2: Array, /, xp: Namespace, *, axis: int = -1) -> Array:
470
575
  if x1.shape[axis] != x2.shape[axis]:
471
576
  raise ValueError("x1 and x2 must have the same size along the given axis")
472
577
 
473
- if hasattr(xp, 'broadcast_tensors'):
578
+ if hasattr(xp, "broadcast_tensors"):
474
579
  _broadcast = xp.broadcast_tensors
475
580
  else:
476
581
  _broadcast = xp.broadcast_arrays
@@ -479,14 +584,19 @@ def vecdot(x1: ndarray, x2: ndarray, /, xp, *, axis: int = -1) -> ndarray:
479
584
  x2_ = xp.moveaxis(x2, axis, -1)
480
585
  x1_, x2_ = _broadcast(x1_, x2_)
481
586
 
482
- res = x1_[..., None, :] @ x2_[..., None]
587
+ res = xp.conj(x1_[..., None, :]) @ x2_[..., None]
483
588
  return res[..., 0, 0]
484
589
 
590
+
485
591
  # isdtype is a new function in the 2022.12 array API specification.
486
592
 
593
+
487
594
  def isdtype(
488
- dtype: Dtype, kind: Union[Dtype, str, Tuple[Union[Dtype, str], ...]], xp,
489
- *, _tuple=True, # Disallow nested tuples
595
+ dtype: DType,
596
+ kind: DType | str | tuple[DType | str, ...],
597
+ xp: Namespace,
598
+ *,
599
+ _tuple: bool = True, # Disallow nested tuples
490
600
  ) -> bool:
491
601
  """
492
602
  Returns a boolean indicating whether a provided dtype is of a specified data type ``kind``.
@@ -499,21 +609,24 @@ def isdtype(
499
609
  for more details
500
610
  """
501
611
  if isinstance(kind, tuple) and _tuple:
502
- return any(isdtype(dtype, k, xp, _tuple=False) for k in kind)
612
+ return any(
613
+ isdtype(dtype, k, xp, _tuple=False)
614
+ for k in cast("tuple[DType | str, ...]", kind)
615
+ )
503
616
  elif isinstance(kind, str):
504
- if kind == 'bool':
617
+ if kind == "bool":
505
618
  return dtype == xp.bool_
506
- elif kind == 'signed integer':
619
+ elif kind == "signed integer":
507
620
  return xp.issubdtype(dtype, xp.signedinteger)
508
- elif kind == 'unsigned integer':
621
+ elif kind == "unsigned integer":
509
622
  return xp.issubdtype(dtype, xp.unsignedinteger)
510
- elif kind == 'integral':
623
+ elif kind == "integral":
511
624
  return xp.issubdtype(dtype, xp.integer)
512
- elif kind == 'real floating':
625
+ elif kind == "real floating":
513
626
  return xp.issubdtype(dtype, xp.floating)
514
- elif kind == 'complex floating':
627
+ elif kind == "complex floating":
515
628
  return xp.issubdtype(dtype, xp.complexfloating)
516
- elif kind == 'numeric':
629
+ elif kind == "numeric":
517
630
  return xp.issubdtype(dtype, xp.number)
518
631
  else:
519
632
  raise ValueError(f"Unrecognized data type kind: {kind!r}")
@@ -524,32 +637,91 @@ def isdtype(
524
637
  # array_api_strict implementation will be very strict.
525
638
  return dtype == kind
526
639
 
640
+
527
641
  # unstack is a new function in the 2023.12 array API standard
528
- def unstack(x: ndarray, /, xp, *, axis: int = 0) -> Tuple[ndarray, ...]:
642
+ def unstack(x: Array, /, xp: Namespace, *, axis: int = 0) -> tuple[Array, ...]:
529
643
  if x.ndim == 0:
530
644
  raise ValueError("Input array must be at least 1-d.")
531
645
  return tuple(xp.moveaxis(x, axis, 0))
532
646
 
647
+
533
648
  # numpy 1.26 does not use the standard definition for sign on complex numbers
534
649
 
535
- def sign(x: ndarray, /, xp, **kwargs) -> ndarray:
536
- if isdtype(x.dtype, 'complex floating', xp=xp):
537
- out = (x/xp.abs(x, **kwargs))[...]
650
+
651
+ def sign(x: Array, /, xp: Namespace, **kwargs: object) -> Array:
652
+ if isdtype(x.dtype, "complex floating", xp=xp):
653
+ out = (x / xp.abs(x, **kwargs))[...]
538
654
  # sign(0) = 0 but the above formula would give nan
539
- out[x == 0+0j] = 0+0j
655
+ out[x == 0j] = 0j
540
656
  else:
541
657
  out = xp.sign(x, **kwargs)
542
658
  # CuPy sign() does not propagate nans. See
543
659
  # https://github.com/data-apis/array-api-compat/issues/136
544
- if is_cupy_namespace(xp) and isdtype(x.dtype, 'real floating', xp=xp):
660
+ if _is_cupy_namespace(xp) and isdtype(x.dtype, "real floating", xp=xp):
545
661
  out[xp.isnan(x)] = xp.nan
546
662
  return out[()]
547
663
 
548
- __all__ = ['arange', 'empty', 'empty_like', 'eye', 'full', 'full_like',
549
- 'linspace', 'ones', 'ones_like', 'zeros', 'zeros_like',
550
- 'UniqueAllResult', 'UniqueCountsResult', 'UniqueInverseResult',
551
- 'unique_all', 'unique_counts', 'unique_inverse', 'unique_values',
552
- 'astype', 'std', 'var', 'cumulative_sum', 'clip', 'permute_dims',
553
- 'reshape', 'argsort', 'sort', 'nonzero', 'ceil', 'floor', 'trunc',
554
- 'matmul', 'matrix_transpose', 'tensordot', 'vecdot', 'isdtype',
555
- 'unstack', 'sign']
664
+
665
+ def finfo(type_: DType | Array, /, xp: Namespace) -> Any:
666
+ # It is surprisingly difficult to recognize a dtype apart from an array.
667
+ # np.int64 is not the same as np.asarray(1).dtype!
668
+ try:
669
+ return xp.finfo(type_)
670
+ except (ValueError, TypeError):
671
+ return xp.finfo(type_.dtype)
672
+
673
+
674
+ def iinfo(type_: DType | Array, /, xp: Namespace) -> Any:
675
+ try:
676
+ return xp.iinfo(type_)
677
+ except (ValueError, TypeError):
678
+ return xp.iinfo(type_.dtype)
679
+
680
+
681
+ __all__ = [
682
+ "arange",
683
+ "empty",
684
+ "empty_like",
685
+ "eye",
686
+ "full",
687
+ "full_like",
688
+ "linspace",
689
+ "ones",
690
+ "ones_like",
691
+ "zeros",
692
+ "zeros_like",
693
+ "UniqueAllResult",
694
+ "UniqueCountsResult",
695
+ "UniqueInverseResult",
696
+ "unique_all",
697
+ "unique_counts",
698
+ "unique_inverse",
699
+ "unique_values",
700
+ "std",
701
+ "var",
702
+ "cumulative_sum",
703
+ "cumulative_prod",
704
+ "clip",
705
+ "permute_dims",
706
+ "reshape",
707
+ "argsort",
708
+ "sort",
709
+ "nonzero",
710
+ "ceil",
711
+ "floor",
712
+ "trunc",
713
+ "matmul",
714
+ "matrix_transpose",
715
+ "tensordot",
716
+ "vecdot",
717
+ "isdtype",
718
+ "unstack",
719
+ "sign",
720
+ "finfo",
721
+ "iinfo",
722
+ ]
723
+ _all_ignore = ["inspect", "array_namespace", "NamedTuple"]
724
+
725
+
726
+ def __dir__() -> list[str]:
727
+ return __all__