numpy 2.4.0__cp313-cp313t-musllinux_1_2_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (915) 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.cpython-313t-aarch64-linux-musl.so +0 -0
  30. numpy/_core/_multiarray_umath.cpython-313t-aarch64-linux-musl.so +0 -0
  31. numpy/_core/_operand_flag_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  32. numpy/_core/_rational_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  33. numpy/_core/_simd.cpython-313t-aarch64-linux-musl.so +0 -0
  34. numpy/_core/_simd.pyi +35 -0
  35. numpy/_core/_string_helpers.py +100 -0
  36. numpy/_core/_string_helpers.pyi +12 -0
  37. numpy/_core/_struct_ufunc_tests.cpython-313t-aarch64-linux-musl.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.cpython-313t-aarch64-linux-musl.so +0 -0
  43. numpy/_core/_umath_tests.pyi +47 -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 +353 -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 +1515 -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/doc/ufuncs.py +138 -0
  278. numpy/dtypes.py +41 -0
  279. numpy/dtypes.pyi +630 -0
  280. numpy/exceptions.py +246 -0
  281. numpy/exceptions.pyi +27 -0
  282. numpy/f2py/__init__.py +86 -0
  283. numpy/f2py/__init__.pyi +5 -0
  284. numpy/f2py/__main__.py +5 -0
  285. numpy/f2py/__version__.py +1 -0
  286. numpy/f2py/__version__.pyi +1 -0
  287. numpy/f2py/_backends/__init__.py +9 -0
  288. numpy/f2py/_backends/__init__.pyi +5 -0
  289. numpy/f2py/_backends/_backend.py +44 -0
  290. numpy/f2py/_backends/_backend.pyi +46 -0
  291. numpy/f2py/_backends/_distutils.py +76 -0
  292. numpy/f2py/_backends/_distutils.pyi +13 -0
  293. numpy/f2py/_backends/_meson.py +244 -0
  294. numpy/f2py/_backends/_meson.pyi +62 -0
  295. numpy/f2py/_backends/meson.build.template +58 -0
  296. numpy/f2py/_isocbind.py +62 -0
  297. numpy/f2py/_isocbind.pyi +13 -0
  298. numpy/f2py/_src_pyf.py +247 -0
  299. numpy/f2py/_src_pyf.pyi +28 -0
  300. numpy/f2py/auxfuncs.py +1004 -0
  301. numpy/f2py/auxfuncs.pyi +262 -0
  302. numpy/f2py/capi_maps.py +811 -0
  303. numpy/f2py/capi_maps.pyi +33 -0
  304. numpy/f2py/cb_rules.py +665 -0
  305. numpy/f2py/cb_rules.pyi +17 -0
  306. numpy/f2py/cfuncs.py +1563 -0
  307. numpy/f2py/cfuncs.pyi +31 -0
  308. numpy/f2py/common_rules.py +143 -0
  309. numpy/f2py/common_rules.pyi +9 -0
  310. numpy/f2py/crackfortran.py +3725 -0
  311. numpy/f2py/crackfortran.pyi +266 -0
  312. numpy/f2py/diagnose.py +149 -0
  313. numpy/f2py/diagnose.pyi +1 -0
  314. numpy/f2py/f2py2e.py +788 -0
  315. numpy/f2py/f2py2e.pyi +74 -0
  316. numpy/f2py/f90mod_rules.py +269 -0
  317. numpy/f2py/f90mod_rules.pyi +16 -0
  318. numpy/f2py/func2subr.py +329 -0
  319. numpy/f2py/func2subr.pyi +7 -0
  320. numpy/f2py/rules.py +1629 -0
  321. numpy/f2py/rules.pyi +41 -0
  322. numpy/f2py/setup.cfg +3 -0
  323. numpy/f2py/src/fortranobject.c +1436 -0
  324. numpy/f2py/src/fortranobject.h +173 -0
  325. numpy/f2py/symbolic.py +1518 -0
  326. numpy/f2py/symbolic.pyi +219 -0
  327. numpy/f2py/tests/__init__.py +16 -0
  328. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  329. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  330. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  331. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  332. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  333. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  334. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  335. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  336. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  337. numpy/f2py/tests/src/callback/foo.f +62 -0
  338. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  339. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  340. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  341. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  342. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  343. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  344. numpy/f2py/tests/src/cli/hi77.f +3 -0
  345. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  346. numpy/f2py/tests/src/common/block.f +11 -0
  347. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  348. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  349. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  350. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  351. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  352. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  353. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  354. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  355. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  356. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  357. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  358. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  359. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  360. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  361. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  362. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  363. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  364. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  365. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  366. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  367. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  368. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  369. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  370. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  371. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  372. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  373. numpy/f2py/tests/src/mixed/foo.f +5 -0
  374. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  375. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  376. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  377. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  378. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  379. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  380. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  381. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  382. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  383. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  384. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  385. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  386. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  387. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  388. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  389. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  390. numpy/f2py/tests/src/regression/AB.inc +1 -0
  391. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  392. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  393. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  394. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  395. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  396. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  397. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  398. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  399. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  400. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  401. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  402. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  403. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  404. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  405. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  406. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  407. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  408. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  409. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  410. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  411. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  412. numpy/f2py/tests/src/routines/subrout.f +4 -0
  413. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  414. numpy/f2py/tests/src/size/foo.f90 +44 -0
  415. numpy/f2py/tests/src/string/char.f90 +29 -0
  416. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  417. numpy/f2py/tests/src/string/gh24008.f +8 -0
  418. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  419. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  420. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  421. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  422. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  423. numpy/f2py/tests/src/string/string.f +12 -0
  424. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  425. numpy/f2py/tests/test_abstract_interface.py +26 -0
  426. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  427. numpy/f2py/tests/test_assumed_shape.py +50 -0
  428. numpy/f2py/tests/test_block_docstring.py +20 -0
  429. numpy/f2py/tests/test_callback.py +263 -0
  430. numpy/f2py/tests/test_character.py +641 -0
  431. numpy/f2py/tests/test_common.py +23 -0
  432. numpy/f2py/tests/test_crackfortran.py +421 -0
  433. numpy/f2py/tests/test_data.py +71 -0
  434. numpy/f2py/tests/test_docs.py +66 -0
  435. numpy/f2py/tests/test_f2cmap.py +17 -0
  436. numpy/f2py/tests/test_f2py2e.py +983 -0
  437. numpy/f2py/tests/test_isoc.py +56 -0
  438. numpy/f2py/tests/test_kind.py +52 -0
  439. numpy/f2py/tests/test_mixed.py +35 -0
  440. numpy/f2py/tests/test_modules.py +83 -0
  441. numpy/f2py/tests/test_parameter.py +129 -0
  442. numpy/f2py/tests/test_pyf_src.py +43 -0
  443. numpy/f2py/tests/test_quoted_character.py +18 -0
  444. numpy/f2py/tests/test_regression.py +187 -0
  445. numpy/f2py/tests/test_return_character.py +48 -0
  446. numpy/f2py/tests/test_return_complex.py +67 -0
  447. numpy/f2py/tests/test_return_integer.py +55 -0
  448. numpy/f2py/tests/test_return_logical.py +65 -0
  449. numpy/f2py/tests/test_return_real.py +109 -0
  450. numpy/f2py/tests/test_routines.py +29 -0
  451. numpy/f2py/tests/test_semicolon_split.py +75 -0
  452. numpy/f2py/tests/test_size.py +45 -0
  453. numpy/f2py/tests/test_string.py +100 -0
  454. numpy/f2py/tests/test_symbolic.py +500 -0
  455. numpy/f2py/tests/test_value_attrspec.py +15 -0
  456. numpy/f2py/tests/util.py +442 -0
  457. numpy/f2py/use_rules.py +99 -0
  458. numpy/f2py/use_rules.pyi +9 -0
  459. numpy/fft/__init__.py +213 -0
  460. numpy/fft/__init__.pyi +38 -0
  461. numpy/fft/_helper.py +235 -0
  462. numpy/fft/_helper.pyi +44 -0
  463. numpy/fft/_pocketfft.py +1693 -0
  464. numpy/fft/_pocketfft.pyi +137 -0
  465. numpy/fft/_pocketfft_umath.cpython-313t-aarch64-linux-musl.so +0 -0
  466. numpy/fft/tests/__init__.py +0 -0
  467. numpy/fft/tests/test_helper.py +167 -0
  468. numpy/fft/tests/test_pocketfft.py +589 -0
  469. numpy/lib/__init__.py +97 -0
  470. numpy/lib/__init__.pyi +52 -0
  471. numpy/lib/_array_utils_impl.py +62 -0
  472. numpy/lib/_array_utils_impl.pyi +10 -0
  473. numpy/lib/_arraypad_impl.py +926 -0
  474. numpy/lib/_arraypad_impl.pyi +88 -0
  475. numpy/lib/_arraysetops_impl.py +1158 -0
  476. numpy/lib/_arraysetops_impl.pyi +462 -0
  477. numpy/lib/_arrayterator_impl.py +224 -0
  478. numpy/lib/_arrayterator_impl.pyi +45 -0
  479. numpy/lib/_datasource.py +700 -0
  480. numpy/lib/_datasource.pyi +30 -0
  481. numpy/lib/_format_impl.py +1036 -0
  482. numpy/lib/_format_impl.pyi +56 -0
  483. numpy/lib/_function_base_impl.py +5758 -0
  484. numpy/lib/_function_base_impl.pyi +2324 -0
  485. numpy/lib/_histograms_impl.py +1085 -0
  486. numpy/lib/_histograms_impl.pyi +40 -0
  487. numpy/lib/_index_tricks_impl.py +1048 -0
  488. numpy/lib/_index_tricks_impl.pyi +267 -0
  489. numpy/lib/_iotools.py +900 -0
  490. numpy/lib/_iotools.pyi +116 -0
  491. numpy/lib/_nanfunctions_impl.py +2001 -0
  492. numpy/lib/_nanfunctions_impl.pyi +48 -0
  493. numpy/lib/_npyio_impl.py +2583 -0
  494. numpy/lib/_npyio_impl.pyi +299 -0
  495. numpy/lib/_polynomial_impl.py +1465 -0
  496. numpy/lib/_polynomial_impl.pyi +338 -0
  497. numpy/lib/_scimath_impl.py +642 -0
  498. numpy/lib/_scimath_impl.pyi +93 -0
  499. numpy/lib/_shape_base_impl.py +1289 -0
  500. numpy/lib/_shape_base_impl.pyi +236 -0
  501. numpy/lib/_stride_tricks_impl.py +582 -0
  502. numpy/lib/_stride_tricks_impl.pyi +73 -0
  503. numpy/lib/_twodim_base_impl.py +1201 -0
  504. numpy/lib/_twodim_base_impl.pyi +408 -0
  505. numpy/lib/_type_check_impl.py +710 -0
  506. numpy/lib/_type_check_impl.pyi +348 -0
  507. numpy/lib/_ufunclike_impl.py +199 -0
  508. numpy/lib/_ufunclike_impl.pyi +60 -0
  509. numpy/lib/_user_array_impl.py +310 -0
  510. numpy/lib/_user_array_impl.pyi +226 -0
  511. numpy/lib/_utils_impl.py +784 -0
  512. numpy/lib/_utils_impl.pyi +22 -0
  513. numpy/lib/_version.py +153 -0
  514. numpy/lib/_version.pyi +17 -0
  515. numpy/lib/array_utils.py +7 -0
  516. numpy/lib/array_utils.pyi +6 -0
  517. numpy/lib/format.py +24 -0
  518. numpy/lib/format.pyi +24 -0
  519. numpy/lib/introspect.py +94 -0
  520. numpy/lib/introspect.pyi +3 -0
  521. numpy/lib/mixins.py +180 -0
  522. numpy/lib/mixins.pyi +78 -0
  523. numpy/lib/npyio.py +1 -0
  524. numpy/lib/npyio.pyi +5 -0
  525. numpy/lib/recfunctions.py +1681 -0
  526. numpy/lib/recfunctions.pyi +444 -0
  527. numpy/lib/scimath.py +13 -0
  528. numpy/lib/scimath.pyi +12 -0
  529. numpy/lib/stride_tricks.py +1 -0
  530. numpy/lib/stride_tricks.pyi +4 -0
  531. numpy/lib/tests/__init__.py +0 -0
  532. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  533. numpy/lib/tests/data/py2-objarr.npy +0 -0
  534. numpy/lib/tests/data/py2-objarr.npz +0 -0
  535. numpy/lib/tests/data/py3-objarr.npy +0 -0
  536. numpy/lib/tests/data/py3-objarr.npz +0 -0
  537. numpy/lib/tests/data/python3.npy +0 -0
  538. numpy/lib/tests/data/win64python2.npy +0 -0
  539. numpy/lib/tests/test__datasource.py +328 -0
  540. numpy/lib/tests/test__iotools.py +358 -0
  541. numpy/lib/tests/test__version.py +64 -0
  542. numpy/lib/tests/test_array_utils.py +32 -0
  543. numpy/lib/tests/test_arraypad.py +1427 -0
  544. numpy/lib/tests/test_arraysetops.py +1302 -0
  545. numpy/lib/tests/test_arrayterator.py +45 -0
  546. numpy/lib/tests/test_format.py +1054 -0
  547. numpy/lib/tests/test_function_base.py +4705 -0
  548. numpy/lib/tests/test_histograms.py +855 -0
  549. numpy/lib/tests/test_index_tricks.py +693 -0
  550. numpy/lib/tests/test_io.py +2857 -0
  551. numpy/lib/tests/test_loadtxt.py +1099 -0
  552. numpy/lib/tests/test_mixins.py +215 -0
  553. numpy/lib/tests/test_nanfunctions.py +1438 -0
  554. numpy/lib/tests/test_packbits.py +376 -0
  555. numpy/lib/tests/test_polynomial.py +325 -0
  556. numpy/lib/tests/test_recfunctions.py +1042 -0
  557. numpy/lib/tests/test_regression.py +231 -0
  558. numpy/lib/tests/test_shape_base.py +813 -0
  559. numpy/lib/tests/test_stride_tricks.py +655 -0
  560. numpy/lib/tests/test_twodim_base.py +559 -0
  561. numpy/lib/tests/test_type_check.py +473 -0
  562. numpy/lib/tests/test_ufunclike.py +97 -0
  563. numpy/lib/tests/test_utils.py +80 -0
  564. numpy/lib/user_array.py +1 -0
  565. numpy/lib/user_array.pyi +1 -0
  566. numpy/linalg/__init__.py +95 -0
  567. numpy/linalg/__init__.pyi +71 -0
  568. numpy/linalg/_linalg.py +3657 -0
  569. numpy/linalg/_linalg.pyi +548 -0
  570. numpy/linalg/_umath_linalg.cpython-313t-aarch64-linux-musl.so +0 -0
  571. numpy/linalg/_umath_linalg.pyi +60 -0
  572. numpy/linalg/lapack_lite.cpython-313t-aarch64-linux-musl.so +0 -0
  573. numpy/linalg/lapack_lite.pyi +143 -0
  574. numpy/linalg/tests/__init__.py +0 -0
  575. numpy/linalg/tests/test_deprecations.py +21 -0
  576. numpy/linalg/tests/test_linalg.py +2442 -0
  577. numpy/linalg/tests/test_regression.py +182 -0
  578. numpy/ma/API_CHANGES.txt +135 -0
  579. numpy/ma/LICENSE +24 -0
  580. numpy/ma/README.rst +236 -0
  581. numpy/ma/__init__.py +53 -0
  582. numpy/ma/__init__.pyi +458 -0
  583. numpy/ma/core.py +8929 -0
  584. numpy/ma/core.pyi +3720 -0
  585. numpy/ma/extras.py +2266 -0
  586. numpy/ma/extras.pyi +297 -0
  587. numpy/ma/mrecords.py +762 -0
  588. numpy/ma/mrecords.pyi +96 -0
  589. numpy/ma/tests/__init__.py +0 -0
  590. numpy/ma/tests/test_arrayobject.py +40 -0
  591. numpy/ma/tests/test_core.py +6008 -0
  592. numpy/ma/tests/test_deprecations.py +65 -0
  593. numpy/ma/tests/test_extras.py +1945 -0
  594. numpy/ma/tests/test_mrecords.py +495 -0
  595. numpy/ma/tests/test_old_ma.py +939 -0
  596. numpy/ma/tests/test_regression.py +83 -0
  597. numpy/ma/tests/test_subclassing.py +469 -0
  598. numpy/ma/testutils.py +294 -0
  599. numpy/ma/testutils.pyi +69 -0
  600. numpy/matlib.py +380 -0
  601. numpy/matlib.pyi +580 -0
  602. numpy/matrixlib/__init__.py +12 -0
  603. numpy/matrixlib/__init__.pyi +3 -0
  604. numpy/matrixlib/defmatrix.py +1119 -0
  605. numpy/matrixlib/defmatrix.pyi +218 -0
  606. numpy/matrixlib/tests/__init__.py +0 -0
  607. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  608. numpy/matrixlib/tests/test_interaction.py +360 -0
  609. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  610. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  611. numpy/matrixlib/tests/test_multiarray.py +17 -0
  612. numpy/matrixlib/tests/test_numeric.py +18 -0
  613. numpy/matrixlib/tests/test_regression.py +31 -0
  614. numpy/polynomial/__init__.py +187 -0
  615. numpy/polynomial/__init__.pyi +31 -0
  616. numpy/polynomial/_polybase.py +1191 -0
  617. numpy/polynomial/_polybase.pyi +262 -0
  618. numpy/polynomial/_polytypes.pyi +501 -0
  619. numpy/polynomial/chebyshev.py +2001 -0
  620. numpy/polynomial/chebyshev.pyi +180 -0
  621. numpy/polynomial/hermite.py +1738 -0
  622. numpy/polynomial/hermite.pyi +106 -0
  623. numpy/polynomial/hermite_e.py +1640 -0
  624. numpy/polynomial/hermite_e.pyi +106 -0
  625. numpy/polynomial/laguerre.py +1673 -0
  626. numpy/polynomial/laguerre.pyi +100 -0
  627. numpy/polynomial/legendre.py +1603 -0
  628. numpy/polynomial/legendre.pyi +100 -0
  629. numpy/polynomial/polynomial.py +1625 -0
  630. numpy/polynomial/polynomial.pyi +109 -0
  631. numpy/polynomial/polyutils.py +759 -0
  632. numpy/polynomial/polyutils.pyi +307 -0
  633. numpy/polynomial/tests/__init__.py +0 -0
  634. numpy/polynomial/tests/test_chebyshev.py +618 -0
  635. numpy/polynomial/tests/test_classes.py +613 -0
  636. numpy/polynomial/tests/test_hermite.py +553 -0
  637. numpy/polynomial/tests/test_hermite_e.py +554 -0
  638. numpy/polynomial/tests/test_laguerre.py +535 -0
  639. numpy/polynomial/tests/test_legendre.py +566 -0
  640. numpy/polynomial/tests/test_polynomial.py +691 -0
  641. numpy/polynomial/tests/test_polyutils.py +123 -0
  642. numpy/polynomial/tests/test_printing.py +557 -0
  643. numpy/polynomial/tests/test_symbol.py +217 -0
  644. numpy/py.typed +0 -0
  645. numpy/random/LICENSE.md +71 -0
  646. numpy/random/__init__.pxd +14 -0
  647. numpy/random/__init__.py +213 -0
  648. numpy/random/__init__.pyi +124 -0
  649. numpy/random/_bounded_integers.cpython-313t-aarch64-linux-musl.so +0 -0
  650. numpy/random/_bounded_integers.pxd +29 -0
  651. numpy/random/_bounded_integers.pyi +1 -0
  652. numpy/random/_common.cpython-313t-aarch64-linux-musl.so +0 -0
  653. numpy/random/_common.pxd +107 -0
  654. numpy/random/_common.pyi +16 -0
  655. numpy/random/_examples/cffi/extending.py +44 -0
  656. numpy/random/_examples/cffi/parse.py +53 -0
  657. numpy/random/_examples/cython/extending.pyx +77 -0
  658. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  659. numpy/random/_examples/cython/meson.build +53 -0
  660. numpy/random/_examples/numba/extending.py +86 -0
  661. numpy/random/_examples/numba/extending_distributions.py +67 -0
  662. numpy/random/_generator.cpython-313t-aarch64-linux-musl.so +0 -0
  663. numpy/random/_generator.pyi +862 -0
  664. numpy/random/_mt19937.cpython-313t-aarch64-linux-musl.so +0 -0
  665. numpy/random/_mt19937.pyi +27 -0
  666. numpy/random/_pcg64.cpython-313t-aarch64-linux-musl.so +0 -0
  667. numpy/random/_pcg64.pyi +41 -0
  668. numpy/random/_philox.cpython-313t-aarch64-linux-musl.so +0 -0
  669. numpy/random/_philox.pyi +36 -0
  670. numpy/random/_pickle.py +88 -0
  671. numpy/random/_pickle.pyi +43 -0
  672. numpy/random/_sfc64.cpython-313t-aarch64-linux-musl.so +0 -0
  673. numpy/random/_sfc64.pyi +25 -0
  674. numpy/random/bit_generator.cpython-313t-aarch64-linux-musl.so +0 -0
  675. numpy/random/bit_generator.pxd +35 -0
  676. numpy/random/bit_generator.pyi +123 -0
  677. numpy/random/c_distributions.pxd +119 -0
  678. numpy/random/lib/libnpyrandom.a +0 -0
  679. numpy/random/mtrand.cpython-313t-aarch64-linux-musl.so +0 -0
  680. numpy/random/mtrand.pyi +759 -0
  681. numpy/random/tests/__init__.py +0 -0
  682. numpy/random/tests/data/__init__.py +0 -0
  683. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  684. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  685. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  686. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  687. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  688. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  689. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  690. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  691. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  692. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  693. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  694. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  695. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  696. numpy/random/tests/test_direct.py +595 -0
  697. numpy/random/tests/test_extending.py +131 -0
  698. numpy/random/tests/test_generator_mt19937.py +2825 -0
  699. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  700. numpy/random/tests/test_random.py +1724 -0
  701. numpy/random/tests/test_randomstate.py +2099 -0
  702. numpy/random/tests/test_randomstate_regression.py +213 -0
  703. numpy/random/tests/test_regression.py +175 -0
  704. numpy/random/tests/test_seed_sequence.py +79 -0
  705. numpy/random/tests/test_smoke.py +882 -0
  706. numpy/rec/__init__.py +2 -0
  707. numpy/rec/__init__.pyi +23 -0
  708. numpy/strings/__init__.py +2 -0
  709. numpy/strings/__init__.pyi +97 -0
  710. numpy/testing/__init__.py +22 -0
  711. numpy/testing/__init__.pyi +107 -0
  712. numpy/testing/_private/__init__.py +0 -0
  713. numpy/testing/_private/__init__.pyi +0 -0
  714. numpy/testing/_private/extbuild.py +250 -0
  715. numpy/testing/_private/extbuild.pyi +25 -0
  716. numpy/testing/_private/utils.py +2830 -0
  717. numpy/testing/_private/utils.pyi +505 -0
  718. numpy/testing/overrides.py +84 -0
  719. numpy/testing/overrides.pyi +10 -0
  720. numpy/testing/print_coercion_tables.py +207 -0
  721. numpy/testing/print_coercion_tables.pyi +26 -0
  722. numpy/testing/tests/__init__.py +0 -0
  723. numpy/testing/tests/test_utils.py +2123 -0
  724. numpy/tests/__init__.py +0 -0
  725. numpy/tests/test__all__.py +10 -0
  726. numpy/tests/test_configtool.py +51 -0
  727. numpy/tests/test_ctypeslib.py +383 -0
  728. numpy/tests/test_lazyloading.py +42 -0
  729. numpy/tests/test_matlib.py +59 -0
  730. numpy/tests/test_numpy_config.py +47 -0
  731. numpy/tests/test_numpy_version.py +54 -0
  732. numpy/tests/test_public_api.py +804 -0
  733. numpy/tests/test_reloading.py +76 -0
  734. numpy/tests/test_scripts.py +48 -0
  735. numpy/tests/test_warnings.py +79 -0
  736. numpy/typing/__init__.py +233 -0
  737. numpy/typing/__init__.pyi +3 -0
  738. numpy/typing/mypy_plugin.py +200 -0
  739. numpy/typing/tests/__init__.py +0 -0
  740. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  741. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  742. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  743. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  744. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  745. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  746. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  747. numpy/typing/tests/data/fail/char.pyi +63 -0
  748. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  749. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  750. numpy/typing/tests/data/fail/constants.pyi +3 -0
  751. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  752. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  753. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  754. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  755. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  756. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  757. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  758. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  759. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  760. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  761. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  762. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  763. numpy/typing/tests/data/fail/ma.pyi +155 -0
  764. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  765. numpy/typing/tests/data/fail/modules.pyi +17 -0
  766. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  767. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  768. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  769. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  770. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  771. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  772. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  773. numpy/typing/tests/data/fail/random.pyi +62 -0
  774. numpy/typing/tests/data/fail/rec.pyi +17 -0
  775. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  776. numpy/typing/tests/data/fail/shape.pyi +7 -0
  777. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  778. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  779. numpy/typing/tests/data/fail/strings.pyi +52 -0
  780. numpy/typing/tests/data/fail/testing.pyi +28 -0
  781. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  782. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  783. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  784. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  785. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  786. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  787. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  788. numpy/typing/tests/data/mypy.ini +8 -0
  789. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  790. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  791. numpy/typing/tests/data/pass/array_like.py +43 -0
  792. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  793. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  794. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  795. numpy/typing/tests/data/pass/comparisons.py +316 -0
  796. numpy/typing/tests/data/pass/dtype.py +57 -0
  797. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  798. numpy/typing/tests/data/pass/flatiter.py +26 -0
  799. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  800. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  801. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  802. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  803. numpy/typing/tests/data/pass/lib_version.py +18 -0
  804. numpy/typing/tests/data/pass/literal.py +52 -0
  805. numpy/typing/tests/data/pass/ma.py +199 -0
  806. numpy/typing/tests/data/pass/mod.py +149 -0
  807. numpy/typing/tests/data/pass/modules.py +45 -0
  808. numpy/typing/tests/data/pass/multiarray.py +77 -0
  809. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  810. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  811. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  812. numpy/typing/tests/data/pass/nditer.py +4 -0
  813. numpy/typing/tests/data/pass/numeric.py +90 -0
  814. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  815. numpy/typing/tests/data/pass/random.py +1498 -0
  816. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  817. numpy/typing/tests/data/pass/scalars.py +249 -0
  818. numpy/typing/tests/data/pass/shape.py +19 -0
  819. numpy/typing/tests/data/pass/simple.py +170 -0
  820. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  821. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  822. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  823. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  824. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  825. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  826. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  827. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  828. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  829. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  830. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  831. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  832. numpy/typing/tests/data/reveal/char.pyi +225 -0
  833. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  834. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  835. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  836. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  837. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  838. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  839. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  840. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  841. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  842. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  843. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  844. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  845. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  846. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  847. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  848. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  849. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  850. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  851. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  852. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  853. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  854. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  855. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  856. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  857. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  858. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  859. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  860. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  861. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  862. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  863. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  864. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  865. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  866. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  867. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  868. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  869. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  870. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  871. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  872. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  873. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  874. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  875. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  876. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  877. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  878. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  879. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  880. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  881. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  882. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  883. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  884. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  885. numpy/typing/tests/test_isfile.py +38 -0
  886. numpy/typing/tests/test_runtime.py +110 -0
  887. numpy/typing/tests/test_typing.py +205 -0
  888. numpy/version.py +11 -0
  889. numpy/version.pyi +9 -0
  890. numpy-2.4.0.dist-info/METADATA +139 -0
  891. numpy-2.4.0.dist-info/RECORD +915 -0
  892. numpy-2.4.0.dist-info/WHEEL +5 -0
  893. numpy-2.4.0.dist-info/entry_points.txt +13 -0
  894. numpy-2.4.0.dist-info/licenses/LICENSE.txt +935 -0
  895. numpy-2.4.0.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  896. numpy-2.4.0.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  897. numpy-2.4.0.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  898. numpy-2.4.0.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  899. numpy-2.4.0.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  900. numpy-2.4.0.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  901. numpy-2.4.0.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  902. numpy-2.4.0.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  903. numpy-2.4.0.dist-info/licenses/numpy/ma/LICENSE +24 -0
  904. numpy-2.4.0.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  905. numpy-2.4.0.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  906. numpy-2.4.0.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  907. numpy-2.4.0.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  908. numpy-2.4.0.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  909. numpy-2.4.0.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  910. numpy-2.4.0.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
  911. numpy.libs/libgcc_s-2d945d6c-767fb991.so.1 +0 -0
  912. numpy.libs/libgcc_s-2d945d6c.so.1 +0 -0
  913. numpy.libs/libgfortran-67378ab2-e7e7cfab.so.5.0.0 +0 -0
  914. numpy.libs/libscipy_openblas64_-1fc386ee.so +0 -0
  915. numpy.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
@@ -0,0 +1,926 @@
1
+ """
2
+ The arraypad module contains a group of functions to pad values onto the edges
3
+ of an n-dimensional array.
4
+
5
+ """
6
+ import typing
7
+
8
+ import numpy as np
9
+ from numpy._core.overrides import array_function_dispatch
10
+ from numpy.lib._index_tricks_impl import ndindex
11
+
12
+ __all__ = ['pad']
13
+
14
+
15
+ ###############################################################################
16
+ # Private utility functions.
17
+
18
+
19
+ def _round_if_needed(arr, dtype):
20
+ """
21
+ Rounds arr inplace if destination dtype is integer.
22
+
23
+ Parameters
24
+ ----------
25
+ arr : ndarray
26
+ Input array.
27
+ dtype : dtype
28
+ The dtype of the destination array.
29
+ """
30
+ if np.issubdtype(dtype, np.integer):
31
+ arr.round(out=arr)
32
+
33
+
34
+ def _slice_at_axis(sl, axis):
35
+ """
36
+ Construct tuple of slices to slice an array in the given dimension.
37
+
38
+ Parameters
39
+ ----------
40
+ sl : slice
41
+ The slice for the given dimension.
42
+ axis : int
43
+ The axis to which `sl` is applied. All other dimensions are left
44
+ "unsliced".
45
+
46
+ Returns
47
+ -------
48
+ sl : tuple of slices
49
+ A tuple with slices matching `shape` in length.
50
+
51
+ Examples
52
+ --------
53
+ >>> np._slice_at_axis(slice(None, 3, -1), 1)
54
+ (slice(None, None, None), slice(None, 3, -1), (...,))
55
+ """
56
+ return (slice(None),) * axis + (sl,) + (...,)
57
+
58
+
59
+ def _view_roi(array, original_area_slice, axis):
60
+ """
61
+ Get a view of the current region of interest during iterative padding.
62
+
63
+ When padding multiple dimensions iteratively corner values are
64
+ unnecessarily overwritten multiple times. This function reduces the
65
+ working area for the first dimensions so that corners are excluded.
66
+
67
+ Parameters
68
+ ----------
69
+ array : ndarray
70
+ The array with the region of interest.
71
+ original_area_slice : tuple of slices
72
+ Denotes the area with original values of the unpadded array.
73
+ axis : int
74
+ The currently padded dimension assuming that `axis` is padded before
75
+ `axis` + 1.
76
+
77
+ Returns
78
+ -------
79
+ roi : ndarray
80
+ The region of interest of the original `array`.
81
+ """
82
+ axis += 1
83
+ sl = (slice(None),) * axis + original_area_slice[axis:]
84
+ return array[sl]
85
+
86
+
87
+ def _pad_simple(array, pad_width, fill_value=None):
88
+ """
89
+ Pad array on all sides with either a single value or undefined values.
90
+
91
+ Parameters
92
+ ----------
93
+ array : ndarray
94
+ Array to grow.
95
+ pad_width : sequence of tuple[int, int]
96
+ Pad width on both sides for each dimension in `arr`.
97
+ fill_value : scalar, optional
98
+ If provided the padded area is filled with this value, otherwise
99
+ the pad area left undefined.
100
+
101
+ Returns
102
+ -------
103
+ padded : ndarray
104
+ The padded array with the same dtype as`array`. Its order will default
105
+ to C-style if `array` is not F-contiguous.
106
+ original_area_slice : tuple
107
+ A tuple of slices pointing to the area of the original array.
108
+ """
109
+ # Allocate grown array
110
+ new_shape = tuple(
111
+ left + size + right
112
+ for size, (left, right) in zip(array.shape, pad_width)
113
+ )
114
+ order = 'F' if array.flags.fnc else 'C' # Fortran and not also C-order
115
+ padded = np.empty(new_shape, dtype=array.dtype, order=order)
116
+
117
+ if fill_value is not None:
118
+ padded.fill(fill_value)
119
+
120
+ # Copy old array into correct space
121
+ original_area_slice = tuple(
122
+ slice(left, left + size)
123
+ for size, (left, right) in zip(array.shape, pad_width)
124
+ )
125
+ padded[original_area_slice] = array
126
+
127
+ return padded, original_area_slice
128
+
129
+
130
+ def _set_pad_area(padded, axis, width_pair, value_pair):
131
+ """
132
+ Set empty-padded area in given dimension.
133
+
134
+ Parameters
135
+ ----------
136
+ padded : ndarray
137
+ Array with the pad area which is modified inplace.
138
+ axis : int
139
+ Dimension with the pad area to set.
140
+ width_pair : (int, int)
141
+ Pair of widths that mark the pad area on both sides in the given
142
+ dimension.
143
+ value_pair : tuple of scalars or ndarrays
144
+ Values inserted into the pad area on each side. It must match or be
145
+ broadcastable to the shape of `arr`.
146
+ """
147
+ left_slice = _slice_at_axis(slice(None, width_pair[0]), axis)
148
+ padded[left_slice] = value_pair[0]
149
+
150
+ right_slice = _slice_at_axis(
151
+ slice(padded.shape[axis] - width_pair[1], None), axis)
152
+ padded[right_slice] = value_pair[1]
153
+
154
+
155
+ def _get_edges(padded, axis, width_pair):
156
+ """
157
+ Retrieve edge values from empty-padded array in given dimension.
158
+
159
+ Parameters
160
+ ----------
161
+ padded : ndarray
162
+ Empty-padded array.
163
+ axis : int
164
+ Dimension in which the edges are considered.
165
+ width_pair : (int, int)
166
+ Pair of widths that mark the pad area on both sides in the given
167
+ dimension.
168
+
169
+ Returns
170
+ -------
171
+ left_edge, right_edge : ndarray
172
+ Edge values of the valid area in `padded` in the given dimension. Its
173
+ shape will always match `padded` except for the dimension given by
174
+ `axis` which will have a length of 1.
175
+ """
176
+ left_index = width_pair[0]
177
+ left_slice = _slice_at_axis(slice(left_index, left_index + 1), axis)
178
+ left_edge = padded[left_slice]
179
+
180
+ right_index = padded.shape[axis] - width_pair[1]
181
+ right_slice = _slice_at_axis(slice(right_index - 1, right_index), axis)
182
+ right_edge = padded[right_slice]
183
+
184
+ return left_edge, right_edge
185
+
186
+
187
+ def _get_linear_ramps(padded, axis, width_pair, end_value_pair):
188
+ """
189
+ Construct linear ramps for empty-padded array in given dimension.
190
+
191
+ Parameters
192
+ ----------
193
+ padded : ndarray
194
+ Empty-padded array.
195
+ axis : int
196
+ Dimension in which the ramps are constructed.
197
+ width_pair : (int, int)
198
+ Pair of widths that mark the pad area on both sides in the given
199
+ dimension.
200
+ end_value_pair : (scalar, scalar)
201
+ End values for the linear ramps which form the edge of the fully padded
202
+ array. These values are included in the linear ramps.
203
+
204
+ Returns
205
+ -------
206
+ left_ramp, right_ramp : ndarray
207
+ Linear ramps to set on both sides of `padded`.
208
+ """
209
+ edge_pair = _get_edges(padded, axis, width_pair)
210
+
211
+ left_ramp, right_ramp = (
212
+ np.linspace(
213
+ start=end_value,
214
+ stop=edge.squeeze(axis), # Dimension is replaced by linspace
215
+ num=width,
216
+ endpoint=False,
217
+ dtype=padded.dtype,
218
+ axis=axis
219
+ )
220
+ for end_value, edge, width in zip(
221
+ end_value_pair, edge_pair, width_pair
222
+ )
223
+ )
224
+
225
+ # Reverse linear space in appropriate dimension
226
+ right_ramp = right_ramp[_slice_at_axis(slice(None, None, -1), axis)]
227
+
228
+ return left_ramp, right_ramp
229
+
230
+
231
+ def _get_stats(padded, axis, width_pair, length_pair, stat_func):
232
+ """
233
+ Calculate statistic for the empty-padded array in given dimension.
234
+
235
+ Parameters
236
+ ----------
237
+ padded : ndarray
238
+ Empty-padded array.
239
+ axis : int
240
+ Dimension in which the statistic is calculated.
241
+ width_pair : (int, int)
242
+ Pair of widths that mark the pad area on both sides in the given
243
+ dimension.
244
+ length_pair : 2-element sequence of None or int
245
+ Gives the number of values in valid area from each side that is
246
+ taken into account when calculating the statistic. If None the entire
247
+ valid area in `padded` is considered.
248
+ stat_func : function
249
+ Function to compute statistic. The expected signature is
250
+ ``stat_func(x: ndarray, axis: int, keepdims: bool) -> ndarray``.
251
+
252
+ Returns
253
+ -------
254
+ left_stat, right_stat : ndarray
255
+ Calculated statistic for both sides of `padded`.
256
+ """
257
+ # Calculate indices of the edges of the area with original values
258
+ left_index = width_pair[0]
259
+ right_index = padded.shape[axis] - width_pair[1]
260
+ # as well as its length
261
+ max_length = right_index - left_index
262
+
263
+ # Limit stat_lengths to max_length
264
+ left_length, right_length = length_pair
265
+ if left_length is None or max_length < left_length:
266
+ left_length = max_length
267
+ if right_length is None or max_length < right_length:
268
+ right_length = max_length
269
+
270
+ if (left_length == 0 or right_length == 0) \
271
+ and stat_func in {np.amax, np.amin}:
272
+ # amax and amin can't operate on an empty array,
273
+ # raise a more descriptive warning here instead of the default one
274
+ raise ValueError("stat_length of 0 yields no value for padding")
275
+
276
+ # Calculate statistic for the left side
277
+ left_slice = _slice_at_axis(
278
+ slice(left_index, left_index + left_length), axis)
279
+ left_chunk = padded[left_slice]
280
+ left_stat = stat_func(left_chunk, axis=axis, keepdims=True)
281
+ _round_if_needed(left_stat, padded.dtype)
282
+
283
+ if left_length == right_length == max_length:
284
+ # return early as right_stat must be identical to left_stat
285
+ return left_stat, left_stat
286
+
287
+ # Calculate statistic for the right side
288
+ right_slice = _slice_at_axis(
289
+ slice(right_index - right_length, right_index), axis)
290
+ right_chunk = padded[right_slice]
291
+ right_stat = stat_func(right_chunk, axis=axis, keepdims=True)
292
+ _round_if_needed(right_stat, padded.dtype)
293
+
294
+ return left_stat, right_stat
295
+
296
+
297
+ def _set_reflect_both(padded, axis, width_pair, method,
298
+ original_period, include_edge=False):
299
+ """
300
+ Pad `axis` of `arr` with reflection.
301
+
302
+ Parameters
303
+ ----------
304
+ padded : ndarray
305
+ Input array of arbitrary shape.
306
+ axis : int
307
+ Axis along which to pad `arr`.
308
+ width_pair : (int, int)
309
+ Pair of widths that mark the pad area on both sides in the given
310
+ dimension.
311
+ method : str
312
+ Controls method of reflection; options are 'even' or 'odd'.
313
+ original_period : int
314
+ Original length of data on `axis` of `arr`.
315
+ include_edge : bool
316
+ If true, edge value is included in reflection, otherwise the edge
317
+ value forms the symmetric axis to the reflection.
318
+
319
+ Returns
320
+ -------
321
+ pad_amt : tuple of ints, length 2
322
+ New index positions of padding to do along the `axis`. If these are
323
+ both 0, padding is done in this dimension.
324
+ """
325
+ left_pad, right_pad = width_pair
326
+ old_length = padded.shape[axis] - right_pad - left_pad
327
+
328
+ if include_edge:
329
+ # Avoid wrapping with only a subset of the original area
330
+ # by ensuring period can only be a multiple of the original
331
+ # area's length.
332
+ old_length = old_length // original_period * original_period
333
+ # Edge is included, we need to offset the pad amount by 1
334
+ edge_offset = 1
335
+ else:
336
+ # Avoid wrapping with only a subset of the original area
337
+ # by ensuring period can only be a multiple of the original
338
+ # area's length.
339
+ old_length = ((old_length - 1) // (original_period - 1)
340
+ * (original_period - 1) + 1)
341
+ edge_offset = 0 # Edge is not included, no need to offset pad amount
342
+ old_length -= 1 # but must be omitted from the chunk
343
+
344
+ if left_pad > 0:
345
+ # Pad with reflected values on left side:
346
+ # First limit chunk size which can't be larger than pad area
347
+ chunk_length = min(old_length, left_pad)
348
+ # Slice right to left, stop on or next to edge, start relative to stop
349
+ stop = left_pad - edge_offset
350
+ start = stop + chunk_length
351
+ left_slice = _slice_at_axis(slice(start, stop, -1), axis)
352
+ left_chunk = padded[left_slice]
353
+
354
+ if method == "odd":
355
+ # Negate chunk and align with edge
356
+ edge_slice = _slice_at_axis(slice(left_pad, left_pad + 1), axis)
357
+ left_chunk = 2 * padded[edge_slice] - left_chunk
358
+
359
+ # Insert chunk into padded area
360
+ start = left_pad - chunk_length
361
+ stop = left_pad
362
+ pad_area = _slice_at_axis(slice(start, stop), axis)
363
+ padded[pad_area] = left_chunk
364
+ # Adjust pointer to left edge for next iteration
365
+ left_pad -= chunk_length
366
+
367
+ if right_pad > 0:
368
+ # Pad with reflected values on right side:
369
+ # First limit chunk size which can't be larger than pad area
370
+ chunk_length = min(old_length, right_pad)
371
+ # Slice right to left, start on or next to edge, stop relative to start
372
+ start = -right_pad + edge_offset - 2
373
+ stop = start - chunk_length
374
+ right_slice = _slice_at_axis(slice(start, stop, -1), axis)
375
+ right_chunk = padded[right_slice]
376
+
377
+ if method == "odd":
378
+ # Negate chunk and align with edge
379
+ edge_slice = _slice_at_axis(
380
+ slice(-right_pad - 1, -right_pad), axis)
381
+ right_chunk = 2 * padded[edge_slice] - right_chunk
382
+
383
+ # Insert chunk into padded area
384
+ start = padded.shape[axis] - right_pad
385
+ stop = start + chunk_length
386
+ pad_area = _slice_at_axis(slice(start, stop), axis)
387
+ padded[pad_area] = right_chunk
388
+ # Adjust pointer to right edge for next iteration
389
+ right_pad -= chunk_length
390
+
391
+ return left_pad, right_pad
392
+
393
+
394
+ def _set_wrap_both(padded, axis, width_pair, original_period):
395
+ """
396
+ Pad `axis` of `arr` with wrapped values.
397
+
398
+ Parameters
399
+ ----------
400
+ padded : ndarray
401
+ Input array of arbitrary shape.
402
+ axis : int
403
+ Axis along which to pad `arr`.
404
+ width_pair : (int, int)
405
+ Pair of widths that mark the pad area on both sides in the given
406
+ dimension.
407
+ original_period : int
408
+ Original length of data on `axis` of `arr`.
409
+
410
+ Returns
411
+ -------
412
+ pad_amt : tuple of ints, length 2
413
+ New index positions of padding to do along the `axis`. If these are
414
+ both 0, padding is done in this dimension.
415
+ """
416
+ left_pad, right_pad = width_pair
417
+ period = padded.shape[axis] - right_pad - left_pad
418
+ # Avoid wrapping with only a subset of the original area by ensuring period
419
+ # can only be a multiple of the original area's length.
420
+ period = period // original_period * original_period
421
+
422
+ # If the current dimension of `arr` doesn't contain enough valid values
423
+ # (not part of the undefined pad area) we need to pad multiple times.
424
+ # Each time the pad area shrinks on both sides which is communicated with
425
+ # these variables.
426
+ new_left_pad = 0
427
+ new_right_pad = 0
428
+
429
+ if left_pad > 0:
430
+ # Pad with wrapped values on left side
431
+ # First slice chunk from left side of the non-pad area.
432
+ # Use min(period, left_pad) to ensure that chunk is not larger than
433
+ # pad area.
434
+ slice_end = left_pad + period
435
+ slice_start = slice_end - min(period, left_pad)
436
+ right_slice = _slice_at_axis(slice(slice_start, slice_end), axis)
437
+ right_chunk = padded[right_slice]
438
+
439
+ if left_pad > period:
440
+ # Chunk is smaller than pad area
441
+ pad_area = _slice_at_axis(slice(left_pad - period, left_pad), axis)
442
+ new_left_pad = left_pad - period
443
+ else:
444
+ # Chunk matches pad area
445
+ pad_area = _slice_at_axis(slice(None, left_pad), axis)
446
+ padded[pad_area] = right_chunk
447
+
448
+ if right_pad > 0:
449
+ # Pad with wrapped values on right side
450
+ # First slice chunk from right side of the non-pad area.
451
+ # Use min(period, right_pad) to ensure that chunk is not larger than
452
+ # pad area.
453
+ slice_start = -right_pad - period
454
+ slice_end = slice_start + min(period, right_pad)
455
+ left_slice = _slice_at_axis(slice(slice_start, slice_end), axis)
456
+ left_chunk = padded[left_slice]
457
+
458
+ if right_pad > period:
459
+ # Chunk is smaller than pad area
460
+ pad_area = _slice_at_axis(
461
+ slice(-right_pad, -right_pad + period), axis)
462
+ new_right_pad = right_pad - period
463
+ else:
464
+ # Chunk matches pad area
465
+ pad_area = _slice_at_axis(slice(-right_pad, None), axis)
466
+ padded[pad_area] = left_chunk
467
+
468
+ return new_left_pad, new_right_pad
469
+
470
+
471
+ def _as_pairs(x, ndim, as_index=False):
472
+ """
473
+ Broadcast `x` to an array with the shape (`ndim`, 2).
474
+
475
+ A helper function for `pad` that prepares and validates arguments like
476
+ `pad_width` for iteration in pairs.
477
+
478
+ Parameters
479
+ ----------
480
+ x : {None, scalar, array-like}
481
+ The object to broadcast to the shape (`ndim`, 2).
482
+ ndim : int
483
+ Number of pairs the broadcasted `x` will have.
484
+ as_index : bool, optional
485
+ If `x` is not None, try to round each element of `x` to an integer
486
+ (dtype `np.intp`) and ensure every element is positive.
487
+
488
+ Returns
489
+ -------
490
+ pairs : nested iterables, shape (`ndim`, 2)
491
+ The broadcasted version of `x`.
492
+
493
+ Raises
494
+ ------
495
+ ValueError
496
+ If `as_index` is True and `x` contains negative elements.
497
+ Or if `x` is not broadcastable to the shape (`ndim`, 2).
498
+ """
499
+ if x is None:
500
+ # Pass through None as a special case, otherwise np.round(x) fails
501
+ # with an AttributeError
502
+ return ((None, None),) * ndim
503
+
504
+ x = np.array(x)
505
+ if as_index:
506
+ x = np.round(x).astype(np.intp, copy=False)
507
+
508
+ if x.ndim < 3:
509
+ # Optimization: Possibly use faster paths for cases where `x` has
510
+ # only 1 or 2 elements. `np.broadcast_to` could handle these as well
511
+ # but is currently slower
512
+
513
+ if x.size == 1:
514
+ # x was supplied as a single value
515
+ x = x.ravel() # Ensure x[0] works for x.ndim == 0, 1, 2
516
+ if as_index and x < 0:
517
+ raise ValueError("index can't contain negative values")
518
+ return ((x[0], x[0]),) * ndim
519
+
520
+ if x.size == 2 and x.shape != (2, 1):
521
+ # x was supplied with a single value for each side
522
+ # but except case when each dimension has a single value
523
+ # which should be broadcasted to a pair,
524
+ # e.g. [[1], [2]] -> [[1, 1], [2, 2]] not [[1, 2], [1, 2]]
525
+ x = x.ravel() # Ensure x[0], x[1] works
526
+ if as_index and (x[0] < 0 or x[1] < 0):
527
+ raise ValueError("index can't contain negative values")
528
+ return ((x[0], x[1]),) * ndim
529
+
530
+ if as_index and x.min() < 0:
531
+ raise ValueError("index can't contain negative values")
532
+
533
+ # Converting the array with `tolist` seems to improve performance
534
+ # when iterating and indexing the result (see usage in `pad`)
535
+ return np.broadcast_to(x, (ndim, 2)).tolist()
536
+
537
+
538
+ def _pad_dispatcher(array, pad_width, mode=None, **kwargs):
539
+ return (array,)
540
+
541
+
542
+ ###############################################################################
543
+ # Public functions
544
+
545
+
546
+ @array_function_dispatch(_pad_dispatcher, module='numpy')
547
+ def pad(array, pad_width, mode='constant', **kwargs):
548
+ """
549
+ Pad an array.
550
+
551
+ Parameters
552
+ ----------
553
+ array : array_like of rank N
554
+ The array to pad.
555
+ pad_width : {sequence, array_like, int, dict}
556
+ Number of values padded to the edges of each axis.
557
+ ``((before_1, after_1), ... (before_N, after_N))`` unique pad widths
558
+ for each axis.
559
+ ``(before, after)`` or ``((before, after),)`` yields same before
560
+ and after pad for each axis.
561
+ ``(pad,)`` or ``int`` is a shortcut for before = after = pad width
562
+ for all axes.
563
+ If a ``dict``, each key is an axis and its corresponding value is an ``int`` or
564
+ ``int`` pair describing the padding ``(before, after)`` or ``pad`` width for
565
+ that axis.
566
+ mode : str or function, optional
567
+ One of the following string values or a user supplied function.
568
+
569
+ 'constant' (default)
570
+ Pads with a constant value.
571
+ 'edge'
572
+ Pads with the edge values of array.
573
+ 'linear_ramp'
574
+ Pads with the linear ramp between end_value and the
575
+ array edge value.
576
+ 'maximum'
577
+ Pads with the maximum value of all or part of the
578
+ vector along each axis.
579
+ 'mean'
580
+ Pads with the mean value of all or part of the
581
+ vector along each axis.
582
+ 'median'
583
+ Pads with the median value of all or part of the
584
+ vector along each axis.
585
+ 'minimum'
586
+ Pads with the minimum value of all or part of the
587
+ vector along each axis.
588
+ 'reflect'
589
+ Pads with the reflection of the vector mirrored on
590
+ the first and last values of the vector along each
591
+ axis.
592
+ 'symmetric'
593
+ Pads with the reflection of the vector mirrored
594
+ along the edge of the array.
595
+ 'wrap'
596
+ Pads with the wrap of the vector along the axis.
597
+ The first values are used to pad the end and the
598
+ end values are used to pad the beginning.
599
+ 'empty'
600
+ Pads with undefined values.
601
+
602
+ <function>
603
+ Padding function, see Notes.
604
+ stat_length : sequence or int, optional
605
+ Used in 'maximum', 'mean', 'median', and 'minimum'. Number of
606
+ values at edge of each axis used to calculate the statistic value.
607
+
608
+ ``((before_1, after_1), ... (before_N, after_N))`` unique statistic
609
+ lengths for each axis.
610
+
611
+ ``(before, after)`` or ``((before, after),)`` yields same before
612
+ and after statistic lengths for each axis.
613
+
614
+ ``(stat_length,)`` or ``int`` is a shortcut for
615
+ ``before = after = statistic`` length for all axes.
616
+
617
+ Default is ``None``, to use the entire axis.
618
+ constant_values : sequence or scalar, optional
619
+ Used in 'constant'. The values to set the padded values for each
620
+ axis.
621
+
622
+ ``((before_1, after_1), ... (before_N, after_N))`` unique pad constants
623
+ for each axis.
624
+
625
+ ``(before, after)`` or ``((before, after),)`` yields same before
626
+ and after constants for each axis.
627
+
628
+ ``(constant,)`` or ``constant`` is a shortcut for
629
+ ``before = after = constant`` for all axes.
630
+
631
+ Default is 0.
632
+ end_values : sequence or scalar, optional
633
+ Used in 'linear_ramp'. The values used for the ending value of the
634
+ linear_ramp and that will form the edge of the padded array.
635
+
636
+ ``((before_1, after_1), ... (before_N, after_N))`` unique end values
637
+ for each axis.
638
+
639
+ ``(before, after)`` or ``((before, after),)`` yields same before
640
+ and after end values for each axis.
641
+
642
+ ``(constant,)`` or ``constant`` is a shortcut for
643
+ ``before = after = constant`` for all axes.
644
+
645
+ Default is 0.
646
+ reflect_type : {'even', 'odd'}, optional
647
+ Used in 'reflect', and 'symmetric'. The 'even' style is the
648
+ default with an unaltered reflection around the edge value. For
649
+ the 'odd' style, the extended part of the array is created by
650
+ subtracting the reflected values from two times the edge value.
651
+
652
+ Returns
653
+ -------
654
+ pad : ndarray
655
+ Padded array of rank equal to `array` with shape increased
656
+ according to `pad_width`.
657
+
658
+ Notes
659
+ -----
660
+ For an array with rank greater than 1, some of the padding of later
661
+ axes is calculated from padding of previous axes. This is easiest to
662
+ think about with a rank 2 array where the corners of the padded array
663
+ are calculated by using padded values from the first axis.
664
+
665
+ The padding function, if used, should modify a rank 1 array in-place. It
666
+ has the following signature::
667
+
668
+ padding_func(vector, iaxis_pad_width, iaxis, kwargs)
669
+
670
+ where
671
+
672
+ vector : ndarray
673
+ A rank 1 array already padded with zeros. Padded values are
674
+ vector[:iaxis_pad_width[0]] and vector[-iaxis_pad_width[1]:].
675
+ iaxis_pad_width : tuple
676
+ A 2-tuple of ints, iaxis_pad_width[0] represents the number of
677
+ values padded at the beginning of vector where
678
+ iaxis_pad_width[1] represents the number of values padded at
679
+ the end of vector.
680
+ iaxis : int
681
+ The axis currently being calculated.
682
+ kwargs : dict
683
+ Any keyword arguments the function requires.
684
+
685
+ Examples
686
+ --------
687
+ >>> import numpy as np
688
+ >>> a = [1, 2, 3, 4, 5]
689
+ >>> np.pad(a, (2, 3), 'constant', constant_values=(4, 6))
690
+ array([4, 4, 1, ..., 6, 6, 6])
691
+
692
+ >>> np.pad(a, (2, 3), 'edge')
693
+ array([1, 1, 1, ..., 5, 5, 5])
694
+
695
+ >>> np.pad(a, (2, 3), 'linear_ramp', end_values=(5, -4))
696
+ array([ 5, 3, 1, 2, 3, 4, 5, 2, -1, -4])
697
+
698
+ >>> np.pad(a, (2,), 'maximum')
699
+ array([5, 5, 1, 2, 3, 4, 5, 5, 5])
700
+
701
+ >>> np.pad(a, (2,), 'mean')
702
+ array([3, 3, 1, 2, 3, 4, 5, 3, 3])
703
+
704
+ >>> np.pad(a, (2,), 'median')
705
+ array([3, 3, 1, 2, 3, 4, 5, 3, 3])
706
+
707
+ >>> a = [[1, 2], [3, 4]]
708
+ >>> np.pad(a, ((3, 2), (2, 3)), 'minimum')
709
+ array([[1, 1, 1, 2, 1, 1, 1],
710
+ [1, 1, 1, 2, 1, 1, 1],
711
+ [1, 1, 1, 2, 1, 1, 1],
712
+ [1, 1, 1, 2, 1, 1, 1],
713
+ [3, 3, 3, 4, 3, 3, 3],
714
+ [1, 1, 1, 2, 1, 1, 1],
715
+ [1, 1, 1, 2, 1, 1, 1]])
716
+
717
+ >>> a = [1, 2, 3, 4, 5]
718
+ >>> np.pad(a, (2, 3), 'reflect')
719
+ array([3, 2, 1, 2, 3, 4, 5, 4, 3, 2])
720
+
721
+ >>> np.pad(a, (2, 3), 'reflect', reflect_type='odd')
722
+ array([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8])
723
+
724
+ >>> np.pad(a, (2, 3), 'symmetric')
725
+ array([2, 1, 1, 2, 3, 4, 5, 5, 4, 3])
726
+
727
+ >>> np.pad(a, (2, 3), 'symmetric', reflect_type='odd')
728
+ array([0, 1, 1, 2, 3, 4, 5, 5, 6, 7])
729
+
730
+ >>> np.pad(a, (2, 3), 'wrap')
731
+ array([4, 5, 1, 2, 3, 4, 5, 1, 2, 3])
732
+
733
+ >>> def pad_with(vector, pad_width, iaxis, kwargs):
734
+ ... pad_value = kwargs.get('padder', 10)
735
+ ... vector[:pad_width[0]] = pad_value
736
+ ... vector[-pad_width[1]:] = pad_value
737
+ >>> a = np.arange(6)
738
+ >>> a = a.reshape((2, 3))
739
+ >>> np.pad(a, 2, pad_with)
740
+ array([[10, 10, 10, 10, 10, 10, 10],
741
+ [10, 10, 10, 10, 10, 10, 10],
742
+ [10, 10, 0, 1, 2, 10, 10],
743
+ [10, 10, 3, 4, 5, 10, 10],
744
+ [10, 10, 10, 10, 10, 10, 10],
745
+ [10, 10, 10, 10, 10, 10, 10]])
746
+ >>> np.pad(a, 2, pad_with, padder=100)
747
+ array([[100, 100, 100, 100, 100, 100, 100],
748
+ [100, 100, 100, 100, 100, 100, 100],
749
+ [100, 100, 0, 1, 2, 100, 100],
750
+ [100, 100, 3, 4, 5, 100, 100],
751
+ [100, 100, 100, 100, 100, 100, 100],
752
+ [100, 100, 100, 100, 100, 100, 100]])
753
+
754
+ >>> a = np.arange(1, 7).reshape(2, 3)
755
+ >>> np.pad(a, {1: (1, 2)})
756
+ array([[0, 1, 2, 3, 0, 0],
757
+ [0, 4, 5, 6, 0, 0]])
758
+ >>> np.pad(a, {-1: 2})
759
+ array([[0, 0, 1, 2, 3, 0, 0],
760
+ [0, 0, 4, 5, 6, 0, 0]])
761
+ >>> np.pad(a, {0: (3, 0)})
762
+ array([[0, 0, 0],
763
+ [0, 0, 0],
764
+ [0, 0, 0],
765
+ [1, 2, 3],
766
+ [4, 5, 6]])
767
+ >>> np.pad(a, {0: (3, 0), 1: 2})
768
+ array([[0, 0, 0, 0, 0, 0, 0],
769
+ [0, 0, 0, 0, 0, 0, 0],
770
+ [0, 0, 0, 0, 0, 0, 0],
771
+ [0, 0, 1, 2, 3, 0, 0],
772
+ [0, 0, 4, 5, 6, 0, 0]])
773
+ """
774
+ array = np.asarray(array)
775
+ if isinstance(pad_width, dict):
776
+ seq = [(0, 0)] * array.ndim
777
+ for axis, width in pad_width.items():
778
+ match width:
779
+ case int(both):
780
+ seq[axis] = both, both
781
+ case tuple((int(before), int(after))):
782
+ seq[axis] = before, after
783
+ case _ as invalid:
784
+ typing.assert_never(invalid)
785
+ pad_width = seq
786
+ pad_width = np.asarray(pad_width)
787
+
788
+ if not pad_width.dtype.kind == 'i':
789
+ raise TypeError('`pad_width` must be of integral type.')
790
+
791
+ # Broadcast to shape (array.ndim, 2)
792
+ pad_width = _as_pairs(pad_width, array.ndim, as_index=True)
793
+
794
+ if callable(mode):
795
+ # Old behavior: Use user-supplied function with np.apply_along_axis
796
+ function = mode
797
+ # Create a new zero padded array
798
+ padded, _ = _pad_simple(array, pad_width, fill_value=0)
799
+ # And apply along each axis
800
+
801
+ for axis in range(padded.ndim):
802
+ # Iterate using ndindex as in apply_along_axis, but assuming that
803
+ # function operates inplace on the padded array.
804
+
805
+ # view with the iteration axis at the end
806
+ view = np.moveaxis(padded, axis, -1)
807
+
808
+ # compute indices for the iteration axes, and append a trailing
809
+ # ellipsis to prevent 0d arrays decaying to scalars (gh-8642)
810
+ inds = ndindex(view.shape[:-1])
811
+ inds = (ind + (Ellipsis,) for ind in inds)
812
+ for ind in inds:
813
+ function(view[ind], pad_width[axis], axis, kwargs)
814
+
815
+ return padded
816
+
817
+ # Make sure that no unsupported keywords were passed for the current mode
818
+ allowed_kwargs = {
819
+ 'empty': [], 'edge': [], 'wrap': [],
820
+ 'constant': ['constant_values'],
821
+ 'linear_ramp': ['end_values'],
822
+ 'maximum': ['stat_length'],
823
+ 'mean': ['stat_length'],
824
+ 'median': ['stat_length'],
825
+ 'minimum': ['stat_length'],
826
+ 'reflect': ['reflect_type'],
827
+ 'symmetric': ['reflect_type'],
828
+ }
829
+ try:
830
+ unsupported_kwargs = set(kwargs) - set(allowed_kwargs[mode])
831
+ except KeyError:
832
+ raise ValueError(f"mode '{mode}' is not supported") from None
833
+ if unsupported_kwargs:
834
+ raise ValueError("unsupported keyword arguments for mode "
835
+ f"'{mode}': {unsupported_kwargs}")
836
+
837
+ stat_functions = {"maximum": np.amax, "minimum": np.amin,
838
+ "mean": np.mean, "median": np.median}
839
+
840
+ # Create array with final shape and original values
841
+ # (padded area is undefined)
842
+ padded, original_area_slice = _pad_simple(array, pad_width)
843
+ # And prepare iteration over all dimensions
844
+ # (zipping may be more readable than using enumerate)
845
+ axes = range(padded.ndim)
846
+
847
+ if mode == "constant":
848
+ values = kwargs.get("constant_values", 0)
849
+ values = _as_pairs(values, padded.ndim)
850
+ for axis, width_pair, value_pair in zip(axes, pad_width, values):
851
+ roi = _view_roi(padded, original_area_slice, axis)
852
+ _set_pad_area(roi, axis, width_pair, value_pair)
853
+
854
+ elif mode == "empty":
855
+ pass # Do nothing as _pad_simple already returned the correct result
856
+
857
+ elif array.size == 0:
858
+ # Only modes "constant" and "empty" can extend empty axes, all other
859
+ # modes depend on `array` not being empty
860
+ # -> ensure every empty axis is only "padded with 0"
861
+ for axis, width_pair in zip(axes, pad_width):
862
+ if array.shape[axis] == 0 and any(width_pair):
863
+ raise ValueError(
864
+ f"can't extend empty axis {axis} using modes other than "
865
+ "'constant' or 'empty'"
866
+ )
867
+ # passed, don't need to do anything more as _pad_simple already
868
+ # returned the correct result
869
+
870
+ elif mode == "edge":
871
+ for axis, width_pair in zip(axes, pad_width):
872
+ roi = _view_roi(padded, original_area_slice, axis)
873
+ edge_pair = _get_edges(roi, axis, width_pair)
874
+ _set_pad_area(roi, axis, width_pair, edge_pair)
875
+
876
+ elif mode == "linear_ramp":
877
+ end_values = kwargs.get("end_values", 0)
878
+ end_values = _as_pairs(end_values, padded.ndim)
879
+ for axis, width_pair, value_pair in zip(axes, pad_width, end_values):
880
+ roi = _view_roi(padded, original_area_slice, axis)
881
+ ramp_pair = _get_linear_ramps(roi, axis, width_pair, value_pair)
882
+ _set_pad_area(roi, axis, width_pair, ramp_pair)
883
+
884
+ elif mode in stat_functions:
885
+ func = stat_functions[mode]
886
+ length = kwargs.get("stat_length")
887
+ length = _as_pairs(length, padded.ndim, as_index=True)
888
+ for axis, width_pair, length_pair in zip(axes, pad_width, length):
889
+ roi = _view_roi(padded, original_area_slice, axis)
890
+ stat_pair = _get_stats(roi, axis, width_pair, length_pair, func)
891
+ _set_pad_area(roi, axis, width_pair, stat_pair)
892
+
893
+ elif mode in {"reflect", "symmetric"}:
894
+ method = kwargs.get("reflect_type", "even")
895
+ include_edge = mode == "symmetric"
896
+ for axis, (left_index, right_index) in zip(axes, pad_width):
897
+ if array.shape[axis] == 1 and (left_index > 0 or right_index > 0):
898
+ # Extending singleton dimension for 'reflect' is legacy
899
+ # behavior; it really should raise an error.
900
+ edge_pair = _get_edges(padded, axis, (left_index, right_index))
901
+ _set_pad_area(
902
+ padded, axis, (left_index, right_index), edge_pair)
903
+ continue
904
+
905
+ roi = _view_roi(padded, original_area_slice, axis)
906
+ while left_index > 0 or right_index > 0:
907
+ # Iteratively pad until dimension is filled with reflected
908
+ # values. This is necessary if the pad area is larger than
909
+ # the length of the original values in the current dimension.
910
+ left_index, right_index = _set_reflect_both(
911
+ roi, axis, (left_index, right_index),
912
+ method, array.shape[axis], include_edge
913
+ )
914
+
915
+ elif mode == "wrap":
916
+ for axis, (left_index, right_index) in zip(axes, pad_width):
917
+ roi = _view_roi(padded, original_area_slice, axis)
918
+ original_period = padded.shape[axis] - right_index - left_index
919
+ while left_index > 0 or right_index > 0:
920
+ # Iteratively pad until dimension is filled with wrapped
921
+ # values. This is necessary if the pad area is larger than
922
+ # the length of the original values in the current dimension.
923
+ left_index, right_index = _set_wrap_both(
924
+ roi, axis, (left_index, right_index), original_period)
925
+
926
+ return padded