numpy 2.4.1__pp311-pypy311_pp73-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1039) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +108 -0
  3. numpy/__init__.cython-30.pxd +1242 -0
  4. numpy/__init__.pxd +1155 -0
  5. numpy/__init__.py +942 -0
  6. numpy/__init__.pyi +6202 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +206 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +201 -0
  12. numpy/_core/__init__.pyi +666 -0
  13. numpy/_core/_add_newdocs.py +7151 -0
  14. numpy/_core/_add_newdocs.pyi +2 -0
  15. numpy/_core/_add_newdocs_scalars.py +381 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +130 -0
  18. numpy/_core/_asarray.pyi +43 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +56 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +54 -0
  25. numpy/_core/_internal.py +968 -0
  26. numpy/_core/_internal.pyi +61 -0
  27. numpy/_core/_methods.py +252 -0
  28. numpy/_core/_methods.pyi +22 -0
  29. numpy/_core/_multiarray_tests.pypy311-pp73-darwin.so +0 -0
  30. numpy/_core/_multiarray_umath.pypy311-pp73-darwin.so +0 -0
  31. numpy/_core/_operand_flag_tests.pypy311-pp73-darwin.so +0 -0
  32. numpy/_core/_rational_tests.pypy311-pp73-darwin.so +0 -0
  33. numpy/_core/_simd.pyi +35 -0
  34. numpy/_core/_simd.pypy311-pp73-darwin.so +0 -0
  35. numpy/_core/_string_helpers.py +100 -0
  36. numpy/_core/_string_helpers.pyi +12 -0
  37. numpy/_core/_struct_ufunc_tests.pypy311-pp73-darwin.so +0 -0
  38. numpy/_core/_type_aliases.py +131 -0
  39. numpy/_core/_type_aliases.pyi +86 -0
  40. numpy/_core/_ufunc_config.py +515 -0
  41. numpy/_core/_ufunc_config.pyi +69 -0
  42. numpy/_core/_umath_tests.pyi +47 -0
  43. numpy/_core/_umath_tests.pypy311-pp73-darwin.so +0 -0
  44. numpy/_core/arrayprint.py +1779 -0
  45. numpy/_core/arrayprint.pyi +158 -0
  46. numpy/_core/cversions.py +13 -0
  47. numpy/_core/defchararray.py +1414 -0
  48. numpy/_core/defchararray.pyi +1150 -0
  49. numpy/_core/einsumfunc.py +1650 -0
  50. numpy/_core/einsumfunc.pyi +184 -0
  51. numpy/_core/fromnumeric.py +4233 -0
  52. numpy/_core/fromnumeric.pyi +1735 -0
  53. numpy/_core/function_base.py +547 -0
  54. numpy/_core/function_base.pyi +276 -0
  55. numpy/_core/getlimits.py +462 -0
  56. numpy/_core/getlimits.pyi +124 -0
  57. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  58. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  59. numpy/_core/include/numpy/__ufunc_api.c +55 -0
  60. numpy/_core/include/numpy/__ufunc_api.h +349 -0
  61. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  62. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  63. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  64. numpy/_core/include/numpy/arrayobject.h +7 -0
  65. numpy/_core/include/numpy/arrayscalars.h +198 -0
  66. numpy/_core/include/numpy/dtype_api.h +547 -0
  67. numpy/_core/include/numpy/halffloat.h +70 -0
  68. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  69. numpy/_core/include/numpy/ndarraytypes.h +1982 -0
  70. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  71. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  72. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  73. numpy/_core/include/numpy/npy_common.h +989 -0
  74. numpy/_core/include/numpy/npy_cpu.h +126 -0
  75. numpy/_core/include/numpy/npy_endian.h +79 -0
  76. numpy/_core/include/numpy/npy_math.h +602 -0
  77. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  78. numpy/_core/include/numpy/npy_os.h +42 -0
  79. numpy/_core/include/numpy/numpyconfig.h +185 -0
  80. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  81. numpy/_core/include/numpy/random/bitgen.h +20 -0
  82. numpy/_core/include/numpy/random/distributions.h +209 -0
  83. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  84. numpy/_core/include/numpy/ufuncobject.h +343 -0
  85. numpy/_core/include/numpy/utils.h +37 -0
  86. numpy/_core/lib/libnpymath.a +0 -0
  87. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  88. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  89. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  90. numpy/_core/memmap.py +363 -0
  91. numpy/_core/memmap.pyi +3 -0
  92. numpy/_core/multiarray.py +1740 -0
  93. numpy/_core/multiarray.pyi +1316 -0
  94. numpy/_core/numeric.py +2758 -0
  95. numpy/_core/numeric.pyi +1276 -0
  96. numpy/_core/numerictypes.py +633 -0
  97. numpy/_core/numerictypes.pyi +196 -0
  98. numpy/_core/overrides.py +188 -0
  99. numpy/_core/overrides.pyi +47 -0
  100. numpy/_core/printoptions.py +32 -0
  101. numpy/_core/printoptions.pyi +28 -0
  102. numpy/_core/records.py +1088 -0
  103. numpy/_core/records.pyi +340 -0
  104. numpy/_core/shape_base.py +996 -0
  105. numpy/_core/shape_base.pyi +182 -0
  106. numpy/_core/strings.py +1813 -0
  107. numpy/_core/strings.pyi +536 -0
  108. numpy/_core/tests/_locales.py +72 -0
  109. numpy/_core/tests/_natype.py +144 -0
  110. numpy/_core/tests/data/astype_copy.pkl +0 -0
  111. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  112. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  113. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  114. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  115. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  122. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  123. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  124. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  125. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  127. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  128. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  129. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  130. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  131. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  132. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  134. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  135. numpy/_core/tests/examples/cython/meson.build +43 -0
  136. numpy/_core/tests/examples/cython/setup.py +39 -0
  137. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  138. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  139. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  140. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  141. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  142. numpy/_core/tests/test__exceptions.py +90 -0
  143. numpy/_core/tests/test_abc.py +54 -0
  144. numpy/_core/tests/test_api.py +655 -0
  145. numpy/_core/tests/test_argparse.py +90 -0
  146. numpy/_core/tests/test_array_api_info.py +113 -0
  147. numpy/_core/tests/test_array_coercion.py +928 -0
  148. numpy/_core/tests/test_array_interface.py +222 -0
  149. numpy/_core/tests/test_arraymethod.py +84 -0
  150. numpy/_core/tests/test_arrayobject.py +75 -0
  151. numpy/_core/tests/test_arrayprint.py +1324 -0
  152. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  153. numpy/_core/tests/test_casting_unittests.py +955 -0
  154. numpy/_core/tests/test_conversion_utils.py +209 -0
  155. numpy/_core/tests/test_cpu_dispatcher.py +48 -0
  156. numpy/_core/tests/test_cpu_features.py +450 -0
  157. numpy/_core/tests/test_custom_dtypes.py +393 -0
  158. numpy/_core/tests/test_cython.py +352 -0
  159. numpy/_core/tests/test_datetime.py +2792 -0
  160. numpy/_core/tests/test_defchararray.py +858 -0
  161. numpy/_core/tests/test_deprecations.py +460 -0
  162. numpy/_core/tests/test_dlpack.py +190 -0
  163. numpy/_core/tests/test_dtype.py +2110 -0
  164. numpy/_core/tests/test_einsum.py +1351 -0
  165. numpy/_core/tests/test_errstate.py +131 -0
  166. numpy/_core/tests/test_extint128.py +217 -0
  167. numpy/_core/tests/test_finfo.py +86 -0
  168. numpy/_core/tests/test_function_base.py +504 -0
  169. numpy/_core/tests/test_getlimits.py +171 -0
  170. numpy/_core/tests/test_half.py +593 -0
  171. numpy/_core/tests/test_hashtable.py +36 -0
  172. numpy/_core/tests/test_indexerrors.py +122 -0
  173. numpy/_core/tests/test_indexing.py +1692 -0
  174. numpy/_core/tests/test_item_selection.py +167 -0
  175. numpy/_core/tests/test_limited_api.py +102 -0
  176. numpy/_core/tests/test_longdouble.py +370 -0
  177. numpy/_core/tests/test_mem_overlap.py +933 -0
  178. numpy/_core/tests/test_mem_policy.py +453 -0
  179. numpy/_core/tests/test_memmap.py +248 -0
  180. numpy/_core/tests/test_multiarray.py +11008 -0
  181. numpy/_core/tests/test_multiprocessing.py +55 -0
  182. numpy/_core/tests/test_multithreading.py +377 -0
  183. numpy/_core/tests/test_nditer.py +3533 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4295 -0
  186. numpy/_core/tests/test_numerictypes.py +650 -0
  187. numpy/_core/tests/test_overrides.py +800 -0
  188. numpy/_core/tests/test_print.py +202 -0
  189. numpy/_core/tests/test_protocols.py +46 -0
  190. numpy/_core/tests/test_records.py +544 -0
  191. numpy/_core/tests/test_regression.py +2677 -0
  192. numpy/_core/tests/test_scalar_ctors.py +203 -0
  193. numpy/_core/tests/test_scalar_methods.py +328 -0
  194. numpy/_core/tests/test_scalarbuffer.py +153 -0
  195. numpy/_core/tests/test_scalarinherit.py +105 -0
  196. numpy/_core/tests/test_scalarmath.py +1168 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +904 -0
  199. numpy/_core/tests/test_simd.py +1345 -0
  200. numpy/_core/tests/test_simd_module.py +105 -0
  201. numpy/_core/tests/test_stringdtype.py +1855 -0
  202. numpy/_core/tests/test_strings.py +1523 -0
  203. numpy/_core/tests/test_ufunc.py +3405 -0
  204. numpy/_core/tests/test_umath.py +4962 -0
  205. numpy/_core/tests/test_umath_accuracy.py +132 -0
  206. numpy/_core/tests/test_umath_complex.py +631 -0
  207. numpy/_core/tests/test_unicode.py +369 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +232 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +78 -0
  213. numpy/_expired_attrs_2_0.pyi +61 -0
  214. numpy/_globals.py +121 -0
  215. numpy/_globals.pyi +17 -0
  216. numpy/_pyinstaller/__init__.py +0 -0
  217. numpy/_pyinstaller/__init__.pyi +0 -0
  218. numpy/_pyinstaller/hook-numpy.py +36 -0
  219. numpy/_pyinstaller/hook-numpy.pyi +6 -0
  220. numpy/_pyinstaller/tests/__init__.py +16 -0
  221. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  222. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  223. numpy/_pytesttester.py +201 -0
  224. numpy/_pytesttester.pyi +18 -0
  225. numpy/_typing/__init__.py +173 -0
  226. numpy/_typing/_add_docstring.py +153 -0
  227. numpy/_typing/_array_like.py +106 -0
  228. numpy/_typing/_char_codes.py +213 -0
  229. numpy/_typing/_dtype_like.py +114 -0
  230. numpy/_typing/_extended_precision.py +15 -0
  231. numpy/_typing/_nbit.py +19 -0
  232. numpy/_typing/_nbit_base.py +94 -0
  233. numpy/_typing/_nbit_base.pyi +39 -0
  234. numpy/_typing/_nested_sequence.py +79 -0
  235. numpy/_typing/_scalars.py +20 -0
  236. numpy/_typing/_shape.py +8 -0
  237. numpy/_typing/_ufunc.py +7 -0
  238. numpy/_typing/_ufunc.pyi +975 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +28 -0
  241. numpy/_utils/_convertions.py +18 -0
  242. numpy/_utils/_convertions.pyi +4 -0
  243. numpy/_utils/_inspect.py +192 -0
  244. numpy/_utils/_inspect.pyi +70 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +118 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +248 -0
  250. numpy/core/__init__.py +33 -0
  251. numpy/core/__init__.pyi +0 -0
  252. numpy/core/_dtype.py +10 -0
  253. numpy/core/_dtype.pyi +0 -0
  254. numpy/core/_dtype_ctypes.py +10 -0
  255. numpy/core/_dtype_ctypes.pyi +0 -0
  256. numpy/core/_internal.py +27 -0
  257. numpy/core/_multiarray_umath.py +57 -0
  258. numpy/core/_utils.py +21 -0
  259. numpy/core/arrayprint.py +10 -0
  260. numpy/core/defchararray.py +10 -0
  261. numpy/core/einsumfunc.py +10 -0
  262. numpy/core/fromnumeric.py +10 -0
  263. numpy/core/function_base.py +10 -0
  264. numpy/core/getlimits.py +10 -0
  265. numpy/core/multiarray.py +25 -0
  266. numpy/core/numeric.py +12 -0
  267. numpy/core/numerictypes.py +10 -0
  268. numpy/core/overrides.py +10 -0
  269. numpy/core/overrides.pyi +7 -0
  270. numpy/core/records.py +10 -0
  271. numpy/core/shape_base.py +10 -0
  272. numpy/core/umath.py +10 -0
  273. numpy/ctypeslib/__init__.py +13 -0
  274. numpy/ctypeslib/__init__.pyi +15 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +236 -0
  277. numpy/distutils/__init__.py +64 -0
  278. numpy/distutils/__init__.pyi +4 -0
  279. numpy/distutils/__pycache__/conv_template.pypy311.pyc +0 -0
  280. numpy/distutils/_shell_utils.py +87 -0
  281. numpy/distutils/armccompiler.py +26 -0
  282. numpy/distutils/ccompiler.py +826 -0
  283. numpy/distutils/ccompiler_opt.py +2668 -0
  284. numpy/distutils/checks/cpu_asimd.c +27 -0
  285. numpy/distutils/checks/cpu_asimddp.c +16 -0
  286. numpy/distutils/checks/cpu_asimdfhm.c +19 -0
  287. numpy/distutils/checks/cpu_asimdhp.c +15 -0
  288. numpy/distutils/checks/cpu_avx.c +20 -0
  289. numpy/distutils/checks/cpu_avx2.c +20 -0
  290. numpy/distutils/checks/cpu_avx512_clx.c +22 -0
  291. numpy/distutils/checks/cpu_avx512_cnl.c +24 -0
  292. numpy/distutils/checks/cpu_avx512_icl.c +26 -0
  293. numpy/distutils/checks/cpu_avx512_knl.c +25 -0
  294. numpy/distutils/checks/cpu_avx512_knm.c +30 -0
  295. numpy/distutils/checks/cpu_avx512_skx.c +26 -0
  296. numpy/distutils/checks/cpu_avx512_spr.c +26 -0
  297. numpy/distutils/checks/cpu_avx512cd.c +20 -0
  298. numpy/distutils/checks/cpu_avx512f.c +20 -0
  299. numpy/distutils/checks/cpu_f16c.c +22 -0
  300. numpy/distutils/checks/cpu_fma3.c +22 -0
  301. numpy/distutils/checks/cpu_fma4.c +13 -0
  302. numpy/distutils/checks/cpu_lsx.c +11 -0
  303. numpy/distutils/checks/cpu_neon.c +19 -0
  304. numpy/distutils/checks/cpu_neon_fp16.c +11 -0
  305. numpy/distutils/checks/cpu_neon_vfpv4.c +21 -0
  306. numpy/distutils/checks/cpu_popcnt.c +32 -0
  307. numpy/distutils/checks/cpu_rvv.c +13 -0
  308. numpy/distutils/checks/cpu_sse.c +20 -0
  309. numpy/distutils/checks/cpu_sse2.c +20 -0
  310. numpy/distutils/checks/cpu_sse3.c +20 -0
  311. numpy/distutils/checks/cpu_sse41.c +20 -0
  312. numpy/distutils/checks/cpu_sse42.c +20 -0
  313. numpy/distutils/checks/cpu_ssse3.c +20 -0
  314. numpy/distutils/checks/cpu_sve.c +14 -0
  315. numpy/distutils/checks/cpu_vsx.c +21 -0
  316. numpy/distutils/checks/cpu_vsx2.c +13 -0
  317. numpy/distutils/checks/cpu_vsx3.c +13 -0
  318. numpy/distutils/checks/cpu_vsx4.c +14 -0
  319. numpy/distutils/checks/cpu_vx.c +16 -0
  320. numpy/distutils/checks/cpu_vxe.c +25 -0
  321. numpy/distutils/checks/cpu_vxe2.c +21 -0
  322. numpy/distutils/checks/cpu_xop.c +12 -0
  323. numpy/distutils/checks/extra_avx512bw_mask.c +18 -0
  324. numpy/distutils/checks/extra_avx512dq_mask.c +16 -0
  325. numpy/distutils/checks/extra_avx512f_reduce.c +41 -0
  326. numpy/distutils/checks/extra_vsx3_half_double.c +12 -0
  327. numpy/distutils/checks/extra_vsx4_mma.c +21 -0
  328. numpy/distutils/checks/extra_vsx_asm.c +36 -0
  329. numpy/distutils/checks/test_flags.c +1 -0
  330. numpy/distutils/command/__init__.py +41 -0
  331. numpy/distutils/command/autodist.py +148 -0
  332. numpy/distutils/command/bdist_rpm.py +22 -0
  333. numpy/distutils/command/build.py +62 -0
  334. numpy/distutils/command/build_clib.py +469 -0
  335. numpy/distutils/command/build_ext.py +752 -0
  336. numpy/distutils/command/build_py.py +31 -0
  337. numpy/distutils/command/build_scripts.py +49 -0
  338. numpy/distutils/command/build_src.py +773 -0
  339. numpy/distutils/command/config.py +516 -0
  340. numpy/distutils/command/config_compiler.py +126 -0
  341. numpy/distutils/command/develop.py +15 -0
  342. numpy/distutils/command/egg_info.py +25 -0
  343. numpy/distutils/command/install.py +79 -0
  344. numpy/distutils/command/install_clib.py +40 -0
  345. numpy/distutils/command/install_data.py +24 -0
  346. numpy/distutils/command/install_headers.py +25 -0
  347. numpy/distutils/command/sdist.py +27 -0
  348. numpy/distutils/conv_template.py +329 -0
  349. numpy/distutils/core.py +215 -0
  350. numpy/distutils/cpuinfo.py +683 -0
  351. numpy/distutils/exec_command.py +315 -0
  352. numpy/distutils/extension.py +101 -0
  353. numpy/distutils/fcompiler/__init__.py +1035 -0
  354. numpy/distutils/fcompiler/absoft.py +158 -0
  355. numpy/distutils/fcompiler/arm.py +71 -0
  356. numpy/distutils/fcompiler/compaq.py +120 -0
  357. numpy/distutils/fcompiler/environment.py +88 -0
  358. numpy/distutils/fcompiler/fujitsu.py +46 -0
  359. numpy/distutils/fcompiler/g95.py +42 -0
  360. numpy/distutils/fcompiler/gnu.py +555 -0
  361. numpy/distutils/fcompiler/hpux.py +41 -0
  362. numpy/distutils/fcompiler/ibm.py +97 -0
  363. numpy/distutils/fcompiler/intel.py +211 -0
  364. numpy/distutils/fcompiler/lahey.py +45 -0
  365. numpy/distutils/fcompiler/mips.py +54 -0
  366. numpy/distutils/fcompiler/nag.py +87 -0
  367. numpy/distutils/fcompiler/none.py +28 -0
  368. numpy/distutils/fcompiler/nv.py +53 -0
  369. numpy/distutils/fcompiler/pathf95.py +33 -0
  370. numpy/distutils/fcompiler/pg.py +128 -0
  371. numpy/distutils/fcompiler/sun.py +51 -0
  372. numpy/distutils/fcompiler/vast.py +52 -0
  373. numpy/distutils/from_template.py +261 -0
  374. numpy/distutils/fujitsuccompiler.py +28 -0
  375. numpy/distutils/intelccompiler.py +106 -0
  376. numpy/distutils/lib2def.py +116 -0
  377. numpy/distutils/line_endings.py +77 -0
  378. numpy/distutils/log.py +111 -0
  379. numpy/distutils/mingw/gfortran_vs2003_hack.c +6 -0
  380. numpy/distutils/mingw32ccompiler.py +620 -0
  381. numpy/distutils/misc_util.py +2484 -0
  382. numpy/distutils/msvc9compiler.py +63 -0
  383. numpy/distutils/msvccompiler.py +76 -0
  384. numpy/distutils/npy_pkg_config.py +441 -0
  385. numpy/distutils/numpy_distribution.py +17 -0
  386. numpy/distutils/pathccompiler.py +21 -0
  387. numpy/distutils/system_info.py +3267 -0
  388. numpy/distutils/tests/__init__.py +0 -0
  389. numpy/distutils/tests/test_build_ext.py +74 -0
  390. numpy/distutils/tests/test_ccompiler_opt.py +808 -0
  391. numpy/distutils/tests/test_ccompiler_opt_conf.py +176 -0
  392. numpy/distutils/tests/test_exec_command.py +217 -0
  393. numpy/distutils/tests/test_fcompiler.py +43 -0
  394. numpy/distutils/tests/test_fcompiler_gnu.py +55 -0
  395. numpy/distutils/tests/test_fcompiler_intel.py +30 -0
  396. numpy/distutils/tests/test_fcompiler_nagfor.py +22 -0
  397. numpy/distutils/tests/test_from_template.py +44 -0
  398. numpy/distutils/tests/test_log.py +34 -0
  399. numpy/distutils/tests/test_mingw32ccompiler.py +47 -0
  400. numpy/distutils/tests/test_misc_util.py +88 -0
  401. numpy/distutils/tests/test_npy_pkg_config.py +84 -0
  402. numpy/distutils/tests/test_shell_utils.py +79 -0
  403. numpy/distutils/tests/test_system_info.py +334 -0
  404. numpy/distutils/tests/utilities.py +90 -0
  405. numpy/distutils/unixccompiler.py +141 -0
  406. numpy/doc/ufuncs.py +138 -0
  407. numpy/dtypes.py +41 -0
  408. numpy/dtypes.pyi +630 -0
  409. numpy/exceptions.py +246 -0
  410. numpy/exceptions.pyi +27 -0
  411. numpy/f2py/__init__.py +86 -0
  412. numpy/f2py/__init__.pyi +5 -0
  413. numpy/f2py/__main__.py +5 -0
  414. numpy/f2py/__version__.py +1 -0
  415. numpy/f2py/__version__.pyi +1 -0
  416. numpy/f2py/_backends/__init__.py +9 -0
  417. numpy/f2py/_backends/__init__.pyi +5 -0
  418. numpy/f2py/_backends/_backend.py +44 -0
  419. numpy/f2py/_backends/_backend.pyi +46 -0
  420. numpy/f2py/_backends/_distutils.py +76 -0
  421. numpy/f2py/_backends/_distutils.pyi +13 -0
  422. numpy/f2py/_backends/_meson.py +244 -0
  423. numpy/f2py/_backends/_meson.pyi +62 -0
  424. numpy/f2py/_backends/meson.build.template +58 -0
  425. numpy/f2py/_isocbind.py +62 -0
  426. numpy/f2py/_isocbind.pyi +13 -0
  427. numpy/f2py/_src_pyf.py +247 -0
  428. numpy/f2py/_src_pyf.pyi +28 -0
  429. numpy/f2py/auxfuncs.py +1004 -0
  430. numpy/f2py/auxfuncs.pyi +262 -0
  431. numpy/f2py/capi_maps.py +811 -0
  432. numpy/f2py/capi_maps.pyi +33 -0
  433. numpy/f2py/cb_rules.py +665 -0
  434. numpy/f2py/cb_rules.pyi +17 -0
  435. numpy/f2py/cfuncs.py +1563 -0
  436. numpy/f2py/cfuncs.pyi +31 -0
  437. numpy/f2py/common_rules.py +143 -0
  438. numpy/f2py/common_rules.pyi +9 -0
  439. numpy/f2py/crackfortran.py +3725 -0
  440. numpy/f2py/crackfortran.pyi +266 -0
  441. numpy/f2py/diagnose.py +149 -0
  442. numpy/f2py/diagnose.pyi +1 -0
  443. numpy/f2py/f2py2e.py +788 -0
  444. numpy/f2py/f2py2e.pyi +74 -0
  445. numpy/f2py/f90mod_rules.py +269 -0
  446. numpy/f2py/f90mod_rules.pyi +16 -0
  447. numpy/f2py/func2subr.py +329 -0
  448. numpy/f2py/func2subr.pyi +7 -0
  449. numpy/f2py/rules.py +1629 -0
  450. numpy/f2py/rules.pyi +41 -0
  451. numpy/f2py/setup.cfg +3 -0
  452. numpy/f2py/src/fortranobject.c +1436 -0
  453. numpy/f2py/src/fortranobject.h +173 -0
  454. numpy/f2py/symbolic.py +1518 -0
  455. numpy/f2py/symbolic.pyi +219 -0
  456. numpy/f2py/tests/__init__.py +16 -0
  457. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  458. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  459. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  460. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  461. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  462. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  463. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  464. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  465. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  466. numpy/f2py/tests/src/callback/foo.f +62 -0
  467. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  468. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  469. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  470. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  471. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  472. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  473. numpy/f2py/tests/src/cli/hi77.f +3 -0
  474. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  475. numpy/f2py/tests/src/common/block.f +11 -0
  476. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  477. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  478. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  479. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  480. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  481. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  482. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  483. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  484. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  485. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  486. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  487. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  488. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  489. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  490. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  491. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  492. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  493. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  494. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  495. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  496. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  497. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  498. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  499. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  500. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  501. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  502. numpy/f2py/tests/src/mixed/foo.f +5 -0
  503. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  504. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  505. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  506. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  507. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  508. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  509. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  510. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  511. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  512. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  513. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  514. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  515. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  516. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  517. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  518. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  519. numpy/f2py/tests/src/regression/AB.inc +1 -0
  520. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  521. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  522. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  523. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  524. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  525. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  526. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  527. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  528. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  529. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  530. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  531. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  532. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  533. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  534. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  535. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  536. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  537. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  538. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  539. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  540. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  541. numpy/f2py/tests/src/routines/subrout.f +4 -0
  542. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  543. numpy/f2py/tests/src/size/foo.f90 +44 -0
  544. numpy/f2py/tests/src/string/char.f90 +29 -0
  545. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  546. numpy/f2py/tests/src/string/gh24008.f +8 -0
  547. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  548. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  549. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  550. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  551. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  552. numpy/f2py/tests/src/string/string.f +12 -0
  553. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  554. numpy/f2py/tests/test_abstract_interface.py +26 -0
  555. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  556. numpy/f2py/tests/test_assumed_shape.py +50 -0
  557. numpy/f2py/tests/test_block_docstring.py +20 -0
  558. numpy/f2py/tests/test_callback.py +263 -0
  559. numpy/f2py/tests/test_character.py +641 -0
  560. numpy/f2py/tests/test_common.py +23 -0
  561. numpy/f2py/tests/test_crackfortran.py +421 -0
  562. numpy/f2py/tests/test_data.py +71 -0
  563. numpy/f2py/tests/test_docs.py +66 -0
  564. numpy/f2py/tests/test_f2cmap.py +17 -0
  565. numpy/f2py/tests/test_f2py2e.py +983 -0
  566. numpy/f2py/tests/test_isoc.py +56 -0
  567. numpy/f2py/tests/test_kind.py +52 -0
  568. numpy/f2py/tests/test_mixed.py +35 -0
  569. numpy/f2py/tests/test_modules.py +83 -0
  570. numpy/f2py/tests/test_parameter.py +129 -0
  571. numpy/f2py/tests/test_pyf_src.py +43 -0
  572. numpy/f2py/tests/test_quoted_character.py +18 -0
  573. numpy/f2py/tests/test_regression.py +187 -0
  574. numpy/f2py/tests/test_return_character.py +48 -0
  575. numpy/f2py/tests/test_return_complex.py +67 -0
  576. numpy/f2py/tests/test_return_integer.py +55 -0
  577. numpy/f2py/tests/test_return_logical.py +65 -0
  578. numpy/f2py/tests/test_return_real.py +109 -0
  579. numpy/f2py/tests/test_routines.py +29 -0
  580. numpy/f2py/tests/test_semicolon_split.py +75 -0
  581. numpy/f2py/tests/test_size.py +45 -0
  582. numpy/f2py/tests/test_string.py +100 -0
  583. numpy/f2py/tests/test_symbolic.py +500 -0
  584. numpy/f2py/tests/test_value_attrspec.py +15 -0
  585. numpy/f2py/tests/util.py +442 -0
  586. numpy/f2py/use_rules.py +99 -0
  587. numpy/f2py/use_rules.pyi +9 -0
  588. numpy/fft/__init__.py +213 -0
  589. numpy/fft/__init__.pyi +38 -0
  590. numpy/fft/_helper.py +235 -0
  591. numpy/fft/_helper.pyi +44 -0
  592. numpy/fft/_pocketfft.py +1693 -0
  593. numpy/fft/_pocketfft.pyi +137 -0
  594. numpy/fft/_pocketfft_umath.pypy311-pp73-darwin.so +0 -0
  595. numpy/fft/tests/__init__.py +0 -0
  596. numpy/fft/tests/test_helper.py +167 -0
  597. numpy/fft/tests/test_pocketfft.py +589 -0
  598. numpy/lib/__init__.py +97 -0
  599. numpy/lib/__init__.pyi +52 -0
  600. numpy/lib/_array_utils_impl.py +62 -0
  601. numpy/lib/_array_utils_impl.pyi +10 -0
  602. numpy/lib/_arraypad_impl.py +926 -0
  603. numpy/lib/_arraypad_impl.pyi +88 -0
  604. numpy/lib/_arraysetops_impl.py +1158 -0
  605. numpy/lib/_arraysetops_impl.pyi +462 -0
  606. numpy/lib/_arrayterator_impl.py +224 -0
  607. numpy/lib/_arrayterator_impl.pyi +45 -0
  608. numpy/lib/_datasource.py +700 -0
  609. numpy/lib/_datasource.pyi +30 -0
  610. numpy/lib/_format_impl.py +1036 -0
  611. numpy/lib/_format_impl.pyi +56 -0
  612. numpy/lib/_function_base_impl.py +5760 -0
  613. numpy/lib/_function_base_impl.pyi +2324 -0
  614. numpy/lib/_histograms_impl.py +1085 -0
  615. numpy/lib/_histograms_impl.pyi +40 -0
  616. numpy/lib/_index_tricks_impl.py +1048 -0
  617. numpy/lib/_index_tricks_impl.pyi +267 -0
  618. numpy/lib/_iotools.py +900 -0
  619. numpy/lib/_iotools.pyi +116 -0
  620. numpy/lib/_nanfunctions_impl.py +2006 -0
  621. numpy/lib/_nanfunctions_impl.pyi +48 -0
  622. numpy/lib/_npyio_impl.py +2583 -0
  623. numpy/lib/_npyio_impl.pyi +299 -0
  624. numpy/lib/_polynomial_impl.py +1465 -0
  625. numpy/lib/_polynomial_impl.pyi +338 -0
  626. numpy/lib/_scimath_impl.py +642 -0
  627. numpy/lib/_scimath_impl.pyi +93 -0
  628. numpy/lib/_shape_base_impl.py +1289 -0
  629. numpy/lib/_shape_base_impl.pyi +236 -0
  630. numpy/lib/_stride_tricks_impl.py +582 -0
  631. numpy/lib/_stride_tricks_impl.pyi +73 -0
  632. numpy/lib/_twodim_base_impl.py +1201 -0
  633. numpy/lib/_twodim_base_impl.pyi +408 -0
  634. numpy/lib/_type_check_impl.py +710 -0
  635. numpy/lib/_type_check_impl.pyi +348 -0
  636. numpy/lib/_ufunclike_impl.py +199 -0
  637. numpy/lib/_ufunclike_impl.pyi +60 -0
  638. numpy/lib/_user_array_impl.py +310 -0
  639. numpy/lib/_user_array_impl.pyi +226 -0
  640. numpy/lib/_utils_impl.py +784 -0
  641. numpy/lib/_utils_impl.pyi +22 -0
  642. numpy/lib/_version.py +153 -0
  643. numpy/lib/_version.pyi +17 -0
  644. numpy/lib/array_utils.py +7 -0
  645. numpy/lib/array_utils.pyi +6 -0
  646. numpy/lib/format.py +24 -0
  647. numpy/lib/format.pyi +24 -0
  648. numpy/lib/introspect.py +94 -0
  649. numpy/lib/introspect.pyi +3 -0
  650. numpy/lib/mixins.py +180 -0
  651. numpy/lib/mixins.pyi +78 -0
  652. numpy/lib/npyio.py +1 -0
  653. numpy/lib/npyio.pyi +5 -0
  654. numpy/lib/recfunctions.py +1681 -0
  655. numpy/lib/recfunctions.pyi +444 -0
  656. numpy/lib/scimath.py +13 -0
  657. numpy/lib/scimath.pyi +12 -0
  658. numpy/lib/stride_tricks.py +1 -0
  659. numpy/lib/stride_tricks.pyi +4 -0
  660. numpy/lib/tests/__init__.py +0 -0
  661. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  662. numpy/lib/tests/data/py2-objarr.npy +0 -0
  663. numpy/lib/tests/data/py2-objarr.npz +0 -0
  664. numpy/lib/tests/data/py3-objarr.npy +0 -0
  665. numpy/lib/tests/data/py3-objarr.npz +0 -0
  666. numpy/lib/tests/data/python3.npy +0 -0
  667. numpy/lib/tests/data/win64python2.npy +0 -0
  668. numpy/lib/tests/test__datasource.py +328 -0
  669. numpy/lib/tests/test__iotools.py +358 -0
  670. numpy/lib/tests/test__version.py +64 -0
  671. numpy/lib/tests/test_array_utils.py +32 -0
  672. numpy/lib/tests/test_arraypad.py +1427 -0
  673. numpy/lib/tests/test_arraysetops.py +1302 -0
  674. numpy/lib/tests/test_arrayterator.py +45 -0
  675. numpy/lib/tests/test_format.py +1054 -0
  676. numpy/lib/tests/test_function_base.py +4750 -0
  677. numpy/lib/tests/test_histograms.py +855 -0
  678. numpy/lib/tests/test_index_tricks.py +693 -0
  679. numpy/lib/tests/test_io.py +2857 -0
  680. numpy/lib/tests/test_loadtxt.py +1099 -0
  681. numpy/lib/tests/test_mixins.py +215 -0
  682. numpy/lib/tests/test_nanfunctions.py +1438 -0
  683. numpy/lib/tests/test_packbits.py +376 -0
  684. numpy/lib/tests/test_polynomial.py +325 -0
  685. numpy/lib/tests/test_recfunctions.py +1042 -0
  686. numpy/lib/tests/test_regression.py +231 -0
  687. numpy/lib/tests/test_shape_base.py +813 -0
  688. numpy/lib/tests/test_stride_tricks.py +655 -0
  689. numpy/lib/tests/test_twodim_base.py +559 -0
  690. numpy/lib/tests/test_type_check.py +473 -0
  691. numpy/lib/tests/test_ufunclike.py +97 -0
  692. numpy/lib/tests/test_utils.py +80 -0
  693. numpy/lib/user_array.py +1 -0
  694. numpy/lib/user_array.pyi +1 -0
  695. numpy/linalg/__init__.py +95 -0
  696. numpy/linalg/__init__.pyi +71 -0
  697. numpy/linalg/_linalg.py +3657 -0
  698. numpy/linalg/_linalg.pyi +548 -0
  699. numpy/linalg/_umath_linalg.pyi +60 -0
  700. numpy/linalg/_umath_linalg.pypy311-pp73-darwin.so +0 -0
  701. numpy/linalg/lapack_lite.pyi +143 -0
  702. numpy/linalg/lapack_lite.pypy311-pp73-darwin.so +0 -0
  703. numpy/linalg/tests/__init__.py +0 -0
  704. numpy/linalg/tests/test_deprecations.py +21 -0
  705. numpy/linalg/tests/test_linalg.py +2442 -0
  706. numpy/linalg/tests/test_regression.py +182 -0
  707. numpy/ma/API_CHANGES.txt +135 -0
  708. numpy/ma/LICENSE +24 -0
  709. numpy/ma/README.rst +236 -0
  710. numpy/ma/__init__.py +53 -0
  711. numpy/ma/__init__.pyi +458 -0
  712. numpy/ma/core.py +8929 -0
  713. numpy/ma/core.pyi +3720 -0
  714. numpy/ma/extras.py +2266 -0
  715. numpy/ma/extras.pyi +297 -0
  716. numpy/ma/mrecords.py +762 -0
  717. numpy/ma/mrecords.pyi +96 -0
  718. numpy/ma/tests/__init__.py +0 -0
  719. numpy/ma/tests/test_arrayobject.py +40 -0
  720. numpy/ma/tests/test_core.py +6008 -0
  721. numpy/ma/tests/test_deprecations.py +65 -0
  722. numpy/ma/tests/test_extras.py +1945 -0
  723. numpy/ma/tests/test_mrecords.py +495 -0
  724. numpy/ma/tests/test_old_ma.py +939 -0
  725. numpy/ma/tests/test_regression.py +83 -0
  726. numpy/ma/tests/test_subclassing.py +469 -0
  727. numpy/ma/testutils.py +294 -0
  728. numpy/ma/testutils.pyi +69 -0
  729. numpy/matlib.py +380 -0
  730. numpy/matlib.pyi +580 -0
  731. numpy/matrixlib/__init__.py +12 -0
  732. numpy/matrixlib/__init__.pyi +3 -0
  733. numpy/matrixlib/defmatrix.py +1119 -0
  734. numpy/matrixlib/defmatrix.pyi +218 -0
  735. numpy/matrixlib/tests/__init__.py +0 -0
  736. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  737. numpy/matrixlib/tests/test_interaction.py +360 -0
  738. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  739. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  740. numpy/matrixlib/tests/test_multiarray.py +17 -0
  741. numpy/matrixlib/tests/test_numeric.py +18 -0
  742. numpy/matrixlib/tests/test_regression.py +31 -0
  743. numpy/polynomial/__init__.py +187 -0
  744. numpy/polynomial/__init__.pyi +31 -0
  745. numpy/polynomial/_polybase.py +1191 -0
  746. numpy/polynomial/_polybase.pyi +262 -0
  747. numpy/polynomial/_polytypes.pyi +501 -0
  748. numpy/polynomial/chebyshev.py +2001 -0
  749. numpy/polynomial/chebyshev.pyi +180 -0
  750. numpy/polynomial/hermite.py +1738 -0
  751. numpy/polynomial/hermite.pyi +106 -0
  752. numpy/polynomial/hermite_e.py +1640 -0
  753. numpy/polynomial/hermite_e.pyi +106 -0
  754. numpy/polynomial/laguerre.py +1673 -0
  755. numpy/polynomial/laguerre.pyi +100 -0
  756. numpy/polynomial/legendre.py +1603 -0
  757. numpy/polynomial/legendre.pyi +100 -0
  758. numpy/polynomial/polynomial.py +1625 -0
  759. numpy/polynomial/polynomial.pyi +109 -0
  760. numpy/polynomial/polyutils.py +759 -0
  761. numpy/polynomial/polyutils.pyi +307 -0
  762. numpy/polynomial/tests/__init__.py +0 -0
  763. numpy/polynomial/tests/test_chebyshev.py +618 -0
  764. numpy/polynomial/tests/test_classes.py +613 -0
  765. numpy/polynomial/tests/test_hermite.py +553 -0
  766. numpy/polynomial/tests/test_hermite_e.py +554 -0
  767. numpy/polynomial/tests/test_laguerre.py +535 -0
  768. numpy/polynomial/tests/test_legendre.py +566 -0
  769. numpy/polynomial/tests/test_polynomial.py +691 -0
  770. numpy/polynomial/tests/test_polyutils.py +123 -0
  771. numpy/polynomial/tests/test_printing.py +557 -0
  772. numpy/polynomial/tests/test_symbol.py +217 -0
  773. numpy/py.typed +0 -0
  774. numpy/random/LICENSE.md +71 -0
  775. numpy/random/__init__.pxd +14 -0
  776. numpy/random/__init__.py +213 -0
  777. numpy/random/__init__.pyi +124 -0
  778. numpy/random/_bounded_integers.pxd +29 -0
  779. numpy/random/_bounded_integers.pyi +1 -0
  780. numpy/random/_bounded_integers.pypy311-pp73-darwin.so +0 -0
  781. numpy/random/_common.pxd +110 -0
  782. numpy/random/_common.pyi +16 -0
  783. numpy/random/_common.pypy311-pp73-darwin.so +0 -0
  784. numpy/random/_examples/cffi/extending.py +44 -0
  785. numpy/random/_examples/cffi/parse.py +53 -0
  786. numpy/random/_examples/cython/extending.pyx +77 -0
  787. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  788. numpy/random/_examples/cython/meson.build +53 -0
  789. numpy/random/_examples/numba/extending.py +86 -0
  790. numpy/random/_examples/numba/extending_distributions.py +67 -0
  791. numpy/random/_generator.pyi +862 -0
  792. numpy/random/_generator.pypy311-pp73-darwin.so +0 -0
  793. numpy/random/_mt19937.pyi +27 -0
  794. numpy/random/_mt19937.pypy311-pp73-darwin.so +0 -0
  795. numpy/random/_pcg64.pyi +41 -0
  796. numpy/random/_pcg64.pypy311-pp73-darwin.so +0 -0
  797. numpy/random/_philox.pyi +36 -0
  798. numpy/random/_philox.pypy311-pp73-darwin.so +0 -0
  799. numpy/random/_pickle.py +88 -0
  800. numpy/random/_pickle.pyi +43 -0
  801. numpy/random/_sfc64.pyi +25 -0
  802. numpy/random/_sfc64.pypy311-pp73-darwin.so +0 -0
  803. numpy/random/bit_generator.pxd +40 -0
  804. numpy/random/bit_generator.pyi +123 -0
  805. numpy/random/bit_generator.pypy311-pp73-darwin.so +0 -0
  806. numpy/random/c_distributions.pxd +119 -0
  807. numpy/random/lib/libnpyrandom.a +0 -0
  808. numpy/random/mtrand.pyi +759 -0
  809. numpy/random/mtrand.pypy311-pp73-darwin.so +0 -0
  810. numpy/random/tests/__init__.py +0 -0
  811. numpy/random/tests/data/__init__.py +0 -0
  812. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  813. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  814. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  815. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  816. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  817. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  818. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  819. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  820. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  821. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  822. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  823. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  824. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  825. numpy/random/tests/test_direct.py +595 -0
  826. numpy/random/tests/test_extending.py +131 -0
  827. numpy/random/tests/test_generator_mt19937.py +2825 -0
  828. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  829. numpy/random/tests/test_random.py +1724 -0
  830. numpy/random/tests/test_randomstate.py +2099 -0
  831. numpy/random/tests/test_randomstate_regression.py +213 -0
  832. numpy/random/tests/test_regression.py +175 -0
  833. numpy/random/tests/test_seed_sequence.py +79 -0
  834. numpy/random/tests/test_smoke.py +882 -0
  835. numpy/rec/__init__.py +2 -0
  836. numpy/rec/__init__.pyi +23 -0
  837. numpy/strings/__init__.py +2 -0
  838. numpy/strings/__init__.pyi +97 -0
  839. numpy/testing/__init__.py +22 -0
  840. numpy/testing/__init__.pyi +107 -0
  841. numpy/testing/_private/__init__.py +0 -0
  842. numpy/testing/_private/__init__.pyi +0 -0
  843. numpy/testing/_private/extbuild.py +250 -0
  844. numpy/testing/_private/extbuild.pyi +25 -0
  845. numpy/testing/_private/utils.py +2830 -0
  846. numpy/testing/_private/utils.pyi +505 -0
  847. numpy/testing/overrides.py +84 -0
  848. numpy/testing/overrides.pyi +10 -0
  849. numpy/testing/print_coercion_tables.py +207 -0
  850. numpy/testing/print_coercion_tables.pyi +26 -0
  851. numpy/testing/tests/__init__.py +0 -0
  852. numpy/testing/tests/test_utils.py +2123 -0
  853. numpy/tests/__init__.py +0 -0
  854. numpy/tests/test__all__.py +10 -0
  855. numpy/tests/test_configtool.py +51 -0
  856. numpy/tests/test_ctypeslib.py +383 -0
  857. numpy/tests/test_lazyloading.py +42 -0
  858. numpy/tests/test_matlib.py +59 -0
  859. numpy/tests/test_numpy_config.py +47 -0
  860. numpy/tests/test_numpy_version.py +54 -0
  861. numpy/tests/test_public_api.py +807 -0
  862. numpy/tests/test_reloading.py +76 -0
  863. numpy/tests/test_scripts.py +48 -0
  864. numpy/tests/test_warnings.py +79 -0
  865. numpy/typing/__init__.py +233 -0
  866. numpy/typing/__init__.pyi +3 -0
  867. numpy/typing/mypy_plugin.py +200 -0
  868. numpy/typing/tests/__init__.py +0 -0
  869. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  870. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  871. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  872. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  873. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  874. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  875. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  876. numpy/typing/tests/data/fail/char.pyi +63 -0
  877. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  878. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  879. numpy/typing/tests/data/fail/constants.pyi +3 -0
  880. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  881. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  882. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  883. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  884. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  885. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  886. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  887. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  888. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  889. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  890. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  891. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  892. numpy/typing/tests/data/fail/ma.pyi +155 -0
  893. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  894. numpy/typing/tests/data/fail/modules.pyi +17 -0
  895. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  896. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  897. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  898. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  899. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  900. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  901. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  902. numpy/typing/tests/data/fail/random.pyi +62 -0
  903. numpy/typing/tests/data/fail/rec.pyi +17 -0
  904. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  905. numpy/typing/tests/data/fail/shape.pyi +7 -0
  906. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  907. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  908. numpy/typing/tests/data/fail/strings.pyi +52 -0
  909. numpy/typing/tests/data/fail/testing.pyi +28 -0
  910. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  911. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  912. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  913. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  914. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  915. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  916. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  917. numpy/typing/tests/data/mypy.ini +8 -0
  918. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  919. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  920. numpy/typing/tests/data/pass/array_like.py +43 -0
  921. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  922. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  923. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  924. numpy/typing/tests/data/pass/comparisons.py +316 -0
  925. numpy/typing/tests/data/pass/dtype.py +57 -0
  926. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  927. numpy/typing/tests/data/pass/flatiter.py +26 -0
  928. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  929. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  930. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  931. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  932. numpy/typing/tests/data/pass/lib_version.py +18 -0
  933. numpy/typing/tests/data/pass/literal.py +52 -0
  934. numpy/typing/tests/data/pass/ma.py +199 -0
  935. numpy/typing/tests/data/pass/mod.py +149 -0
  936. numpy/typing/tests/data/pass/modules.py +45 -0
  937. numpy/typing/tests/data/pass/multiarray.py +77 -0
  938. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  939. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  940. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  941. numpy/typing/tests/data/pass/nditer.py +4 -0
  942. numpy/typing/tests/data/pass/numeric.py +90 -0
  943. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  944. numpy/typing/tests/data/pass/random.py +1498 -0
  945. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  946. numpy/typing/tests/data/pass/scalars.py +249 -0
  947. numpy/typing/tests/data/pass/shape.py +19 -0
  948. numpy/typing/tests/data/pass/simple.py +170 -0
  949. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  950. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  951. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  952. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  953. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  954. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  955. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  956. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  957. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  958. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  959. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  960. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  961. numpy/typing/tests/data/reveal/char.pyi +225 -0
  962. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  963. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  964. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  965. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  966. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  967. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  968. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  969. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  970. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  971. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  972. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  973. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  974. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  975. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  976. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  977. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  978. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  979. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  980. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  981. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  982. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  983. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  984. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  985. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  986. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  987. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  988. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  989. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  990. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  991. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  992. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  993. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  994. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  995. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  996. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  997. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  998. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  999. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  1000. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  1001. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  1002. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  1003. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  1004. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  1005. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  1006. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  1007. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  1008. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  1009. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  1010. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  1011. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  1012. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  1013. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  1014. numpy/typing/tests/test_isfile.py +38 -0
  1015. numpy/typing/tests/test_runtime.py +110 -0
  1016. numpy/typing/tests/test_typing.py +205 -0
  1017. numpy/version.py +11 -0
  1018. numpy/version.pyi +9 -0
  1019. numpy-2.4.1.dist-info/METADATA +139 -0
  1020. numpy-2.4.1.dist-info/RECORD +1039 -0
  1021. numpy-2.4.1.dist-info/WHEEL +6 -0
  1022. numpy-2.4.1.dist-info/entry_points.txt +13 -0
  1023. numpy-2.4.1.dist-info/licenses/LICENSE.txt +935 -0
  1024. numpy-2.4.1.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  1025. numpy-2.4.1.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  1026. numpy-2.4.1.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  1027. numpy-2.4.1.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  1028. numpy-2.4.1.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  1029. numpy-2.4.1.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  1030. numpy-2.4.1.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  1031. numpy-2.4.1.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  1032. numpy-2.4.1.dist-info/licenses/numpy/ma/LICENSE +24 -0
  1033. numpy-2.4.1.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  1034. numpy-2.4.1.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  1035. numpy-2.4.1.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  1036. numpy-2.4.1.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  1037. numpy-2.4.1.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  1038. numpy-2.4.1.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  1039. numpy-2.4.1.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -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)