scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp313-cp313-musllinux_1_2_aarch64.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.
- scipy/__config__.py +10 -10
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/cluster/_vq.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/pypocketfft.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_multivariate.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/integrate/_vode.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_fitpack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_fast_matrix_market/_fmm_core.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
- scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
- scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
- scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.so +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
- scipy.libs/libgcc_s-7393e603.so.1 +0 -0
- scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -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
|
-
|
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:
|
25
|
+
start: float,
|
23
26
|
/,
|
24
|
-
stop:
|
25
|
-
step:
|
27
|
+
stop: float | None = None,
|
28
|
+
step: float = 1,
|
26
29
|
*,
|
27
|
-
xp,
|
28
|
-
dtype:
|
29
|
-
device:
|
30
|
-
**kwargs
|
31
|
-
) ->
|
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:
|
37
|
-
xp,
|
40
|
+
shape: int | tuple[int, ...],
|
41
|
+
xp: Namespace,
|
38
42
|
*,
|
39
|
-
dtype:
|
40
|
-
device:
|
41
|
-
**kwargs
|
42
|
-
) ->
|
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:
|
48
|
-
|
49
|
-
|
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:
|
66
|
+
n_cols: int | None = None,
|
56
67
|
/,
|
57
68
|
*,
|
58
|
-
xp,
|
69
|
+
xp: Namespace,
|
59
70
|
k: int = 0,
|
60
|
-
dtype:
|
61
|
-
device:
|
62
|
-
**kwargs,
|
63
|
-
) ->
|
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:
|
69
|
-
fill_value:
|
70
|
-
xp,
|
80
|
+
shape: int | tuple[int, ...],
|
81
|
+
fill_value: complex,
|
82
|
+
xp: Namespace,
|
71
83
|
*,
|
72
|
-
dtype:
|
73
|
-
device:
|
74
|
-
**kwargs,
|
75
|
-
) ->
|
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:
|
93
|
+
x: Array,
|
81
94
|
/,
|
82
|
-
fill_value:
|
95
|
+
fill_value: complex,
|
83
96
|
*,
|
84
|
-
xp,
|
85
|
-
dtype:
|
86
|
-
device:
|
87
|
-
**kwargs,
|
88
|
-
) ->
|
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:
|
94
|
-
stop:
|
107
|
+
start: float,
|
108
|
+
stop: float,
|
95
109
|
/,
|
96
110
|
num: int,
|
97
111
|
*,
|
98
|
-
xp,
|
99
|
-
dtype:
|
100
|
-
device:
|
112
|
+
xp: Namespace,
|
113
|
+
dtype: DType | None = None,
|
114
|
+
device: Device | None = None,
|
101
115
|
endpoint: bool = True,
|
102
|
-
**kwargs,
|
103
|
-
) ->
|
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:
|
109
|
-
xp,
|
123
|
+
shape: int | tuple[int, ...],
|
124
|
+
xp: Namespace,
|
110
125
|
*,
|
111
|
-
dtype:
|
112
|
-
device:
|
113
|
-
**kwargs,
|
114
|
-
) ->
|
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:
|
120
|
-
|
121
|
-
|
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:
|
127
|
-
xp,
|
148
|
+
shape: int | tuple[int, ...],
|
149
|
+
xp: Namespace,
|
128
150
|
*,
|
129
|
-
dtype:
|
130
|
-
device:
|
131
|
-
**kwargs,
|
132
|
-
) ->
|
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:
|
138
|
-
|
139
|
-
|
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:
|
154
|
-
indices:
|
155
|
-
inverse_indices:
|
156
|
-
counts:
|
183
|
+
values: Array
|
184
|
+
indices: Array
|
185
|
+
inverse_indices: Array
|
186
|
+
counts: Array
|
157
187
|
|
158
188
|
|
159
189
|
class UniqueCountsResult(NamedTuple):
|
160
|
-
values:
|
161
|
-
counts:
|
190
|
+
values: Array
|
191
|
+
counts: Array
|
162
192
|
|
163
193
|
|
164
194
|
class UniqueInverseResult(NamedTuple):
|
165
|
-
values:
|
166
|
-
inverse_indices:
|
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
|
175
|
-
return {
|
204
|
+
if "equal_nan" in s.parameters:
|
205
|
+
return {"equal_nan": False}
|
176
206
|
return {}
|
177
207
|
|
178
|
-
|
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:
|
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:
|
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:
|
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:
|
268
|
+
x: Array,
|
245
269
|
/,
|
246
|
-
xp,
|
270
|
+
xp: Namespace,
|
247
271
|
*,
|
248
|
-
axis:
|
249
|
-
correction:
|
272
|
+
axis: int | tuple[int, ...] | None = None,
|
273
|
+
correction: float = 0.0, # correction instead of ddof
|
250
274
|
keepdims: bool = False,
|
251
|
-
**kwargs,
|
252
|
-
) ->
|
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:
|
281
|
+
x: Array,
|
257
282
|
/,
|
258
|
-
xp,
|
283
|
+
xp: Namespace,
|
259
284
|
*,
|
260
|
-
axis:
|
261
|
-
correction:
|
285
|
+
axis: int | tuple[int, ...] | None = None,
|
286
|
+
correction: float = 0.0, # correction instead of ddof
|
262
287
|
keepdims: bool = False,
|
263
|
-
**kwargs,
|
264
|
-
) ->
|
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:
|
298
|
+
x: Array,
|
272
299
|
/,
|
273
|
-
xp,
|
300
|
+
xp: Namespace,
|
274
301
|
*,
|
275
|
-
axis:
|
276
|
-
dtype:
|
302
|
+
axis: int | None = None,
|
303
|
+
dtype: DType | None = None,
|
277
304
|
include_initial: bool = False,
|
278
|
-
**kwargs
|
279
|
-
) ->
|
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(
|
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
|
-
[
|
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:
|
375
|
+
x: Array,
|
304
376
|
/,
|
305
|
-
min:
|
306
|
-
max:
|
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:
|
311
|
-
) ->
|
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
|
342
|
-
min
|
343
|
-
|
344
|
-
max
|
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.
|
348
|
-
|
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
|
-
|
351
|
-
|
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
|
-
|
356
|
-
|
429
|
+
out[ia] = a[ia]
|
430
|
+
|
357
431
|
if max is not None:
|
358
|
-
|
359
|
-
|
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] =
|
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:
|
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(
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
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:
|
388
|
-
|
389
|
-
|
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[
|
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:
|
413
|
-
|
414
|
-
|
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[
|
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:
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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:
|
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
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
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
|
-
|
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,
|
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:
|
489
|
-
|
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(
|
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 ==
|
617
|
+
if kind == "bool":
|
505
618
|
return dtype == xp.bool_
|
506
|
-
elif kind ==
|
619
|
+
elif kind == "signed integer":
|
507
620
|
return xp.issubdtype(dtype, xp.signedinteger)
|
508
|
-
elif kind ==
|
621
|
+
elif kind == "unsigned integer":
|
509
622
|
return xp.issubdtype(dtype, xp.unsignedinteger)
|
510
|
-
elif kind ==
|
623
|
+
elif kind == "integral":
|
511
624
|
return xp.issubdtype(dtype, xp.integer)
|
512
|
-
elif kind ==
|
625
|
+
elif kind == "real floating":
|
513
626
|
return xp.issubdtype(dtype, xp.floating)
|
514
|
-
elif kind ==
|
627
|
+
elif kind == "complex floating":
|
515
628
|
return xp.issubdtype(dtype, xp.complexfloating)
|
516
|
-
elif kind ==
|
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:
|
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
|
-
|
536
|
-
|
537
|
-
|
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 ==
|
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
|
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
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
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__
|