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
numpy/_core/numeric.py
ADDED
|
@@ -0,0 +1,2758 @@
|
|
|
1
|
+
import builtins
|
|
2
|
+
import functools
|
|
3
|
+
import itertools
|
|
4
|
+
import math
|
|
5
|
+
import numbers
|
|
6
|
+
import operator
|
|
7
|
+
import sys
|
|
8
|
+
import warnings
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
from numpy.exceptions import AxisError
|
|
12
|
+
|
|
13
|
+
from . import multiarray, numerictypes, numerictypes as nt, overrides, shape_base, umath
|
|
14
|
+
from ._ufunc_config import errstate
|
|
15
|
+
from .multiarray import ( # noqa: F401
|
|
16
|
+
ALLOW_THREADS,
|
|
17
|
+
BUFSIZE,
|
|
18
|
+
CLIP,
|
|
19
|
+
MAXDIMS,
|
|
20
|
+
MAY_SHARE_BOUNDS,
|
|
21
|
+
MAY_SHARE_EXACT,
|
|
22
|
+
RAISE,
|
|
23
|
+
WRAP,
|
|
24
|
+
arange,
|
|
25
|
+
array,
|
|
26
|
+
asanyarray,
|
|
27
|
+
asarray,
|
|
28
|
+
ascontiguousarray,
|
|
29
|
+
asfortranarray,
|
|
30
|
+
broadcast,
|
|
31
|
+
can_cast,
|
|
32
|
+
concatenate,
|
|
33
|
+
copyto,
|
|
34
|
+
dot,
|
|
35
|
+
dtype,
|
|
36
|
+
empty,
|
|
37
|
+
empty_like,
|
|
38
|
+
flatiter,
|
|
39
|
+
from_dlpack,
|
|
40
|
+
frombuffer,
|
|
41
|
+
fromfile,
|
|
42
|
+
fromiter,
|
|
43
|
+
fromstring,
|
|
44
|
+
inner,
|
|
45
|
+
lexsort,
|
|
46
|
+
matmul,
|
|
47
|
+
may_share_memory,
|
|
48
|
+
min_scalar_type,
|
|
49
|
+
ndarray,
|
|
50
|
+
nditer,
|
|
51
|
+
nested_iters,
|
|
52
|
+
normalize_axis_index,
|
|
53
|
+
promote_types,
|
|
54
|
+
putmask,
|
|
55
|
+
result_type,
|
|
56
|
+
shares_memory,
|
|
57
|
+
vdot,
|
|
58
|
+
vecdot,
|
|
59
|
+
where,
|
|
60
|
+
zeros,
|
|
61
|
+
)
|
|
62
|
+
from .overrides import finalize_array_function_like, set_module
|
|
63
|
+
from .umath import NAN, PINF, invert, multiply, sin
|
|
64
|
+
|
|
65
|
+
bitwise_not = invert
|
|
66
|
+
ufunc = type(sin)
|
|
67
|
+
newaxis = None
|
|
68
|
+
|
|
69
|
+
array_function_dispatch = functools.partial(
|
|
70
|
+
overrides.array_function_dispatch, module='numpy')
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
__all__ = [
|
|
74
|
+
'newaxis', 'ndarray', 'flatiter', 'nditer', 'nested_iters', 'ufunc',
|
|
75
|
+
'arange', 'array', 'asarray', 'asanyarray', 'ascontiguousarray',
|
|
76
|
+
'asfortranarray', 'zeros', 'count_nonzero', 'empty', 'broadcast', 'dtype',
|
|
77
|
+
'fromstring', 'fromfile', 'frombuffer', 'from_dlpack', 'where',
|
|
78
|
+
'argwhere', 'copyto', 'concatenate', 'lexsort', 'astype',
|
|
79
|
+
'can_cast', 'promote_types', 'min_scalar_type',
|
|
80
|
+
'result_type', 'isfortran', 'empty_like', 'zeros_like', 'ones_like',
|
|
81
|
+
'correlate', 'convolve', 'inner', 'dot', 'outer', 'vdot', 'roll',
|
|
82
|
+
'rollaxis', 'moveaxis', 'cross', 'tensordot', 'little_endian',
|
|
83
|
+
'fromiter', 'array_equal', 'array_equiv', 'indices', 'fromfunction',
|
|
84
|
+
'isclose', 'isscalar', 'binary_repr', 'base_repr', 'ones',
|
|
85
|
+
'identity', 'allclose', 'putmask',
|
|
86
|
+
'flatnonzero', 'inf', 'nan', 'False_', 'True_', 'bitwise_not',
|
|
87
|
+
'full', 'full_like', 'matmul', 'vecdot', 'shares_memory',
|
|
88
|
+
'may_share_memory']
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _zeros_like_dispatcher(
|
|
92
|
+
a, dtype=None, order=None, subok=None, shape=None, *, device=None
|
|
93
|
+
):
|
|
94
|
+
return (a,)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@array_function_dispatch(_zeros_like_dispatcher)
|
|
98
|
+
def zeros_like(
|
|
99
|
+
a, dtype=None, order='K', subok=True, shape=None, *, device=None
|
|
100
|
+
):
|
|
101
|
+
"""
|
|
102
|
+
Return an array of zeros with the same shape and type as a given array.
|
|
103
|
+
|
|
104
|
+
Parameters
|
|
105
|
+
----------
|
|
106
|
+
a : array_like
|
|
107
|
+
The shape and data-type of `a` define these same attributes of
|
|
108
|
+
the returned array.
|
|
109
|
+
dtype : data-type, optional
|
|
110
|
+
Overrides the data type of the result.
|
|
111
|
+
order : {'C', 'F', 'A', or 'K'}, optional
|
|
112
|
+
Overrides the memory layout of the result. 'C' means C-order,
|
|
113
|
+
'F' means F-order, 'A' means 'F' if `a` is Fortran contiguous,
|
|
114
|
+
'C' otherwise. 'K' means match the layout of `a` as closely
|
|
115
|
+
as possible.
|
|
116
|
+
subok : bool, optional.
|
|
117
|
+
If True, then the newly created array will use the sub-class
|
|
118
|
+
type of `a`, otherwise it will be a base-class array. Defaults
|
|
119
|
+
to True.
|
|
120
|
+
shape : int or sequence of ints, optional.
|
|
121
|
+
Overrides the shape of the result. If order='K' and the number of
|
|
122
|
+
dimensions is unchanged, will try to keep order, otherwise,
|
|
123
|
+
order='C' is implied.
|
|
124
|
+
device : str, optional
|
|
125
|
+
The device on which to place the created array. Default: None.
|
|
126
|
+
For Array-API interoperability only, so must be ``"cpu"`` if passed.
|
|
127
|
+
|
|
128
|
+
.. versionadded:: 2.0.0
|
|
129
|
+
|
|
130
|
+
Returns
|
|
131
|
+
-------
|
|
132
|
+
out : ndarray
|
|
133
|
+
Array of zeros with the same shape and type as `a`.
|
|
134
|
+
|
|
135
|
+
See Also
|
|
136
|
+
--------
|
|
137
|
+
empty_like : Return an empty array with shape and type of input.
|
|
138
|
+
ones_like : Return an array of ones with shape and type of input.
|
|
139
|
+
full_like : Return a new array with shape of input filled with value.
|
|
140
|
+
zeros : Return a new array setting values to zero.
|
|
141
|
+
|
|
142
|
+
Examples
|
|
143
|
+
--------
|
|
144
|
+
>>> import numpy as np
|
|
145
|
+
>>> x = np.arange(6)
|
|
146
|
+
>>> x = x.reshape((2, 3))
|
|
147
|
+
>>> x
|
|
148
|
+
array([[0, 1, 2],
|
|
149
|
+
[3, 4, 5]])
|
|
150
|
+
>>> np.zeros_like(x)
|
|
151
|
+
array([[0, 0, 0],
|
|
152
|
+
[0, 0, 0]])
|
|
153
|
+
|
|
154
|
+
>>> y = np.arange(3, dtype=float)
|
|
155
|
+
>>> y
|
|
156
|
+
array([0., 1., 2.])
|
|
157
|
+
>>> np.zeros_like(y)
|
|
158
|
+
array([0., 0., 0.])
|
|
159
|
+
|
|
160
|
+
"""
|
|
161
|
+
res = empty_like(
|
|
162
|
+
a, dtype=dtype, order=order, subok=subok, shape=shape, device=device
|
|
163
|
+
)
|
|
164
|
+
# needed instead of a 0 to get same result as zeros for string dtypes
|
|
165
|
+
z = zeros(1, dtype=res.dtype)
|
|
166
|
+
multiarray.copyto(res, z, casting='unsafe')
|
|
167
|
+
return res
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
@finalize_array_function_like
|
|
171
|
+
@set_module('numpy')
|
|
172
|
+
def ones(shape, dtype=None, order='C', *, device=None, like=None):
|
|
173
|
+
"""
|
|
174
|
+
Return a new array of given shape and type, filled with ones.
|
|
175
|
+
|
|
176
|
+
Parameters
|
|
177
|
+
----------
|
|
178
|
+
shape : int or sequence of ints
|
|
179
|
+
Shape of the new array, e.g., ``(2, 3)`` or ``2``.
|
|
180
|
+
dtype : data-type, optional
|
|
181
|
+
The desired data-type for the array, e.g., `numpy.int8`. Default is
|
|
182
|
+
`numpy.float64`.
|
|
183
|
+
order : {'C', 'F'}, optional, default: C
|
|
184
|
+
Whether to store multi-dimensional data in row-major
|
|
185
|
+
(C-style) or column-major (Fortran-style) order in
|
|
186
|
+
memory.
|
|
187
|
+
device : str, optional
|
|
188
|
+
The device on which to place the created array. Default: None.
|
|
189
|
+
For Array-API interoperability only, so must be ``"cpu"`` if passed.
|
|
190
|
+
|
|
191
|
+
.. versionadded:: 2.0.0
|
|
192
|
+
${ARRAY_FUNCTION_LIKE}
|
|
193
|
+
|
|
194
|
+
.. versionadded:: 1.20.0
|
|
195
|
+
|
|
196
|
+
Returns
|
|
197
|
+
-------
|
|
198
|
+
out : ndarray
|
|
199
|
+
Array of ones with the given shape, dtype, and order.
|
|
200
|
+
|
|
201
|
+
See Also
|
|
202
|
+
--------
|
|
203
|
+
ones_like : Return an array of ones with shape and type of input.
|
|
204
|
+
empty : Return a new uninitialized array.
|
|
205
|
+
zeros : Return a new array setting values to zero.
|
|
206
|
+
full : Return a new array of given shape filled with value.
|
|
207
|
+
|
|
208
|
+
Examples
|
|
209
|
+
--------
|
|
210
|
+
>>> import numpy as np
|
|
211
|
+
>>> np.ones(5)
|
|
212
|
+
array([1., 1., 1., 1., 1.])
|
|
213
|
+
|
|
214
|
+
>>> np.ones((5,), dtype=int)
|
|
215
|
+
array([1, 1, 1, 1, 1])
|
|
216
|
+
|
|
217
|
+
>>> np.ones((2, 1))
|
|
218
|
+
array([[1.],
|
|
219
|
+
[1.]])
|
|
220
|
+
|
|
221
|
+
>>> s = (2,2)
|
|
222
|
+
>>> np.ones(s)
|
|
223
|
+
array([[1., 1.],
|
|
224
|
+
[1., 1.]])
|
|
225
|
+
|
|
226
|
+
"""
|
|
227
|
+
if like is not None:
|
|
228
|
+
return _ones_with_like(
|
|
229
|
+
like, shape, dtype=dtype, order=order, device=device
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
a = empty(shape, dtype, order, device=device)
|
|
233
|
+
multiarray.copyto(a, 1, casting='unsafe')
|
|
234
|
+
return a
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
_ones_with_like = array_function_dispatch()(ones)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _ones_like_dispatcher(
|
|
241
|
+
a, dtype=None, order=None, subok=None, shape=None, *, device=None
|
|
242
|
+
):
|
|
243
|
+
return (a,)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
@array_function_dispatch(_ones_like_dispatcher)
|
|
247
|
+
def ones_like(
|
|
248
|
+
a, dtype=None, order='K', subok=True, shape=None, *, device=None
|
|
249
|
+
):
|
|
250
|
+
"""
|
|
251
|
+
Return an array of ones with the same shape and type as a given array.
|
|
252
|
+
|
|
253
|
+
Parameters
|
|
254
|
+
----------
|
|
255
|
+
a : array_like
|
|
256
|
+
The shape and data-type of `a` define these same attributes of
|
|
257
|
+
the returned array.
|
|
258
|
+
dtype : data-type, optional
|
|
259
|
+
Overrides the data type of the result.
|
|
260
|
+
order : {'C', 'F', 'A', or 'K'}, optional
|
|
261
|
+
Overrides the memory layout of the result. 'C' means C-order,
|
|
262
|
+
'F' means F-order, 'A' means 'F' if `a` is Fortran contiguous,
|
|
263
|
+
'C' otherwise. 'K' means match the layout of `a` as closely
|
|
264
|
+
as possible.
|
|
265
|
+
subok : bool, optional.
|
|
266
|
+
If True, then the newly created array will use the sub-class
|
|
267
|
+
type of `a`, otherwise it will be a base-class array. Defaults
|
|
268
|
+
to True.
|
|
269
|
+
shape : int or sequence of ints, optional.
|
|
270
|
+
Overrides the shape of the result. If order='K' and the number of
|
|
271
|
+
dimensions is unchanged, will try to keep order, otherwise,
|
|
272
|
+
order='C' is implied.
|
|
273
|
+
device : str, optional
|
|
274
|
+
The device on which to place the created array. Default: None.
|
|
275
|
+
For Array-API interoperability only, so must be ``"cpu"`` if passed.
|
|
276
|
+
|
|
277
|
+
.. versionadded:: 2.0.0
|
|
278
|
+
|
|
279
|
+
Returns
|
|
280
|
+
-------
|
|
281
|
+
out : ndarray
|
|
282
|
+
Array of ones with the same shape and type as `a`.
|
|
283
|
+
|
|
284
|
+
See Also
|
|
285
|
+
--------
|
|
286
|
+
empty_like : Return an empty array with shape and type of input.
|
|
287
|
+
zeros_like : Return an array of zeros with shape and type of input.
|
|
288
|
+
full_like : Return a new array with shape of input filled with value.
|
|
289
|
+
ones : Return a new array setting values to one.
|
|
290
|
+
|
|
291
|
+
Examples
|
|
292
|
+
--------
|
|
293
|
+
>>> import numpy as np
|
|
294
|
+
>>> x = np.arange(6)
|
|
295
|
+
>>> x = x.reshape((2, 3))
|
|
296
|
+
>>> x
|
|
297
|
+
array([[0, 1, 2],
|
|
298
|
+
[3, 4, 5]])
|
|
299
|
+
>>> np.ones_like(x)
|
|
300
|
+
array([[1, 1, 1],
|
|
301
|
+
[1, 1, 1]])
|
|
302
|
+
|
|
303
|
+
>>> y = np.arange(3, dtype=float)
|
|
304
|
+
>>> y
|
|
305
|
+
array([0., 1., 2.])
|
|
306
|
+
>>> np.ones_like(y)
|
|
307
|
+
array([1., 1., 1.])
|
|
308
|
+
|
|
309
|
+
"""
|
|
310
|
+
res = empty_like(
|
|
311
|
+
a, dtype=dtype, order=order, subok=subok, shape=shape, device=device
|
|
312
|
+
)
|
|
313
|
+
multiarray.copyto(res, 1, casting='unsafe')
|
|
314
|
+
return res
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def _full_dispatcher(
|
|
318
|
+
shape, fill_value, dtype=None, order=None, *, device=None, like=None
|
|
319
|
+
):
|
|
320
|
+
return (like,)
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
@finalize_array_function_like
|
|
324
|
+
@set_module('numpy')
|
|
325
|
+
def full(shape, fill_value, dtype=None, order='C', *, device=None, like=None):
|
|
326
|
+
"""
|
|
327
|
+
Return a new array of given shape and type, filled with `fill_value`.
|
|
328
|
+
|
|
329
|
+
Parameters
|
|
330
|
+
----------
|
|
331
|
+
shape : int or sequence of ints
|
|
332
|
+
Shape of the new array, e.g., ``(2, 3)`` or ``2``.
|
|
333
|
+
fill_value : scalar or array_like
|
|
334
|
+
Fill value.
|
|
335
|
+
dtype : data-type, optional
|
|
336
|
+
The desired data-type for the array The default, None, means
|
|
337
|
+
``np.array(fill_value).dtype``.
|
|
338
|
+
order : {'C', 'F'}, optional
|
|
339
|
+
Whether to store multidimensional data in C- or Fortran-contiguous
|
|
340
|
+
(row- or column-wise) order in memory.
|
|
341
|
+
device : str, optional
|
|
342
|
+
The device on which to place the created array. Default: None.
|
|
343
|
+
For Array-API interoperability only, so must be ``"cpu"`` if passed.
|
|
344
|
+
|
|
345
|
+
.. versionadded:: 2.0.0
|
|
346
|
+
${ARRAY_FUNCTION_LIKE}
|
|
347
|
+
|
|
348
|
+
.. versionadded:: 1.20.0
|
|
349
|
+
|
|
350
|
+
Returns
|
|
351
|
+
-------
|
|
352
|
+
out : ndarray
|
|
353
|
+
Array of `fill_value` with the given shape, dtype, and order.
|
|
354
|
+
|
|
355
|
+
See Also
|
|
356
|
+
--------
|
|
357
|
+
full_like : Return a new array with shape of input filled with value.
|
|
358
|
+
empty : Return a new uninitialized array.
|
|
359
|
+
ones : Return a new array setting values to one.
|
|
360
|
+
zeros : Return a new array setting values to zero.
|
|
361
|
+
|
|
362
|
+
Examples
|
|
363
|
+
--------
|
|
364
|
+
>>> import numpy as np
|
|
365
|
+
>>> np.full((2, 2), np.inf)
|
|
366
|
+
array([[inf, inf],
|
|
367
|
+
[inf, inf]])
|
|
368
|
+
>>> np.full((2, 2), 10)
|
|
369
|
+
array([[10, 10],
|
|
370
|
+
[10, 10]])
|
|
371
|
+
|
|
372
|
+
>>> np.full((2, 2), [1, 2])
|
|
373
|
+
array([[1, 2],
|
|
374
|
+
[1, 2]])
|
|
375
|
+
|
|
376
|
+
"""
|
|
377
|
+
if like is not None:
|
|
378
|
+
return _full_with_like(
|
|
379
|
+
like, shape, fill_value, dtype=dtype, order=order, device=device
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
if dtype is None:
|
|
383
|
+
fill_value = asarray(fill_value)
|
|
384
|
+
dtype = fill_value.dtype
|
|
385
|
+
a = empty(shape, dtype, order, device=device)
|
|
386
|
+
multiarray.copyto(a, fill_value, casting='unsafe')
|
|
387
|
+
return a
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
_full_with_like = array_function_dispatch()(full)
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def _full_like_dispatcher(
|
|
394
|
+
a, fill_value, dtype=None, order=None, subok=None, shape=None,
|
|
395
|
+
*, device=None
|
|
396
|
+
):
|
|
397
|
+
return (a,)
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
@array_function_dispatch(_full_like_dispatcher)
|
|
401
|
+
def full_like(
|
|
402
|
+
a, fill_value, dtype=None, order='K', subok=True, shape=None,
|
|
403
|
+
*, device=None
|
|
404
|
+
):
|
|
405
|
+
"""
|
|
406
|
+
Return a full array with the same shape and type as a given array.
|
|
407
|
+
|
|
408
|
+
Parameters
|
|
409
|
+
----------
|
|
410
|
+
a : array_like
|
|
411
|
+
The shape and data-type of `a` define these same attributes of
|
|
412
|
+
the returned array.
|
|
413
|
+
fill_value : array_like
|
|
414
|
+
Fill value.
|
|
415
|
+
dtype : data-type, optional
|
|
416
|
+
Overrides the data type of the result.
|
|
417
|
+
order : {'C', 'F', 'A', or 'K'}, optional
|
|
418
|
+
Overrides the memory layout of the result. 'C' means C-order,
|
|
419
|
+
'F' means F-order, 'A' means 'F' if `a` is Fortran contiguous,
|
|
420
|
+
'C' otherwise. 'K' means match the layout of `a` as closely
|
|
421
|
+
as possible.
|
|
422
|
+
subok : bool, optional.
|
|
423
|
+
If True, then the newly created array will use the sub-class
|
|
424
|
+
type of `a`, otherwise it will be a base-class array. Defaults
|
|
425
|
+
to True.
|
|
426
|
+
shape : int or sequence of ints, optional.
|
|
427
|
+
Overrides the shape of the result. If order='K' and the number of
|
|
428
|
+
dimensions is unchanged, will try to keep order, otherwise,
|
|
429
|
+
order='C' is implied.
|
|
430
|
+
device : str, optional
|
|
431
|
+
The device on which to place the created array. Default: None.
|
|
432
|
+
For Array-API interoperability only, so must be ``"cpu"`` if passed.
|
|
433
|
+
|
|
434
|
+
.. versionadded:: 2.0.0
|
|
435
|
+
|
|
436
|
+
Returns
|
|
437
|
+
-------
|
|
438
|
+
out : ndarray
|
|
439
|
+
Array of `fill_value` with the same shape and type as `a`.
|
|
440
|
+
|
|
441
|
+
See Also
|
|
442
|
+
--------
|
|
443
|
+
empty_like : Return an empty array with shape and type of input.
|
|
444
|
+
ones_like : Return an array of ones with shape and type of input.
|
|
445
|
+
zeros_like : Return an array of zeros with shape and type of input.
|
|
446
|
+
full : Return a new array of given shape filled with value.
|
|
447
|
+
|
|
448
|
+
Examples
|
|
449
|
+
--------
|
|
450
|
+
>>> import numpy as np
|
|
451
|
+
>>> x = np.arange(6, dtype=int)
|
|
452
|
+
>>> np.full_like(x, 1)
|
|
453
|
+
array([1, 1, 1, 1, 1, 1])
|
|
454
|
+
>>> np.full_like(x, 0.1)
|
|
455
|
+
array([0, 0, 0, 0, 0, 0])
|
|
456
|
+
>>> np.full_like(x, 0.1, dtype=np.double)
|
|
457
|
+
array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
|
|
458
|
+
>>> np.full_like(x, np.nan, dtype=np.double)
|
|
459
|
+
array([nan, nan, nan, nan, nan, nan])
|
|
460
|
+
|
|
461
|
+
>>> y = np.arange(6, dtype=np.double)
|
|
462
|
+
>>> np.full_like(y, 0.1)
|
|
463
|
+
array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
|
|
464
|
+
|
|
465
|
+
>>> y = np.zeros([2, 2, 3], dtype=int)
|
|
466
|
+
>>> np.full_like(y, [0, 0, 255])
|
|
467
|
+
array([[[ 0, 0, 255],
|
|
468
|
+
[ 0, 0, 255]],
|
|
469
|
+
[[ 0, 0, 255],
|
|
470
|
+
[ 0, 0, 255]]])
|
|
471
|
+
"""
|
|
472
|
+
res = empty_like(
|
|
473
|
+
a, dtype=dtype, order=order, subok=subok, shape=shape, device=device
|
|
474
|
+
)
|
|
475
|
+
multiarray.copyto(res, fill_value, casting='unsafe')
|
|
476
|
+
return res
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
def _count_nonzero_dispatcher(a, axis=None, *, keepdims=None):
|
|
480
|
+
return (a,)
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
@array_function_dispatch(_count_nonzero_dispatcher)
|
|
484
|
+
def count_nonzero(a, axis=None, *, keepdims=False):
|
|
485
|
+
"""
|
|
486
|
+
Counts the number of non-zero values in the array ``a``.
|
|
487
|
+
|
|
488
|
+
The word "non-zero" is in reference to the Python 2.x
|
|
489
|
+
built-in method ``__nonzero__()`` (renamed ``__bool__()``
|
|
490
|
+
in Python 3.x) of Python objects that tests an object's
|
|
491
|
+
"truthfulness". For example, any number is considered
|
|
492
|
+
truthful if it is nonzero, whereas any string is considered
|
|
493
|
+
truthful if it is not the empty string. Thus, this function
|
|
494
|
+
(recursively) counts how many elements in ``a`` (and in
|
|
495
|
+
sub-arrays thereof) have their ``__nonzero__()`` or ``__bool__()``
|
|
496
|
+
method evaluated to ``True``.
|
|
497
|
+
|
|
498
|
+
Parameters
|
|
499
|
+
----------
|
|
500
|
+
a : array_like
|
|
501
|
+
The array for which to count non-zeros.
|
|
502
|
+
axis : int or tuple, optional
|
|
503
|
+
Axis or tuple of axes along which to count non-zeros.
|
|
504
|
+
Default is None, meaning that non-zeros will be counted
|
|
505
|
+
along a flattened version of ``a``.
|
|
506
|
+
keepdims : bool, optional
|
|
507
|
+
If this is set to True, the axes that are counted are left
|
|
508
|
+
in the result as dimensions with size one. With this option,
|
|
509
|
+
the result will broadcast correctly against the input array.
|
|
510
|
+
|
|
511
|
+
Returns
|
|
512
|
+
-------
|
|
513
|
+
count : int or array of int
|
|
514
|
+
Number of non-zero values in the array along a given axis.
|
|
515
|
+
Otherwise, the total number of non-zero values in the array
|
|
516
|
+
is returned.
|
|
517
|
+
|
|
518
|
+
See Also
|
|
519
|
+
--------
|
|
520
|
+
nonzero : Return the coordinates of all the non-zero values.
|
|
521
|
+
|
|
522
|
+
Examples
|
|
523
|
+
--------
|
|
524
|
+
>>> import numpy as np
|
|
525
|
+
>>> np.count_nonzero(np.eye(4))
|
|
526
|
+
np.int64(4)
|
|
527
|
+
>>> a = np.array([[0, 1, 7, 0],
|
|
528
|
+
... [3, 0, 2, 19]])
|
|
529
|
+
>>> np.count_nonzero(a)
|
|
530
|
+
np.int64(5)
|
|
531
|
+
>>> np.count_nonzero(a, axis=0)
|
|
532
|
+
array([1, 1, 2, 1])
|
|
533
|
+
>>> np.count_nonzero(a, axis=1)
|
|
534
|
+
array([2, 3])
|
|
535
|
+
>>> np.count_nonzero(a, axis=1, keepdims=True)
|
|
536
|
+
array([[2],
|
|
537
|
+
[3]])
|
|
538
|
+
"""
|
|
539
|
+
if axis is None and not keepdims:
|
|
540
|
+
return multiarray.count_nonzero(a)
|
|
541
|
+
|
|
542
|
+
a = asanyarray(a)
|
|
543
|
+
|
|
544
|
+
# TODO: this works around .astype(bool) not working properly (gh-9847)
|
|
545
|
+
if np.issubdtype(a.dtype, np.character):
|
|
546
|
+
a_bool = a != a.dtype.type()
|
|
547
|
+
else:
|
|
548
|
+
a_bool = a.astype(np.bool, copy=False)
|
|
549
|
+
|
|
550
|
+
return a_bool.sum(axis=axis, dtype=np.intp, keepdims=keepdims)
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
@set_module('numpy')
|
|
554
|
+
def isfortran(a):
|
|
555
|
+
"""
|
|
556
|
+
Check if the array is Fortran contiguous but *not* C contiguous.
|
|
557
|
+
|
|
558
|
+
This function is obsolete. If you only want to check if an array is Fortran
|
|
559
|
+
contiguous use ``a.flags.f_contiguous`` instead.
|
|
560
|
+
|
|
561
|
+
Parameters
|
|
562
|
+
----------
|
|
563
|
+
a : ndarray
|
|
564
|
+
Input array.
|
|
565
|
+
|
|
566
|
+
Returns
|
|
567
|
+
-------
|
|
568
|
+
isfortran : bool
|
|
569
|
+
Returns True if the array is Fortran contiguous but *not* C contiguous.
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
Examples
|
|
573
|
+
--------
|
|
574
|
+
|
|
575
|
+
np.array allows to specify whether the array is written in C-contiguous
|
|
576
|
+
order (last index varies the fastest), or FORTRAN-contiguous order in
|
|
577
|
+
memory (first index varies the fastest).
|
|
578
|
+
|
|
579
|
+
>>> import numpy as np
|
|
580
|
+
>>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C')
|
|
581
|
+
>>> a
|
|
582
|
+
array([[1, 2, 3],
|
|
583
|
+
[4, 5, 6]])
|
|
584
|
+
>>> np.isfortran(a)
|
|
585
|
+
False
|
|
586
|
+
|
|
587
|
+
>>> b = np.array([[1, 2, 3], [4, 5, 6]], order='F')
|
|
588
|
+
>>> b
|
|
589
|
+
array([[1, 2, 3],
|
|
590
|
+
[4, 5, 6]])
|
|
591
|
+
>>> np.isfortran(b)
|
|
592
|
+
True
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
The transpose of a C-ordered array is a FORTRAN-ordered array.
|
|
596
|
+
|
|
597
|
+
>>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C')
|
|
598
|
+
>>> a
|
|
599
|
+
array([[1, 2, 3],
|
|
600
|
+
[4, 5, 6]])
|
|
601
|
+
>>> np.isfortran(a)
|
|
602
|
+
False
|
|
603
|
+
>>> b = a.T
|
|
604
|
+
>>> b
|
|
605
|
+
array([[1, 4],
|
|
606
|
+
[2, 5],
|
|
607
|
+
[3, 6]])
|
|
608
|
+
>>> np.isfortran(b)
|
|
609
|
+
True
|
|
610
|
+
|
|
611
|
+
C-ordered arrays evaluate as False even if they are also FORTRAN-ordered.
|
|
612
|
+
|
|
613
|
+
>>> np.isfortran(np.array([1, 2], order='F'))
|
|
614
|
+
False
|
|
615
|
+
|
|
616
|
+
"""
|
|
617
|
+
return a.flags.fnc
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
def _argwhere_dispatcher(a):
|
|
621
|
+
return (a,)
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
@array_function_dispatch(_argwhere_dispatcher)
|
|
625
|
+
def argwhere(a):
|
|
626
|
+
"""
|
|
627
|
+
Find the indices of array elements that are non-zero, grouped by element.
|
|
628
|
+
|
|
629
|
+
Parameters
|
|
630
|
+
----------
|
|
631
|
+
a : array_like
|
|
632
|
+
Input data.
|
|
633
|
+
|
|
634
|
+
Returns
|
|
635
|
+
-------
|
|
636
|
+
index_array : (N, a.ndim) ndarray
|
|
637
|
+
Indices of elements that are non-zero. Indices are grouped by element.
|
|
638
|
+
This array will have shape ``(N, a.ndim)`` where ``N`` is the number of
|
|
639
|
+
non-zero items.
|
|
640
|
+
|
|
641
|
+
See Also
|
|
642
|
+
--------
|
|
643
|
+
where, nonzero
|
|
644
|
+
|
|
645
|
+
Notes
|
|
646
|
+
-----
|
|
647
|
+
``np.argwhere(a)`` is almost the same as ``np.transpose(np.nonzero(a))``,
|
|
648
|
+
but produces a result of the correct shape for a 0D array.
|
|
649
|
+
|
|
650
|
+
The output of ``argwhere`` is not suitable for indexing arrays.
|
|
651
|
+
For this purpose use ``nonzero(a)`` instead.
|
|
652
|
+
|
|
653
|
+
Examples
|
|
654
|
+
--------
|
|
655
|
+
>>> import numpy as np
|
|
656
|
+
>>> x = np.arange(6).reshape(2,3)
|
|
657
|
+
>>> x
|
|
658
|
+
array([[0, 1, 2],
|
|
659
|
+
[3, 4, 5]])
|
|
660
|
+
>>> np.argwhere(x>1)
|
|
661
|
+
array([[0, 2],
|
|
662
|
+
[1, 0],
|
|
663
|
+
[1, 1],
|
|
664
|
+
[1, 2]])
|
|
665
|
+
|
|
666
|
+
"""
|
|
667
|
+
# nonzero does not behave well on 0d, so promote to 1d
|
|
668
|
+
if np.ndim(a) == 0:
|
|
669
|
+
a = shape_base.atleast_1d(a)
|
|
670
|
+
# then remove the added dimension
|
|
671
|
+
return argwhere(a)[:, :0]
|
|
672
|
+
return transpose(nonzero(a))
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
def _flatnonzero_dispatcher(a):
|
|
676
|
+
return (a,)
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
@array_function_dispatch(_flatnonzero_dispatcher)
|
|
680
|
+
def flatnonzero(a):
|
|
681
|
+
"""
|
|
682
|
+
Return indices that are non-zero in the flattened version of a.
|
|
683
|
+
|
|
684
|
+
This is equivalent to ``np.nonzero(np.ravel(a))[0]``.
|
|
685
|
+
|
|
686
|
+
Parameters
|
|
687
|
+
----------
|
|
688
|
+
a : array_like
|
|
689
|
+
Input data.
|
|
690
|
+
|
|
691
|
+
Returns
|
|
692
|
+
-------
|
|
693
|
+
res : ndarray
|
|
694
|
+
Output array, containing the indices of the elements of ``a.ravel()``
|
|
695
|
+
that are non-zero.
|
|
696
|
+
|
|
697
|
+
See Also
|
|
698
|
+
--------
|
|
699
|
+
nonzero : Return the indices of the non-zero elements of the input array.
|
|
700
|
+
ravel : Return a 1-D array containing the elements of the input array.
|
|
701
|
+
|
|
702
|
+
Examples
|
|
703
|
+
--------
|
|
704
|
+
>>> import numpy as np
|
|
705
|
+
>>> x = np.arange(-2, 3)
|
|
706
|
+
>>> x
|
|
707
|
+
array([-2, -1, 0, 1, 2])
|
|
708
|
+
>>> np.flatnonzero(x)
|
|
709
|
+
array([0, 1, 3, 4])
|
|
710
|
+
|
|
711
|
+
Use the indices of the non-zero elements as an index array to extract
|
|
712
|
+
these elements:
|
|
713
|
+
|
|
714
|
+
>>> x.ravel()[np.flatnonzero(x)]
|
|
715
|
+
array([-2, -1, 1, 2])
|
|
716
|
+
|
|
717
|
+
"""
|
|
718
|
+
return np.nonzero(np.ravel(a))[0]
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
def _correlate_dispatcher(a, v, mode=None):
|
|
722
|
+
return (a, v)
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
@array_function_dispatch(_correlate_dispatcher)
|
|
726
|
+
def correlate(a, v, mode='valid'):
|
|
727
|
+
r"""
|
|
728
|
+
Cross-correlation of two 1-dimensional sequences.
|
|
729
|
+
|
|
730
|
+
This function computes the correlation as generally defined in signal
|
|
731
|
+
processing texts [1]_:
|
|
732
|
+
|
|
733
|
+
.. math:: c_k = \sum_n a_{n+k} \cdot \overline{v}_n
|
|
734
|
+
|
|
735
|
+
with a and v sequences being zero-padded where necessary and
|
|
736
|
+
:math:`\overline v` denoting complex conjugation.
|
|
737
|
+
|
|
738
|
+
Parameters
|
|
739
|
+
----------
|
|
740
|
+
a, v : array_like
|
|
741
|
+
Input sequences.
|
|
742
|
+
mode : {'valid', 'same', 'full'}, optional
|
|
743
|
+
Refer to the `convolve` docstring. Note that the default
|
|
744
|
+
is 'valid', unlike `convolve`, which uses 'full'.
|
|
745
|
+
|
|
746
|
+
Returns
|
|
747
|
+
-------
|
|
748
|
+
out : ndarray
|
|
749
|
+
Discrete cross-correlation of `a` and `v`.
|
|
750
|
+
|
|
751
|
+
See Also
|
|
752
|
+
--------
|
|
753
|
+
convolve : Discrete, linear convolution of two one-dimensional sequences.
|
|
754
|
+
scipy.signal.correlate : uses FFT which has superior performance
|
|
755
|
+
on large arrays.
|
|
756
|
+
|
|
757
|
+
Notes
|
|
758
|
+
-----
|
|
759
|
+
The definition of correlation above is not unique and sometimes
|
|
760
|
+
correlation may be defined differently. Another common definition is [1]_:
|
|
761
|
+
|
|
762
|
+
.. math:: c'_k = \sum_n a_{n} \cdot \overline{v_{n+k}}
|
|
763
|
+
|
|
764
|
+
which is related to :math:`c_k` by :math:`c'_k = c_{-k}`.
|
|
765
|
+
|
|
766
|
+
`numpy.correlate` may perform slowly in large arrays (i.e. n = 1e5)
|
|
767
|
+
because it does not use the FFT to compute the convolution; in that case,
|
|
768
|
+
`scipy.signal.correlate` might be preferable.
|
|
769
|
+
|
|
770
|
+
References
|
|
771
|
+
----------
|
|
772
|
+
.. [1] Wikipedia, "Cross-correlation",
|
|
773
|
+
https://en.wikipedia.org/wiki/Cross-correlation
|
|
774
|
+
|
|
775
|
+
Examples
|
|
776
|
+
--------
|
|
777
|
+
>>> import numpy as np
|
|
778
|
+
>>> np.correlate([1, 2, 3], [0, 1, 0.5])
|
|
779
|
+
array([3.5])
|
|
780
|
+
>>> np.correlate([1, 2, 3], [0, 1, 0.5], "same")
|
|
781
|
+
array([2. , 3.5, 3. ])
|
|
782
|
+
>>> np.correlate([1, 2, 3], [0, 1, 0.5], "full")
|
|
783
|
+
array([0.5, 2. , 3.5, 3. , 0. ])
|
|
784
|
+
|
|
785
|
+
Using complex sequences:
|
|
786
|
+
|
|
787
|
+
>>> np.correlate([1+1j, 2, 3-1j], [0, 1, 0.5j], 'full')
|
|
788
|
+
array([ 0.5-0.5j, 1.0+0.j , 1.5-1.5j, 3.0-1.j , 0.0+0.j ])
|
|
789
|
+
|
|
790
|
+
Note that you get the time reversed, complex conjugated result
|
|
791
|
+
(:math:`\overline{c_{-k}}`) when the two input sequences a and v change
|
|
792
|
+
places:
|
|
793
|
+
|
|
794
|
+
>>> np.correlate([0, 1, 0.5j], [1+1j, 2, 3-1j], 'full')
|
|
795
|
+
array([ 0.0+0.j , 3.0+1.j , 1.5+1.5j, 1.0+0.j , 0.5+0.5j])
|
|
796
|
+
|
|
797
|
+
"""
|
|
798
|
+
return multiarray.correlate2(a, v, mode)
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
def _convolve_dispatcher(a, v, mode=None):
|
|
802
|
+
return (a, v)
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
@array_function_dispatch(_convolve_dispatcher)
|
|
806
|
+
def convolve(a, v, mode='full'):
|
|
807
|
+
"""
|
|
808
|
+
Returns the discrete, linear convolution of two one-dimensional sequences.
|
|
809
|
+
|
|
810
|
+
The convolution operator is often seen in signal processing, where it
|
|
811
|
+
models the effect of a linear time-invariant system on a signal [1]_. In
|
|
812
|
+
probability theory, the sum of two independent random variables is
|
|
813
|
+
distributed according to the convolution of their individual
|
|
814
|
+
distributions.
|
|
815
|
+
|
|
816
|
+
If `v` is longer than `a`, the arrays are swapped before computation.
|
|
817
|
+
|
|
818
|
+
Parameters
|
|
819
|
+
----------
|
|
820
|
+
a : (N,) array_like
|
|
821
|
+
First one-dimensional input array.
|
|
822
|
+
v : (M,) array_like
|
|
823
|
+
Second one-dimensional input array.
|
|
824
|
+
mode : {'full', 'valid', 'same'}, optional
|
|
825
|
+
'full':
|
|
826
|
+
By default, mode is 'full'. This returns the convolution
|
|
827
|
+
at each point of overlap, with an output shape of (N+M-1,). At
|
|
828
|
+
the end-points of the convolution, the signals do not overlap
|
|
829
|
+
completely, and boundary effects may be seen.
|
|
830
|
+
|
|
831
|
+
'same':
|
|
832
|
+
Mode 'same' returns output of length ``max(M, N)``. Boundary
|
|
833
|
+
effects are still visible.
|
|
834
|
+
|
|
835
|
+
'valid':
|
|
836
|
+
Mode 'valid' returns output of length
|
|
837
|
+
``max(M, N) - min(M, N) + 1``. The convolution product is only given
|
|
838
|
+
for points where the signals overlap completely. Values outside
|
|
839
|
+
the signal boundary have no effect.
|
|
840
|
+
|
|
841
|
+
Returns
|
|
842
|
+
-------
|
|
843
|
+
out : ndarray
|
|
844
|
+
Discrete, linear convolution of `a` and `v`.
|
|
845
|
+
|
|
846
|
+
See Also
|
|
847
|
+
--------
|
|
848
|
+
scipy.signal.fftconvolve : Convolve two arrays using the Fast Fourier
|
|
849
|
+
Transform.
|
|
850
|
+
scipy.linalg.toeplitz : Used to construct the convolution operator.
|
|
851
|
+
polymul : Polynomial multiplication. Same output as convolve, but also
|
|
852
|
+
accepts poly1d objects as input.
|
|
853
|
+
|
|
854
|
+
Notes
|
|
855
|
+
-----
|
|
856
|
+
The discrete convolution operation is defined as
|
|
857
|
+
|
|
858
|
+
.. math:: (a * v)_n = \\sum_{m = -\\infty}^{\\infty} a_m v_{n - m}
|
|
859
|
+
|
|
860
|
+
It can be shown that a convolution :math:`x(t) * y(t)` in time/space
|
|
861
|
+
is equivalent to the multiplication :math:`X(f) Y(f)` in the Fourier
|
|
862
|
+
domain, after appropriate padding (padding is necessary to prevent
|
|
863
|
+
circular convolution). Since multiplication is more efficient (faster)
|
|
864
|
+
than convolution, the function `scipy.signal.fftconvolve` exploits the
|
|
865
|
+
FFT to calculate the convolution of large data-sets.
|
|
866
|
+
|
|
867
|
+
References
|
|
868
|
+
----------
|
|
869
|
+
.. [1] Wikipedia, "Convolution",
|
|
870
|
+
https://en.wikipedia.org/wiki/Convolution
|
|
871
|
+
|
|
872
|
+
Examples
|
|
873
|
+
--------
|
|
874
|
+
Note how the convolution operator flips the second array
|
|
875
|
+
before "sliding" the two across one another:
|
|
876
|
+
|
|
877
|
+
>>> import numpy as np
|
|
878
|
+
>>> np.convolve([1, 2, 3], [0, 1, 0.5])
|
|
879
|
+
array([0. , 1. , 2.5, 4. , 1.5])
|
|
880
|
+
|
|
881
|
+
Only return the middle values of the convolution.
|
|
882
|
+
Contains boundary effects, where zeros are taken
|
|
883
|
+
into account:
|
|
884
|
+
|
|
885
|
+
>>> np.convolve([1,2,3],[0,1,0.5], 'same')
|
|
886
|
+
array([1. , 2.5, 4. ])
|
|
887
|
+
|
|
888
|
+
The two arrays are of the same length, so there
|
|
889
|
+
is only one position where they completely overlap:
|
|
890
|
+
|
|
891
|
+
>>> np.convolve([1,2,3],[0,1,0.5], 'valid')
|
|
892
|
+
array([2.5])
|
|
893
|
+
|
|
894
|
+
"""
|
|
895
|
+
a, v = array(a, copy=None, ndmin=1), array(v, copy=None, ndmin=1)
|
|
896
|
+
if len(a) == 0:
|
|
897
|
+
raise ValueError('a cannot be empty')
|
|
898
|
+
if len(v) == 0:
|
|
899
|
+
raise ValueError('v cannot be empty')
|
|
900
|
+
if len(v) > len(a):
|
|
901
|
+
a, v = v, a
|
|
902
|
+
return multiarray.correlate(a, v[::-1], mode)
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
def _outer_dispatcher(a, b, out=None):
|
|
906
|
+
return (a, b, out)
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
@array_function_dispatch(_outer_dispatcher)
|
|
910
|
+
def outer(a, b, out=None):
|
|
911
|
+
"""
|
|
912
|
+
Compute the outer product of two vectors.
|
|
913
|
+
|
|
914
|
+
Given two vectors `a` and `b` of length ``M`` and ``N``, respectively,
|
|
915
|
+
the outer product [1]_ is::
|
|
916
|
+
|
|
917
|
+
[[a_0*b_0 a_0*b_1 ... a_0*b_{N-1} ]
|
|
918
|
+
[a_1*b_0 .
|
|
919
|
+
[ ... .
|
|
920
|
+
[a_{M-1}*b_0 a_{M-1}*b_{N-1} ]]
|
|
921
|
+
|
|
922
|
+
Parameters
|
|
923
|
+
----------
|
|
924
|
+
a : (M,) array_like
|
|
925
|
+
First input vector. Input is flattened if
|
|
926
|
+
not already 1-dimensional.
|
|
927
|
+
b : (N,) array_like
|
|
928
|
+
Second input vector. Input is flattened if
|
|
929
|
+
not already 1-dimensional.
|
|
930
|
+
out : (M, N) ndarray, optional
|
|
931
|
+
A location where the result is stored
|
|
932
|
+
|
|
933
|
+
Returns
|
|
934
|
+
-------
|
|
935
|
+
out : (M, N) ndarray
|
|
936
|
+
``out[i, j] = a[i] * b[j]``
|
|
937
|
+
|
|
938
|
+
See also
|
|
939
|
+
--------
|
|
940
|
+
inner
|
|
941
|
+
einsum : ``einsum('i,j->ij', a.ravel(), b.ravel())`` is the equivalent.
|
|
942
|
+
ufunc.outer : A generalization to dimensions other than 1D and other
|
|
943
|
+
operations. ``np.multiply.outer(a.ravel(), b.ravel())``
|
|
944
|
+
is the equivalent.
|
|
945
|
+
linalg.outer : An Array API compatible variation of ``np.outer``,
|
|
946
|
+
which accepts 1-dimensional inputs only.
|
|
947
|
+
tensordot : ``np.tensordot(a.ravel(), b.ravel(), axes=((), ()))``
|
|
948
|
+
is the equivalent.
|
|
949
|
+
|
|
950
|
+
References
|
|
951
|
+
----------
|
|
952
|
+
.. [1] G. H. Golub and C. F. Van Loan, *Matrix Computations*, 3rd
|
|
953
|
+
ed., Baltimore, MD, Johns Hopkins University Press, 1996,
|
|
954
|
+
pg. 8.
|
|
955
|
+
|
|
956
|
+
Examples
|
|
957
|
+
--------
|
|
958
|
+
Make a (*very* coarse) grid for computing a Mandelbrot set:
|
|
959
|
+
|
|
960
|
+
>>> import numpy as np
|
|
961
|
+
>>> rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5))
|
|
962
|
+
>>> rl
|
|
963
|
+
array([[-2., -1., 0., 1., 2.],
|
|
964
|
+
[-2., -1., 0., 1., 2.],
|
|
965
|
+
[-2., -1., 0., 1., 2.],
|
|
966
|
+
[-2., -1., 0., 1., 2.],
|
|
967
|
+
[-2., -1., 0., 1., 2.]])
|
|
968
|
+
>>> im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
|
|
969
|
+
>>> im
|
|
970
|
+
array([[0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j],
|
|
971
|
+
[0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j],
|
|
972
|
+
[0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
|
|
973
|
+
[0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j],
|
|
974
|
+
[0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j]])
|
|
975
|
+
>>> grid = rl + im
|
|
976
|
+
>>> grid
|
|
977
|
+
array([[-2.+2.j, -1.+2.j, 0.+2.j, 1.+2.j, 2.+2.j],
|
|
978
|
+
[-2.+1.j, -1.+1.j, 0.+1.j, 1.+1.j, 2.+1.j],
|
|
979
|
+
[-2.+0.j, -1.+0.j, 0.+0.j, 1.+0.j, 2.+0.j],
|
|
980
|
+
[-2.-1.j, -1.-1.j, 0.-1.j, 1.-1.j, 2.-1.j],
|
|
981
|
+
[-2.-2.j, -1.-2.j, 0.-2.j, 1.-2.j, 2.-2.j]])
|
|
982
|
+
|
|
983
|
+
An example using a "vector" of letters:
|
|
984
|
+
|
|
985
|
+
>>> x = np.array(['a', 'b', 'c'], dtype=object)
|
|
986
|
+
>>> np.outer(x, [1, 2, 3])
|
|
987
|
+
array([['a', 'aa', 'aaa'],
|
|
988
|
+
['b', 'bb', 'bbb'],
|
|
989
|
+
['c', 'cc', 'ccc']], dtype=object)
|
|
990
|
+
|
|
991
|
+
"""
|
|
992
|
+
a = asarray(a)
|
|
993
|
+
b = asarray(b)
|
|
994
|
+
return multiply(a.ravel()[:, newaxis], b.ravel()[newaxis, :], out)
|
|
995
|
+
|
|
996
|
+
|
|
997
|
+
def _tensordot_dispatcher(a, b, axes=None):
|
|
998
|
+
return (a, b)
|
|
999
|
+
|
|
1000
|
+
|
|
1001
|
+
@array_function_dispatch(_tensordot_dispatcher)
|
|
1002
|
+
def tensordot(a, b, axes=2):
|
|
1003
|
+
"""
|
|
1004
|
+
Compute tensor dot product along specified axes.
|
|
1005
|
+
|
|
1006
|
+
Given two tensors, `a` and `b`, and an array_like object containing
|
|
1007
|
+
two array_like objects, ``(a_axes, b_axes)``, sum the products of
|
|
1008
|
+
`a`'s and `b`'s elements (components) over the axes specified by
|
|
1009
|
+
``a_axes`` and ``b_axes``. The third argument can be a single non-negative
|
|
1010
|
+
integer_like scalar, ``N``; if it is such, then the last ``N`` dimensions
|
|
1011
|
+
of `a` and the first ``N`` dimensions of `b` are summed over.
|
|
1012
|
+
|
|
1013
|
+
Parameters
|
|
1014
|
+
----------
|
|
1015
|
+
a, b : array_like
|
|
1016
|
+
Tensors to "dot".
|
|
1017
|
+
|
|
1018
|
+
axes : int or (2,) array_like
|
|
1019
|
+
* integer_like
|
|
1020
|
+
If an int N, sum over the last N axes of `a` and the first N axes
|
|
1021
|
+
of `b` in order. The sizes of the corresponding axes must match.
|
|
1022
|
+
* (2,) array_like
|
|
1023
|
+
Or, a list of axes to be summed over, first sequence applying to `a`,
|
|
1024
|
+
second to `b`. Both elements array_like must be of the same length.
|
|
1025
|
+
|
|
1026
|
+
Returns
|
|
1027
|
+
-------
|
|
1028
|
+
output : ndarray
|
|
1029
|
+
The tensor dot product of the input.
|
|
1030
|
+
|
|
1031
|
+
See Also
|
|
1032
|
+
--------
|
|
1033
|
+
dot, einsum
|
|
1034
|
+
|
|
1035
|
+
Notes
|
|
1036
|
+
-----
|
|
1037
|
+
Three common use cases are:
|
|
1038
|
+
* ``axes = 0`` : tensor product :math:`a\\otimes b`
|
|
1039
|
+
* ``axes = 1`` : tensor dot product :math:`a\\cdot b`
|
|
1040
|
+
* ``axes = 2`` : (default) tensor double contraction :math:`a:b`
|
|
1041
|
+
|
|
1042
|
+
When `axes` is integer_like, the sequence of axes for evaluation
|
|
1043
|
+
will be: from the -Nth axis to the -1th axis in `a`,
|
|
1044
|
+
and from the 0th axis to (N-1)th axis in `b`.
|
|
1045
|
+
For example, ``axes = 2`` is the equal to
|
|
1046
|
+
``axes = [[-2, -1], [0, 1]]``.
|
|
1047
|
+
When N-1 is smaller than 0, or when -N is larger than -1,
|
|
1048
|
+
the element of `a` and `b` are defined as the `axes`.
|
|
1049
|
+
|
|
1050
|
+
When there is more than one axis to sum over - and they are not the last
|
|
1051
|
+
(first) axes of `a` (`b`) - the argument `axes` should consist of
|
|
1052
|
+
two sequences of the same length, with the first axis to sum over given
|
|
1053
|
+
first in both sequences, the second axis second, and so forth.
|
|
1054
|
+
The calculation can be referred to ``numpy.einsum``.
|
|
1055
|
+
|
|
1056
|
+
The shape of the result consists of the non-contracted axes of the
|
|
1057
|
+
first tensor, followed by the non-contracted axes of the second.
|
|
1058
|
+
|
|
1059
|
+
Examples
|
|
1060
|
+
--------
|
|
1061
|
+
An example on integer_like:
|
|
1062
|
+
|
|
1063
|
+
>>> a_0 = np.array([[1, 2], [3, 4]])
|
|
1064
|
+
>>> b_0 = np.array([[5, 6], [7, 8]])
|
|
1065
|
+
>>> c_0 = np.tensordot(a_0, b_0, axes=0)
|
|
1066
|
+
>>> c_0.shape
|
|
1067
|
+
(2, 2, 2, 2)
|
|
1068
|
+
>>> c_0
|
|
1069
|
+
array([[[[ 5, 6],
|
|
1070
|
+
[ 7, 8]],
|
|
1071
|
+
[[10, 12],
|
|
1072
|
+
[14, 16]]],
|
|
1073
|
+
[[[15, 18],
|
|
1074
|
+
[21, 24]],
|
|
1075
|
+
[[20, 24],
|
|
1076
|
+
[28, 32]]]])
|
|
1077
|
+
|
|
1078
|
+
An example on array_like:
|
|
1079
|
+
|
|
1080
|
+
>>> a = np.arange(60.).reshape(3,4,5)
|
|
1081
|
+
>>> b = np.arange(24.).reshape(4,3,2)
|
|
1082
|
+
>>> c = np.tensordot(a,b, axes=([1,0],[0,1]))
|
|
1083
|
+
>>> c.shape
|
|
1084
|
+
(5, 2)
|
|
1085
|
+
>>> c
|
|
1086
|
+
array([[4400., 4730.],
|
|
1087
|
+
[4532., 4874.],
|
|
1088
|
+
[4664., 5018.],
|
|
1089
|
+
[4796., 5162.],
|
|
1090
|
+
[4928., 5306.]])
|
|
1091
|
+
|
|
1092
|
+
A slower but equivalent way of computing the same...
|
|
1093
|
+
|
|
1094
|
+
>>> d = np.zeros((5,2))
|
|
1095
|
+
>>> for i in range(5):
|
|
1096
|
+
... for j in range(2):
|
|
1097
|
+
... for k in range(3):
|
|
1098
|
+
... for n in range(4):
|
|
1099
|
+
... d[i,j] += a[k,n,i] * b[n,k,j]
|
|
1100
|
+
>>> c == d
|
|
1101
|
+
array([[ True, True],
|
|
1102
|
+
[ True, True],
|
|
1103
|
+
[ True, True],
|
|
1104
|
+
[ True, True],
|
|
1105
|
+
[ True, True]])
|
|
1106
|
+
|
|
1107
|
+
An extended example taking advantage of the overloading of + and \\*:
|
|
1108
|
+
|
|
1109
|
+
>>> a = np.array(range(1, 9)).reshape((2, 2, 2))
|
|
1110
|
+
>>> A = np.array(('a', 'b', 'c', 'd'), dtype=object)
|
|
1111
|
+
>>> A = A.reshape((2, 2))
|
|
1112
|
+
>>> a; A
|
|
1113
|
+
array([[[1, 2],
|
|
1114
|
+
[3, 4]],
|
|
1115
|
+
[[5, 6],
|
|
1116
|
+
[7, 8]]])
|
|
1117
|
+
array([['a', 'b'],
|
|
1118
|
+
['c', 'd']], dtype=object)
|
|
1119
|
+
|
|
1120
|
+
>>> np.tensordot(a, A) # third argument default is 2 for double-contraction
|
|
1121
|
+
array(['abbcccdddd', 'aaaaabbbbbbcccccccdddddddd'], dtype=object)
|
|
1122
|
+
|
|
1123
|
+
>>> np.tensordot(a, A, 1)
|
|
1124
|
+
array([[['acc', 'bdd'],
|
|
1125
|
+
['aaacccc', 'bbbdddd']],
|
|
1126
|
+
[['aaaaacccccc', 'bbbbbdddddd'],
|
|
1127
|
+
['aaaaaaacccccccc', 'bbbbbbbdddddddd']]], dtype=object)
|
|
1128
|
+
|
|
1129
|
+
>>> np.tensordot(a, A, 0) # tensor product (result too long to incl.)
|
|
1130
|
+
array([[[[['a', 'b'],
|
|
1131
|
+
['c', 'd']],
|
|
1132
|
+
...
|
|
1133
|
+
|
|
1134
|
+
>>> np.tensordot(a, A, (0, 1))
|
|
1135
|
+
array([[['abbbbb', 'cddddd'],
|
|
1136
|
+
['aabbbbbb', 'ccdddddd']],
|
|
1137
|
+
[['aaabbbbbbb', 'cccddddddd'],
|
|
1138
|
+
['aaaabbbbbbbb', 'ccccdddddddd']]], dtype=object)
|
|
1139
|
+
|
|
1140
|
+
>>> np.tensordot(a, A, (2, 1))
|
|
1141
|
+
array([[['abb', 'cdd'],
|
|
1142
|
+
['aaabbbb', 'cccdddd']],
|
|
1143
|
+
[['aaaaabbbbbb', 'cccccdddddd'],
|
|
1144
|
+
['aaaaaaabbbbbbbb', 'cccccccdddddddd']]], dtype=object)
|
|
1145
|
+
|
|
1146
|
+
>>> np.tensordot(a, A, ((0, 1), (0, 1)))
|
|
1147
|
+
array(['abbbcccccddddddd', 'aabbbbccccccdddddddd'], dtype=object)
|
|
1148
|
+
|
|
1149
|
+
>>> np.tensordot(a, A, ((2, 1), (1, 0)))
|
|
1150
|
+
array(['acccbbdddd', 'aaaaacccccccbbbbbbdddddddd'], dtype=object)
|
|
1151
|
+
|
|
1152
|
+
"""
|
|
1153
|
+
try:
|
|
1154
|
+
iter(axes)
|
|
1155
|
+
except Exception:
|
|
1156
|
+
axes_a = list(range(-axes, 0))
|
|
1157
|
+
axes_b = list(range(axes))
|
|
1158
|
+
else:
|
|
1159
|
+
axes_a, axes_b = axes
|
|
1160
|
+
try:
|
|
1161
|
+
na = len(axes_a)
|
|
1162
|
+
axes_a = list(axes_a)
|
|
1163
|
+
except TypeError:
|
|
1164
|
+
axes_a = [axes_a]
|
|
1165
|
+
na = 1
|
|
1166
|
+
try:
|
|
1167
|
+
nb = len(axes_b)
|
|
1168
|
+
axes_b = list(axes_b)
|
|
1169
|
+
except TypeError:
|
|
1170
|
+
axes_b = [axes_b]
|
|
1171
|
+
nb = 1
|
|
1172
|
+
|
|
1173
|
+
a, b = asarray(a), asarray(b)
|
|
1174
|
+
as_ = a.shape
|
|
1175
|
+
nda = a.ndim
|
|
1176
|
+
bs = b.shape
|
|
1177
|
+
ndb = b.ndim
|
|
1178
|
+
equal = True
|
|
1179
|
+
if na != nb:
|
|
1180
|
+
equal = False
|
|
1181
|
+
else:
|
|
1182
|
+
for k in range(na):
|
|
1183
|
+
if as_[axes_a[k]] != bs[axes_b[k]]:
|
|
1184
|
+
equal = False
|
|
1185
|
+
break
|
|
1186
|
+
if axes_a[k] < 0:
|
|
1187
|
+
axes_a[k] += nda
|
|
1188
|
+
if axes_b[k] < 0:
|
|
1189
|
+
axes_b[k] += ndb
|
|
1190
|
+
if not equal:
|
|
1191
|
+
raise ValueError("shape-mismatch for sum")
|
|
1192
|
+
|
|
1193
|
+
# Move the axes to sum over to the end of "a"
|
|
1194
|
+
# and to the front of "b"
|
|
1195
|
+
notin = [k for k in range(nda) if k not in axes_a]
|
|
1196
|
+
newaxes_a = notin + axes_a
|
|
1197
|
+
N2 = math.prod(as_[axis] for axis in axes_a)
|
|
1198
|
+
newshape_a = (math.prod(as_[ax] for ax in notin), N2)
|
|
1199
|
+
olda = [as_[axis] for axis in notin]
|
|
1200
|
+
|
|
1201
|
+
notin = [k for k in range(ndb) if k not in axes_b]
|
|
1202
|
+
newaxes_b = axes_b + notin
|
|
1203
|
+
N2 = math.prod(bs[axis] for axis in axes_b)
|
|
1204
|
+
newshape_b = (N2, math.prod(bs[ax] for ax in notin))
|
|
1205
|
+
oldb = [bs[axis] for axis in notin]
|
|
1206
|
+
|
|
1207
|
+
at = a.transpose(newaxes_a).reshape(newshape_a)
|
|
1208
|
+
bt = b.transpose(newaxes_b).reshape(newshape_b)
|
|
1209
|
+
res = dot(at, bt)
|
|
1210
|
+
return res.reshape(olda + oldb)
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
def _roll_dispatcher(a, shift, axis=None):
|
|
1214
|
+
return (a,)
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
@array_function_dispatch(_roll_dispatcher)
|
|
1218
|
+
def roll(a, shift, axis=None):
|
|
1219
|
+
"""
|
|
1220
|
+
Roll array elements along a given axis.
|
|
1221
|
+
|
|
1222
|
+
Elements that roll beyond the last position are re-introduced at
|
|
1223
|
+
the first.
|
|
1224
|
+
|
|
1225
|
+
Parameters
|
|
1226
|
+
----------
|
|
1227
|
+
a : array_like
|
|
1228
|
+
Input array.
|
|
1229
|
+
shift : int or tuple of ints
|
|
1230
|
+
The number of places by which elements are shifted. If a tuple,
|
|
1231
|
+
then `axis` must be a tuple of the same size, and each of the
|
|
1232
|
+
given axes is shifted by the corresponding number. If an int
|
|
1233
|
+
while `axis` is a tuple of ints, then the same value is used for
|
|
1234
|
+
all given axes.
|
|
1235
|
+
axis : int or tuple of ints, optional
|
|
1236
|
+
Axis or axes along which elements are shifted. By default, the
|
|
1237
|
+
array is flattened before shifting, after which the original
|
|
1238
|
+
shape is restored.
|
|
1239
|
+
|
|
1240
|
+
Returns
|
|
1241
|
+
-------
|
|
1242
|
+
res : ndarray
|
|
1243
|
+
Output array, with the same shape as `a`.
|
|
1244
|
+
|
|
1245
|
+
See Also
|
|
1246
|
+
--------
|
|
1247
|
+
rollaxis : Roll the specified axis backwards, until it lies in a
|
|
1248
|
+
given position.
|
|
1249
|
+
|
|
1250
|
+
Notes
|
|
1251
|
+
-----
|
|
1252
|
+
Supports rolling over multiple dimensions simultaneously.
|
|
1253
|
+
|
|
1254
|
+
Examples
|
|
1255
|
+
--------
|
|
1256
|
+
>>> import numpy as np
|
|
1257
|
+
>>> x = np.arange(10)
|
|
1258
|
+
>>> np.roll(x, 2)
|
|
1259
|
+
array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
|
|
1260
|
+
>>> np.roll(x, -2)
|
|
1261
|
+
array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
|
|
1262
|
+
|
|
1263
|
+
>>> x2 = np.reshape(x, (2, 5))
|
|
1264
|
+
>>> x2
|
|
1265
|
+
array([[0, 1, 2, 3, 4],
|
|
1266
|
+
[5, 6, 7, 8, 9]])
|
|
1267
|
+
>>> np.roll(x2, 1)
|
|
1268
|
+
array([[9, 0, 1, 2, 3],
|
|
1269
|
+
[4, 5, 6, 7, 8]])
|
|
1270
|
+
>>> np.roll(x2, -1)
|
|
1271
|
+
array([[1, 2, 3, 4, 5],
|
|
1272
|
+
[6, 7, 8, 9, 0]])
|
|
1273
|
+
>>> np.roll(x2, 1, axis=0)
|
|
1274
|
+
array([[5, 6, 7, 8, 9],
|
|
1275
|
+
[0, 1, 2, 3, 4]])
|
|
1276
|
+
>>> np.roll(x2, -1, axis=0)
|
|
1277
|
+
array([[5, 6, 7, 8, 9],
|
|
1278
|
+
[0, 1, 2, 3, 4]])
|
|
1279
|
+
>>> np.roll(x2, 1, axis=1)
|
|
1280
|
+
array([[4, 0, 1, 2, 3],
|
|
1281
|
+
[9, 5, 6, 7, 8]])
|
|
1282
|
+
>>> np.roll(x2, -1, axis=1)
|
|
1283
|
+
array([[1, 2, 3, 4, 0],
|
|
1284
|
+
[6, 7, 8, 9, 5]])
|
|
1285
|
+
>>> np.roll(x2, (1, 1), axis=(1, 0))
|
|
1286
|
+
array([[9, 5, 6, 7, 8],
|
|
1287
|
+
[4, 0, 1, 2, 3]])
|
|
1288
|
+
>>> np.roll(x2, (2, 1), axis=(1, 0))
|
|
1289
|
+
array([[8, 9, 5, 6, 7],
|
|
1290
|
+
[3, 4, 0, 1, 2]])
|
|
1291
|
+
|
|
1292
|
+
"""
|
|
1293
|
+
a = asanyarray(a)
|
|
1294
|
+
if axis is None:
|
|
1295
|
+
return roll(a.ravel(), shift, 0).reshape(a.shape)
|
|
1296
|
+
|
|
1297
|
+
else:
|
|
1298
|
+
axis = normalize_axis_tuple(axis, a.ndim, allow_duplicate=True)
|
|
1299
|
+
broadcasted = broadcast(shift, axis)
|
|
1300
|
+
if broadcasted.ndim > 1:
|
|
1301
|
+
raise ValueError(
|
|
1302
|
+
"'shift' and 'axis' should be scalars or 1D sequences")
|
|
1303
|
+
shifts = dict.fromkeys(range(a.ndim), 0)
|
|
1304
|
+
for sh, ax in broadcasted:
|
|
1305
|
+
shifts[ax] += int(sh)
|
|
1306
|
+
|
|
1307
|
+
rolls = [((slice(None), slice(None)),)] * a.ndim
|
|
1308
|
+
for ax, offset in shifts.items():
|
|
1309
|
+
offset %= a.shape[ax] or 1 # If `a` is empty, nothing matters.
|
|
1310
|
+
if offset:
|
|
1311
|
+
# (original, result), (original, result)
|
|
1312
|
+
rolls[ax] = ((slice(None, -offset), slice(offset, None)),
|
|
1313
|
+
(slice(-offset, None), slice(None, offset)))
|
|
1314
|
+
|
|
1315
|
+
result = empty_like(a)
|
|
1316
|
+
for indices in itertools.product(*rolls):
|
|
1317
|
+
arr_index, res_index = zip(*indices)
|
|
1318
|
+
result[res_index] = a[arr_index]
|
|
1319
|
+
|
|
1320
|
+
return result
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
def _rollaxis_dispatcher(a, axis, start=None):
|
|
1324
|
+
return (a,)
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
@array_function_dispatch(_rollaxis_dispatcher)
|
|
1328
|
+
def rollaxis(a, axis, start=0):
|
|
1329
|
+
"""
|
|
1330
|
+
Roll the specified axis backwards, until it lies in a given position.
|
|
1331
|
+
|
|
1332
|
+
This function continues to be supported for backward compatibility, but you
|
|
1333
|
+
should prefer `moveaxis`. The `moveaxis` function was added in NumPy
|
|
1334
|
+
1.11.
|
|
1335
|
+
|
|
1336
|
+
Parameters
|
|
1337
|
+
----------
|
|
1338
|
+
a : ndarray
|
|
1339
|
+
Input array.
|
|
1340
|
+
axis : int
|
|
1341
|
+
The axis to be rolled. The positions of the other axes do not
|
|
1342
|
+
change relative to one another.
|
|
1343
|
+
start : int, optional
|
|
1344
|
+
When ``start <= axis``, the axis is rolled back until it lies in
|
|
1345
|
+
this position. When ``start > axis``, the axis is rolled until it
|
|
1346
|
+
lies before this position. The default, 0, results in a "complete"
|
|
1347
|
+
roll. The following table describes how negative values of ``start``
|
|
1348
|
+
are interpreted:
|
|
1349
|
+
|
|
1350
|
+
.. table::
|
|
1351
|
+
:align: left
|
|
1352
|
+
|
|
1353
|
+
+-------------------+----------------------+
|
|
1354
|
+
| ``start`` | Normalized ``start`` |
|
|
1355
|
+
+===================+======================+
|
|
1356
|
+
| ``-(arr.ndim+1)`` | raise ``AxisError`` |
|
|
1357
|
+
+-------------------+----------------------+
|
|
1358
|
+
| ``-arr.ndim`` | 0 |
|
|
1359
|
+
+-------------------+----------------------+
|
|
1360
|
+
| |vdots| | |vdots| |
|
|
1361
|
+
+-------------------+----------------------+
|
|
1362
|
+
| ``-1`` | ``arr.ndim-1`` |
|
|
1363
|
+
+-------------------+----------------------+
|
|
1364
|
+
| ``0`` | ``0`` |
|
|
1365
|
+
+-------------------+----------------------+
|
|
1366
|
+
| |vdots| | |vdots| |
|
|
1367
|
+
+-------------------+----------------------+
|
|
1368
|
+
| ``arr.ndim`` | ``arr.ndim`` |
|
|
1369
|
+
+-------------------+----------------------+
|
|
1370
|
+
| ``arr.ndim + 1`` | raise ``AxisError`` |
|
|
1371
|
+
+-------------------+----------------------+
|
|
1372
|
+
|
|
1373
|
+
.. |vdots| unicode:: U+22EE .. Vertical Ellipsis
|
|
1374
|
+
|
|
1375
|
+
Returns
|
|
1376
|
+
-------
|
|
1377
|
+
res : ndarray
|
|
1378
|
+
For NumPy >= 1.10.0 a view of `a` is always returned. For earlier
|
|
1379
|
+
NumPy versions a view of `a` is returned only if the order of the
|
|
1380
|
+
axes is changed, otherwise the input array is returned.
|
|
1381
|
+
|
|
1382
|
+
See Also
|
|
1383
|
+
--------
|
|
1384
|
+
moveaxis : Move array axes to new positions.
|
|
1385
|
+
roll : Roll the elements of an array by a number of positions along a
|
|
1386
|
+
given axis.
|
|
1387
|
+
|
|
1388
|
+
Examples
|
|
1389
|
+
--------
|
|
1390
|
+
>>> import numpy as np
|
|
1391
|
+
>>> a = np.ones((3,4,5,6))
|
|
1392
|
+
>>> np.rollaxis(a, 3, 1).shape
|
|
1393
|
+
(3, 6, 4, 5)
|
|
1394
|
+
>>> np.rollaxis(a, 2).shape
|
|
1395
|
+
(5, 3, 4, 6)
|
|
1396
|
+
>>> np.rollaxis(a, 1, 4).shape
|
|
1397
|
+
(3, 5, 6, 4)
|
|
1398
|
+
|
|
1399
|
+
"""
|
|
1400
|
+
n = a.ndim
|
|
1401
|
+
axis = normalize_axis_index(axis, n)
|
|
1402
|
+
if start < 0:
|
|
1403
|
+
start += n
|
|
1404
|
+
msg = "'%s' arg requires %d <= %s < %d, but %d was passed in"
|
|
1405
|
+
if not (0 <= start < n + 1):
|
|
1406
|
+
raise AxisError(msg % ('start', -n, 'start', n + 1, start))
|
|
1407
|
+
if axis < start:
|
|
1408
|
+
# it's been removed
|
|
1409
|
+
start -= 1
|
|
1410
|
+
if axis == start:
|
|
1411
|
+
return a[...]
|
|
1412
|
+
axes = list(range(n))
|
|
1413
|
+
axes.remove(axis)
|
|
1414
|
+
axes.insert(start, axis)
|
|
1415
|
+
return a.transpose(axes)
|
|
1416
|
+
|
|
1417
|
+
|
|
1418
|
+
@set_module("numpy.lib.array_utils")
|
|
1419
|
+
def normalize_axis_tuple(axis, ndim, argname=None, allow_duplicate=False):
|
|
1420
|
+
"""
|
|
1421
|
+
Normalizes an axis argument into a tuple of non-negative integer axes.
|
|
1422
|
+
|
|
1423
|
+
This handles shorthands such as ``1`` and converts them to ``(1,)``,
|
|
1424
|
+
as well as performing the handling of negative indices covered by
|
|
1425
|
+
`normalize_axis_index`.
|
|
1426
|
+
|
|
1427
|
+
By default, this forbids axes from being specified multiple times.
|
|
1428
|
+
|
|
1429
|
+
Used internally by multi-axis-checking logic.
|
|
1430
|
+
|
|
1431
|
+
Parameters
|
|
1432
|
+
----------
|
|
1433
|
+
axis : int, iterable of int
|
|
1434
|
+
The un-normalized index or indices of the axis.
|
|
1435
|
+
ndim : int
|
|
1436
|
+
The number of dimensions of the array that `axis` should be normalized
|
|
1437
|
+
against.
|
|
1438
|
+
argname : str, optional
|
|
1439
|
+
A prefix to put before the error message, typically the name of the
|
|
1440
|
+
argument.
|
|
1441
|
+
allow_duplicate : bool, optional
|
|
1442
|
+
If False, the default, disallow an axis from being specified twice.
|
|
1443
|
+
|
|
1444
|
+
Returns
|
|
1445
|
+
-------
|
|
1446
|
+
normalized_axes : tuple of int
|
|
1447
|
+
The normalized axis index, such that `0 <= normalized_axis < ndim`
|
|
1448
|
+
|
|
1449
|
+
Raises
|
|
1450
|
+
------
|
|
1451
|
+
AxisError
|
|
1452
|
+
If any axis provided is out of range
|
|
1453
|
+
ValueError
|
|
1454
|
+
If an axis is repeated
|
|
1455
|
+
|
|
1456
|
+
See also
|
|
1457
|
+
--------
|
|
1458
|
+
normalize_axis_index : normalizing a single scalar axis
|
|
1459
|
+
"""
|
|
1460
|
+
# Optimization to speed-up the most common cases.
|
|
1461
|
+
if not isinstance(axis, (tuple, list)):
|
|
1462
|
+
try:
|
|
1463
|
+
axis = [operator.index(axis)]
|
|
1464
|
+
except TypeError:
|
|
1465
|
+
pass
|
|
1466
|
+
# Going via an iterator directly is slower than via list comprehension.
|
|
1467
|
+
axis = tuple(normalize_axis_index(ax, ndim, argname) for ax in axis)
|
|
1468
|
+
if not allow_duplicate and len(set(axis)) != len(axis):
|
|
1469
|
+
if argname:
|
|
1470
|
+
raise ValueError(f'repeated axis in `{argname}` argument')
|
|
1471
|
+
else:
|
|
1472
|
+
raise ValueError('repeated axis')
|
|
1473
|
+
return axis
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
def _moveaxis_dispatcher(a, source, destination):
|
|
1477
|
+
return (a,)
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
@array_function_dispatch(_moveaxis_dispatcher)
|
|
1481
|
+
def moveaxis(a, source, destination):
|
|
1482
|
+
"""
|
|
1483
|
+
Move axes of an array to new positions.
|
|
1484
|
+
|
|
1485
|
+
Other axes remain in their original order.
|
|
1486
|
+
|
|
1487
|
+
Parameters
|
|
1488
|
+
----------
|
|
1489
|
+
a : np.ndarray
|
|
1490
|
+
The array whose axes should be reordered.
|
|
1491
|
+
source : int or sequence of int
|
|
1492
|
+
Original positions of the axes to move. These must be unique.
|
|
1493
|
+
destination : int or sequence of int
|
|
1494
|
+
Destination positions for each of the original axes. These must also be
|
|
1495
|
+
unique.
|
|
1496
|
+
|
|
1497
|
+
Returns
|
|
1498
|
+
-------
|
|
1499
|
+
result : np.ndarray
|
|
1500
|
+
Array with moved axes. This array is a view of the input array.
|
|
1501
|
+
|
|
1502
|
+
See Also
|
|
1503
|
+
--------
|
|
1504
|
+
transpose : Permute the dimensions of an array.
|
|
1505
|
+
swapaxes : Interchange two axes of an array.
|
|
1506
|
+
|
|
1507
|
+
Examples
|
|
1508
|
+
--------
|
|
1509
|
+
>>> import numpy as np
|
|
1510
|
+
>>> x = np.zeros((3, 4, 5))
|
|
1511
|
+
>>> np.moveaxis(x, 0, -1).shape
|
|
1512
|
+
(4, 5, 3)
|
|
1513
|
+
>>> np.moveaxis(x, -1, 0).shape
|
|
1514
|
+
(5, 3, 4)
|
|
1515
|
+
|
|
1516
|
+
These all achieve the same result:
|
|
1517
|
+
|
|
1518
|
+
>>> np.transpose(x).shape
|
|
1519
|
+
(5, 4, 3)
|
|
1520
|
+
>>> np.swapaxes(x, 0, -1).shape
|
|
1521
|
+
(5, 4, 3)
|
|
1522
|
+
>>> np.moveaxis(x, [0, 1], [-1, -2]).shape
|
|
1523
|
+
(5, 4, 3)
|
|
1524
|
+
>>> np.moveaxis(x, [0, 1, 2], [-1, -2, -3]).shape
|
|
1525
|
+
(5, 4, 3)
|
|
1526
|
+
|
|
1527
|
+
"""
|
|
1528
|
+
try:
|
|
1529
|
+
# allow duck-array types if they define transpose
|
|
1530
|
+
transpose = a.transpose
|
|
1531
|
+
except AttributeError:
|
|
1532
|
+
a = asarray(a)
|
|
1533
|
+
transpose = a.transpose
|
|
1534
|
+
|
|
1535
|
+
source = normalize_axis_tuple(source, a.ndim, 'source')
|
|
1536
|
+
destination = normalize_axis_tuple(destination, a.ndim, 'destination')
|
|
1537
|
+
if len(source) != len(destination):
|
|
1538
|
+
raise ValueError('`source` and `destination` arguments must have '
|
|
1539
|
+
'the same number of elements')
|
|
1540
|
+
|
|
1541
|
+
order = [n for n in range(a.ndim) if n not in source]
|
|
1542
|
+
|
|
1543
|
+
for dest, src in sorted(zip(destination, source)):
|
|
1544
|
+
order.insert(dest, src)
|
|
1545
|
+
|
|
1546
|
+
result = transpose(order)
|
|
1547
|
+
return result
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
def _cross_dispatcher(a, b, axisa=None, axisb=None, axisc=None, axis=None):
|
|
1551
|
+
return (a, b)
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
@array_function_dispatch(_cross_dispatcher)
|
|
1555
|
+
def cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None):
|
|
1556
|
+
"""
|
|
1557
|
+
Return the cross product of two (arrays of) vectors.
|
|
1558
|
+
|
|
1559
|
+
The cross product of `a` and `b` in :math:`R^3` is a vector perpendicular
|
|
1560
|
+
to both `a` and `b`. If `a` and `b` are arrays of vectors, the vectors
|
|
1561
|
+
are defined by the last axis of `a` and `b` by default, and these axes
|
|
1562
|
+
can have dimensions 2 or 3. Where the dimension of either `a` or `b` is
|
|
1563
|
+
2, the third component of the input vector is assumed to be zero and the
|
|
1564
|
+
cross product calculated accordingly. In cases where both input vectors
|
|
1565
|
+
have dimension 2, the z-component of the cross product is returned.
|
|
1566
|
+
|
|
1567
|
+
Parameters
|
|
1568
|
+
----------
|
|
1569
|
+
a : array_like
|
|
1570
|
+
Components of the first vector(s).
|
|
1571
|
+
b : array_like
|
|
1572
|
+
Components of the second vector(s).
|
|
1573
|
+
axisa : int, optional
|
|
1574
|
+
Axis of `a` that defines the vector(s). By default, the last axis.
|
|
1575
|
+
axisb : int, optional
|
|
1576
|
+
Axis of `b` that defines the vector(s). By default, the last axis.
|
|
1577
|
+
axisc : int, optional
|
|
1578
|
+
Axis of `c` containing the cross product vector(s). Ignored if
|
|
1579
|
+
both input vectors have dimension 2, as the return is scalar.
|
|
1580
|
+
By default, the last axis.
|
|
1581
|
+
axis : int, optional
|
|
1582
|
+
If defined, the axis of `a`, `b` and `c` that defines the vector(s)
|
|
1583
|
+
and cross product(s). Overrides `axisa`, `axisb` and `axisc`.
|
|
1584
|
+
|
|
1585
|
+
Returns
|
|
1586
|
+
-------
|
|
1587
|
+
c : ndarray
|
|
1588
|
+
Vector cross product(s).
|
|
1589
|
+
|
|
1590
|
+
Raises
|
|
1591
|
+
------
|
|
1592
|
+
ValueError
|
|
1593
|
+
When the dimension of the vector(s) in `a` and/or `b` does not
|
|
1594
|
+
equal 2 or 3.
|
|
1595
|
+
|
|
1596
|
+
See Also
|
|
1597
|
+
--------
|
|
1598
|
+
inner : Inner product
|
|
1599
|
+
outer : Outer product.
|
|
1600
|
+
linalg.cross : An Array API compatible variation of ``np.cross``,
|
|
1601
|
+
which accepts (arrays of) 3-element vectors only.
|
|
1602
|
+
ix_ : Construct index arrays.
|
|
1603
|
+
|
|
1604
|
+
Notes
|
|
1605
|
+
-----
|
|
1606
|
+
Supports full broadcasting of the inputs.
|
|
1607
|
+
|
|
1608
|
+
Dimension-2 input arrays were deprecated in 2.0.0. If you do need this
|
|
1609
|
+
functionality, you can use::
|
|
1610
|
+
|
|
1611
|
+
def cross2d(x, y):
|
|
1612
|
+
return x[..., 0] * y[..., 1] - x[..., 1] * y[..., 0]
|
|
1613
|
+
|
|
1614
|
+
Examples
|
|
1615
|
+
--------
|
|
1616
|
+
Vector cross-product.
|
|
1617
|
+
|
|
1618
|
+
>>> import numpy as np
|
|
1619
|
+
>>> x = [1, 2, 3]
|
|
1620
|
+
>>> y = [4, 5, 6]
|
|
1621
|
+
>>> np.cross(x, y)
|
|
1622
|
+
array([-3, 6, -3])
|
|
1623
|
+
|
|
1624
|
+
One vector with dimension 2.
|
|
1625
|
+
|
|
1626
|
+
>>> x = [1, 2]
|
|
1627
|
+
>>> y = [4, 5, 6]
|
|
1628
|
+
>>> np.cross(x, y)
|
|
1629
|
+
array([12, -6, -3])
|
|
1630
|
+
|
|
1631
|
+
Equivalently:
|
|
1632
|
+
|
|
1633
|
+
>>> x = [1, 2, 0]
|
|
1634
|
+
>>> y = [4, 5, 6]
|
|
1635
|
+
>>> np.cross(x, y)
|
|
1636
|
+
array([12, -6, -3])
|
|
1637
|
+
|
|
1638
|
+
Both vectors with dimension 2.
|
|
1639
|
+
|
|
1640
|
+
>>> x = [1,2]
|
|
1641
|
+
>>> y = [4,5]
|
|
1642
|
+
>>> np.cross(x, y)
|
|
1643
|
+
array(-3)
|
|
1644
|
+
|
|
1645
|
+
Multiple vector cross-products. Note that the direction of the cross
|
|
1646
|
+
product vector is defined by the *right-hand rule*.
|
|
1647
|
+
|
|
1648
|
+
>>> x = np.array([[1,2,3], [4,5,6]])
|
|
1649
|
+
>>> y = np.array([[4,5,6], [1,2,3]])
|
|
1650
|
+
>>> np.cross(x, y)
|
|
1651
|
+
array([[-3, 6, -3],
|
|
1652
|
+
[ 3, -6, 3]])
|
|
1653
|
+
|
|
1654
|
+
The orientation of `c` can be changed using the `axisc` keyword.
|
|
1655
|
+
|
|
1656
|
+
>>> np.cross(x, y, axisc=0)
|
|
1657
|
+
array([[-3, 3],
|
|
1658
|
+
[ 6, -6],
|
|
1659
|
+
[-3, 3]])
|
|
1660
|
+
|
|
1661
|
+
Change the vector definition of `x` and `y` using `axisa` and `axisb`.
|
|
1662
|
+
|
|
1663
|
+
>>> x = np.array([[1,2,3], [4,5,6], [7, 8, 9]])
|
|
1664
|
+
>>> y = np.array([[7, 8, 9], [4,5,6], [1,2,3]])
|
|
1665
|
+
>>> np.cross(x, y)
|
|
1666
|
+
array([[ -6, 12, -6],
|
|
1667
|
+
[ 0, 0, 0],
|
|
1668
|
+
[ 6, -12, 6]])
|
|
1669
|
+
>>> np.cross(x, y, axisa=0, axisb=0)
|
|
1670
|
+
array([[-24, 48, -24],
|
|
1671
|
+
[-30, 60, -30],
|
|
1672
|
+
[-36, 72, -36]])
|
|
1673
|
+
|
|
1674
|
+
"""
|
|
1675
|
+
if axis is not None:
|
|
1676
|
+
axisa, axisb, axisc = (axis,) * 3
|
|
1677
|
+
a = asarray(a)
|
|
1678
|
+
b = asarray(b)
|
|
1679
|
+
|
|
1680
|
+
if (a.ndim < 1) or (b.ndim < 1):
|
|
1681
|
+
raise ValueError("At least one array has zero dimension")
|
|
1682
|
+
|
|
1683
|
+
# Check axisa and axisb are within bounds
|
|
1684
|
+
axisa = normalize_axis_index(axisa, a.ndim, msg_prefix='axisa')
|
|
1685
|
+
axisb = normalize_axis_index(axisb, b.ndim, msg_prefix='axisb')
|
|
1686
|
+
|
|
1687
|
+
# Move working axis to the end of the shape
|
|
1688
|
+
a = moveaxis(a, axisa, -1)
|
|
1689
|
+
b = moveaxis(b, axisb, -1)
|
|
1690
|
+
msg = ("incompatible dimensions for cross product\n"
|
|
1691
|
+
"(dimension must be 2 or 3)")
|
|
1692
|
+
if a.shape[-1] not in (2, 3) or b.shape[-1] not in (2, 3):
|
|
1693
|
+
raise ValueError(msg)
|
|
1694
|
+
if a.shape[-1] == 2 or b.shape[-1] == 2:
|
|
1695
|
+
# Deprecated in NumPy 2.0, 2023-09-26
|
|
1696
|
+
warnings.warn(
|
|
1697
|
+
"Arrays of 2-dimensional vectors are deprecated. Use arrays of "
|
|
1698
|
+
"3-dimensional vectors instead. (deprecated in NumPy 2.0)",
|
|
1699
|
+
DeprecationWarning, stacklevel=2
|
|
1700
|
+
)
|
|
1701
|
+
|
|
1702
|
+
# Create the output array
|
|
1703
|
+
shape = broadcast(a[..., 0], b[..., 0]).shape
|
|
1704
|
+
if a.shape[-1] == 3 or b.shape[-1] == 3:
|
|
1705
|
+
shape += (3,)
|
|
1706
|
+
# Check axisc is within bounds
|
|
1707
|
+
axisc = normalize_axis_index(axisc, len(shape), msg_prefix='axisc')
|
|
1708
|
+
dtype = promote_types(a.dtype, b.dtype)
|
|
1709
|
+
cp = empty(shape, dtype)
|
|
1710
|
+
|
|
1711
|
+
# recast arrays as dtype
|
|
1712
|
+
a = a.astype(dtype)
|
|
1713
|
+
b = b.astype(dtype)
|
|
1714
|
+
|
|
1715
|
+
# create local aliases for readability
|
|
1716
|
+
a0 = a[..., 0]
|
|
1717
|
+
a1 = a[..., 1]
|
|
1718
|
+
if a.shape[-1] == 3:
|
|
1719
|
+
a2 = a[..., 2]
|
|
1720
|
+
b0 = b[..., 0]
|
|
1721
|
+
b1 = b[..., 1]
|
|
1722
|
+
if b.shape[-1] == 3:
|
|
1723
|
+
b2 = b[..., 2]
|
|
1724
|
+
if cp.ndim != 0 and cp.shape[-1] == 3:
|
|
1725
|
+
cp0 = cp[..., 0]
|
|
1726
|
+
cp1 = cp[..., 1]
|
|
1727
|
+
cp2 = cp[..., 2]
|
|
1728
|
+
|
|
1729
|
+
if a.shape[-1] == 2:
|
|
1730
|
+
if b.shape[-1] == 2:
|
|
1731
|
+
# a0 * b1 - a1 * b0
|
|
1732
|
+
multiply(a0, b1, out=cp)
|
|
1733
|
+
cp -= a1 * b0
|
|
1734
|
+
return cp
|
|
1735
|
+
else:
|
|
1736
|
+
assert b.shape[-1] == 3
|
|
1737
|
+
# cp0 = a1 * b2 - 0 (a2 = 0)
|
|
1738
|
+
# cp1 = 0 - a0 * b2 (a2 = 0)
|
|
1739
|
+
# cp2 = a0 * b1 - a1 * b0
|
|
1740
|
+
multiply(a1, b2, out=cp0)
|
|
1741
|
+
multiply(a0, b2, out=cp1)
|
|
1742
|
+
negative(cp1, out=cp1)
|
|
1743
|
+
multiply(a0, b1, out=cp2)
|
|
1744
|
+
cp2 -= a1 * b0
|
|
1745
|
+
else:
|
|
1746
|
+
assert a.shape[-1] == 3
|
|
1747
|
+
if b.shape[-1] == 3:
|
|
1748
|
+
# cp0 = a1 * b2 - a2 * b1
|
|
1749
|
+
# cp1 = a2 * b0 - a0 * b2
|
|
1750
|
+
# cp2 = a0 * b1 - a1 * b0
|
|
1751
|
+
multiply(a1, b2, out=cp0)
|
|
1752
|
+
tmp = np.multiply(a2, b1, out=...)
|
|
1753
|
+
cp0 -= tmp
|
|
1754
|
+
multiply(a2, b0, out=cp1)
|
|
1755
|
+
multiply(a0, b2, out=tmp)
|
|
1756
|
+
cp1 -= tmp
|
|
1757
|
+
multiply(a0, b1, out=cp2)
|
|
1758
|
+
multiply(a1, b0, out=tmp)
|
|
1759
|
+
cp2 -= tmp
|
|
1760
|
+
else:
|
|
1761
|
+
assert b.shape[-1] == 2
|
|
1762
|
+
# cp0 = 0 - a2 * b1 (b2 = 0)
|
|
1763
|
+
# cp1 = a2 * b0 - 0 (b2 = 0)
|
|
1764
|
+
# cp2 = a0 * b1 - a1 * b0
|
|
1765
|
+
multiply(a2, b1, out=cp0)
|
|
1766
|
+
negative(cp0, out=cp0)
|
|
1767
|
+
multiply(a2, b0, out=cp1)
|
|
1768
|
+
multiply(a0, b1, out=cp2)
|
|
1769
|
+
cp2 -= a1 * b0
|
|
1770
|
+
|
|
1771
|
+
return moveaxis(cp, -1, axisc)
|
|
1772
|
+
|
|
1773
|
+
|
|
1774
|
+
little_endian = (sys.byteorder == 'little')
|
|
1775
|
+
|
|
1776
|
+
|
|
1777
|
+
@set_module('numpy')
|
|
1778
|
+
def indices(dimensions, dtype=int, sparse=False):
|
|
1779
|
+
"""
|
|
1780
|
+
Return an array representing the indices of a grid.
|
|
1781
|
+
|
|
1782
|
+
Compute an array where the subarrays contain index values 0, 1, ...
|
|
1783
|
+
varying only along the corresponding axis.
|
|
1784
|
+
|
|
1785
|
+
Parameters
|
|
1786
|
+
----------
|
|
1787
|
+
dimensions : sequence of ints
|
|
1788
|
+
The shape of the grid.
|
|
1789
|
+
dtype : dtype, optional
|
|
1790
|
+
Data type of the result.
|
|
1791
|
+
sparse : boolean, optional
|
|
1792
|
+
Return a sparse representation of the grid instead of a dense
|
|
1793
|
+
representation. Default is False.
|
|
1794
|
+
|
|
1795
|
+
Returns
|
|
1796
|
+
-------
|
|
1797
|
+
grid : one ndarray or tuple of ndarrays
|
|
1798
|
+
If sparse is False:
|
|
1799
|
+
Returns one array of grid indices,
|
|
1800
|
+
``grid.shape = (len(dimensions),) + tuple(dimensions)``.
|
|
1801
|
+
If sparse is True:
|
|
1802
|
+
Returns a tuple of arrays, with
|
|
1803
|
+
``grid[i].shape = (1, ..., 1, dimensions[i], 1, ..., 1)`` with
|
|
1804
|
+
dimensions[i] in the ith place
|
|
1805
|
+
|
|
1806
|
+
See Also
|
|
1807
|
+
--------
|
|
1808
|
+
mgrid, ogrid, meshgrid
|
|
1809
|
+
|
|
1810
|
+
Notes
|
|
1811
|
+
-----
|
|
1812
|
+
The output shape in the dense case is obtained by prepending the number
|
|
1813
|
+
of dimensions in front of the tuple of dimensions, i.e. if `dimensions`
|
|
1814
|
+
is a tuple ``(r0, ..., rN-1)`` of length ``N``, the output shape is
|
|
1815
|
+
``(N, r0, ..., rN-1)``.
|
|
1816
|
+
|
|
1817
|
+
The subarrays ``grid[k]`` contains the N-D array of indices along the
|
|
1818
|
+
``k-th`` axis. Explicitly::
|
|
1819
|
+
|
|
1820
|
+
grid[k, i0, i1, ..., iN-1] = ik
|
|
1821
|
+
|
|
1822
|
+
Examples
|
|
1823
|
+
--------
|
|
1824
|
+
>>> import numpy as np
|
|
1825
|
+
>>> grid = np.indices((2, 3))
|
|
1826
|
+
>>> grid.shape
|
|
1827
|
+
(2, 2, 3)
|
|
1828
|
+
>>> grid[0] # row indices
|
|
1829
|
+
array([[0, 0, 0],
|
|
1830
|
+
[1, 1, 1]])
|
|
1831
|
+
>>> grid[1] # column indices
|
|
1832
|
+
array([[0, 1, 2],
|
|
1833
|
+
[0, 1, 2]])
|
|
1834
|
+
|
|
1835
|
+
The indices can be used as an index into an array.
|
|
1836
|
+
|
|
1837
|
+
>>> x = np.arange(20).reshape(5, 4)
|
|
1838
|
+
>>> row, col = np.indices((2, 3))
|
|
1839
|
+
>>> x[row, col]
|
|
1840
|
+
array([[0, 1, 2],
|
|
1841
|
+
[4, 5, 6]])
|
|
1842
|
+
|
|
1843
|
+
Note that it would be more straightforward in the above example to
|
|
1844
|
+
extract the required elements directly with ``x[:2, :3]``.
|
|
1845
|
+
|
|
1846
|
+
If sparse is set to true, the grid will be returned in a sparse
|
|
1847
|
+
representation.
|
|
1848
|
+
|
|
1849
|
+
>>> i, j = np.indices((2, 3), sparse=True)
|
|
1850
|
+
>>> i.shape
|
|
1851
|
+
(2, 1)
|
|
1852
|
+
>>> j.shape
|
|
1853
|
+
(1, 3)
|
|
1854
|
+
>>> i # row indices
|
|
1855
|
+
array([[0],
|
|
1856
|
+
[1]])
|
|
1857
|
+
>>> j # column indices
|
|
1858
|
+
array([[0, 1, 2]])
|
|
1859
|
+
|
|
1860
|
+
"""
|
|
1861
|
+
dimensions = tuple(dimensions)
|
|
1862
|
+
N = len(dimensions)
|
|
1863
|
+
shape = (1,) * N
|
|
1864
|
+
if sparse:
|
|
1865
|
+
res = ()
|
|
1866
|
+
else:
|
|
1867
|
+
res = empty((N,) + dimensions, dtype=dtype)
|
|
1868
|
+
for i, dim in enumerate(dimensions):
|
|
1869
|
+
idx = arange(dim, dtype=dtype).reshape(
|
|
1870
|
+
shape[:i] + (dim,) + shape[i + 1:]
|
|
1871
|
+
)
|
|
1872
|
+
if sparse:
|
|
1873
|
+
res = res + (idx,)
|
|
1874
|
+
else:
|
|
1875
|
+
res[i] = idx
|
|
1876
|
+
return res
|
|
1877
|
+
|
|
1878
|
+
|
|
1879
|
+
@finalize_array_function_like
|
|
1880
|
+
@set_module('numpy')
|
|
1881
|
+
def fromfunction(function, shape, *, dtype=float, like=None, **kwargs):
|
|
1882
|
+
"""
|
|
1883
|
+
Construct an array by executing a function over each coordinate.
|
|
1884
|
+
|
|
1885
|
+
The resulting array therefore has a value ``fn(x, y, z)`` at
|
|
1886
|
+
coordinate ``(x, y, z)``.
|
|
1887
|
+
|
|
1888
|
+
Parameters
|
|
1889
|
+
----------
|
|
1890
|
+
function : callable
|
|
1891
|
+
The function is called with N parameters, where N is the rank of
|
|
1892
|
+
`shape`. Each parameter represents the coordinates of the array
|
|
1893
|
+
varying along a specific axis. For example, if `shape`
|
|
1894
|
+
were ``(2, 2)``, then the parameters would be
|
|
1895
|
+
``array([[0, 0], [1, 1]])`` and ``array([[0, 1], [0, 1]])``
|
|
1896
|
+
shape : (N,) tuple of ints
|
|
1897
|
+
Shape of the output array, which also determines the shape of
|
|
1898
|
+
the coordinate arrays passed to `function`.
|
|
1899
|
+
dtype : data-type, optional
|
|
1900
|
+
Data-type of the coordinate arrays passed to `function`.
|
|
1901
|
+
By default, `dtype` is float.
|
|
1902
|
+
${ARRAY_FUNCTION_LIKE}
|
|
1903
|
+
|
|
1904
|
+
.. versionadded:: 1.20.0
|
|
1905
|
+
|
|
1906
|
+
Returns
|
|
1907
|
+
-------
|
|
1908
|
+
fromfunction : any
|
|
1909
|
+
The result of the call to `function` is passed back directly.
|
|
1910
|
+
Therefore the shape of `fromfunction` is completely determined by
|
|
1911
|
+
`function`. If `function` returns a scalar value, the shape of
|
|
1912
|
+
`fromfunction` would not match the `shape` parameter.
|
|
1913
|
+
|
|
1914
|
+
See Also
|
|
1915
|
+
--------
|
|
1916
|
+
indices, meshgrid
|
|
1917
|
+
|
|
1918
|
+
Notes
|
|
1919
|
+
-----
|
|
1920
|
+
Keywords other than `dtype` and `like` are passed to `function`.
|
|
1921
|
+
|
|
1922
|
+
Examples
|
|
1923
|
+
--------
|
|
1924
|
+
>>> import numpy as np
|
|
1925
|
+
>>> np.fromfunction(lambda i, j: i, (2, 2), dtype=float)
|
|
1926
|
+
array([[0., 0.],
|
|
1927
|
+
[1., 1.]])
|
|
1928
|
+
|
|
1929
|
+
>>> np.fromfunction(lambda i, j: j, (2, 2), dtype=float)
|
|
1930
|
+
array([[0., 1.],
|
|
1931
|
+
[0., 1.]])
|
|
1932
|
+
|
|
1933
|
+
>>> np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
|
|
1934
|
+
array([[ True, False, False],
|
|
1935
|
+
[False, True, False],
|
|
1936
|
+
[False, False, True]])
|
|
1937
|
+
|
|
1938
|
+
>>> np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)
|
|
1939
|
+
array([[0, 1, 2],
|
|
1940
|
+
[1, 2, 3],
|
|
1941
|
+
[2, 3, 4]])
|
|
1942
|
+
|
|
1943
|
+
"""
|
|
1944
|
+
if like is not None:
|
|
1945
|
+
return _fromfunction_with_like(
|
|
1946
|
+
like, function, shape, dtype=dtype, **kwargs)
|
|
1947
|
+
|
|
1948
|
+
args = indices(shape, dtype=dtype)
|
|
1949
|
+
return function(*args, **kwargs)
|
|
1950
|
+
|
|
1951
|
+
|
|
1952
|
+
_fromfunction_with_like = array_function_dispatch()(fromfunction)
|
|
1953
|
+
|
|
1954
|
+
|
|
1955
|
+
def _frombuffer(buf, dtype, shape, order, axis_order=None):
|
|
1956
|
+
array = frombuffer(buf, dtype=dtype)
|
|
1957
|
+
if order == 'K' and axis_order is not None:
|
|
1958
|
+
return array.reshape(shape, order='C').transpose(axis_order)
|
|
1959
|
+
return array.reshape(shape, order=order)
|
|
1960
|
+
|
|
1961
|
+
|
|
1962
|
+
@set_module('numpy')
|
|
1963
|
+
def isscalar(element):
|
|
1964
|
+
"""
|
|
1965
|
+
Returns True if the type of `element` is a scalar type.
|
|
1966
|
+
|
|
1967
|
+
Parameters
|
|
1968
|
+
----------
|
|
1969
|
+
element : any
|
|
1970
|
+
Input argument, can be of any type and shape.
|
|
1971
|
+
|
|
1972
|
+
Returns
|
|
1973
|
+
-------
|
|
1974
|
+
val : bool
|
|
1975
|
+
True if `element` is a scalar type, False if it is not.
|
|
1976
|
+
|
|
1977
|
+
See Also
|
|
1978
|
+
--------
|
|
1979
|
+
ndim : Get the number of dimensions of an array
|
|
1980
|
+
|
|
1981
|
+
Notes
|
|
1982
|
+
-----
|
|
1983
|
+
If you need a stricter way to identify a *numerical* scalar, use
|
|
1984
|
+
``isinstance(x, numbers.Number)``, as that returns ``False`` for most
|
|
1985
|
+
non-numerical elements such as strings.
|
|
1986
|
+
|
|
1987
|
+
In most cases ``np.ndim(x) == 0`` should be used instead of this function,
|
|
1988
|
+
as that will also return true for 0d arrays. This is how numpy overloads
|
|
1989
|
+
functions in the style of the ``dx`` arguments to `gradient` and
|
|
1990
|
+
the ``bins`` argument to `histogram`. Some key differences:
|
|
1991
|
+
|
|
1992
|
+
+------------------------------------+---------------+-------------------+
|
|
1993
|
+
| x |``isscalar(x)``|``np.ndim(x) == 0``|
|
|
1994
|
+
+====================================+===============+===================+
|
|
1995
|
+
| PEP 3141 numeric objects | ``True`` | ``True`` |
|
|
1996
|
+
| (including builtins) | | |
|
|
1997
|
+
+------------------------------------+---------------+-------------------+
|
|
1998
|
+
| builtin string and buffer objects | ``True`` | ``True`` |
|
|
1999
|
+
+------------------------------------+---------------+-------------------+
|
|
2000
|
+
| other builtin objects, like | ``False`` | ``True`` |
|
|
2001
|
+
| `pathlib.Path`, `Exception`, | | |
|
|
2002
|
+
| the result of `re.compile` | | |
|
|
2003
|
+
+------------------------------------+---------------+-------------------+
|
|
2004
|
+
| third-party objects like | ``False`` | ``True`` |
|
|
2005
|
+
| `matplotlib.figure.Figure` | | |
|
|
2006
|
+
+------------------------------------+---------------+-------------------+
|
|
2007
|
+
| zero-dimensional numpy arrays | ``False`` | ``True`` |
|
|
2008
|
+
+------------------------------------+---------------+-------------------+
|
|
2009
|
+
| other numpy arrays | ``False`` | ``False`` |
|
|
2010
|
+
+------------------------------------+---------------+-------------------+
|
|
2011
|
+
| `list`, `tuple`, and other | ``False`` | ``False`` |
|
|
2012
|
+
| sequence objects | | |
|
|
2013
|
+
+------------------------------------+---------------+-------------------+
|
|
2014
|
+
|
|
2015
|
+
Examples
|
|
2016
|
+
--------
|
|
2017
|
+
>>> import numpy as np
|
|
2018
|
+
|
|
2019
|
+
>>> np.isscalar(3.1)
|
|
2020
|
+
True
|
|
2021
|
+
|
|
2022
|
+
>>> np.isscalar(np.array(3.1))
|
|
2023
|
+
False
|
|
2024
|
+
|
|
2025
|
+
>>> np.isscalar([3.1])
|
|
2026
|
+
False
|
|
2027
|
+
|
|
2028
|
+
>>> np.isscalar(False)
|
|
2029
|
+
True
|
|
2030
|
+
|
|
2031
|
+
>>> np.isscalar('numpy')
|
|
2032
|
+
True
|
|
2033
|
+
|
|
2034
|
+
NumPy supports PEP 3141 numbers:
|
|
2035
|
+
|
|
2036
|
+
>>> from fractions import Fraction
|
|
2037
|
+
>>> np.isscalar(Fraction(5, 17))
|
|
2038
|
+
True
|
|
2039
|
+
>>> from numbers import Number
|
|
2040
|
+
>>> np.isscalar(Number())
|
|
2041
|
+
True
|
|
2042
|
+
|
|
2043
|
+
"""
|
|
2044
|
+
return (isinstance(element, generic)
|
|
2045
|
+
or type(element) in ScalarType
|
|
2046
|
+
or isinstance(element, numbers.Number))
|
|
2047
|
+
|
|
2048
|
+
|
|
2049
|
+
@set_module('numpy')
|
|
2050
|
+
def binary_repr(num, width=None):
|
|
2051
|
+
"""
|
|
2052
|
+
Return the binary representation of the input number as a string.
|
|
2053
|
+
|
|
2054
|
+
For negative numbers, if width is not given, a minus sign is added to the
|
|
2055
|
+
front. If width is given, the two's complement of the number is
|
|
2056
|
+
returned, with respect to that width.
|
|
2057
|
+
|
|
2058
|
+
In a two's-complement system negative numbers are represented by the two's
|
|
2059
|
+
complement of the absolute value. This is the most common method of
|
|
2060
|
+
representing signed integers on computers [1]_. A N-bit two's-complement
|
|
2061
|
+
system can represent every integer in the range
|
|
2062
|
+
:math:`-2^{N-1}` to :math:`+2^{N-1}-1`.
|
|
2063
|
+
|
|
2064
|
+
Parameters
|
|
2065
|
+
----------
|
|
2066
|
+
num : int
|
|
2067
|
+
Only an integer decimal number can be used.
|
|
2068
|
+
width : int, optional
|
|
2069
|
+
The length of the returned string if `num` is positive, or the length
|
|
2070
|
+
of the two's complement if `num` is negative, provided that `width` is
|
|
2071
|
+
at least a sufficient number of bits for `num` to be represented in
|
|
2072
|
+
the designated form. If the `width` value is insufficient, an error is
|
|
2073
|
+
raised.
|
|
2074
|
+
|
|
2075
|
+
Returns
|
|
2076
|
+
-------
|
|
2077
|
+
bin : str
|
|
2078
|
+
Binary representation of `num` or two's complement of `num`.
|
|
2079
|
+
|
|
2080
|
+
See Also
|
|
2081
|
+
--------
|
|
2082
|
+
base_repr: Return a string representation of a number in the given base
|
|
2083
|
+
system.
|
|
2084
|
+
bin: Python's built-in binary representation generator of an integer.
|
|
2085
|
+
|
|
2086
|
+
Notes
|
|
2087
|
+
-----
|
|
2088
|
+
`binary_repr` is equivalent to using `base_repr` with base 2, but about 25x
|
|
2089
|
+
faster.
|
|
2090
|
+
|
|
2091
|
+
References
|
|
2092
|
+
----------
|
|
2093
|
+
.. [1] Wikipedia, "Two's complement",
|
|
2094
|
+
https://en.wikipedia.org/wiki/Two's_complement
|
|
2095
|
+
|
|
2096
|
+
Examples
|
|
2097
|
+
--------
|
|
2098
|
+
>>> import numpy as np
|
|
2099
|
+
>>> np.binary_repr(3)
|
|
2100
|
+
'11'
|
|
2101
|
+
>>> np.binary_repr(-3)
|
|
2102
|
+
'-11'
|
|
2103
|
+
>>> np.binary_repr(3, width=4)
|
|
2104
|
+
'0011'
|
|
2105
|
+
|
|
2106
|
+
The two's complement is returned when the input number is negative and
|
|
2107
|
+
width is specified:
|
|
2108
|
+
|
|
2109
|
+
>>> np.binary_repr(-3, width=3)
|
|
2110
|
+
'101'
|
|
2111
|
+
>>> np.binary_repr(-3, width=5)
|
|
2112
|
+
'11101'
|
|
2113
|
+
|
|
2114
|
+
"""
|
|
2115
|
+
def err_if_insufficient(width, binwidth):
|
|
2116
|
+
if width is not None and width < binwidth:
|
|
2117
|
+
raise ValueError(
|
|
2118
|
+
f"Insufficient bit {width=} provided for {binwidth=}"
|
|
2119
|
+
)
|
|
2120
|
+
|
|
2121
|
+
# Ensure that num is a Python integer to avoid overflow or unwanted
|
|
2122
|
+
# casts to floating point.
|
|
2123
|
+
num = operator.index(num)
|
|
2124
|
+
|
|
2125
|
+
if num == 0:
|
|
2126
|
+
return '0' * (width or 1)
|
|
2127
|
+
|
|
2128
|
+
elif num > 0:
|
|
2129
|
+
binary = f'{num:b}'
|
|
2130
|
+
binwidth = len(binary)
|
|
2131
|
+
outwidth = (binwidth if width is None
|
|
2132
|
+
else builtins.max(binwidth, width))
|
|
2133
|
+
err_if_insufficient(width, binwidth)
|
|
2134
|
+
return binary.zfill(outwidth)
|
|
2135
|
+
|
|
2136
|
+
elif width is None:
|
|
2137
|
+
return f'-{-num:b}'
|
|
2138
|
+
|
|
2139
|
+
else:
|
|
2140
|
+
poswidth = len(f'{-num:b}')
|
|
2141
|
+
|
|
2142
|
+
# See gh-8679: remove extra digit
|
|
2143
|
+
# for numbers at boundaries.
|
|
2144
|
+
if 2**(poswidth - 1) == -num:
|
|
2145
|
+
poswidth -= 1
|
|
2146
|
+
|
|
2147
|
+
twocomp = 2**(poswidth + 1) + num
|
|
2148
|
+
binary = f'{twocomp:b}'
|
|
2149
|
+
binwidth = len(binary)
|
|
2150
|
+
|
|
2151
|
+
outwidth = builtins.max(binwidth, width)
|
|
2152
|
+
err_if_insufficient(width, binwidth)
|
|
2153
|
+
return '1' * (outwidth - binwidth) + binary
|
|
2154
|
+
|
|
2155
|
+
|
|
2156
|
+
@set_module('numpy')
|
|
2157
|
+
def base_repr(number, base=2, padding=0):
|
|
2158
|
+
"""
|
|
2159
|
+
Return a string representation of a number in the given base system.
|
|
2160
|
+
|
|
2161
|
+
Parameters
|
|
2162
|
+
----------
|
|
2163
|
+
number : int
|
|
2164
|
+
The value to convert. Positive and negative values are handled.
|
|
2165
|
+
base : int, optional
|
|
2166
|
+
Convert `number` to the `base` number system. The valid range is 2-36,
|
|
2167
|
+
the default value is 2.
|
|
2168
|
+
padding : int, optional
|
|
2169
|
+
Number of zeros padded on the left. Default is 0 (no padding).
|
|
2170
|
+
|
|
2171
|
+
Returns
|
|
2172
|
+
-------
|
|
2173
|
+
out : str
|
|
2174
|
+
String representation of `number` in `base` system.
|
|
2175
|
+
|
|
2176
|
+
See Also
|
|
2177
|
+
--------
|
|
2178
|
+
binary_repr : Faster version of `base_repr` for base 2.
|
|
2179
|
+
|
|
2180
|
+
Examples
|
|
2181
|
+
--------
|
|
2182
|
+
>>> import numpy as np
|
|
2183
|
+
>>> np.base_repr(5)
|
|
2184
|
+
'101'
|
|
2185
|
+
>>> np.base_repr(6, 5)
|
|
2186
|
+
'11'
|
|
2187
|
+
>>> np.base_repr(7, base=5, padding=3)
|
|
2188
|
+
'00012'
|
|
2189
|
+
|
|
2190
|
+
>>> np.base_repr(10, base=16)
|
|
2191
|
+
'A'
|
|
2192
|
+
>>> np.base_repr(32, base=16)
|
|
2193
|
+
'20'
|
|
2194
|
+
|
|
2195
|
+
"""
|
|
2196
|
+
digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
2197
|
+
if base > len(digits):
|
|
2198
|
+
raise ValueError("Bases greater than 36 not handled in base_repr.")
|
|
2199
|
+
elif base < 2:
|
|
2200
|
+
raise ValueError("Bases less than 2 not handled in base_repr.")
|
|
2201
|
+
|
|
2202
|
+
num = abs(int(number))
|
|
2203
|
+
res = []
|
|
2204
|
+
while num:
|
|
2205
|
+
res.append(digits[num % base])
|
|
2206
|
+
num //= base
|
|
2207
|
+
if padding:
|
|
2208
|
+
res.append('0' * padding)
|
|
2209
|
+
if number < 0:
|
|
2210
|
+
res.append('-')
|
|
2211
|
+
return ''.join(reversed(res or '0'))
|
|
2212
|
+
|
|
2213
|
+
|
|
2214
|
+
# These are all essentially abbreviations
|
|
2215
|
+
# These might wind up in a special abbreviations module
|
|
2216
|
+
|
|
2217
|
+
|
|
2218
|
+
def _maketup(descr, val):
|
|
2219
|
+
dt = dtype(descr)
|
|
2220
|
+
# Place val in all scalar tuples:
|
|
2221
|
+
fields = dt.fields
|
|
2222
|
+
if fields is None:
|
|
2223
|
+
return val
|
|
2224
|
+
else:
|
|
2225
|
+
res = [_maketup(fields[name][0], val) for name in dt.names]
|
|
2226
|
+
return tuple(res)
|
|
2227
|
+
|
|
2228
|
+
|
|
2229
|
+
@finalize_array_function_like
|
|
2230
|
+
@set_module('numpy')
|
|
2231
|
+
def identity(n, dtype=None, *, like=None):
|
|
2232
|
+
"""
|
|
2233
|
+
Return the identity array.
|
|
2234
|
+
|
|
2235
|
+
The identity array is a square array with ones on
|
|
2236
|
+
the main diagonal.
|
|
2237
|
+
|
|
2238
|
+
Parameters
|
|
2239
|
+
----------
|
|
2240
|
+
n : int
|
|
2241
|
+
Number of rows (and columns) in `n` x `n` output.
|
|
2242
|
+
dtype : data-type, optional
|
|
2243
|
+
Data-type of the output. Defaults to ``float``.
|
|
2244
|
+
${ARRAY_FUNCTION_LIKE}
|
|
2245
|
+
|
|
2246
|
+
.. versionadded:: 1.20.0
|
|
2247
|
+
|
|
2248
|
+
Returns
|
|
2249
|
+
-------
|
|
2250
|
+
out : ndarray
|
|
2251
|
+
`n` x `n` array with its main diagonal set to one,
|
|
2252
|
+
and all other elements 0.
|
|
2253
|
+
|
|
2254
|
+
Examples
|
|
2255
|
+
--------
|
|
2256
|
+
>>> import numpy as np
|
|
2257
|
+
>>> np.identity(3)
|
|
2258
|
+
array([[1., 0., 0.],
|
|
2259
|
+
[0., 1., 0.],
|
|
2260
|
+
[0., 0., 1.]])
|
|
2261
|
+
|
|
2262
|
+
"""
|
|
2263
|
+
if like is not None:
|
|
2264
|
+
return _identity_with_like(like, n, dtype=dtype)
|
|
2265
|
+
|
|
2266
|
+
from numpy import eye
|
|
2267
|
+
return eye(n, dtype=dtype, like=like)
|
|
2268
|
+
|
|
2269
|
+
|
|
2270
|
+
_identity_with_like = array_function_dispatch()(identity)
|
|
2271
|
+
|
|
2272
|
+
|
|
2273
|
+
def _allclose_dispatcher(a, b, rtol=None, atol=None, equal_nan=None):
|
|
2274
|
+
return (a, b, rtol, atol)
|
|
2275
|
+
|
|
2276
|
+
|
|
2277
|
+
@array_function_dispatch(_allclose_dispatcher)
|
|
2278
|
+
def allclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
|
|
2279
|
+
"""
|
|
2280
|
+
Returns True if two arrays are element-wise equal within a tolerance.
|
|
2281
|
+
|
|
2282
|
+
The tolerance values are positive, typically very small numbers. The
|
|
2283
|
+
relative difference (`rtol` * abs(`b`)) and the absolute difference
|
|
2284
|
+
`atol` are added together to compare against the absolute difference
|
|
2285
|
+
between `a` and `b`.
|
|
2286
|
+
|
|
2287
|
+
.. warning:: The default `atol` is not appropriate for comparing numbers
|
|
2288
|
+
with magnitudes much smaller than one (see Notes).
|
|
2289
|
+
|
|
2290
|
+
NaNs are treated as equal if they are in the same place and if
|
|
2291
|
+
``equal_nan=True``. Infs are treated as equal if they are in the same
|
|
2292
|
+
place and of the same sign in both arrays.
|
|
2293
|
+
|
|
2294
|
+
Parameters
|
|
2295
|
+
----------
|
|
2296
|
+
a, b : array_like
|
|
2297
|
+
Input arrays to compare.
|
|
2298
|
+
rtol : array_like
|
|
2299
|
+
The relative tolerance parameter (see Notes).
|
|
2300
|
+
atol : array_like
|
|
2301
|
+
The absolute tolerance parameter (see Notes).
|
|
2302
|
+
equal_nan : bool
|
|
2303
|
+
Whether to compare NaN's as equal. If True, NaN's in `a` will be
|
|
2304
|
+
considered equal to NaN's in `b` in the output array.
|
|
2305
|
+
|
|
2306
|
+
Returns
|
|
2307
|
+
-------
|
|
2308
|
+
allclose : bool
|
|
2309
|
+
Returns True if the two arrays are equal within the given
|
|
2310
|
+
tolerance; False otherwise.
|
|
2311
|
+
|
|
2312
|
+
See Also
|
|
2313
|
+
--------
|
|
2314
|
+
isclose, all, any, equal
|
|
2315
|
+
|
|
2316
|
+
Notes
|
|
2317
|
+
-----
|
|
2318
|
+
If the following equation is element-wise True, then allclose returns
|
|
2319
|
+
True.::
|
|
2320
|
+
|
|
2321
|
+
absolute(a - b) <= (atol + rtol * absolute(b))
|
|
2322
|
+
|
|
2323
|
+
The above equation is not symmetric in `a` and `b`, so that
|
|
2324
|
+
``allclose(a, b)`` might be different from ``allclose(b, a)`` in
|
|
2325
|
+
some rare cases.
|
|
2326
|
+
|
|
2327
|
+
The default value of `atol` is not appropriate when the reference value
|
|
2328
|
+
`b` has magnitude smaller than one. For example, it is unlikely that
|
|
2329
|
+
``a = 1e-9`` and ``b = 2e-9`` should be considered "close", yet
|
|
2330
|
+
``allclose(1e-9, 2e-9)`` is ``True`` with default settings. Be sure
|
|
2331
|
+
to select `atol` for the use case at hand, especially for defining the
|
|
2332
|
+
threshold below which a non-zero value in `a` will be considered "close"
|
|
2333
|
+
to a very small or zero value in `b`.
|
|
2334
|
+
|
|
2335
|
+
The comparison of `a` and `b` uses standard broadcasting, which
|
|
2336
|
+
means that `a` and `b` need not have the same shape in order for
|
|
2337
|
+
``allclose(a, b)`` to evaluate to True. The same is true for
|
|
2338
|
+
`equal` but not `array_equal`.
|
|
2339
|
+
|
|
2340
|
+
`allclose` is not defined for non-numeric data types.
|
|
2341
|
+
`bool` is considered a numeric data-type for this purpose.
|
|
2342
|
+
|
|
2343
|
+
Examples
|
|
2344
|
+
--------
|
|
2345
|
+
>>> import numpy as np
|
|
2346
|
+
>>> np.allclose([1e10,1e-7], [1.00001e10,1e-8])
|
|
2347
|
+
False
|
|
2348
|
+
|
|
2349
|
+
>>> np.allclose([1e10,1e-8], [1.00001e10,1e-9])
|
|
2350
|
+
True
|
|
2351
|
+
|
|
2352
|
+
>>> np.allclose([1e10,1e-8], [1.0001e10,1e-9])
|
|
2353
|
+
False
|
|
2354
|
+
|
|
2355
|
+
>>> np.allclose([1.0, np.nan], [1.0, np.nan])
|
|
2356
|
+
False
|
|
2357
|
+
|
|
2358
|
+
>>> np.allclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
|
|
2359
|
+
True
|
|
2360
|
+
|
|
2361
|
+
|
|
2362
|
+
"""
|
|
2363
|
+
res = all(isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan))
|
|
2364
|
+
return builtins.bool(res)
|
|
2365
|
+
|
|
2366
|
+
|
|
2367
|
+
def _isclose_dispatcher(a, b, rtol=None, atol=None, equal_nan=None):
|
|
2368
|
+
return (a, b, rtol, atol)
|
|
2369
|
+
|
|
2370
|
+
|
|
2371
|
+
@array_function_dispatch(_isclose_dispatcher)
|
|
2372
|
+
def isclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
|
|
2373
|
+
"""
|
|
2374
|
+
Returns a boolean array where two arrays are element-wise equal within a
|
|
2375
|
+
tolerance.
|
|
2376
|
+
|
|
2377
|
+
The tolerance values are positive, typically very small numbers. The
|
|
2378
|
+
relative difference (`rtol` * abs(`b`)) and the absolute difference
|
|
2379
|
+
`atol` are added together to compare against the absolute difference
|
|
2380
|
+
between `a` and `b`.
|
|
2381
|
+
|
|
2382
|
+
.. warning:: The default `atol` is not appropriate for comparing numbers
|
|
2383
|
+
with magnitudes much smaller than one (see Notes).
|
|
2384
|
+
|
|
2385
|
+
Parameters
|
|
2386
|
+
----------
|
|
2387
|
+
a, b : array_like
|
|
2388
|
+
Input arrays to compare.
|
|
2389
|
+
rtol : array_like
|
|
2390
|
+
The relative tolerance parameter (see Notes).
|
|
2391
|
+
atol : array_like
|
|
2392
|
+
The absolute tolerance parameter (see Notes).
|
|
2393
|
+
equal_nan : bool
|
|
2394
|
+
Whether to compare NaN's as equal. If True, NaN's in `a` will be
|
|
2395
|
+
considered equal to NaN's in `b` in the output array.
|
|
2396
|
+
|
|
2397
|
+
Returns
|
|
2398
|
+
-------
|
|
2399
|
+
y : array_like
|
|
2400
|
+
Returns a boolean array of where `a` and `b` are equal within the
|
|
2401
|
+
given tolerance. If both `a` and `b` are scalars, returns a single
|
|
2402
|
+
boolean value.
|
|
2403
|
+
|
|
2404
|
+
See Also
|
|
2405
|
+
--------
|
|
2406
|
+
allclose
|
|
2407
|
+
math.isclose
|
|
2408
|
+
|
|
2409
|
+
Notes
|
|
2410
|
+
-----
|
|
2411
|
+
For finite values, isclose uses the following equation to test whether
|
|
2412
|
+
two floating point values are equivalent.::
|
|
2413
|
+
|
|
2414
|
+
absolute(a - b) <= (atol + rtol * absolute(b))
|
|
2415
|
+
|
|
2416
|
+
Unlike the built-in `math.isclose`, the above equation is not symmetric
|
|
2417
|
+
in `a` and `b` -- it assumes `b` is the reference value -- so that
|
|
2418
|
+
`isclose(a, b)` might be different from `isclose(b, a)`.
|
|
2419
|
+
|
|
2420
|
+
The default value of `atol` is not appropriate when the reference value
|
|
2421
|
+
`b` has magnitude smaller than one. For example, it is unlikely that
|
|
2422
|
+
``a = 1e-9`` and ``b = 2e-9`` should be considered "close", yet
|
|
2423
|
+
``isclose(1e-9, 2e-9)`` is ``True`` with default settings. Be sure
|
|
2424
|
+
to select `atol` for the use case at hand, especially for defining the
|
|
2425
|
+
threshold below which a non-zero value in `a` will be considered "close"
|
|
2426
|
+
to a very small or zero value in `b`.
|
|
2427
|
+
|
|
2428
|
+
`isclose` is not defined for non-numeric data types.
|
|
2429
|
+
:class:`bool` is considered a numeric data-type for this purpose.
|
|
2430
|
+
|
|
2431
|
+
Examples
|
|
2432
|
+
--------
|
|
2433
|
+
>>> import numpy as np
|
|
2434
|
+
>>> np.isclose([1e10,1e-7], [1.00001e10,1e-8])
|
|
2435
|
+
array([ True, False])
|
|
2436
|
+
|
|
2437
|
+
>>> np.isclose([1e10,1e-8], [1.00001e10,1e-9])
|
|
2438
|
+
array([ True, True])
|
|
2439
|
+
|
|
2440
|
+
>>> np.isclose([1e10,1e-8], [1.0001e10,1e-9])
|
|
2441
|
+
array([False, True])
|
|
2442
|
+
|
|
2443
|
+
>>> np.isclose([1.0, np.nan], [1.0, np.nan])
|
|
2444
|
+
array([ True, False])
|
|
2445
|
+
|
|
2446
|
+
>>> np.isclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
|
|
2447
|
+
array([ True, True])
|
|
2448
|
+
|
|
2449
|
+
>>> np.isclose([1e-8, 1e-7], [0.0, 0.0])
|
|
2450
|
+
array([ True, False])
|
|
2451
|
+
|
|
2452
|
+
>>> np.isclose([1e-100, 1e-7], [0.0, 0.0], atol=0.0)
|
|
2453
|
+
array([False, False])
|
|
2454
|
+
|
|
2455
|
+
>>> np.isclose([1e-10, 1e-10], [1e-20, 0.0])
|
|
2456
|
+
array([ True, True])
|
|
2457
|
+
|
|
2458
|
+
>>> np.isclose([1e-10, 1e-10], [1e-20, 0.999999e-10], atol=0.0)
|
|
2459
|
+
array([False, True])
|
|
2460
|
+
|
|
2461
|
+
"""
|
|
2462
|
+
# Turn all but python scalars into arrays.
|
|
2463
|
+
x, y, atol, rtol = (
|
|
2464
|
+
a if isinstance(a, (int, float, complex)) else asanyarray(a)
|
|
2465
|
+
for a in (a, b, atol, rtol))
|
|
2466
|
+
|
|
2467
|
+
# Make sure y is an inexact type to avoid bad behavior on abs(MIN_INT).
|
|
2468
|
+
# This will cause casting of x later. Also, make sure to allow subclasses
|
|
2469
|
+
# (e.g., for numpy.ma).
|
|
2470
|
+
# NOTE: We explicitly allow timedelta, which used to work. This could
|
|
2471
|
+
# possibly be deprecated. See also gh-18286.
|
|
2472
|
+
# timedelta works if `atol` is an integer or also a timedelta.
|
|
2473
|
+
# Although, the default tolerances are unlikely to be useful
|
|
2474
|
+
if (dtype := getattr(y, "dtype", None)) is not None and dtype.kind != "m":
|
|
2475
|
+
dt = multiarray.result_type(y, 1.)
|
|
2476
|
+
y = asanyarray(y, dtype=dt)
|
|
2477
|
+
elif isinstance(y, int):
|
|
2478
|
+
y = float(y)
|
|
2479
|
+
|
|
2480
|
+
# atol and rtol can be arrays
|
|
2481
|
+
if not (np.all(np.isfinite(atol)) and np.all(np.isfinite(rtol))):
|
|
2482
|
+
err_s = np.geterr()["invalid"]
|
|
2483
|
+
err_msg = f"One of rtol or atol is not valid, atol: {atol}, rtol: {rtol}"
|
|
2484
|
+
|
|
2485
|
+
if err_s == "warn":
|
|
2486
|
+
warnings.warn(err_msg, RuntimeWarning, stacklevel=2)
|
|
2487
|
+
elif err_s == "raise":
|
|
2488
|
+
raise FloatingPointError(err_msg)
|
|
2489
|
+
elif err_s == "print":
|
|
2490
|
+
print(err_msg)
|
|
2491
|
+
|
|
2492
|
+
with errstate(invalid='ignore'):
|
|
2493
|
+
|
|
2494
|
+
result = (less_equal(abs(x - y), atol + rtol * abs(y))
|
|
2495
|
+
& isfinite(y)
|
|
2496
|
+
| (x == y))
|
|
2497
|
+
if equal_nan:
|
|
2498
|
+
result |= isnan(x) & isnan(y)
|
|
2499
|
+
|
|
2500
|
+
return result[()] # Flatten 0d arrays to scalars
|
|
2501
|
+
|
|
2502
|
+
|
|
2503
|
+
def _array_equal_dispatcher(a1, a2, equal_nan=None):
|
|
2504
|
+
return (a1, a2)
|
|
2505
|
+
|
|
2506
|
+
|
|
2507
|
+
_no_nan_types = {
|
|
2508
|
+
# should use np.dtype.BoolDType, but as of writing
|
|
2509
|
+
# that fails the reloading test.
|
|
2510
|
+
type(dtype(nt.bool)),
|
|
2511
|
+
type(dtype(nt.int8)),
|
|
2512
|
+
type(dtype(nt.int16)),
|
|
2513
|
+
type(dtype(nt.int32)),
|
|
2514
|
+
type(dtype(nt.int64)),
|
|
2515
|
+
}
|
|
2516
|
+
|
|
2517
|
+
|
|
2518
|
+
def _dtype_cannot_hold_nan(dtype):
|
|
2519
|
+
return type(dtype) in _no_nan_types
|
|
2520
|
+
|
|
2521
|
+
|
|
2522
|
+
@array_function_dispatch(_array_equal_dispatcher)
|
|
2523
|
+
def array_equal(a1, a2, equal_nan=False):
|
|
2524
|
+
"""
|
|
2525
|
+
True if two arrays have the same shape and elements, False otherwise.
|
|
2526
|
+
|
|
2527
|
+
Parameters
|
|
2528
|
+
----------
|
|
2529
|
+
a1, a2 : array_like
|
|
2530
|
+
Input arrays.
|
|
2531
|
+
equal_nan : bool
|
|
2532
|
+
Whether to compare NaN's as equal. If the dtype of a1 and a2 is
|
|
2533
|
+
complex, values will be considered equal if either the real or the
|
|
2534
|
+
imaginary component of a given value is ``nan``.
|
|
2535
|
+
|
|
2536
|
+
Returns
|
|
2537
|
+
-------
|
|
2538
|
+
b : bool
|
|
2539
|
+
Returns True if the arrays are equal.
|
|
2540
|
+
|
|
2541
|
+
See Also
|
|
2542
|
+
--------
|
|
2543
|
+
allclose: Returns True if two arrays are element-wise equal within a
|
|
2544
|
+
tolerance.
|
|
2545
|
+
array_equiv: Returns True if input arrays are shape consistent and all
|
|
2546
|
+
elements equal.
|
|
2547
|
+
|
|
2548
|
+
Examples
|
|
2549
|
+
--------
|
|
2550
|
+
>>> import numpy as np
|
|
2551
|
+
|
|
2552
|
+
>>> np.array_equal([1, 2], [1, 2])
|
|
2553
|
+
True
|
|
2554
|
+
|
|
2555
|
+
>>> np.array_equal(np.array([1, 2]), np.array([1, 2]))
|
|
2556
|
+
True
|
|
2557
|
+
|
|
2558
|
+
>>> np.array_equal([1, 2], [1, 2, 3])
|
|
2559
|
+
False
|
|
2560
|
+
|
|
2561
|
+
>>> np.array_equal([1, 2], [1, 4])
|
|
2562
|
+
False
|
|
2563
|
+
|
|
2564
|
+
>>> a = np.array([1, np.nan])
|
|
2565
|
+
>>> np.array_equal(a, a)
|
|
2566
|
+
False
|
|
2567
|
+
|
|
2568
|
+
>>> np.array_equal(a, a, equal_nan=True)
|
|
2569
|
+
True
|
|
2570
|
+
|
|
2571
|
+
When ``equal_nan`` is True, complex values with nan components are
|
|
2572
|
+
considered equal if either the real *or* the imaginary components are nan.
|
|
2573
|
+
|
|
2574
|
+
>>> a = np.array([1 + 1j])
|
|
2575
|
+
>>> b = a.copy()
|
|
2576
|
+
>>> a.real = np.nan
|
|
2577
|
+
>>> b.imag = np.nan
|
|
2578
|
+
>>> np.array_equal(a, b, equal_nan=True)
|
|
2579
|
+
True
|
|
2580
|
+
"""
|
|
2581
|
+
try:
|
|
2582
|
+
a1, a2 = asarray(a1), asarray(a2)
|
|
2583
|
+
except Exception:
|
|
2584
|
+
return False
|
|
2585
|
+
if a1.shape != a2.shape:
|
|
2586
|
+
return False
|
|
2587
|
+
if not equal_nan:
|
|
2588
|
+
return builtins.bool((asanyarray(a1 == a2)).all())
|
|
2589
|
+
|
|
2590
|
+
if a1 is a2:
|
|
2591
|
+
# nan will compare equal so an array will compare equal to itself.
|
|
2592
|
+
return True
|
|
2593
|
+
|
|
2594
|
+
cannot_have_nan = (_dtype_cannot_hold_nan(a1.dtype)
|
|
2595
|
+
and _dtype_cannot_hold_nan(a2.dtype))
|
|
2596
|
+
if cannot_have_nan:
|
|
2597
|
+
return builtins.bool(asarray(a1 == a2).all())
|
|
2598
|
+
|
|
2599
|
+
# Handling NaN values if equal_nan is True
|
|
2600
|
+
a1nan, a2nan = isnan(a1), isnan(a2)
|
|
2601
|
+
# NaN's occur at different locations
|
|
2602
|
+
if not (a1nan == a2nan).all():
|
|
2603
|
+
return False
|
|
2604
|
+
# Shapes of a1, a2 and masks are guaranteed to be consistent by this point
|
|
2605
|
+
return builtins.bool((a1[~a1nan] == a2[~a1nan]).all())
|
|
2606
|
+
|
|
2607
|
+
|
|
2608
|
+
def _array_equiv_dispatcher(a1, a2):
|
|
2609
|
+
return (a1, a2)
|
|
2610
|
+
|
|
2611
|
+
|
|
2612
|
+
@array_function_dispatch(_array_equiv_dispatcher)
|
|
2613
|
+
def array_equiv(a1, a2):
|
|
2614
|
+
"""
|
|
2615
|
+
Returns True if input arrays are shape consistent and all elements equal.
|
|
2616
|
+
|
|
2617
|
+
Shape consistent means they are either the same shape, or one input array
|
|
2618
|
+
can be broadcasted to create the same shape as the other one.
|
|
2619
|
+
|
|
2620
|
+
Parameters
|
|
2621
|
+
----------
|
|
2622
|
+
a1, a2 : array_like
|
|
2623
|
+
Input arrays.
|
|
2624
|
+
|
|
2625
|
+
Returns
|
|
2626
|
+
-------
|
|
2627
|
+
out : bool
|
|
2628
|
+
True if equivalent, False otherwise.
|
|
2629
|
+
|
|
2630
|
+
Examples
|
|
2631
|
+
--------
|
|
2632
|
+
>>> import numpy as np
|
|
2633
|
+
>>> np.array_equiv([1, 2], [1, 2])
|
|
2634
|
+
True
|
|
2635
|
+
>>> np.array_equiv([1, 2], [1, 3])
|
|
2636
|
+
False
|
|
2637
|
+
|
|
2638
|
+
Showing the shape equivalence:
|
|
2639
|
+
|
|
2640
|
+
>>> np.array_equiv([1, 2], [[1, 2], [1, 2]])
|
|
2641
|
+
True
|
|
2642
|
+
>>> np.array_equiv([1, 2], [[1, 2, 1, 2], [1, 2, 1, 2]])
|
|
2643
|
+
False
|
|
2644
|
+
|
|
2645
|
+
>>> np.array_equiv([1, 2], [[1, 2], [1, 3]])
|
|
2646
|
+
False
|
|
2647
|
+
|
|
2648
|
+
"""
|
|
2649
|
+
try:
|
|
2650
|
+
a1, a2 = asarray(a1), asarray(a2)
|
|
2651
|
+
except Exception:
|
|
2652
|
+
return False
|
|
2653
|
+
try:
|
|
2654
|
+
multiarray.broadcast(a1, a2)
|
|
2655
|
+
except Exception:
|
|
2656
|
+
return False
|
|
2657
|
+
|
|
2658
|
+
return builtins.bool(asanyarray(a1 == a2).all())
|
|
2659
|
+
|
|
2660
|
+
|
|
2661
|
+
def _astype_dispatcher(x, dtype, /, *, copy=None, device=None):
|
|
2662
|
+
return (x, dtype)
|
|
2663
|
+
|
|
2664
|
+
|
|
2665
|
+
@array_function_dispatch(_astype_dispatcher)
|
|
2666
|
+
def astype(x, dtype, /, *, copy=True, device=None):
|
|
2667
|
+
"""
|
|
2668
|
+
Copies an array to a specified data type.
|
|
2669
|
+
|
|
2670
|
+
This function is an Array API compatible alternative to
|
|
2671
|
+
`numpy.ndarray.astype`.
|
|
2672
|
+
|
|
2673
|
+
Parameters
|
|
2674
|
+
----------
|
|
2675
|
+
x : ndarray
|
|
2676
|
+
Input NumPy array to cast. ``array_likes`` are explicitly not
|
|
2677
|
+
supported here.
|
|
2678
|
+
dtype : dtype
|
|
2679
|
+
Data type of the result.
|
|
2680
|
+
copy : bool, optional
|
|
2681
|
+
Specifies whether to copy an array when the specified dtype matches
|
|
2682
|
+
the data type of the input array ``x``. If ``True``, a newly allocated
|
|
2683
|
+
array must always be returned. If ``False`` and the specified dtype
|
|
2684
|
+
matches the data type of the input array, the input array must be
|
|
2685
|
+
returned; otherwise, a newly allocated array must be returned.
|
|
2686
|
+
Defaults to ``True``.
|
|
2687
|
+
device : str, optional
|
|
2688
|
+
The device on which to place the returned array. Default: None.
|
|
2689
|
+
For Array-API interoperability only, so must be ``"cpu"`` if passed.
|
|
2690
|
+
|
|
2691
|
+
.. versionadded:: 2.1.0
|
|
2692
|
+
|
|
2693
|
+
Returns
|
|
2694
|
+
-------
|
|
2695
|
+
out : ndarray
|
|
2696
|
+
An array having the specified data type.
|
|
2697
|
+
|
|
2698
|
+
See Also
|
|
2699
|
+
--------
|
|
2700
|
+
ndarray.astype
|
|
2701
|
+
|
|
2702
|
+
Examples
|
|
2703
|
+
--------
|
|
2704
|
+
>>> import numpy as np
|
|
2705
|
+
>>> arr = np.array([1, 2, 3]); arr
|
|
2706
|
+
array([1, 2, 3])
|
|
2707
|
+
>>> np.astype(arr, np.float64)
|
|
2708
|
+
array([1., 2., 3.])
|
|
2709
|
+
|
|
2710
|
+
Non-copy case:
|
|
2711
|
+
|
|
2712
|
+
>>> arr = np.array([1, 2, 3])
|
|
2713
|
+
>>> arr_noncpy = np.astype(arr, arr.dtype, copy=False)
|
|
2714
|
+
>>> np.shares_memory(arr, arr_noncpy)
|
|
2715
|
+
True
|
|
2716
|
+
|
|
2717
|
+
"""
|
|
2718
|
+
if not (isinstance(x, np.ndarray) or isscalar(x)):
|
|
2719
|
+
raise TypeError(
|
|
2720
|
+
"Input should be a NumPy array or scalar. "
|
|
2721
|
+
f"It is a {type(x)} instead."
|
|
2722
|
+
)
|
|
2723
|
+
if device is not None and device != "cpu":
|
|
2724
|
+
raise ValueError(
|
|
2725
|
+
'Device not understood. Only "cpu" is allowed, but received:'
|
|
2726
|
+
f' {device}'
|
|
2727
|
+
)
|
|
2728
|
+
return x.astype(dtype, copy=copy)
|
|
2729
|
+
|
|
2730
|
+
|
|
2731
|
+
inf = PINF
|
|
2732
|
+
nan = NAN
|
|
2733
|
+
False_ = nt.bool(False)
|
|
2734
|
+
True_ = nt.bool(True)
|
|
2735
|
+
|
|
2736
|
+
|
|
2737
|
+
def extend_all(module):
|
|
2738
|
+
existing = set(__all__)
|
|
2739
|
+
mall = module.__all__
|
|
2740
|
+
for a in mall:
|
|
2741
|
+
if a not in existing:
|
|
2742
|
+
__all__.append(a)
|
|
2743
|
+
|
|
2744
|
+
|
|
2745
|
+
from . import _asarray, _ufunc_config, arrayprint, fromnumeric
|
|
2746
|
+
from ._asarray import *
|
|
2747
|
+
from ._ufunc_config import *
|
|
2748
|
+
from .arrayprint import *
|
|
2749
|
+
from .fromnumeric import *
|
|
2750
|
+
from .numerictypes import *
|
|
2751
|
+
from .umath import *
|
|
2752
|
+
|
|
2753
|
+
extend_all(fromnumeric)
|
|
2754
|
+
extend_all(umath)
|
|
2755
|
+
extend_all(numerictypes)
|
|
2756
|
+
extend_all(arrayprint)
|
|
2757
|
+
extend_all(_asarray)
|
|
2758
|
+
extend_all(_ufunc_config)
|