numpy 2.4.1__cp314-cp314t-win_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.
- numpy/__config__.py +170 -0
- numpy/__config__.pyi +108 -0
- numpy/__init__.cython-30.pxd +1242 -0
- numpy/__init__.pxd +1155 -0
- numpy/__init__.py +955 -0
- numpy/__init__.pyi +6202 -0
- numpy/_array_api_info.py +346 -0
- numpy/_array_api_info.pyi +206 -0
- numpy/_configtool.py +39 -0
- numpy/_configtool.pyi +1 -0
- numpy/_core/__init__.py +201 -0
- numpy/_core/__init__.pyi +666 -0
- numpy/_core/_add_newdocs.py +7151 -0
- numpy/_core/_add_newdocs.pyi +2 -0
- numpy/_core/_add_newdocs_scalars.py +381 -0
- numpy/_core/_add_newdocs_scalars.pyi +16 -0
- numpy/_core/_asarray.py +130 -0
- numpy/_core/_asarray.pyi +43 -0
- numpy/_core/_dtype.py +366 -0
- numpy/_core/_dtype.pyi +56 -0
- numpy/_core/_dtype_ctypes.py +120 -0
- numpy/_core/_dtype_ctypes.pyi +83 -0
- numpy/_core/_exceptions.py +162 -0
- numpy/_core/_exceptions.pyi +54 -0
- numpy/_core/_internal.py +968 -0
- numpy/_core/_internal.pyi +61 -0
- numpy/_core/_methods.py +252 -0
- numpy/_core/_methods.pyi +22 -0
- numpy/_core/_multiarray_tests.cp314t-win_arm64.lib +0 -0
- numpy/_core/_multiarray_tests.cp314t-win_arm64.pyd +0 -0
- numpy/_core/_multiarray_umath.cp314t-win_arm64.lib +0 -0
- numpy/_core/_multiarray_umath.cp314t-win_arm64.pyd +0 -0
- numpy/_core/_operand_flag_tests.cp314t-win_arm64.lib +0 -0
- numpy/_core/_operand_flag_tests.cp314t-win_arm64.pyd +0 -0
- numpy/_core/_rational_tests.cp314t-win_arm64.lib +0 -0
- numpy/_core/_rational_tests.cp314t-win_arm64.pyd +0 -0
- numpy/_core/_simd.cp314t-win_arm64.lib +0 -0
- numpy/_core/_simd.cp314t-win_arm64.pyd +0 -0
- numpy/_core/_simd.pyi +35 -0
- numpy/_core/_string_helpers.py +100 -0
- numpy/_core/_string_helpers.pyi +12 -0
- numpy/_core/_struct_ufunc_tests.cp314t-win_arm64.lib +0 -0
- numpy/_core/_struct_ufunc_tests.cp314t-win_arm64.pyd +0 -0
- numpy/_core/_type_aliases.py +131 -0
- numpy/_core/_type_aliases.pyi +86 -0
- numpy/_core/_ufunc_config.py +515 -0
- numpy/_core/_ufunc_config.pyi +69 -0
- numpy/_core/_umath_tests.cp314t-win_arm64.lib +0 -0
- numpy/_core/_umath_tests.cp314t-win_arm64.pyd +0 -0
- numpy/_core/_umath_tests.pyi +47 -0
- numpy/_core/arrayprint.py +1779 -0
- numpy/_core/arrayprint.pyi +158 -0
- numpy/_core/cversions.py +13 -0
- numpy/_core/defchararray.py +1414 -0
- numpy/_core/defchararray.pyi +1150 -0
- numpy/_core/einsumfunc.py +1650 -0
- numpy/_core/einsumfunc.pyi +184 -0
- numpy/_core/fromnumeric.py +4233 -0
- numpy/_core/fromnumeric.pyi +1735 -0
- numpy/_core/function_base.py +547 -0
- numpy/_core/function_base.pyi +276 -0
- numpy/_core/getlimits.py +462 -0
- numpy/_core/getlimits.pyi +124 -0
- numpy/_core/include/numpy/__multiarray_api.c +376 -0
- numpy/_core/include/numpy/__multiarray_api.h +1628 -0
- numpy/_core/include/numpy/__ufunc_api.c +55 -0
- numpy/_core/include/numpy/__ufunc_api.h +349 -0
- numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
- numpy/_core/include/numpy/_numpyconfig.h +33 -0
- numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
- numpy/_core/include/numpy/arrayobject.h +7 -0
- numpy/_core/include/numpy/arrayscalars.h +198 -0
- numpy/_core/include/numpy/dtype_api.h +547 -0
- numpy/_core/include/numpy/halffloat.h +70 -0
- numpy/_core/include/numpy/ndarrayobject.h +304 -0
- numpy/_core/include/numpy/ndarraytypes.h +1982 -0
- numpy/_core/include/numpy/npy_2_compat.h +249 -0
- numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
- numpy/_core/include/numpy/npy_3kcompat.h +374 -0
- numpy/_core/include/numpy/npy_common.h +989 -0
- numpy/_core/include/numpy/npy_cpu.h +126 -0
- numpy/_core/include/numpy/npy_endian.h +79 -0
- numpy/_core/include/numpy/npy_math.h +602 -0
- numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
- numpy/_core/include/numpy/npy_os.h +42 -0
- numpy/_core/include/numpy/numpyconfig.h +185 -0
- numpy/_core/include/numpy/random/LICENSE.txt +21 -0
- numpy/_core/include/numpy/random/bitgen.h +20 -0
- numpy/_core/include/numpy/random/distributions.h +209 -0
- numpy/_core/include/numpy/random/libdivide.h +2079 -0
- numpy/_core/include/numpy/ufuncobject.h +343 -0
- numpy/_core/include/numpy/utils.h +37 -0
- numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
- numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
- numpy/_core/lib/npymath.lib +0 -0
- numpy/_core/lib/pkgconfig/numpy.pc +7 -0
- numpy/_core/memmap.py +363 -0
- numpy/_core/memmap.pyi +3 -0
- numpy/_core/multiarray.py +1740 -0
- numpy/_core/multiarray.pyi +1316 -0
- numpy/_core/numeric.py +2758 -0
- numpy/_core/numeric.pyi +1276 -0
- numpy/_core/numerictypes.py +633 -0
- numpy/_core/numerictypes.pyi +196 -0
- numpy/_core/overrides.py +188 -0
- numpy/_core/overrides.pyi +47 -0
- numpy/_core/printoptions.py +32 -0
- numpy/_core/printoptions.pyi +28 -0
- numpy/_core/records.py +1088 -0
- numpy/_core/records.pyi +340 -0
- numpy/_core/shape_base.py +996 -0
- numpy/_core/shape_base.pyi +182 -0
- numpy/_core/strings.py +1813 -0
- numpy/_core/strings.pyi +536 -0
- numpy/_core/tests/_locales.py +72 -0
- numpy/_core/tests/_natype.py +144 -0
- numpy/_core/tests/data/astype_copy.pkl +0 -0
- numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
- numpy/_core/tests/data/recarray_from_file.fits +0 -0
- numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
- numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
- numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
- numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
- numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
- numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
- numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
- numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
- numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
- numpy/_core/tests/examples/cython/checks.pyx +373 -0
- numpy/_core/tests/examples/cython/meson.build +43 -0
- numpy/_core/tests/examples/cython/setup.py +39 -0
- numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
- numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
- numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
- numpy/_core/tests/examples/limited_api/meson.build +59 -0
- numpy/_core/tests/examples/limited_api/setup.py +24 -0
- numpy/_core/tests/test__exceptions.py +90 -0
- numpy/_core/tests/test_abc.py +54 -0
- numpy/_core/tests/test_api.py +655 -0
- numpy/_core/tests/test_argparse.py +90 -0
- numpy/_core/tests/test_array_api_info.py +113 -0
- numpy/_core/tests/test_array_coercion.py +928 -0
- numpy/_core/tests/test_array_interface.py +222 -0
- numpy/_core/tests/test_arraymethod.py +84 -0
- numpy/_core/tests/test_arrayobject.py +75 -0
- numpy/_core/tests/test_arrayprint.py +1324 -0
- numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
- numpy/_core/tests/test_casting_unittests.py +955 -0
- numpy/_core/tests/test_conversion_utils.py +209 -0
- numpy/_core/tests/test_cpu_dispatcher.py +48 -0
- numpy/_core/tests/test_cpu_features.py +450 -0
- numpy/_core/tests/test_custom_dtypes.py +393 -0
- numpy/_core/tests/test_cython.py +352 -0
- numpy/_core/tests/test_datetime.py +2792 -0
- numpy/_core/tests/test_defchararray.py +858 -0
- numpy/_core/tests/test_deprecations.py +460 -0
- numpy/_core/tests/test_dlpack.py +190 -0
- numpy/_core/tests/test_dtype.py +2110 -0
- numpy/_core/tests/test_einsum.py +1351 -0
- numpy/_core/tests/test_errstate.py +131 -0
- numpy/_core/tests/test_extint128.py +217 -0
- numpy/_core/tests/test_finfo.py +86 -0
- numpy/_core/tests/test_function_base.py +504 -0
- numpy/_core/tests/test_getlimits.py +171 -0
- numpy/_core/tests/test_half.py +593 -0
- numpy/_core/tests/test_hashtable.py +36 -0
- numpy/_core/tests/test_indexerrors.py +122 -0
- numpy/_core/tests/test_indexing.py +1692 -0
- numpy/_core/tests/test_item_selection.py +167 -0
- numpy/_core/tests/test_limited_api.py +102 -0
- numpy/_core/tests/test_longdouble.py +370 -0
- numpy/_core/tests/test_mem_overlap.py +933 -0
- numpy/_core/tests/test_mem_policy.py +453 -0
- numpy/_core/tests/test_memmap.py +248 -0
- numpy/_core/tests/test_multiarray.py +11008 -0
- numpy/_core/tests/test_multiprocessing.py +55 -0
- numpy/_core/tests/test_multithreading.py +377 -0
- numpy/_core/tests/test_nditer.py +3533 -0
- numpy/_core/tests/test_nep50_promotions.py +287 -0
- numpy/_core/tests/test_numeric.py +4295 -0
- numpy/_core/tests/test_numerictypes.py +650 -0
- numpy/_core/tests/test_overrides.py +800 -0
- numpy/_core/tests/test_print.py +202 -0
- numpy/_core/tests/test_protocols.py +46 -0
- numpy/_core/tests/test_records.py +544 -0
- numpy/_core/tests/test_regression.py +2677 -0
- numpy/_core/tests/test_scalar_ctors.py +203 -0
- numpy/_core/tests/test_scalar_methods.py +328 -0
- numpy/_core/tests/test_scalarbuffer.py +153 -0
- numpy/_core/tests/test_scalarinherit.py +105 -0
- numpy/_core/tests/test_scalarmath.py +1168 -0
- numpy/_core/tests/test_scalarprint.py +403 -0
- numpy/_core/tests/test_shape_base.py +904 -0
- numpy/_core/tests/test_simd.py +1345 -0
- numpy/_core/tests/test_simd_module.py +105 -0
- numpy/_core/tests/test_stringdtype.py +1855 -0
- numpy/_core/tests/test_strings.py +1523 -0
- numpy/_core/tests/test_ufunc.py +3405 -0
- numpy/_core/tests/test_umath.py +4962 -0
- numpy/_core/tests/test_umath_accuracy.py +132 -0
- numpy/_core/tests/test_umath_complex.py +631 -0
- numpy/_core/tests/test_unicode.py +369 -0
- numpy/_core/umath.py +60 -0
- numpy/_core/umath.pyi +232 -0
- numpy/_distributor_init.py +15 -0
- numpy/_distributor_init.pyi +1 -0
- numpy/_expired_attrs_2_0.py +78 -0
- numpy/_expired_attrs_2_0.pyi +61 -0
- numpy/_globals.py +121 -0
- numpy/_globals.pyi +17 -0
- numpy/_pyinstaller/__init__.py +0 -0
- numpy/_pyinstaller/__init__.pyi +0 -0
- numpy/_pyinstaller/hook-numpy.py +36 -0
- numpy/_pyinstaller/hook-numpy.pyi +6 -0
- numpy/_pyinstaller/tests/__init__.py +16 -0
- numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
- numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
- numpy/_pytesttester.py +201 -0
- numpy/_pytesttester.pyi +18 -0
- numpy/_typing/__init__.py +173 -0
- numpy/_typing/_add_docstring.py +153 -0
- numpy/_typing/_array_like.py +106 -0
- numpy/_typing/_char_codes.py +213 -0
- numpy/_typing/_dtype_like.py +114 -0
- numpy/_typing/_extended_precision.py +15 -0
- numpy/_typing/_nbit.py +19 -0
- numpy/_typing/_nbit_base.py +94 -0
- numpy/_typing/_nbit_base.pyi +39 -0
- numpy/_typing/_nested_sequence.py +79 -0
- numpy/_typing/_scalars.py +20 -0
- numpy/_typing/_shape.py +8 -0
- numpy/_typing/_ufunc.py +7 -0
- numpy/_typing/_ufunc.pyi +975 -0
- numpy/_utils/__init__.py +95 -0
- numpy/_utils/__init__.pyi +28 -0
- numpy/_utils/_convertions.py +18 -0
- numpy/_utils/_convertions.pyi +4 -0
- numpy/_utils/_inspect.py +192 -0
- numpy/_utils/_inspect.pyi +70 -0
- numpy/_utils/_pep440.py +486 -0
- numpy/_utils/_pep440.pyi +118 -0
- numpy/char/__init__.py +2 -0
- numpy/char/__init__.pyi +111 -0
- numpy/conftest.py +248 -0
- numpy/core/__init__.py +33 -0
- numpy/core/__init__.pyi +0 -0
- numpy/core/_dtype.py +10 -0
- numpy/core/_dtype.pyi +0 -0
- numpy/core/_dtype_ctypes.py +10 -0
- numpy/core/_dtype_ctypes.pyi +0 -0
- numpy/core/_internal.py +27 -0
- numpy/core/_multiarray_umath.py +57 -0
- numpy/core/_utils.py +21 -0
- numpy/core/arrayprint.py +10 -0
- numpy/core/defchararray.py +10 -0
- numpy/core/einsumfunc.py +10 -0
- numpy/core/fromnumeric.py +10 -0
- numpy/core/function_base.py +10 -0
- numpy/core/getlimits.py +10 -0
- numpy/core/multiarray.py +25 -0
- numpy/core/numeric.py +12 -0
- numpy/core/numerictypes.py +10 -0
- numpy/core/overrides.py +10 -0
- numpy/core/overrides.pyi +7 -0
- numpy/core/records.py +10 -0
- numpy/core/shape_base.py +10 -0
- numpy/core/umath.py +10 -0
- numpy/ctypeslib/__init__.py +13 -0
- numpy/ctypeslib/__init__.pyi +15 -0
- numpy/ctypeslib/_ctypeslib.py +603 -0
- numpy/ctypeslib/_ctypeslib.pyi +236 -0
- numpy/doc/ufuncs.py +138 -0
- numpy/dtypes.py +41 -0
- numpy/dtypes.pyi +630 -0
- numpy/exceptions.py +246 -0
- numpy/exceptions.pyi +27 -0
- numpy/f2py/__init__.py +86 -0
- numpy/f2py/__init__.pyi +5 -0
- numpy/f2py/__main__.py +5 -0
- numpy/f2py/__version__.py +1 -0
- numpy/f2py/__version__.pyi +1 -0
- numpy/f2py/_backends/__init__.py +9 -0
- numpy/f2py/_backends/__init__.pyi +5 -0
- numpy/f2py/_backends/_backend.py +44 -0
- numpy/f2py/_backends/_backend.pyi +46 -0
- numpy/f2py/_backends/_distutils.py +76 -0
- numpy/f2py/_backends/_distutils.pyi +13 -0
- numpy/f2py/_backends/_meson.py +244 -0
- numpy/f2py/_backends/_meson.pyi +62 -0
- numpy/f2py/_backends/meson.build.template +58 -0
- numpy/f2py/_isocbind.py +62 -0
- numpy/f2py/_isocbind.pyi +13 -0
- numpy/f2py/_src_pyf.py +247 -0
- numpy/f2py/_src_pyf.pyi +28 -0
- numpy/f2py/auxfuncs.py +1004 -0
- numpy/f2py/auxfuncs.pyi +262 -0
- numpy/f2py/capi_maps.py +811 -0
- numpy/f2py/capi_maps.pyi +33 -0
- numpy/f2py/cb_rules.py +665 -0
- numpy/f2py/cb_rules.pyi +17 -0
- numpy/f2py/cfuncs.py +1563 -0
- numpy/f2py/cfuncs.pyi +31 -0
- numpy/f2py/common_rules.py +143 -0
- numpy/f2py/common_rules.pyi +9 -0
- numpy/f2py/crackfortran.py +3725 -0
- numpy/f2py/crackfortran.pyi +266 -0
- numpy/f2py/diagnose.py +149 -0
- numpy/f2py/diagnose.pyi +1 -0
- numpy/f2py/f2py2e.py +788 -0
- numpy/f2py/f2py2e.pyi +74 -0
- numpy/f2py/f90mod_rules.py +269 -0
- numpy/f2py/f90mod_rules.pyi +16 -0
- numpy/f2py/func2subr.py +329 -0
- numpy/f2py/func2subr.pyi +7 -0
- numpy/f2py/rules.py +1629 -0
- numpy/f2py/rules.pyi +41 -0
- numpy/f2py/setup.cfg +3 -0
- numpy/f2py/src/fortranobject.c +1436 -0
- numpy/f2py/src/fortranobject.h +173 -0
- numpy/f2py/symbolic.py +1518 -0
- numpy/f2py/symbolic.pyi +219 -0
- numpy/f2py/tests/__init__.py +16 -0
- numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
- numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
- numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
- numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
- numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
- numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
- numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
- numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
- numpy/f2py/tests/src/block_docstring/foo.f +6 -0
- numpy/f2py/tests/src/callback/foo.f +62 -0
- numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
- numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
- numpy/f2py/tests/src/callback/gh25211.f +10 -0
- numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
- numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
- numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
- numpy/f2py/tests/src/cli/hi77.f +3 -0
- numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
- numpy/f2py/tests/src/common/block.f +11 -0
- numpy/f2py/tests/src/common/gh19161.f90 +10 -0
- numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
- numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
- numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
- numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
- numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
- numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
- numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
- numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
- numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
- numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
- numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
- numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
- numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
- numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
- numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
- numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
- numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
- numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
- numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
- numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
- numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
- numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
- numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
- numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
- numpy/f2py/tests/src/kind/foo.f90 +20 -0
- numpy/f2py/tests/src/mixed/foo.f +5 -0
- numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
- numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
- numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
- numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
- numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
- numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
- numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
- numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
- numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
- numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
- numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
- numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
- numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
- numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
- numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
- numpy/f2py/tests/src/quoted_character/foo.f +14 -0
- numpy/f2py/tests/src/regression/AB.inc +1 -0
- numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
- numpy/f2py/tests/src/regression/datonly.f90 +17 -0
- numpy/f2py/tests/src/regression/f77comments.f +26 -0
- numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
- numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
- numpy/f2py/tests/src/regression/incfile.f90 +5 -0
- numpy/f2py/tests/src/regression/inout.f90 +9 -0
- numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
- numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
- numpy/f2py/tests/src/return_character/foo77.f +45 -0
- numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
- numpy/f2py/tests/src/return_complex/foo77.f +45 -0
- numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
- numpy/f2py/tests/src/return_integer/foo77.f +56 -0
- numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
- numpy/f2py/tests/src/return_logical/foo77.f +56 -0
- numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
- numpy/f2py/tests/src/return_real/foo77.f +45 -0
- numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
- numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
- numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
- numpy/f2py/tests/src/routines/subrout.f +4 -0
- numpy/f2py/tests/src/routines/subrout.pyf +10 -0
- numpy/f2py/tests/src/size/foo.f90 +44 -0
- numpy/f2py/tests/src/string/char.f90 +29 -0
- numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
- numpy/f2py/tests/src/string/gh24008.f +8 -0
- numpy/f2py/tests/src/string/gh24662.f90 +7 -0
- numpy/f2py/tests/src/string/gh25286.f90 +14 -0
- numpy/f2py/tests/src/string/gh25286.pyf +12 -0
- numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
- numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
- numpy/f2py/tests/src/string/string.f +12 -0
- numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
- numpy/f2py/tests/test_abstract_interface.py +26 -0
- numpy/f2py/tests/test_array_from_pyobj.py +678 -0
- numpy/f2py/tests/test_assumed_shape.py +50 -0
- numpy/f2py/tests/test_block_docstring.py +20 -0
- numpy/f2py/tests/test_callback.py +263 -0
- numpy/f2py/tests/test_character.py +641 -0
- numpy/f2py/tests/test_common.py +23 -0
- numpy/f2py/tests/test_crackfortran.py +421 -0
- numpy/f2py/tests/test_data.py +71 -0
- numpy/f2py/tests/test_docs.py +66 -0
- numpy/f2py/tests/test_f2cmap.py +17 -0
- numpy/f2py/tests/test_f2py2e.py +983 -0
- numpy/f2py/tests/test_isoc.py +56 -0
- numpy/f2py/tests/test_kind.py +52 -0
- numpy/f2py/tests/test_mixed.py +35 -0
- numpy/f2py/tests/test_modules.py +83 -0
- numpy/f2py/tests/test_parameter.py +129 -0
- numpy/f2py/tests/test_pyf_src.py +43 -0
- numpy/f2py/tests/test_quoted_character.py +18 -0
- numpy/f2py/tests/test_regression.py +187 -0
- numpy/f2py/tests/test_return_character.py +48 -0
- numpy/f2py/tests/test_return_complex.py +67 -0
- numpy/f2py/tests/test_return_integer.py +55 -0
- numpy/f2py/tests/test_return_logical.py +65 -0
- numpy/f2py/tests/test_return_real.py +109 -0
- numpy/f2py/tests/test_routines.py +29 -0
- numpy/f2py/tests/test_semicolon_split.py +75 -0
- numpy/f2py/tests/test_size.py +45 -0
- numpy/f2py/tests/test_string.py +100 -0
- numpy/f2py/tests/test_symbolic.py +500 -0
- numpy/f2py/tests/test_value_attrspec.py +15 -0
- numpy/f2py/tests/util.py +442 -0
- numpy/f2py/use_rules.py +99 -0
- numpy/f2py/use_rules.pyi +9 -0
- numpy/fft/__init__.py +213 -0
- numpy/fft/__init__.pyi +38 -0
- numpy/fft/_helper.py +235 -0
- numpy/fft/_helper.pyi +44 -0
- numpy/fft/_pocketfft.py +1693 -0
- numpy/fft/_pocketfft.pyi +137 -0
- numpy/fft/_pocketfft_umath.cp314t-win_arm64.lib +0 -0
- numpy/fft/_pocketfft_umath.cp314t-win_arm64.pyd +0 -0
- numpy/fft/tests/__init__.py +0 -0
- numpy/fft/tests/test_helper.py +167 -0
- numpy/fft/tests/test_pocketfft.py +589 -0
- numpy/lib/__init__.py +97 -0
- numpy/lib/__init__.pyi +52 -0
- numpy/lib/_array_utils_impl.py +62 -0
- numpy/lib/_array_utils_impl.pyi +10 -0
- numpy/lib/_arraypad_impl.py +926 -0
- numpy/lib/_arraypad_impl.pyi +88 -0
- numpy/lib/_arraysetops_impl.py +1158 -0
- numpy/lib/_arraysetops_impl.pyi +462 -0
- numpy/lib/_arrayterator_impl.py +224 -0
- numpy/lib/_arrayterator_impl.pyi +45 -0
- numpy/lib/_datasource.py +700 -0
- numpy/lib/_datasource.pyi +30 -0
- numpy/lib/_format_impl.py +1036 -0
- numpy/lib/_format_impl.pyi +56 -0
- numpy/lib/_function_base_impl.py +5760 -0
- numpy/lib/_function_base_impl.pyi +2324 -0
- numpy/lib/_histograms_impl.py +1085 -0
- numpy/lib/_histograms_impl.pyi +40 -0
- numpy/lib/_index_tricks_impl.py +1048 -0
- numpy/lib/_index_tricks_impl.pyi +267 -0
- numpy/lib/_iotools.py +900 -0
- numpy/lib/_iotools.pyi +116 -0
- numpy/lib/_nanfunctions_impl.py +2006 -0
- numpy/lib/_nanfunctions_impl.pyi +48 -0
- numpy/lib/_npyio_impl.py +2583 -0
- numpy/lib/_npyio_impl.pyi +299 -0
- numpy/lib/_polynomial_impl.py +1465 -0
- numpy/lib/_polynomial_impl.pyi +338 -0
- numpy/lib/_scimath_impl.py +642 -0
- numpy/lib/_scimath_impl.pyi +93 -0
- numpy/lib/_shape_base_impl.py +1289 -0
- numpy/lib/_shape_base_impl.pyi +236 -0
- numpy/lib/_stride_tricks_impl.py +582 -0
- numpy/lib/_stride_tricks_impl.pyi +73 -0
- numpy/lib/_twodim_base_impl.py +1201 -0
- numpy/lib/_twodim_base_impl.pyi +408 -0
- numpy/lib/_type_check_impl.py +710 -0
- numpy/lib/_type_check_impl.pyi +348 -0
- numpy/lib/_ufunclike_impl.py +199 -0
- numpy/lib/_ufunclike_impl.pyi +60 -0
- numpy/lib/_user_array_impl.py +310 -0
- numpy/lib/_user_array_impl.pyi +226 -0
- numpy/lib/_utils_impl.py +784 -0
- numpy/lib/_utils_impl.pyi +22 -0
- numpy/lib/_version.py +153 -0
- numpy/lib/_version.pyi +17 -0
- numpy/lib/array_utils.py +7 -0
- numpy/lib/array_utils.pyi +6 -0
- numpy/lib/format.py +24 -0
- numpy/lib/format.pyi +24 -0
- numpy/lib/introspect.py +94 -0
- numpy/lib/introspect.pyi +3 -0
- numpy/lib/mixins.py +180 -0
- numpy/lib/mixins.pyi +78 -0
- numpy/lib/npyio.py +1 -0
- numpy/lib/npyio.pyi +5 -0
- numpy/lib/recfunctions.py +1681 -0
- numpy/lib/recfunctions.pyi +444 -0
- numpy/lib/scimath.py +13 -0
- numpy/lib/scimath.pyi +12 -0
- numpy/lib/stride_tricks.py +1 -0
- numpy/lib/stride_tricks.pyi +4 -0
- numpy/lib/tests/__init__.py +0 -0
- numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
- numpy/lib/tests/data/py2-objarr.npy +0 -0
- numpy/lib/tests/data/py2-objarr.npz +0 -0
- numpy/lib/tests/data/py3-objarr.npy +0 -0
- numpy/lib/tests/data/py3-objarr.npz +0 -0
- numpy/lib/tests/data/python3.npy +0 -0
- numpy/lib/tests/data/win64python2.npy +0 -0
- numpy/lib/tests/test__datasource.py +328 -0
- numpy/lib/tests/test__iotools.py +358 -0
- numpy/lib/tests/test__version.py +64 -0
- numpy/lib/tests/test_array_utils.py +32 -0
- numpy/lib/tests/test_arraypad.py +1427 -0
- numpy/lib/tests/test_arraysetops.py +1302 -0
- numpy/lib/tests/test_arrayterator.py +45 -0
- numpy/lib/tests/test_format.py +1054 -0
- numpy/lib/tests/test_function_base.py +4750 -0
- numpy/lib/tests/test_histograms.py +855 -0
- numpy/lib/tests/test_index_tricks.py +693 -0
- numpy/lib/tests/test_io.py +2857 -0
- numpy/lib/tests/test_loadtxt.py +1099 -0
- numpy/lib/tests/test_mixins.py +215 -0
- numpy/lib/tests/test_nanfunctions.py +1438 -0
- numpy/lib/tests/test_packbits.py +376 -0
- numpy/lib/tests/test_polynomial.py +325 -0
- numpy/lib/tests/test_recfunctions.py +1042 -0
- numpy/lib/tests/test_regression.py +231 -0
- numpy/lib/tests/test_shape_base.py +813 -0
- numpy/lib/tests/test_stride_tricks.py +655 -0
- numpy/lib/tests/test_twodim_base.py +559 -0
- numpy/lib/tests/test_type_check.py +473 -0
- numpy/lib/tests/test_ufunclike.py +97 -0
- numpy/lib/tests/test_utils.py +80 -0
- numpy/lib/user_array.py +1 -0
- numpy/lib/user_array.pyi +1 -0
- numpy/linalg/__init__.py +95 -0
- numpy/linalg/__init__.pyi +71 -0
- numpy/linalg/_linalg.py +3657 -0
- numpy/linalg/_linalg.pyi +548 -0
- numpy/linalg/_umath_linalg.cp314t-win_arm64.lib +0 -0
- numpy/linalg/_umath_linalg.cp314t-win_arm64.pyd +0 -0
- numpy/linalg/_umath_linalg.pyi +60 -0
- numpy/linalg/lapack_lite.cp314t-win_arm64.lib +0 -0
- numpy/linalg/lapack_lite.cp314t-win_arm64.pyd +0 -0
- numpy/linalg/lapack_lite.pyi +143 -0
- numpy/linalg/tests/__init__.py +0 -0
- numpy/linalg/tests/test_deprecations.py +21 -0
- numpy/linalg/tests/test_linalg.py +2442 -0
- numpy/linalg/tests/test_regression.py +182 -0
- numpy/ma/API_CHANGES.txt +135 -0
- numpy/ma/LICENSE +24 -0
- numpy/ma/README.rst +236 -0
- numpy/ma/__init__.py +53 -0
- numpy/ma/__init__.pyi +458 -0
- numpy/ma/core.py +8929 -0
- numpy/ma/core.pyi +3720 -0
- numpy/ma/extras.py +2266 -0
- numpy/ma/extras.pyi +297 -0
- numpy/ma/mrecords.py +762 -0
- numpy/ma/mrecords.pyi +96 -0
- numpy/ma/tests/__init__.py +0 -0
- numpy/ma/tests/test_arrayobject.py +40 -0
- numpy/ma/tests/test_core.py +6008 -0
- numpy/ma/tests/test_deprecations.py +65 -0
- numpy/ma/tests/test_extras.py +1945 -0
- numpy/ma/tests/test_mrecords.py +495 -0
- numpy/ma/tests/test_old_ma.py +939 -0
- numpy/ma/tests/test_regression.py +83 -0
- numpy/ma/tests/test_subclassing.py +469 -0
- numpy/ma/testutils.py +294 -0
- numpy/ma/testutils.pyi +69 -0
- numpy/matlib.py +380 -0
- numpy/matlib.pyi +580 -0
- numpy/matrixlib/__init__.py +12 -0
- numpy/matrixlib/__init__.pyi +3 -0
- numpy/matrixlib/defmatrix.py +1119 -0
- numpy/matrixlib/defmatrix.pyi +218 -0
- numpy/matrixlib/tests/__init__.py +0 -0
- numpy/matrixlib/tests/test_defmatrix.py +455 -0
- numpy/matrixlib/tests/test_interaction.py +360 -0
- numpy/matrixlib/tests/test_masked_matrix.py +240 -0
- numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
- numpy/matrixlib/tests/test_multiarray.py +17 -0
- numpy/matrixlib/tests/test_numeric.py +18 -0
- numpy/matrixlib/tests/test_regression.py +31 -0
- numpy/polynomial/__init__.py +187 -0
- numpy/polynomial/__init__.pyi +31 -0
- numpy/polynomial/_polybase.py +1191 -0
- numpy/polynomial/_polybase.pyi +262 -0
- numpy/polynomial/_polytypes.pyi +501 -0
- numpy/polynomial/chebyshev.py +2001 -0
- numpy/polynomial/chebyshev.pyi +180 -0
- numpy/polynomial/hermite.py +1738 -0
- numpy/polynomial/hermite.pyi +106 -0
- numpy/polynomial/hermite_e.py +1640 -0
- numpy/polynomial/hermite_e.pyi +106 -0
- numpy/polynomial/laguerre.py +1673 -0
- numpy/polynomial/laguerre.pyi +100 -0
- numpy/polynomial/legendre.py +1603 -0
- numpy/polynomial/legendre.pyi +100 -0
- numpy/polynomial/polynomial.py +1625 -0
- numpy/polynomial/polynomial.pyi +109 -0
- numpy/polynomial/polyutils.py +759 -0
- numpy/polynomial/polyutils.pyi +307 -0
- numpy/polynomial/tests/__init__.py +0 -0
- numpy/polynomial/tests/test_chebyshev.py +618 -0
- numpy/polynomial/tests/test_classes.py +613 -0
- numpy/polynomial/tests/test_hermite.py +553 -0
- numpy/polynomial/tests/test_hermite_e.py +554 -0
- numpy/polynomial/tests/test_laguerre.py +535 -0
- numpy/polynomial/tests/test_legendre.py +566 -0
- numpy/polynomial/tests/test_polynomial.py +691 -0
- numpy/polynomial/tests/test_polyutils.py +123 -0
- numpy/polynomial/tests/test_printing.py +557 -0
- numpy/polynomial/tests/test_symbol.py +217 -0
- numpy/py.typed +0 -0
- numpy/random/LICENSE.md +71 -0
- numpy/random/__init__.pxd +14 -0
- numpy/random/__init__.py +213 -0
- numpy/random/__init__.pyi +124 -0
- numpy/random/_bounded_integers.cp314t-win_arm64.lib +0 -0
- numpy/random/_bounded_integers.cp314t-win_arm64.pyd +0 -0
- numpy/random/_bounded_integers.pxd +38 -0
- numpy/random/_bounded_integers.pyi +1 -0
- numpy/random/_common.cp314t-win_arm64.lib +0 -0
- numpy/random/_common.cp314t-win_arm64.pyd +0 -0
- numpy/random/_common.pxd +110 -0
- numpy/random/_common.pyi +16 -0
- numpy/random/_examples/cffi/extending.py +44 -0
- numpy/random/_examples/cffi/parse.py +53 -0
- numpy/random/_examples/cython/extending.pyx +77 -0
- numpy/random/_examples/cython/extending_distributions.pyx +117 -0
- numpy/random/_examples/cython/meson.build +53 -0
- numpy/random/_examples/numba/extending.py +86 -0
- numpy/random/_examples/numba/extending_distributions.py +67 -0
- numpy/random/_generator.cp314t-win_arm64.lib +0 -0
- numpy/random/_generator.cp314t-win_arm64.pyd +0 -0
- numpy/random/_generator.pyi +862 -0
- numpy/random/_mt19937.cp314t-win_arm64.lib +0 -0
- numpy/random/_mt19937.cp314t-win_arm64.pyd +0 -0
- numpy/random/_mt19937.pyi +27 -0
- numpy/random/_pcg64.cp314t-win_arm64.lib +0 -0
- numpy/random/_pcg64.cp314t-win_arm64.pyd +0 -0
- numpy/random/_pcg64.pyi +41 -0
- numpy/random/_philox.cp314t-win_arm64.lib +0 -0
- numpy/random/_philox.cp314t-win_arm64.pyd +0 -0
- numpy/random/_philox.pyi +36 -0
- numpy/random/_pickle.py +88 -0
- numpy/random/_pickle.pyi +43 -0
- numpy/random/_sfc64.cp314t-win_arm64.lib +0 -0
- numpy/random/_sfc64.cp314t-win_arm64.pyd +0 -0
- numpy/random/_sfc64.pyi +25 -0
- numpy/random/bit_generator.cp314t-win_arm64.lib +0 -0
- numpy/random/bit_generator.cp314t-win_arm64.pyd +0 -0
- numpy/random/bit_generator.pxd +40 -0
- numpy/random/bit_generator.pyi +123 -0
- numpy/random/c_distributions.pxd +119 -0
- numpy/random/lib/npyrandom.lib +0 -0
- numpy/random/mtrand.cp314t-win_arm64.lib +0 -0
- numpy/random/mtrand.cp314t-win_arm64.pyd +0 -0
- numpy/random/mtrand.pyi +759 -0
- numpy/random/tests/__init__.py +0 -0
- numpy/random/tests/data/__init__.py +0 -0
- numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
- numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
- numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
- numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
- numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
- numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
- numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
- numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
- numpy/random/tests/data/philox-testset-1.csv +1001 -0
- numpy/random/tests/data/philox-testset-2.csv +1001 -0
- numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
- numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
- numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
- numpy/random/tests/test_direct.py +595 -0
- numpy/random/tests/test_extending.py +131 -0
- numpy/random/tests/test_generator_mt19937.py +2825 -0
- numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
- numpy/random/tests/test_random.py +1724 -0
- numpy/random/tests/test_randomstate.py +2099 -0
- numpy/random/tests/test_randomstate_regression.py +213 -0
- numpy/random/tests/test_regression.py +175 -0
- numpy/random/tests/test_seed_sequence.py +79 -0
- numpy/random/tests/test_smoke.py +882 -0
- numpy/rec/__init__.py +2 -0
- numpy/rec/__init__.pyi +23 -0
- numpy/strings/__init__.py +2 -0
- numpy/strings/__init__.pyi +97 -0
- numpy/testing/__init__.py +22 -0
- numpy/testing/__init__.pyi +107 -0
- numpy/testing/_private/__init__.py +0 -0
- numpy/testing/_private/__init__.pyi +0 -0
- numpy/testing/_private/extbuild.py +250 -0
- numpy/testing/_private/extbuild.pyi +25 -0
- numpy/testing/_private/utils.py +2830 -0
- numpy/testing/_private/utils.pyi +505 -0
- numpy/testing/overrides.py +84 -0
- numpy/testing/overrides.pyi +10 -0
- numpy/testing/print_coercion_tables.py +207 -0
- numpy/testing/print_coercion_tables.pyi +26 -0
- numpy/testing/tests/__init__.py +0 -0
- numpy/testing/tests/test_utils.py +2123 -0
- numpy/tests/__init__.py +0 -0
- numpy/tests/test__all__.py +10 -0
- numpy/tests/test_configtool.py +51 -0
- numpy/tests/test_ctypeslib.py +383 -0
- numpy/tests/test_lazyloading.py +42 -0
- numpy/tests/test_matlib.py +59 -0
- numpy/tests/test_numpy_config.py +47 -0
- numpy/tests/test_numpy_version.py +54 -0
- numpy/tests/test_public_api.py +807 -0
- numpy/tests/test_reloading.py +76 -0
- numpy/tests/test_scripts.py +48 -0
- numpy/tests/test_warnings.py +79 -0
- numpy/typing/__init__.py +233 -0
- numpy/typing/__init__.pyi +3 -0
- numpy/typing/mypy_plugin.py +200 -0
- numpy/typing/tests/__init__.py +0 -0
- numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
- numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
- numpy/typing/tests/data/fail/array_like.pyi +15 -0
- numpy/typing/tests/data/fail/array_pad.pyi +6 -0
- numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
- numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
- numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
- numpy/typing/tests/data/fail/char.pyi +63 -0
- numpy/typing/tests/data/fail/chararray.pyi +61 -0
- numpy/typing/tests/data/fail/comparisons.pyi +27 -0
- numpy/typing/tests/data/fail/constants.pyi +3 -0
- numpy/typing/tests/data/fail/datasource.pyi +16 -0
- numpy/typing/tests/data/fail/dtype.pyi +17 -0
- numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
- numpy/typing/tests/data/fail/flatiter.pyi +38 -0
- numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
- numpy/typing/tests/data/fail/histograms.pyi +12 -0
- numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
- numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
- numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
- numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
- numpy/typing/tests/data/fail/lib_version.pyi +6 -0
- numpy/typing/tests/data/fail/linalg.pyi +52 -0
- numpy/typing/tests/data/fail/ma.pyi +155 -0
- numpy/typing/tests/data/fail/memmap.pyi +5 -0
- numpy/typing/tests/data/fail/modules.pyi +17 -0
- numpy/typing/tests/data/fail/multiarray.pyi +52 -0
- numpy/typing/tests/data/fail/ndarray.pyi +11 -0
- numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
- numpy/typing/tests/data/fail/nditer.pyi +8 -0
- numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
- numpy/typing/tests/data/fail/npyio.pyi +24 -0
- numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
- numpy/typing/tests/data/fail/random.pyi +62 -0
- numpy/typing/tests/data/fail/rec.pyi +17 -0
- numpy/typing/tests/data/fail/scalars.pyi +86 -0
- numpy/typing/tests/data/fail/shape.pyi +7 -0
- numpy/typing/tests/data/fail/shape_base.pyi +8 -0
- numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
- numpy/typing/tests/data/fail/strings.pyi +52 -0
- numpy/typing/tests/data/fail/testing.pyi +28 -0
- numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
- numpy/typing/tests/data/fail/type_check.pyi +12 -0
- numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
- numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
- numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
- numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
- numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
- numpy/typing/tests/data/mypy.ini +8 -0
- numpy/typing/tests/data/pass/arithmetic.py +614 -0
- numpy/typing/tests/data/pass/array_constructors.py +138 -0
- numpy/typing/tests/data/pass/array_like.py +43 -0
- numpy/typing/tests/data/pass/arrayprint.py +37 -0
- numpy/typing/tests/data/pass/arrayterator.py +28 -0
- numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
- numpy/typing/tests/data/pass/comparisons.py +316 -0
- numpy/typing/tests/data/pass/dtype.py +57 -0
- numpy/typing/tests/data/pass/einsumfunc.py +36 -0
- numpy/typing/tests/data/pass/flatiter.py +26 -0
- numpy/typing/tests/data/pass/fromnumeric.py +272 -0
- numpy/typing/tests/data/pass/index_tricks.py +62 -0
- numpy/typing/tests/data/pass/lib_user_array.py +22 -0
- numpy/typing/tests/data/pass/lib_utils.py +19 -0
- numpy/typing/tests/data/pass/lib_version.py +18 -0
- numpy/typing/tests/data/pass/literal.py +52 -0
- numpy/typing/tests/data/pass/ma.py +199 -0
- numpy/typing/tests/data/pass/mod.py +149 -0
- numpy/typing/tests/data/pass/modules.py +45 -0
- numpy/typing/tests/data/pass/multiarray.py +77 -0
- numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
- numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
- numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
- numpy/typing/tests/data/pass/nditer.py +4 -0
- numpy/typing/tests/data/pass/numeric.py +90 -0
- numpy/typing/tests/data/pass/numerictypes.py +17 -0
- numpy/typing/tests/data/pass/random.py +1498 -0
- numpy/typing/tests/data/pass/recfunctions.py +164 -0
- numpy/typing/tests/data/pass/scalars.py +249 -0
- numpy/typing/tests/data/pass/shape.py +19 -0
- numpy/typing/tests/data/pass/simple.py +170 -0
- numpy/typing/tests/data/pass/ufunc_config.py +64 -0
- numpy/typing/tests/data/pass/ufunclike.py +52 -0
- numpy/typing/tests/data/pass/ufuncs.py +16 -0
- numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
- numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
- numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
- numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
- numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
- numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
- numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
- numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
- numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
- numpy/typing/tests/data/reveal/char.pyi +225 -0
- numpy/typing/tests/data/reveal/chararray.pyi +138 -0
- numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
- numpy/typing/tests/data/reveal/constants.pyi +14 -0
- numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
- numpy/typing/tests/data/reveal/datasource.pyi +23 -0
- numpy/typing/tests/data/reveal/dtype.pyi +132 -0
- numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
- numpy/typing/tests/data/reveal/emath.pyi +54 -0
- numpy/typing/tests/data/reveal/fft.pyi +37 -0
- numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
- numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
- numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
- numpy/typing/tests/data/reveal/histograms.pyi +25 -0
- numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
- numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
- numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
- numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
- numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
- numpy/typing/tests/data/reveal/linalg.pyi +154 -0
- numpy/typing/tests/data/reveal/ma.pyi +1098 -0
- numpy/typing/tests/data/reveal/matrix.pyi +73 -0
- numpy/typing/tests/data/reveal/memmap.pyi +19 -0
- numpy/typing/tests/data/reveal/mod.pyi +178 -0
- numpy/typing/tests/data/reveal/modules.pyi +51 -0
- numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
- numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
- numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
- numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
- numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
- numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
- numpy/typing/tests/data/reveal/nditer.pyi +49 -0
- numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
- numpy/typing/tests/data/reveal/npyio.pyi +83 -0
- numpy/typing/tests/data/reveal/numeric.pyi +170 -0
- numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
- numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
- numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
- numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
- numpy/typing/tests/data/reveal/random.pyi +1546 -0
- numpy/typing/tests/data/reveal/rec.pyi +171 -0
- numpy/typing/tests/data/reveal/scalars.pyi +191 -0
- numpy/typing/tests/data/reveal/shape.pyi +13 -0
- numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
- numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
- numpy/typing/tests/data/reveal/strings.pyi +196 -0
- numpy/typing/tests/data/reveal/testing.pyi +198 -0
- numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
- numpy/typing/tests/data/reveal/type_check.pyi +67 -0
- numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
- numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
- numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
- numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
- numpy/typing/tests/test_isfile.py +38 -0
- numpy/typing/tests/test_runtime.py +110 -0
- numpy/typing/tests/test_typing.py +205 -0
- numpy/version.py +11 -0
- numpy/version.pyi +9 -0
- numpy-2.4.1.dist-info/DELVEWHEEL +2 -0
- numpy-2.4.1.dist-info/METADATA +139 -0
- numpy-2.4.1.dist-info/RECORD +932 -0
- numpy-2.4.1.dist-info/WHEEL +4 -0
- numpy-2.4.1.dist-info/entry_points.txt +13 -0
- numpy-2.4.1.dist-info/licenses/LICENSE.txt +914 -0
- numpy-2.4.1.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
- numpy-2.4.1.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
- numpy-2.4.1.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
- numpy-2.4.1.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
- numpy-2.4.1.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
- numpy-2.4.1.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
- numpy-2.4.1.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
- numpy-2.4.1.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
- numpy-2.4.1.dist-info/licenses/numpy/ma/LICENSE +24 -0
- numpy-2.4.1.dist-info/licenses/numpy/random/LICENSE.md +71 -0
- numpy-2.4.1.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
- numpy-2.4.1.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
- numpy-2.4.1.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
- numpy-2.4.1.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
- numpy-2.4.1.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
- numpy-2.4.1.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
- numpy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
- numpy.libs/scipy_openblas-7b69cbfd2599e6035f1310f2a72d59a6.dll +0 -0
|
@@ -0,0 +1,1289 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import warnings
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
import numpy._core.numeric as _nx
|
|
6
|
+
from numpy._core import atleast_3d, overrides, vstack
|
|
7
|
+
from numpy._core._multiarray_umath import _array_converter
|
|
8
|
+
from numpy._core.fromnumeric import reshape, transpose
|
|
9
|
+
from numpy._core.multiarray import normalize_axis_index
|
|
10
|
+
from numpy._core.numeric import (
|
|
11
|
+
array,
|
|
12
|
+
asanyarray,
|
|
13
|
+
asarray,
|
|
14
|
+
normalize_axis_tuple,
|
|
15
|
+
zeros,
|
|
16
|
+
zeros_like,
|
|
17
|
+
)
|
|
18
|
+
from numpy._core.overrides import set_module
|
|
19
|
+
from numpy._core.shape_base import _arrays_for_stack_dispatcher
|
|
20
|
+
from numpy.lib._index_tricks_impl import ndindex
|
|
21
|
+
from numpy.matrixlib.defmatrix import matrix # this raises all the right alarm bells
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
'column_stack', 'row_stack', 'dstack', 'array_split', 'split',
|
|
25
|
+
'hsplit', 'vsplit', 'dsplit', 'apply_over_axes', 'expand_dims',
|
|
26
|
+
'apply_along_axis', 'kron', 'tile', 'take_along_axis',
|
|
27
|
+
'put_along_axis'
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
array_function_dispatch = functools.partial(
|
|
32
|
+
overrides.array_function_dispatch, module='numpy')
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _make_along_axis_idx(arr_shape, indices, axis):
|
|
36
|
+
# compute dimensions to iterate over
|
|
37
|
+
if not _nx.issubdtype(indices.dtype, _nx.integer):
|
|
38
|
+
raise IndexError('`indices` must be an integer array')
|
|
39
|
+
if len(arr_shape) != indices.ndim:
|
|
40
|
+
raise ValueError(
|
|
41
|
+
"`indices` and `arr` must have the same number of dimensions")
|
|
42
|
+
shape_ones = (1,) * indices.ndim
|
|
43
|
+
dest_dims = list(range(axis)) + [None] + list(range(axis + 1, indices.ndim))
|
|
44
|
+
|
|
45
|
+
# build a fancy index, consisting of orthogonal aranges, with the
|
|
46
|
+
# requested index inserted at the right location
|
|
47
|
+
fancy_index = []
|
|
48
|
+
for dim, n in zip(dest_dims, arr_shape):
|
|
49
|
+
if dim is None:
|
|
50
|
+
fancy_index.append(indices)
|
|
51
|
+
else:
|
|
52
|
+
ind_shape = shape_ones[:dim] + (-1,) + shape_ones[dim + 1:]
|
|
53
|
+
fancy_index.append(_nx.arange(n).reshape(ind_shape))
|
|
54
|
+
|
|
55
|
+
return tuple(fancy_index)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _take_along_axis_dispatcher(arr, indices, axis=None):
|
|
59
|
+
return (arr, indices)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@array_function_dispatch(_take_along_axis_dispatcher)
|
|
63
|
+
def take_along_axis(arr, indices, axis=-1):
|
|
64
|
+
"""
|
|
65
|
+
Take values from the input array by matching 1d index and data slices.
|
|
66
|
+
|
|
67
|
+
This iterates over matching 1d slices oriented along the specified axis in
|
|
68
|
+
the index and data arrays, and uses the former to look up values in the
|
|
69
|
+
latter. These slices can be different lengths.
|
|
70
|
+
|
|
71
|
+
Functions returning an index along an axis, like `argsort` and
|
|
72
|
+
`argpartition`, produce suitable indices for this function.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
arr : ndarray (Ni..., M, Nk...)
|
|
77
|
+
Source array
|
|
78
|
+
indices : ndarray (Ni..., J, Nk...)
|
|
79
|
+
Indices to take along each 1d slice of ``arr``. This must match the
|
|
80
|
+
dimension of ``arr``, but dimensions Ni and Nj only need to broadcast
|
|
81
|
+
against ``arr``.
|
|
82
|
+
axis : int or None, optional
|
|
83
|
+
The axis to take 1d slices along. If axis is None, the input array is
|
|
84
|
+
treated as if it had first been flattened to 1d, for consistency with
|
|
85
|
+
`sort` and `argsort`.
|
|
86
|
+
|
|
87
|
+
.. versionchanged:: 2.3
|
|
88
|
+
The default value is now ``-1``.
|
|
89
|
+
|
|
90
|
+
Returns
|
|
91
|
+
-------
|
|
92
|
+
out: ndarray (Ni..., J, Nk...)
|
|
93
|
+
The indexed result.
|
|
94
|
+
|
|
95
|
+
Notes
|
|
96
|
+
-----
|
|
97
|
+
This is equivalent to (but faster than) the following use of `ndindex` and
|
|
98
|
+
`s_`, which sets each of ``ii`` and ``kk`` to a tuple of indices::
|
|
99
|
+
|
|
100
|
+
Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
|
|
101
|
+
J = indices.shape[axis] # Need not equal M
|
|
102
|
+
out = np.empty(Ni + (J,) + Nk)
|
|
103
|
+
|
|
104
|
+
for ii in ndindex(Ni):
|
|
105
|
+
for kk in ndindex(Nk):
|
|
106
|
+
a_1d = a [ii + s_[:,] + kk]
|
|
107
|
+
indices_1d = indices[ii + s_[:,] + kk]
|
|
108
|
+
out_1d = out [ii + s_[:,] + kk]
|
|
109
|
+
for j in range(J):
|
|
110
|
+
out_1d[j] = a_1d[indices_1d[j]]
|
|
111
|
+
|
|
112
|
+
Equivalently, eliminating the inner loop, the last two lines would be::
|
|
113
|
+
|
|
114
|
+
out_1d[:] = a_1d[indices_1d]
|
|
115
|
+
|
|
116
|
+
See Also
|
|
117
|
+
--------
|
|
118
|
+
take : Take along an axis, using the same indices for every 1d slice
|
|
119
|
+
put_along_axis :
|
|
120
|
+
Put values into the destination array by matching 1d index and data slices
|
|
121
|
+
|
|
122
|
+
Examples
|
|
123
|
+
--------
|
|
124
|
+
>>> import numpy as np
|
|
125
|
+
|
|
126
|
+
For this sample array
|
|
127
|
+
|
|
128
|
+
>>> a = np.array([[10, 30, 20], [60, 40, 50]])
|
|
129
|
+
|
|
130
|
+
We can sort either by using sort directly, or argsort and this function
|
|
131
|
+
|
|
132
|
+
>>> np.sort(a, axis=1)
|
|
133
|
+
array([[10, 20, 30],
|
|
134
|
+
[40, 50, 60]])
|
|
135
|
+
>>> ai = np.argsort(a, axis=1)
|
|
136
|
+
>>> ai
|
|
137
|
+
array([[0, 2, 1],
|
|
138
|
+
[1, 2, 0]])
|
|
139
|
+
>>> np.take_along_axis(a, ai, axis=1)
|
|
140
|
+
array([[10, 20, 30],
|
|
141
|
+
[40, 50, 60]])
|
|
142
|
+
|
|
143
|
+
The same works for max and min, if you maintain the trivial dimension
|
|
144
|
+
with ``keepdims``:
|
|
145
|
+
|
|
146
|
+
>>> np.max(a, axis=1, keepdims=True)
|
|
147
|
+
array([[30],
|
|
148
|
+
[60]])
|
|
149
|
+
>>> ai = np.argmax(a, axis=1, keepdims=True)
|
|
150
|
+
>>> ai
|
|
151
|
+
array([[1],
|
|
152
|
+
[0]])
|
|
153
|
+
>>> np.take_along_axis(a, ai, axis=1)
|
|
154
|
+
array([[30],
|
|
155
|
+
[60]])
|
|
156
|
+
|
|
157
|
+
If we want to get the max and min at the same time, we can stack the
|
|
158
|
+
indices first
|
|
159
|
+
|
|
160
|
+
>>> ai_min = np.argmin(a, axis=1, keepdims=True)
|
|
161
|
+
>>> ai_max = np.argmax(a, axis=1, keepdims=True)
|
|
162
|
+
>>> ai = np.concatenate([ai_min, ai_max], axis=1)
|
|
163
|
+
>>> ai
|
|
164
|
+
array([[0, 1],
|
|
165
|
+
[1, 0]])
|
|
166
|
+
>>> np.take_along_axis(a, ai, axis=1)
|
|
167
|
+
array([[10, 30],
|
|
168
|
+
[40, 60]])
|
|
169
|
+
"""
|
|
170
|
+
# normalize inputs
|
|
171
|
+
if axis is None:
|
|
172
|
+
if indices.ndim != 1:
|
|
173
|
+
raise ValueError(
|
|
174
|
+
'when axis=None, `indices` must have a single dimension.')
|
|
175
|
+
arr = np.array(arr.flat)
|
|
176
|
+
axis = 0
|
|
177
|
+
else:
|
|
178
|
+
axis = normalize_axis_index(axis, arr.ndim)
|
|
179
|
+
|
|
180
|
+
# use the fancy index
|
|
181
|
+
return arr[_make_along_axis_idx(arr.shape, indices, axis)]
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _put_along_axis_dispatcher(arr, indices, values, axis):
|
|
185
|
+
return (arr, indices, values)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@array_function_dispatch(_put_along_axis_dispatcher)
|
|
189
|
+
def put_along_axis(arr, indices, values, axis):
|
|
190
|
+
"""
|
|
191
|
+
Put values into the destination array by matching 1d index and data slices.
|
|
192
|
+
|
|
193
|
+
This iterates over matching 1d slices oriented along the specified axis in
|
|
194
|
+
the index and data arrays, and uses the former to place values into the
|
|
195
|
+
latter. These slices can be different lengths.
|
|
196
|
+
|
|
197
|
+
Functions returning an index along an axis, like `argsort` and
|
|
198
|
+
`argpartition`, produce suitable indices for this function.
|
|
199
|
+
|
|
200
|
+
Parameters
|
|
201
|
+
----------
|
|
202
|
+
arr : ndarray (Ni..., M, Nk...)
|
|
203
|
+
Destination array.
|
|
204
|
+
indices : ndarray (Ni..., J, Nk...)
|
|
205
|
+
Indices to change along each 1d slice of `arr`. This must match the
|
|
206
|
+
dimension of arr, but dimensions in Ni and Nj may be 1 to broadcast
|
|
207
|
+
against `arr`.
|
|
208
|
+
values : array_like (Ni..., J, Nk...)
|
|
209
|
+
values to insert at those indices. Its shape and dimension are
|
|
210
|
+
broadcast to match that of `indices`.
|
|
211
|
+
axis : int
|
|
212
|
+
The axis to take 1d slices along. If axis is None, the destination
|
|
213
|
+
array is treated as if a flattened 1d view had been created of it.
|
|
214
|
+
|
|
215
|
+
Notes
|
|
216
|
+
-----
|
|
217
|
+
This is equivalent to (but faster than) the following use of `ndindex` and
|
|
218
|
+
`s_`, which sets each of ``ii`` and ``kk`` to a tuple of indices::
|
|
219
|
+
|
|
220
|
+
Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
|
|
221
|
+
J = indices.shape[axis] # Need not equal M
|
|
222
|
+
|
|
223
|
+
for ii in ndindex(Ni):
|
|
224
|
+
for kk in ndindex(Nk):
|
|
225
|
+
a_1d = a [ii + s_[:,] + kk]
|
|
226
|
+
indices_1d = indices[ii + s_[:,] + kk]
|
|
227
|
+
values_1d = values [ii + s_[:,] + kk]
|
|
228
|
+
for j in range(J):
|
|
229
|
+
a_1d[indices_1d[j]] = values_1d[j]
|
|
230
|
+
|
|
231
|
+
Equivalently, eliminating the inner loop, the last two lines would be::
|
|
232
|
+
|
|
233
|
+
a_1d[indices_1d] = values_1d
|
|
234
|
+
|
|
235
|
+
See Also
|
|
236
|
+
--------
|
|
237
|
+
take_along_axis :
|
|
238
|
+
Take values from the input array by matching 1d index and data slices
|
|
239
|
+
|
|
240
|
+
Examples
|
|
241
|
+
--------
|
|
242
|
+
>>> import numpy as np
|
|
243
|
+
|
|
244
|
+
For this sample array
|
|
245
|
+
|
|
246
|
+
>>> a = np.array([[10, 30, 20], [60, 40, 50]])
|
|
247
|
+
|
|
248
|
+
We can replace the maximum values with:
|
|
249
|
+
|
|
250
|
+
>>> ai = np.argmax(a, axis=1, keepdims=True)
|
|
251
|
+
>>> ai
|
|
252
|
+
array([[1],
|
|
253
|
+
[0]])
|
|
254
|
+
>>> np.put_along_axis(a, ai, 99, axis=1)
|
|
255
|
+
>>> a
|
|
256
|
+
array([[10, 99, 20],
|
|
257
|
+
[99, 40, 50]])
|
|
258
|
+
|
|
259
|
+
"""
|
|
260
|
+
# normalize inputs
|
|
261
|
+
if axis is None:
|
|
262
|
+
if indices.ndim != 1:
|
|
263
|
+
raise ValueError(
|
|
264
|
+
'when axis=None, `indices` must have a single dimension.')
|
|
265
|
+
arr = np.array(arr.flat)
|
|
266
|
+
axis = 0
|
|
267
|
+
else:
|
|
268
|
+
axis = normalize_axis_index(axis, arr.ndim)
|
|
269
|
+
|
|
270
|
+
# use the fancy index
|
|
271
|
+
arr[_make_along_axis_idx(arr.shape, indices, axis)] = values
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _apply_along_axis_dispatcher(func1d, axis, arr, *args, **kwargs):
|
|
275
|
+
return (arr,)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
@array_function_dispatch(_apply_along_axis_dispatcher)
|
|
279
|
+
def apply_along_axis(func1d, axis, arr, *args, **kwargs):
|
|
280
|
+
"""
|
|
281
|
+
Apply a function to 1-D slices along the given axis.
|
|
282
|
+
|
|
283
|
+
Execute `func1d(a, *args, **kwargs)` where `func1d` operates on 1-D arrays
|
|
284
|
+
and `a` is a 1-D slice of `arr` along `axis`.
|
|
285
|
+
|
|
286
|
+
This is equivalent to (but faster than) the following use of `ndindex` and
|
|
287
|
+
`s_`, which sets each of ``ii``, ``jj``, and ``kk`` to a tuple of indices::
|
|
288
|
+
|
|
289
|
+
Ni, Nk = a.shape[:axis], a.shape[axis+1:]
|
|
290
|
+
for ii in ndindex(Ni):
|
|
291
|
+
for kk in ndindex(Nk):
|
|
292
|
+
f = func1d(arr[ii + s_[:,] + kk])
|
|
293
|
+
Nj = f.shape
|
|
294
|
+
for jj in ndindex(Nj):
|
|
295
|
+
out[ii + jj + kk] = f[jj]
|
|
296
|
+
|
|
297
|
+
Equivalently, eliminating the inner loop, this can be expressed as::
|
|
298
|
+
|
|
299
|
+
Ni, Nk = a.shape[:axis], a.shape[axis+1:]
|
|
300
|
+
for ii in ndindex(Ni):
|
|
301
|
+
for kk in ndindex(Nk):
|
|
302
|
+
out[ii + s_[...,] + kk] = func1d(arr[ii + s_[:,] + kk])
|
|
303
|
+
|
|
304
|
+
Parameters
|
|
305
|
+
----------
|
|
306
|
+
func1d : function (M,) -> (Nj...)
|
|
307
|
+
This function should accept 1-D arrays. It is applied to 1-D
|
|
308
|
+
slices of `arr` along the specified axis.
|
|
309
|
+
axis : integer
|
|
310
|
+
Axis along which `arr` is sliced.
|
|
311
|
+
arr : ndarray (Ni..., M, Nk...)
|
|
312
|
+
Input array.
|
|
313
|
+
args : any
|
|
314
|
+
Additional arguments to `func1d`.
|
|
315
|
+
kwargs : any
|
|
316
|
+
Additional named arguments to `func1d`.
|
|
317
|
+
|
|
318
|
+
Returns
|
|
319
|
+
-------
|
|
320
|
+
out : ndarray (Ni..., Nj..., Nk...)
|
|
321
|
+
The output array. The shape of `out` is identical to the shape of
|
|
322
|
+
`arr`, except along the `axis` dimension. This axis is removed, and
|
|
323
|
+
replaced with new dimensions equal to the shape of the return value
|
|
324
|
+
of `func1d`. So if `func1d` returns a scalar `out` will have one
|
|
325
|
+
fewer dimensions than `arr`.
|
|
326
|
+
|
|
327
|
+
See Also
|
|
328
|
+
--------
|
|
329
|
+
apply_over_axes : Apply a function repeatedly over multiple axes.
|
|
330
|
+
|
|
331
|
+
Examples
|
|
332
|
+
--------
|
|
333
|
+
>>> import numpy as np
|
|
334
|
+
>>> def my_func(a):
|
|
335
|
+
... \"\"\"Average first and last element of a 1-D array\"\"\"
|
|
336
|
+
... return (a[0] + a[-1]) * 0.5
|
|
337
|
+
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
|
|
338
|
+
>>> np.apply_along_axis(my_func, 0, b)
|
|
339
|
+
array([4., 5., 6.])
|
|
340
|
+
>>> np.apply_along_axis(my_func, 1, b)
|
|
341
|
+
array([2., 5., 8.])
|
|
342
|
+
|
|
343
|
+
For a function that returns a 1D array, the number of dimensions in
|
|
344
|
+
`outarr` is the same as `arr`.
|
|
345
|
+
|
|
346
|
+
>>> b = np.array([[8,1,7], [4,3,9], [5,2,6]])
|
|
347
|
+
>>> np.apply_along_axis(sorted, 1, b)
|
|
348
|
+
array([[1, 7, 8],
|
|
349
|
+
[3, 4, 9],
|
|
350
|
+
[2, 5, 6]])
|
|
351
|
+
|
|
352
|
+
For a function that returns a higher dimensional array, those dimensions
|
|
353
|
+
are inserted in place of the `axis` dimension.
|
|
354
|
+
|
|
355
|
+
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
|
|
356
|
+
>>> np.apply_along_axis(np.diag, -1, b)
|
|
357
|
+
array([[[1, 0, 0],
|
|
358
|
+
[0, 2, 0],
|
|
359
|
+
[0, 0, 3]],
|
|
360
|
+
[[4, 0, 0],
|
|
361
|
+
[0, 5, 0],
|
|
362
|
+
[0, 0, 6]],
|
|
363
|
+
[[7, 0, 0],
|
|
364
|
+
[0, 8, 0],
|
|
365
|
+
[0, 0, 9]]])
|
|
366
|
+
"""
|
|
367
|
+
# handle negative axes
|
|
368
|
+
conv = _array_converter(arr)
|
|
369
|
+
arr = conv[0]
|
|
370
|
+
|
|
371
|
+
nd = arr.ndim
|
|
372
|
+
axis = normalize_axis_index(axis, nd)
|
|
373
|
+
|
|
374
|
+
# arr, with the iteration axis at the end
|
|
375
|
+
in_dims = list(range(nd))
|
|
376
|
+
inarr_view = transpose(arr, in_dims[:axis] + in_dims[axis + 1:] + [axis])
|
|
377
|
+
|
|
378
|
+
# compute indices for the iteration axes, and append a trailing ellipsis to
|
|
379
|
+
# prevent 0d arrays decaying to scalars, which fixes gh-8642
|
|
380
|
+
inds = ndindex(inarr_view.shape[:-1])
|
|
381
|
+
inds = (ind + (Ellipsis,) for ind in inds)
|
|
382
|
+
|
|
383
|
+
# invoke the function on the first item
|
|
384
|
+
try:
|
|
385
|
+
ind0 = next(inds)
|
|
386
|
+
except StopIteration:
|
|
387
|
+
raise ValueError(
|
|
388
|
+
'Cannot apply_along_axis when any iteration dimensions are 0'
|
|
389
|
+
) from None
|
|
390
|
+
res = asanyarray(func1d(inarr_view[ind0], *args, **kwargs))
|
|
391
|
+
|
|
392
|
+
# build a buffer for storing evaluations of func1d.
|
|
393
|
+
# remove the requested axis, and add the new ones on the end.
|
|
394
|
+
# laid out so that each write is contiguous.
|
|
395
|
+
# for a tuple index inds, buff[inds] = func1d(inarr_view[inds])
|
|
396
|
+
if not isinstance(res, matrix):
|
|
397
|
+
buff = zeros_like(res, shape=inarr_view.shape[:-1] + res.shape)
|
|
398
|
+
else:
|
|
399
|
+
# Matrices are nasty with reshaping, so do not preserve them here.
|
|
400
|
+
buff = zeros(inarr_view.shape[:-1] + res.shape, dtype=res.dtype)
|
|
401
|
+
|
|
402
|
+
# permutation of axes such that out = buff.transpose(buff_permute)
|
|
403
|
+
buff_dims = list(range(buff.ndim))
|
|
404
|
+
buff_permute = (
|
|
405
|
+
buff_dims[0 : axis] +
|
|
406
|
+
buff_dims[buff.ndim - res.ndim : buff.ndim] +
|
|
407
|
+
buff_dims[axis : buff.ndim - res.ndim]
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
# save the first result, then compute and save all remaining results
|
|
411
|
+
buff[ind0] = res
|
|
412
|
+
for ind in inds:
|
|
413
|
+
buff[ind] = asanyarray(func1d(inarr_view[ind], *args, **kwargs))
|
|
414
|
+
|
|
415
|
+
res = transpose(buff, buff_permute)
|
|
416
|
+
return conv.wrap(res)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def _apply_over_axes_dispatcher(func, a, axes):
|
|
420
|
+
return (a,)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
@array_function_dispatch(_apply_over_axes_dispatcher)
|
|
424
|
+
def apply_over_axes(func, a, axes):
|
|
425
|
+
"""
|
|
426
|
+
Apply a function repeatedly over multiple axes.
|
|
427
|
+
|
|
428
|
+
`func` is called as `res = func(a, axis)`, where `axis` is the first
|
|
429
|
+
element of `axes`. The result `res` of the function call must have
|
|
430
|
+
either the same dimensions as `a` or one less dimension. If `res`
|
|
431
|
+
has one less dimension than `a`, a dimension is inserted before
|
|
432
|
+
`axis`. The call to `func` is then repeated for each axis in `axes`,
|
|
433
|
+
with `res` as the first argument.
|
|
434
|
+
|
|
435
|
+
Parameters
|
|
436
|
+
----------
|
|
437
|
+
func : function
|
|
438
|
+
This function must take two arguments, `func(a, axis)`.
|
|
439
|
+
a : array_like
|
|
440
|
+
Input array.
|
|
441
|
+
axes : array_like
|
|
442
|
+
Axes over which `func` is applied; the elements must be integers.
|
|
443
|
+
|
|
444
|
+
Returns
|
|
445
|
+
-------
|
|
446
|
+
apply_over_axis : ndarray
|
|
447
|
+
The output array. The number of dimensions is the same as `a`,
|
|
448
|
+
but the shape can be different. This depends on whether `func`
|
|
449
|
+
changes the shape of its output with respect to its input.
|
|
450
|
+
|
|
451
|
+
See Also
|
|
452
|
+
--------
|
|
453
|
+
apply_along_axis :
|
|
454
|
+
Apply a function to 1-D slices of an array along the given axis.
|
|
455
|
+
|
|
456
|
+
Notes
|
|
457
|
+
-----
|
|
458
|
+
This function is equivalent to tuple axis arguments to reorderable ufuncs
|
|
459
|
+
with keepdims=True. Tuple axis arguments to ufuncs have been available since
|
|
460
|
+
version 1.7.0.
|
|
461
|
+
|
|
462
|
+
Examples
|
|
463
|
+
--------
|
|
464
|
+
>>> import numpy as np
|
|
465
|
+
>>> a = np.arange(24).reshape(2,3,4)
|
|
466
|
+
>>> a
|
|
467
|
+
array([[[ 0, 1, 2, 3],
|
|
468
|
+
[ 4, 5, 6, 7],
|
|
469
|
+
[ 8, 9, 10, 11]],
|
|
470
|
+
[[12, 13, 14, 15],
|
|
471
|
+
[16, 17, 18, 19],
|
|
472
|
+
[20, 21, 22, 23]]])
|
|
473
|
+
|
|
474
|
+
Sum over axes 0 and 2. The result has same number of dimensions
|
|
475
|
+
as the original array:
|
|
476
|
+
|
|
477
|
+
>>> np.apply_over_axes(np.sum, a, [0,2])
|
|
478
|
+
array([[[ 60],
|
|
479
|
+
[ 92],
|
|
480
|
+
[124]]])
|
|
481
|
+
|
|
482
|
+
Tuple axis arguments to ufuncs are equivalent:
|
|
483
|
+
|
|
484
|
+
>>> np.sum(a, axis=(0,2), keepdims=True)
|
|
485
|
+
array([[[ 60],
|
|
486
|
+
[ 92],
|
|
487
|
+
[124]]])
|
|
488
|
+
|
|
489
|
+
"""
|
|
490
|
+
val = asarray(a)
|
|
491
|
+
N = a.ndim
|
|
492
|
+
if array(axes).ndim == 0:
|
|
493
|
+
axes = (axes,)
|
|
494
|
+
for axis in axes:
|
|
495
|
+
if axis < 0:
|
|
496
|
+
axis = N + axis
|
|
497
|
+
args = (val, axis)
|
|
498
|
+
res = func(*args)
|
|
499
|
+
if res.ndim == val.ndim:
|
|
500
|
+
val = res
|
|
501
|
+
else:
|
|
502
|
+
res = expand_dims(res, axis)
|
|
503
|
+
if res.ndim == val.ndim:
|
|
504
|
+
val = res
|
|
505
|
+
else:
|
|
506
|
+
raise ValueError("function is not returning "
|
|
507
|
+
"an array of the correct shape")
|
|
508
|
+
return val
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
def _expand_dims_dispatcher(a, axis):
|
|
512
|
+
return (a,)
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
@array_function_dispatch(_expand_dims_dispatcher)
|
|
516
|
+
def expand_dims(a, axis):
|
|
517
|
+
"""
|
|
518
|
+
Expand the shape of an array.
|
|
519
|
+
|
|
520
|
+
Insert a new axis that will appear at the `axis` position in the expanded
|
|
521
|
+
array shape.
|
|
522
|
+
|
|
523
|
+
Parameters
|
|
524
|
+
----------
|
|
525
|
+
a : array_like
|
|
526
|
+
Input array.
|
|
527
|
+
axis : int or tuple of ints
|
|
528
|
+
Position in the expanded axes where the new axis (or axes) is placed.
|
|
529
|
+
|
|
530
|
+
.. deprecated:: 1.13.0
|
|
531
|
+
Passing an axis where ``axis > a.ndim`` will be treated as
|
|
532
|
+
``axis == a.ndim``, and passing ``axis < -a.ndim - 1`` will
|
|
533
|
+
be treated as ``axis == 0``. This behavior is deprecated.
|
|
534
|
+
|
|
535
|
+
Returns
|
|
536
|
+
-------
|
|
537
|
+
result : ndarray
|
|
538
|
+
View of `a` with the number of dimensions increased.
|
|
539
|
+
|
|
540
|
+
See Also
|
|
541
|
+
--------
|
|
542
|
+
squeeze : The inverse operation, removing singleton dimensions
|
|
543
|
+
reshape : Insert, remove, and combine dimensions, and resize existing ones
|
|
544
|
+
atleast_1d, atleast_2d, atleast_3d
|
|
545
|
+
|
|
546
|
+
Examples
|
|
547
|
+
--------
|
|
548
|
+
>>> import numpy as np
|
|
549
|
+
>>> x = np.array([1, 2])
|
|
550
|
+
>>> x.shape
|
|
551
|
+
(2,)
|
|
552
|
+
|
|
553
|
+
The following is equivalent to ``x[np.newaxis, :]`` or ``x[np.newaxis]``:
|
|
554
|
+
|
|
555
|
+
>>> y = np.expand_dims(x, axis=0)
|
|
556
|
+
>>> y
|
|
557
|
+
array([[1, 2]])
|
|
558
|
+
>>> y.shape
|
|
559
|
+
(1, 2)
|
|
560
|
+
|
|
561
|
+
The following is equivalent to ``x[:, np.newaxis]``:
|
|
562
|
+
|
|
563
|
+
>>> y = np.expand_dims(x, axis=1)
|
|
564
|
+
>>> y
|
|
565
|
+
array([[1],
|
|
566
|
+
[2]])
|
|
567
|
+
>>> y.shape
|
|
568
|
+
(2, 1)
|
|
569
|
+
|
|
570
|
+
``axis`` may also be a tuple:
|
|
571
|
+
|
|
572
|
+
>>> y = np.expand_dims(x, axis=(0, 1))
|
|
573
|
+
>>> y
|
|
574
|
+
array([[[1, 2]]])
|
|
575
|
+
|
|
576
|
+
>>> y = np.expand_dims(x, axis=(2, 0))
|
|
577
|
+
>>> y
|
|
578
|
+
array([[[1],
|
|
579
|
+
[2]]])
|
|
580
|
+
|
|
581
|
+
Note that some examples may use ``None`` instead of ``np.newaxis``. These
|
|
582
|
+
are the same objects:
|
|
583
|
+
|
|
584
|
+
>>> np.newaxis is None
|
|
585
|
+
True
|
|
586
|
+
|
|
587
|
+
"""
|
|
588
|
+
if isinstance(a, matrix):
|
|
589
|
+
a = asarray(a)
|
|
590
|
+
else:
|
|
591
|
+
a = asanyarray(a)
|
|
592
|
+
|
|
593
|
+
if not isinstance(axis, (tuple, list)):
|
|
594
|
+
axis = (axis,)
|
|
595
|
+
|
|
596
|
+
out_ndim = len(axis) + a.ndim
|
|
597
|
+
axis = normalize_axis_tuple(axis, out_ndim)
|
|
598
|
+
|
|
599
|
+
shape_it = iter(a.shape)
|
|
600
|
+
shape = [1 if ax in axis else next(shape_it) for ax in range(out_ndim)]
|
|
601
|
+
|
|
602
|
+
return a.reshape(shape)
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
# NOTE: Remove once deprecation period passes
|
|
606
|
+
@set_module("numpy")
|
|
607
|
+
def row_stack(tup, *, dtype=None, casting="same_kind"):
|
|
608
|
+
# Deprecated in NumPy 2.0, 2023-08-18
|
|
609
|
+
warnings.warn(
|
|
610
|
+
"`row_stack` alias is deprecated. "
|
|
611
|
+
"Use `np.vstack` directly.",
|
|
612
|
+
DeprecationWarning,
|
|
613
|
+
stacklevel=2
|
|
614
|
+
)
|
|
615
|
+
return vstack(tup, dtype=dtype, casting=casting)
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
row_stack.__doc__ = vstack.__doc__
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
def _column_stack_dispatcher(tup):
|
|
622
|
+
return _arrays_for_stack_dispatcher(tup)
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
@array_function_dispatch(_column_stack_dispatcher)
|
|
626
|
+
def column_stack(tup):
|
|
627
|
+
"""
|
|
628
|
+
Stack 1-D arrays as columns into a 2-D array.
|
|
629
|
+
|
|
630
|
+
Take a sequence of 1-D arrays and stack them as columns
|
|
631
|
+
to make a single 2-D array. 2-D arrays are stacked as-is,
|
|
632
|
+
just like with `hstack`. 1-D arrays are turned into 2-D columns
|
|
633
|
+
first.
|
|
634
|
+
|
|
635
|
+
Parameters
|
|
636
|
+
----------
|
|
637
|
+
tup : sequence of 1-D or 2-D arrays.
|
|
638
|
+
Arrays to stack. All of them must have the same first dimension.
|
|
639
|
+
|
|
640
|
+
Returns
|
|
641
|
+
-------
|
|
642
|
+
stacked : 2-D array
|
|
643
|
+
The array formed by stacking the given arrays.
|
|
644
|
+
|
|
645
|
+
See Also
|
|
646
|
+
--------
|
|
647
|
+
stack, hstack, vstack, concatenate
|
|
648
|
+
|
|
649
|
+
Examples
|
|
650
|
+
--------
|
|
651
|
+
>>> import numpy as np
|
|
652
|
+
>>> a = np.array((1,2,3))
|
|
653
|
+
>>> b = np.array((4,5,6))
|
|
654
|
+
>>> np.column_stack((a,b))
|
|
655
|
+
array([[1, 4],
|
|
656
|
+
[2, 5],
|
|
657
|
+
[3, 6]])
|
|
658
|
+
|
|
659
|
+
"""
|
|
660
|
+
arrays = []
|
|
661
|
+
for v in tup:
|
|
662
|
+
arr = asanyarray(v)
|
|
663
|
+
if arr.ndim < 2:
|
|
664
|
+
arr = array(arr, copy=None, subok=True, ndmin=2).T
|
|
665
|
+
arrays.append(arr)
|
|
666
|
+
return _nx.concatenate(arrays, 1)
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
def _dstack_dispatcher(tup):
|
|
670
|
+
return _arrays_for_stack_dispatcher(tup)
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
@array_function_dispatch(_dstack_dispatcher)
|
|
674
|
+
def dstack(tup):
|
|
675
|
+
"""
|
|
676
|
+
Stack arrays in sequence depth wise (along third axis).
|
|
677
|
+
|
|
678
|
+
This is equivalent to concatenation along the third axis after 2-D arrays
|
|
679
|
+
of shape `(M,N)` have been reshaped to `(M,N,1)` and 1-D arrays of shape
|
|
680
|
+
`(N,)` have been reshaped to `(1,N,1)`. Rebuilds arrays divided by
|
|
681
|
+
`dsplit`.
|
|
682
|
+
|
|
683
|
+
This function makes most sense for arrays with up to 3 dimensions. For
|
|
684
|
+
instance, for pixel-data with a height (first axis), width (second axis),
|
|
685
|
+
and r/g/b channels (third axis). The functions `concatenate`, `stack` and
|
|
686
|
+
`block` provide more general stacking and concatenation operations.
|
|
687
|
+
|
|
688
|
+
Parameters
|
|
689
|
+
----------
|
|
690
|
+
tup : sequence of arrays
|
|
691
|
+
The arrays must have the same shape along all but the third axis.
|
|
692
|
+
1-D or 2-D arrays must have the same shape.
|
|
693
|
+
|
|
694
|
+
Returns
|
|
695
|
+
-------
|
|
696
|
+
stacked : ndarray
|
|
697
|
+
The array formed by stacking the given arrays, will be at least 3-D.
|
|
698
|
+
|
|
699
|
+
See Also
|
|
700
|
+
--------
|
|
701
|
+
concatenate : Join a sequence of arrays along an existing axis.
|
|
702
|
+
stack : Join a sequence of arrays along a new axis.
|
|
703
|
+
block : Assemble an nd-array from nested lists of blocks.
|
|
704
|
+
vstack : Stack arrays in sequence vertically (row wise).
|
|
705
|
+
hstack : Stack arrays in sequence horizontally (column wise).
|
|
706
|
+
column_stack : Stack 1-D arrays as columns into a 2-D array.
|
|
707
|
+
dsplit : Split array along third axis.
|
|
708
|
+
|
|
709
|
+
Examples
|
|
710
|
+
--------
|
|
711
|
+
>>> import numpy as np
|
|
712
|
+
>>> a = np.array((1,2,3))
|
|
713
|
+
>>> b = np.array((4,5,6))
|
|
714
|
+
>>> np.dstack((a,b))
|
|
715
|
+
array([[[1, 4],
|
|
716
|
+
[2, 5],
|
|
717
|
+
[3, 6]]])
|
|
718
|
+
|
|
719
|
+
>>> a = np.array([[1],[2],[3]])
|
|
720
|
+
>>> b = np.array([[4],[5],[6]])
|
|
721
|
+
>>> np.dstack((a,b))
|
|
722
|
+
array([[[1, 4]],
|
|
723
|
+
[[2, 5]],
|
|
724
|
+
[[3, 6]]])
|
|
725
|
+
|
|
726
|
+
"""
|
|
727
|
+
arrs = atleast_3d(*tup)
|
|
728
|
+
if not isinstance(arrs, tuple):
|
|
729
|
+
arrs = (arrs,)
|
|
730
|
+
return _nx.concatenate(arrs, 2)
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
def _array_split_dispatcher(ary, indices_or_sections, axis=None):
|
|
734
|
+
return (ary, indices_or_sections)
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
@array_function_dispatch(_array_split_dispatcher)
|
|
738
|
+
def array_split(ary, indices_or_sections, axis=0):
|
|
739
|
+
"""
|
|
740
|
+
Split an array into multiple sub-arrays.
|
|
741
|
+
|
|
742
|
+
Please refer to the ``split`` documentation. The only difference
|
|
743
|
+
between these functions is that ``array_split`` allows
|
|
744
|
+
`indices_or_sections` to be an integer that does *not* equally
|
|
745
|
+
divide the axis. For an array of length l that should be split
|
|
746
|
+
into n sections, it returns l % n sub-arrays of size l//n + 1
|
|
747
|
+
and the rest of size l//n.
|
|
748
|
+
|
|
749
|
+
See Also
|
|
750
|
+
--------
|
|
751
|
+
split : Split array into multiple sub-arrays of equal size.
|
|
752
|
+
|
|
753
|
+
Examples
|
|
754
|
+
--------
|
|
755
|
+
>>> import numpy as np
|
|
756
|
+
>>> x = np.arange(8.0)
|
|
757
|
+
>>> np.array_split(x, 3)
|
|
758
|
+
[array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7.])]
|
|
759
|
+
|
|
760
|
+
>>> x = np.arange(9)
|
|
761
|
+
>>> np.array_split(x, 4)
|
|
762
|
+
[array([0, 1, 2]), array([3, 4]), array([5, 6]), array([7, 8])]
|
|
763
|
+
|
|
764
|
+
"""
|
|
765
|
+
try:
|
|
766
|
+
Ntotal = ary.shape[axis]
|
|
767
|
+
except AttributeError:
|
|
768
|
+
Ntotal = len(ary)
|
|
769
|
+
try:
|
|
770
|
+
# handle array case.
|
|
771
|
+
Nsections = len(indices_or_sections) + 1
|
|
772
|
+
div_points = [0] + list(indices_or_sections) + [Ntotal]
|
|
773
|
+
except TypeError:
|
|
774
|
+
# indices_or_sections is a scalar, not an array.
|
|
775
|
+
Nsections = int(indices_or_sections)
|
|
776
|
+
if Nsections <= 0:
|
|
777
|
+
raise ValueError('number sections must be larger than 0.') from None
|
|
778
|
+
Neach_section, extras = divmod(Ntotal, Nsections)
|
|
779
|
+
section_sizes = ([0] +
|
|
780
|
+
extras * [Neach_section + 1] +
|
|
781
|
+
(Nsections - extras) * [Neach_section])
|
|
782
|
+
div_points = _nx.array(section_sizes, dtype=_nx.intp).cumsum()
|
|
783
|
+
|
|
784
|
+
sub_arys = []
|
|
785
|
+
sary = _nx.swapaxes(ary, axis, 0)
|
|
786
|
+
for i in range(Nsections):
|
|
787
|
+
st = div_points[i]
|
|
788
|
+
end = div_points[i + 1]
|
|
789
|
+
sub_arys.append(_nx.swapaxes(sary[st:end], axis, 0))
|
|
790
|
+
|
|
791
|
+
return sub_arys
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
def _split_dispatcher(ary, indices_or_sections, axis=None):
|
|
795
|
+
return (ary, indices_or_sections)
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
@array_function_dispatch(_split_dispatcher)
|
|
799
|
+
def split(ary, indices_or_sections, axis=0):
|
|
800
|
+
"""
|
|
801
|
+
Split an array into multiple sub-arrays as views into `ary`.
|
|
802
|
+
|
|
803
|
+
Parameters
|
|
804
|
+
----------
|
|
805
|
+
ary : ndarray
|
|
806
|
+
Array to be divided into sub-arrays.
|
|
807
|
+
indices_or_sections : int or 1-D array
|
|
808
|
+
If `indices_or_sections` is an integer, N, the array will be divided
|
|
809
|
+
into N equal arrays along `axis`. If such a split is not possible,
|
|
810
|
+
an error is raised.
|
|
811
|
+
|
|
812
|
+
If `indices_or_sections` is a 1-D array of sorted integers, the entries
|
|
813
|
+
indicate where along `axis` the array is split. For example,
|
|
814
|
+
``[2, 3]`` would, for ``axis=0``, result in
|
|
815
|
+
|
|
816
|
+
- ary[:2]
|
|
817
|
+
- ary[2:3]
|
|
818
|
+
- ary[3:]
|
|
819
|
+
|
|
820
|
+
If an index exceeds the dimension of the array along `axis`,
|
|
821
|
+
an empty sub-array is returned correspondingly.
|
|
822
|
+
axis : int, optional
|
|
823
|
+
The axis along which to split, default is 0.
|
|
824
|
+
|
|
825
|
+
Returns
|
|
826
|
+
-------
|
|
827
|
+
sub-arrays : list of ndarrays
|
|
828
|
+
A list of sub-arrays as views into `ary`.
|
|
829
|
+
|
|
830
|
+
Raises
|
|
831
|
+
------
|
|
832
|
+
ValueError
|
|
833
|
+
If `indices_or_sections` is given as an integer, but
|
|
834
|
+
a split does not result in equal division.
|
|
835
|
+
|
|
836
|
+
See Also
|
|
837
|
+
--------
|
|
838
|
+
array_split : Split an array into multiple sub-arrays of equal or
|
|
839
|
+
near-equal size. Does not raise an exception if
|
|
840
|
+
an equal division cannot be made.
|
|
841
|
+
hsplit : Split array into multiple sub-arrays horizontally (column-wise).
|
|
842
|
+
vsplit : Split array into multiple sub-arrays vertically (row wise).
|
|
843
|
+
dsplit : Split array into multiple sub-arrays along the 3rd axis (depth).
|
|
844
|
+
concatenate : Join a sequence of arrays along an existing axis.
|
|
845
|
+
stack : Join a sequence of arrays along a new axis.
|
|
846
|
+
hstack : Stack arrays in sequence horizontally (column wise).
|
|
847
|
+
vstack : Stack arrays in sequence vertically (row wise).
|
|
848
|
+
dstack : Stack arrays in sequence depth wise (along third dimension).
|
|
849
|
+
|
|
850
|
+
Examples
|
|
851
|
+
--------
|
|
852
|
+
>>> import numpy as np
|
|
853
|
+
>>> x = np.arange(9.0)
|
|
854
|
+
>>> np.split(x, 3)
|
|
855
|
+
[array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7., 8.])]
|
|
856
|
+
|
|
857
|
+
>>> x = np.arange(8.0)
|
|
858
|
+
>>> np.split(x, [3, 5, 6, 10])
|
|
859
|
+
[array([0., 1., 2.]),
|
|
860
|
+
array([3., 4.]),
|
|
861
|
+
array([5.]),
|
|
862
|
+
array([6., 7.]),
|
|
863
|
+
array([], dtype=float64)]
|
|
864
|
+
|
|
865
|
+
"""
|
|
866
|
+
try:
|
|
867
|
+
len(indices_or_sections)
|
|
868
|
+
except TypeError:
|
|
869
|
+
sections = indices_or_sections
|
|
870
|
+
N = ary.shape[axis]
|
|
871
|
+
if N % sections:
|
|
872
|
+
raise ValueError(
|
|
873
|
+
'array split does not result in an equal division') from None
|
|
874
|
+
return array_split(ary, indices_or_sections, axis)
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
def _hvdsplit_dispatcher(ary, indices_or_sections):
|
|
878
|
+
return (ary, indices_or_sections)
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
@array_function_dispatch(_hvdsplit_dispatcher)
|
|
882
|
+
def hsplit(ary, indices_or_sections):
|
|
883
|
+
"""
|
|
884
|
+
Split an array into multiple sub-arrays horizontally (column-wise).
|
|
885
|
+
|
|
886
|
+
Please refer to the `split` documentation. `hsplit` is equivalent
|
|
887
|
+
to `split` with ``axis=1``, the array is always split along the second
|
|
888
|
+
axis except for 1-D arrays, where it is split at ``axis=0``.
|
|
889
|
+
|
|
890
|
+
See Also
|
|
891
|
+
--------
|
|
892
|
+
split : Split an array into multiple sub-arrays of equal size.
|
|
893
|
+
|
|
894
|
+
Examples
|
|
895
|
+
--------
|
|
896
|
+
>>> import numpy as np
|
|
897
|
+
>>> x = np.arange(16.0).reshape(4, 4)
|
|
898
|
+
>>> x
|
|
899
|
+
array([[ 0., 1., 2., 3.],
|
|
900
|
+
[ 4., 5., 6., 7.],
|
|
901
|
+
[ 8., 9., 10., 11.],
|
|
902
|
+
[12., 13., 14., 15.]])
|
|
903
|
+
>>> np.hsplit(x, 2)
|
|
904
|
+
[array([[ 0., 1.],
|
|
905
|
+
[ 4., 5.],
|
|
906
|
+
[ 8., 9.],
|
|
907
|
+
[12., 13.]]),
|
|
908
|
+
array([[ 2., 3.],
|
|
909
|
+
[ 6., 7.],
|
|
910
|
+
[10., 11.],
|
|
911
|
+
[14., 15.]])]
|
|
912
|
+
>>> np.hsplit(x, np.array([3, 6]))
|
|
913
|
+
[array([[ 0., 1., 2.],
|
|
914
|
+
[ 4., 5., 6.],
|
|
915
|
+
[ 8., 9., 10.],
|
|
916
|
+
[12., 13., 14.]]),
|
|
917
|
+
array([[ 3.],
|
|
918
|
+
[ 7.],
|
|
919
|
+
[11.],
|
|
920
|
+
[15.]]),
|
|
921
|
+
array([], shape=(4, 0), dtype=float64)]
|
|
922
|
+
|
|
923
|
+
With a higher dimensional array the split is still along the second axis.
|
|
924
|
+
|
|
925
|
+
>>> x = np.arange(8.0).reshape(2, 2, 2)
|
|
926
|
+
>>> x
|
|
927
|
+
array([[[0., 1.],
|
|
928
|
+
[2., 3.]],
|
|
929
|
+
[[4., 5.],
|
|
930
|
+
[6., 7.]]])
|
|
931
|
+
>>> np.hsplit(x, 2)
|
|
932
|
+
[array([[[0., 1.]],
|
|
933
|
+
[[4., 5.]]]),
|
|
934
|
+
array([[[2., 3.]],
|
|
935
|
+
[[6., 7.]]])]
|
|
936
|
+
|
|
937
|
+
With a 1-D array, the split is along axis 0.
|
|
938
|
+
|
|
939
|
+
>>> x = np.array([0, 1, 2, 3, 4, 5])
|
|
940
|
+
>>> np.hsplit(x, 2)
|
|
941
|
+
[array([0, 1, 2]), array([3, 4, 5])]
|
|
942
|
+
|
|
943
|
+
"""
|
|
944
|
+
if _nx.ndim(ary) == 0:
|
|
945
|
+
raise ValueError('hsplit only works on arrays of 1 or more dimensions')
|
|
946
|
+
if ary.ndim > 1:
|
|
947
|
+
return split(ary, indices_or_sections, 1)
|
|
948
|
+
else:
|
|
949
|
+
return split(ary, indices_or_sections, 0)
|
|
950
|
+
|
|
951
|
+
|
|
952
|
+
@array_function_dispatch(_hvdsplit_dispatcher)
|
|
953
|
+
def vsplit(ary, indices_or_sections):
|
|
954
|
+
"""
|
|
955
|
+
Split an array into multiple sub-arrays vertically (row-wise).
|
|
956
|
+
|
|
957
|
+
Please refer to the ``split`` documentation. ``vsplit`` is equivalent
|
|
958
|
+
to ``split`` with `axis=0` (default), the array is always split along the
|
|
959
|
+
first axis regardless of the array dimension.
|
|
960
|
+
|
|
961
|
+
See Also
|
|
962
|
+
--------
|
|
963
|
+
split : Split an array into multiple sub-arrays of equal size.
|
|
964
|
+
|
|
965
|
+
Examples
|
|
966
|
+
--------
|
|
967
|
+
>>> import numpy as np
|
|
968
|
+
>>> x = np.arange(16.0).reshape(4, 4)
|
|
969
|
+
>>> x
|
|
970
|
+
array([[ 0., 1., 2., 3.],
|
|
971
|
+
[ 4., 5., 6., 7.],
|
|
972
|
+
[ 8., 9., 10., 11.],
|
|
973
|
+
[12., 13., 14., 15.]])
|
|
974
|
+
>>> np.vsplit(x, 2)
|
|
975
|
+
[array([[0., 1., 2., 3.],
|
|
976
|
+
[4., 5., 6., 7.]]),
|
|
977
|
+
array([[ 8., 9., 10., 11.],
|
|
978
|
+
[12., 13., 14., 15.]])]
|
|
979
|
+
>>> np.vsplit(x, np.array([3, 6]))
|
|
980
|
+
[array([[ 0., 1., 2., 3.],
|
|
981
|
+
[ 4., 5., 6., 7.],
|
|
982
|
+
[ 8., 9., 10., 11.]]),
|
|
983
|
+
array([[12., 13., 14., 15.]]),
|
|
984
|
+
array([], shape=(0, 4), dtype=float64)]
|
|
985
|
+
|
|
986
|
+
With a higher dimensional array the split is still along the first axis.
|
|
987
|
+
|
|
988
|
+
>>> x = np.arange(8.0).reshape(2, 2, 2)
|
|
989
|
+
>>> x
|
|
990
|
+
array([[[0., 1.],
|
|
991
|
+
[2., 3.]],
|
|
992
|
+
[[4., 5.],
|
|
993
|
+
[6., 7.]]])
|
|
994
|
+
>>> np.vsplit(x, 2)
|
|
995
|
+
[array([[[0., 1.],
|
|
996
|
+
[2., 3.]]]),
|
|
997
|
+
array([[[4., 5.],
|
|
998
|
+
[6., 7.]]])]
|
|
999
|
+
|
|
1000
|
+
"""
|
|
1001
|
+
if _nx.ndim(ary) < 2:
|
|
1002
|
+
raise ValueError('vsplit only works on arrays of 2 or more dimensions')
|
|
1003
|
+
return split(ary, indices_or_sections, 0)
|
|
1004
|
+
|
|
1005
|
+
|
|
1006
|
+
@array_function_dispatch(_hvdsplit_dispatcher)
|
|
1007
|
+
def dsplit(ary, indices_or_sections):
|
|
1008
|
+
"""
|
|
1009
|
+
Split array into multiple sub-arrays along the 3rd axis (depth).
|
|
1010
|
+
|
|
1011
|
+
Please refer to the `split` documentation. `dsplit` is equivalent
|
|
1012
|
+
to `split` with ``axis=2``, the array is always split along the third
|
|
1013
|
+
axis provided the array dimension is greater than or equal to 3.
|
|
1014
|
+
|
|
1015
|
+
See Also
|
|
1016
|
+
--------
|
|
1017
|
+
split : Split an array into multiple sub-arrays of equal size.
|
|
1018
|
+
|
|
1019
|
+
Examples
|
|
1020
|
+
--------
|
|
1021
|
+
>>> import numpy as np
|
|
1022
|
+
>>> x = np.arange(16.0).reshape(2, 2, 4)
|
|
1023
|
+
>>> x
|
|
1024
|
+
array([[[ 0., 1., 2., 3.],
|
|
1025
|
+
[ 4., 5., 6., 7.]],
|
|
1026
|
+
[[ 8., 9., 10., 11.],
|
|
1027
|
+
[12., 13., 14., 15.]]])
|
|
1028
|
+
>>> np.dsplit(x, 2)
|
|
1029
|
+
[array([[[ 0., 1.],
|
|
1030
|
+
[ 4., 5.]],
|
|
1031
|
+
[[ 8., 9.],
|
|
1032
|
+
[12., 13.]]]), array([[[ 2., 3.],
|
|
1033
|
+
[ 6., 7.]],
|
|
1034
|
+
[[10., 11.],
|
|
1035
|
+
[14., 15.]]])]
|
|
1036
|
+
>>> np.dsplit(x, np.array([3, 6]))
|
|
1037
|
+
[array([[[ 0., 1., 2.],
|
|
1038
|
+
[ 4., 5., 6.]],
|
|
1039
|
+
[[ 8., 9., 10.],
|
|
1040
|
+
[12., 13., 14.]]]),
|
|
1041
|
+
array([[[ 3.],
|
|
1042
|
+
[ 7.]],
|
|
1043
|
+
[[11.],
|
|
1044
|
+
[15.]]]),
|
|
1045
|
+
array([], shape=(2, 2, 0), dtype=float64)]
|
|
1046
|
+
"""
|
|
1047
|
+
if _nx.ndim(ary) < 3:
|
|
1048
|
+
raise ValueError('dsplit only works on arrays of 3 or more dimensions')
|
|
1049
|
+
return split(ary, indices_or_sections, 2)
|
|
1050
|
+
|
|
1051
|
+
|
|
1052
|
+
def get_array_wrap(*args):
|
|
1053
|
+
"""Find the wrapper for the array with the highest priority.
|
|
1054
|
+
|
|
1055
|
+
In case of ties, leftmost wins. If no wrapper is found, return None.
|
|
1056
|
+
|
|
1057
|
+
.. deprecated:: 2.0
|
|
1058
|
+
"""
|
|
1059
|
+
|
|
1060
|
+
# Deprecated in NumPy 2.0, 2023-07-11
|
|
1061
|
+
warnings.warn(
|
|
1062
|
+
"`get_array_wrap` is deprecated. "
|
|
1063
|
+
"(deprecated in NumPy 2.0)",
|
|
1064
|
+
DeprecationWarning,
|
|
1065
|
+
stacklevel=2
|
|
1066
|
+
)
|
|
1067
|
+
|
|
1068
|
+
wrappers = sorted((getattr(x, '__array_priority__', 0), -i,
|
|
1069
|
+
x.__array_wrap__) for i, x in enumerate(args)
|
|
1070
|
+
if hasattr(x, '__array_wrap__'))
|
|
1071
|
+
if wrappers:
|
|
1072
|
+
return wrappers[-1][-1]
|
|
1073
|
+
return None
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
def _kron_dispatcher(a, b):
|
|
1077
|
+
return (a, b)
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
@array_function_dispatch(_kron_dispatcher)
|
|
1081
|
+
def kron(a, b):
|
|
1082
|
+
"""
|
|
1083
|
+
Kronecker product of two arrays.
|
|
1084
|
+
|
|
1085
|
+
Computes the Kronecker product, a composite array made of blocks of the
|
|
1086
|
+
second array scaled by the first.
|
|
1087
|
+
|
|
1088
|
+
Parameters
|
|
1089
|
+
----------
|
|
1090
|
+
a, b : array_like
|
|
1091
|
+
|
|
1092
|
+
Returns
|
|
1093
|
+
-------
|
|
1094
|
+
out : ndarray
|
|
1095
|
+
|
|
1096
|
+
See Also
|
|
1097
|
+
--------
|
|
1098
|
+
outer : The outer product
|
|
1099
|
+
|
|
1100
|
+
Notes
|
|
1101
|
+
-----
|
|
1102
|
+
The function assumes that the number of dimensions of `a` and `b`
|
|
1103
|
+
are the same, if necessary prepending the smallest with ones.
|
|
1104
|
+
If ``a.shape = (r0,r1,...,rN)`` and ``b.shape = (s0,s1,...,sN)``,
|
|
1105
|
+
the Kronecker product has shape ``(r0*s0, r1*s1, ..., rN*SN)``.
|
|
1106
|
+
The elements are products of elements from `a` and `b`, organized
|
|
1107
|
+
explicitly by::
|
|
1108
|
+
|
|
1109
|
+
kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN]
|
|
1110
|
+
|
|
1111
|
+
where::
|
|
1112
|
+
|
|
1113
|
+
kt = it * st + jt, t = 0,...,N
|
|
1114
|
+
|
|
1115
|
+
In the common 2-D case (N=1), the block structure can be visualized::
|
|
1116
|
+
|
|
1117
|
+
[[ a[0,0]*b, a[0,1]*b, ... , a[0,-1]*b ],
|
|
1118
|
+
[ ... ... ],
|
|
1119
|
+
[ a[-1,0]*b, a[-1,1]*b, ... , a[-1,-1]*b ]]
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
Examples
|
|
1123
|
+
--------
|
|
1124
|
+
>>> import numpy as np
|
|
1125
|
+
>>> np.kron([1,10,100], [5,6,7])
|
|
1126
|
+
array([ 5, 6, 7, ..., 500, 600, 700])
|
|
1127
|
+
>>> np.kron([5,6,7], [1,10,100])
|
|
1128
|
+
array([ 5, 50, 500, ..., 7, 70, 700])
|
|
1129
|
+
|
|
1130
|
+
>>> np.kron(np.eye(2), np.ones((2,2)))
|
|
1131
|
+
array([[1., 1., 0., 0.],
|
|
1132
|
+
[1., 1., 0., 0.],
|
|
1133
|
+
[0., 0., 1., 1.],
|
|
1134
|
+
[0., 0., 1., 1.]])
|
|
1135
|
+
|
|
1136
|
+
>>> a = np.arange(100).reshape((2,5,2,5))
|
|
1137
|
+
>>> b = np.arange(24).reshape((2,3,4))
|
|
1138
|
+
>>> c = np.kron(a,b)
|
|
1139
|
+
>>> c.shape
|
|
1140
|
+
(2, 10, 6, 20)
|
|
1141
|
+
>>> I = (1,3,0,2)
|
|
1142
|
+
>>> J = (0,2,1)
|
|
1143
|
+
>>> J1 = (0,) + J # extend to ndim=4
|
|
1144
|
+
>>> S1 = (1,) + b.shape
|
|
1145
|
+
>>> K = tuple(np.array(I) * np.array(S1) + np.array(J1))
|
|
1146
|
+
>>> c[K] == a[I]*b[J]
|
|
1147
|
+
True
|
|
1148
|
+
|
|
1149
|
+
"""
|
|
1150
|
+
# Working:
|
|
1151
|
+
# 1. Equalise the shapes by prepending smaller array with 1s
|
|
1152
|
+
# 2. Expand shapes of both the arrays by adding new axes at
|
|
1153
|
+
# odd positions for 1st array and even positions for 2nd
|
|
1154
|
+
# 3. Compute the product of the modified array
|
|
1155
|
+
# 4. The inner most array elements now contain the rows of
|
|
1156
|
+
# the Kronecker product
|
|
1157
|
+
# 5. Reshape the result to kron's shape, which is same as
|
|
1158
|
+
# product of shapes of the two arrays.
|
|
1159
|
+
b = asanyarray(b)
|
|
1160
|
+
a = array(a, copy=None, subok=True, ndmin=b.ndim)
|
|
1161
|
+
is_any_mat = isinstance(a, matrix) or isinstance(b, matrix)
|
|
1162
|
+
ndb, nda = b.ndim, a.ndim
|
|
1163
|
+
nd = max(ndb, nda)
|
|
1164
|
+
|
|
1165
|
+
if (nda == 0 or ndb == 0):
|
|
1166
|
+
return _nx.multiply(a, b)
|
|
1167
|
+
|
|
1168
|
+
as_ = a.shape
|
|
1169
|
+
bs = b.shape
|
|
1170
|
+
if not a.flags.contiguous:
|
|
1171
|
+
a = reshape(a, as_)
|
|
1172
|
+
if not b.flags.contiguous:
|
|
1173
|
+
b = reshape(b, bs)
|
|
1174
|
+
|
|
1175
|
+
# Equalise the shapes by prepending smaller one with 1s
|
|
1176
|
+
as_ = (1,) * max(0, ndb - nda) + as_
|
|
1177
|
+
bs = (1,) * max(0, nda - ndb) + bs
|
|
1178
|
+
|
|
1179
|
+
# Insert empty dimensions
|
|
1180
|
+
a_arr = expand_dims(a, axis=tuple(range(ndb - nda)))
|
|
1181
|
+
b_arr = expand_dims(b, axis=tuple(range(nda - ndb)))
|
|
1182
|
+
|
|
1183
|
+
# Compute the product
|
|
1184
|
+
a_arr = expand_dims(a_arr, axis=tuple(range(1, nd * 2, 2)))
|
|
1185
|
+
b_arr = expand_dims(b_arr, axis=tuple(range(0, nd * 2, 2)))
|
|
1186
|
+
# In case of `mat`, convert result to `array`
|
|
1187
|
+
result = _nx.multiply(a_arr, b_arr, subok=(not is_any_mat))
|
|
1188
|
+
|
|
1189
|
+
# Reshape back
|
|
1190
|
+
result = result.reshape(_nx.multiply(as_, bs))
|
|
1191
|
+
|
|
1192
|
+
return result if not is_any_mat else matrix(result, copy=False)
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
def _tile_dispatcher(A, reps):
|
|
1196
|
+
return (A, reps)
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
@array_function_dispatch(_tile_dispatcher)
|
|
1200
|
+
def tile(A, reps):
|
|
1201
|
+
"""
|
|
1202
|
+
Construct an array by repeating A the number of times given by reps.
|
|
1203
|
+
|
|
1204
|
+
If `reps` has length ``d``, the result will have dimension of
|
|
1205
|
+
``max(d, A.ndim)``.
|
|
1206
|
+
|
|
1207
|
+
If ``A.ndim < d``, `A` is promoted to be d-dimensional by prepending new
|
|
1208
|
+
axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication,
|
|
1209
|
+
or shape (1, 1, 3) for 3-D replication. If this is not the desired
|
|
1210
|
+
behavior, promote `A` to d-dimensions manually before calling this
|
|
1211
|
+
function.
|
|
1212
|
+
|
|
1213
|
+
If ``A.ndim > d``, `reps` is promoted to `A`.ndim by prepending 1's to it.
|
|
1214
|
+
Thus for an `A` of shape (2, 3, 4, 5), a `reps` of (2, 2) is treated as
|
|
1215
|
+
(1, 1, 2, 2).
|
|
1216
|
+
|
|
1217
|
+
Note : Although tile may be used for broadcasting, it is strongly
|
|
1218
|
+
recommended to use numpy's broadcasting operations and functions.
|
|
1219
|
+
|
|
1220
|
+
Parameters
|
|
1221
|
+
----------
|
|
1222
|
+
A : array_like
|
|
1223
|
+
The input array.
|
|
1224
|
+
reps : array_like
|
|
1225
|
+
The number of repetitions of `A` along each axis.
|
|
1226
|
+
|
|
1227
|
+
Returns
|
|
1228
|
+
-------
|
|
1229
|
+
c : ndarray
|
|
1230
|
+
The tiled output array.
|
|
1231
|
+
|
|
1232
|
+
See Also
|
|
1233
|
+
--------
|
|
1234
|
+
repeat : Repeat elements of an array.
|
|
1235
|
+
broadcast_to : Broadcast an array to a new shape
|
|
1236
|
+
|
|
1237
|
+
Examples
|
|
1238
|
+
--------
|
|
1239
|
+
>>> import numpy as np
|
|
1240
|
+
>>> a = np.array([0, 1, 2])
|
|
1241
|
+
>>> np.tile(a, 2)
|
|
1242
|
+
array([0, 1, 2, 0, 1, 2])
|
|
1243
|
+
>>> np.tile(a, (2, 2))
|
|
1244
|
+
array([[0, 1, 2, 0, 1, 2],
|
|
1245
|
+
[0, 1, 2, 0, 1, 2]])
|
|
1246
|
+
>>> np.tile(a, (2, 1, 2))
|
|
1247
|
+
array([[[0, 1, 2, 0, 1, 2]],
|
|
1248
|
+
[[0, 1, 2, 0, 1, 2]]])
|
|
1249
|
+
|
|
1250
|
+
>>> b = np.array([[1, 2], [3, 4]])
|
|
1251
|
+
>>> np.tile(b, 2)
|
|
1252
|
+
array([[1, 2, 1, 2],
|
|
1253
|
+
[3, 4, 3, 4]])
|
|
1254
|
+
>>> np.tile(b, (2, 1))
|
|
1255
|
+
array([[1, 2],
|
|
1256
|
+
[3, 4],
|
|
1257
|
+
[1, 2],
|
|
1258
|
+
[3, 4]])
|
|
1259
|
+
|
|
1260
|
+
>>> c = np.array([1,2,3,4])
|
|
1261
|
+
>>> np.tile(c,(4,1))
|
|
1262
|
+
array([[1, 2, 3, 4],
|
|
1263
|
+
[1, 2, 3, 4],
|
|
1264
|
+
[1, 2, 3, 4],
|
|
1265
|
+
[1, 2, 3, 4]])
|
|
1266
|
+
"""
|
|
1267
|
+
try:
|
|
1268
|
+
tup = tuple(reps)
|
|
1269
|
+
except TypeError:
|
|
1270
|
+
tup = (reps,)
|
|
1271
|
+
d = len(tup)
|
|
1272
|
+
if all(x == 1 for x in tup) and isinstance(A, _nx.ndarray):
|
|
1273
|
+
# Fixes the problem that the function does not make a copy if A is a
|
|
1274
|
+
# numpy array and the repetitions are 1 in all dimensions
|
|
1275
|
+
return _nx.array(A, copy=True, subok=True, ndmin=d)
|
|
1276
|
+
else:
|
|
1277
|
+
# Note that no copy of zero-sized arrays is made. However since they
|
|
1278
|
+
# have no data there is no risk of an inadvertent overwrite.
|
|
1279
|
+
c = _nx.array(A, copy=None, subok=True, ndmin=d)
|
|
1280
|
+
if (d < c.ndim):
|
|
1281
|
+
tup = (1,) * (c.ndim - d) + tup
|
|
1282
|
+
shape_out = tuple(s * t for s, t in zip(c.shape, tup))
|
|
1283
|
+
n = c.size
|
|
1284
|
+
if n > 0:
|
|
1285
|
+
for dim_in, nrep in zip(c.shape, tup):
|
|
1286
|
+
if nrep != 1:
|
|
1287
|
+
c = c.reshape(-1, n).repeat(nrep, 0)
|
|
1288
|
+
n //= dim_in
|
|
1289
|
+
return c.reshape(shape_out)
|