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
@@ -0,0 +1,1523 @@
1
+ import operator
2
+ import sys
3
+
4
+ import pytest
5
+
6
+ import numpy as np
7
+ from numpy._core._exceptions import _UFuncNoLoopError
8
+ from numpy.testing import IS_PYPY, assert_array_equal, assert_raises
9
+ from numpy.testing._private.utils import requires_memory
10
+
11
+ COMPARISONS = [
12
+ (operator.eq, np.equal, "=="),
13
+ (operator.ne, np.not_equal, "!="),
14
+ (operator.lt, np.less, "<"),
15
+ (operator.le, np.less_equal, "<="),
16
+ (operator.gt, np.greater, ">"),
17
+ (operator.ge, np.greater_equal, ">="),
18
+ ]
19
+
20
+ MAX = np.iinfo(np.int64).max
21
+
22
+ IS_PYPY_LT_7_3_16 = IS_PYPY and sys.implementation.version < (7, 3, 16)
23
+
24
+ @pytest.mark.parametrize(["op", "ufunc", "sym"], COMPARISONS)
25
+ def test_mixed_string_comparison_ufuncs_fail(op, ufunc, sym):
26
+ arr_string = np.array(["a", "b"], dtype="S")
27
+ arr_unicode = np.array(["a", "c"], dtype="U")
28
+
29
+ with pytest.raises(TypeError, match="did not contain a loop"):
30
+ ufunc(arr_string, arr_unicode)
31
+
32
+ with pytest.raises(TypeError, match="did not contain a loop"):
33
+ ufunc(arr_unicode, arr_string)
34
+
35
+ @pytest.mark.parametrize(["op", "ufunc", "sym"], COMPARISONS)
36
+ def test_mixed_string_comparisons_ufuncs_with_cast(op, ufunc, sym):
37
+ arr_string = np.array(["a", "b"], dtype="S")
38
+ arr_unicode = np.array(["a", "c"], dtype="U")
39
+
40
+ # While there is no loop, manual casting is acceptable:
41
+ res1 = ufunc(arr_string, arr_unicode, signature="UU->?", casting="unsafe")
42
+ res2 = ufunc(arr_string, arr_unicode, signature="SS->?", casting="unsafe")
43
+
44
+ expected = op(arr_string.astype("U"), arr_unicode)
45
+ assert_array_equal(res1, expected)
46
+ assert_array_equal(res2, expected)
47
+
48
+
49
+ @pytest.mark.parametrize(["op", "ufunc", "sym"], COMPARISONS)
50
+ @pytest.mark.parametrize("dtypes", [
51
+ ("S2", "S2"), ("S2", "S10"),
52
+ ("<U1", "<U1"), ("<U1", ">U1"), (">U1", ">U1"),
53
+ ("<U1", "<U10"), ("<U1", ">U10")])
54
+ @pytest.mark.parametrize("aligned", [True, False])
55
+ def test_string_comparisons(op, ufunc, sym, dtypes, aligned):
56
+ # ensure native byte-order for the first view to stay within unicode range
57
+ native_dt = np.dtype(dtypes[0]).newbyteorder("=")
58
+ arr = np.arange(2**15).view(native_dt).astype(dtypes[0])
59
+ if not aligned:
60
+ # Make `arr` unaligned:
61
+ new = np.zeros(arr.nbytes + 1, dtype=np.uint8)[1:].view(dtypes[0])
62
+ new[...] = arr
63
+ arr = new
64
+
65
+ arr2 = arr.astype(dtypes[1], copy=True)
66
+ np.random.shuffle(arr2)
67
+ arr[0] = arr2[0] # make sure one matches
68
+
69
+ expected = [op(d1, d2) for d1, d2 in zip(arr.tolist(), arr2.tolist())]
70
+ assert_array_equal(op(arr, arr2), expected)
71
+ assert_array_equal(ufunc(arr, arr2), expected)
72
+ assert_array_equal(
73
+ np.char.compare_chararrays(arr, arr2, sym, False), expected
74
+ )
75
+
76
+ expected = [op(d2, d1) for d1, d2 in zip(arr.tolist(), arr2.tolist())]
77
+ assert_array_equal(op(arr2, arr), expected)
78
+ assert_array_equal(ufunc(arr2, arr), expected)
79
+ assert_array_equal(
80
+ np.char.compare_chararrays(arr2, arr, sym, False), expected
81
+ )
82
+
83
+
84
+ @pytest.mark.parametrize(["op", "ufunc", "sym"], COMPARISONS)
85
+ @pytest.mark.parametrize("dtypes", [
86
+ ("S2", "S2"), ("S2", "S10"), ("<U1", "<U1"), ("<U1", ">U10")])
87
+ def test_string_comparisons_empty(op, ufunc, sym, dtypes):
88
+ arr = np.empty((1, 0, 1, 5), dtype=dtypes[0])
89
+ arr2 = np.empty((100, 1, 0, 1), dtype=dtypes[1])
90
+
91
+ expected = np.empty(np.broadcast_shapes(arr.shape, arr2.shape), dtype=bool)
92
+ assert_array_equal(op(arr, arr2), expected)
93
+ assert_array_equal(ufunc(arr, arr2), expected)
94
+ assert_array_equal(
95
+ np.char.compare_chararrays(arr, arr2, sym, False), expected
96
+ )
97
+
98
+
99
+ @pytest.mark.parametrize("str_dt", ["S", "U"])
100
+ @pytest.mark.parametrize("float_dt", np.typecodes["AllFloat"])
101
+ def test_float_to_string_cast(str_dt, float_dt):
102
+ float_dt = np.dtype(float_dt)
103
+ fi = np.finfo(float_dt)
104
+ arr = np.array([np.nan, np.inf, -np.inf, fi.max, fi.min], dtype=float_dt)
105
+ expected = ["nan", "inf", "-inf", str(fi.max), str(fi.min)]
106
+ if float_dt.kind == "c":
107
+ expected = [f"({r}+0j)" for r in expected]
108
+
109
+ res = arr.astype(str_dt)
110
+ assert_array_equal(res, np.array(expected, dtype=str_dt))
111
+
112
+
113
+ @pytest.mark.parametrize("str_dt", "US")
114
+ @pytest.mark.parametrize("size", [-1, np.iinfo(np.intc).max])
115
+ def test_string_size_dtype_errors(str_dt, size):
116
+ if size > 0:
117
+ size = size // np.dtype(f"{str_dt}1").itemsize + 1
118
+
119
+ with pytest.raises(ValueError):
120
+ np.dtype((str_dt, size))
121
+ with pytest.raises(TypeError):
122
+ np.dtype(f"{str_dt}{size}")
123
+
124
+
125
+ @pytest.mark.parametrize("str_dt", "US")
126
+ def test_string_size_dtype_large_repr(str_dt):
127
+ size = np.iinfo(np.intc).max // np.dtype(f"{str_dt}1").itemsize
128
+ size_str = str(size)
129
+
130
+ dtype = np.dtype((str_dt, size))
131
+ assert size_str in dtype.str
132
+ assert size_str in str(dtype)
133
+ assert size_str in repr(dtype)
134
+
135
+
136
+ @pytest.mark.slow
137
+ @requires_memory(2 * np.iinfo(np.intc).max)
138
+ @pytest.mark.parametrize("str_dt", "US")
139
+ @pytest.mark.thread_unsafe(reason="crashes with low memory")
140
+ def test_large_string_coercion_error(str_dt):
141
+ very_large = np.iinfo(np.intc).max // np.dtype(f"{str_dt}1").itemsize
142
+ try:
143
+ large_string = "A" * (very_large + 1)
144
+ except Exception:
145
+ # We may not be able to create this Python string on 32bit.
146
+ pytest.skip("python failed to create huge string")
147
+
148
+ class MyStr:
149
+ def __str__(self):
150
+ return large_string
151
+
152
+ try:
153
+ # TypeError from NumPy, or OverflowError from 32bit Python.
154
+ with pytest.raises((TypeError, OverflowError)):
155
+ np.array([large_string], dtype=str_dt)
156
+
157
+ # Same as above, but input has to be converted to a string.
158
+ with pytest.raises((TypeError, OverflowError)):
159
+ np.array([MyStr()], dtype=str_dt)
160
+ except MemoryError:
161
+ # Catch memory errors, because `requires_memory` would do so.
162
+ raise AssertionError("Ops should raise before any large allocation.")
163
+
164
+ @pytest.mark.slow
165
+ @requires_memory(2 * np.iinfo(np.intc).max)
166
+ @pytest.mark.parametrize("str_dt", "US")
167
+ @pytest.mark.thread_unsafe(reason="crashes with low memory")
168
+ def test_large_string_addition_error(str_dt):
169
+ very_large = np.iinfo(np.intc).max // np.dtype(f"{str_dt}1").itemsize
170
+
171
+ a = np.array(["A" * very_large], dtype=str_dt)
172
+ b = np.array("B", dtype=str_dt)
173
+ try:
174
+ with pytest.raises(TypeError):
175
+ np.add(a, b)
176
+ with pytest.raises(TypeError):
177
+ np.add(a, a)
178
+ except MemoryError:
179
+ # Catch memory errors, because `requires_memory` would do so.
180
+ raise AssertionError("Ops should raise before any large allocation.")
181
+
182
+
183
+ def test_large_string_cast():
184
+ very_large = np.iinfo(np.intc).max // 4
185
+ # Could be nice to test very large path, but it makes too many huge
186
+ # allocations right now (need non-legacy cast loops for this).
187
+ # a = np.array([], dtype=np.dtype(("S", very_large)))
188
+ # assert a.astype("U").dtype.itemsize == very_large * 4
189
+
190
+ a = np.array([], dtype=np.dtype(("S", very_large + 1)))
191
+ # It is not perfect but OK if this raises a MemoryError during setup
192
+ # (this happens due clunky code and/or buffer setup.)
193
+ with pytest.raises((TypeError, MemoryError)):
194
+ a.astype("U")
195
+
196
+
197
+ @pytest.mark.parametrize("dt", ["S1", "U1"])
198
+ def test_in_place_mutiply_no_overflow(dt):
199
+ # see gh-30495
200
+ a = np.array("a", dtype=dt)
201
+ a *= 20
202
+ assert_array_equal(a, np.array("a", dtype=dt))
203
+
204
+
205
+ @pytest.mark.parametrize("dt", ["S", "U", "T"])
206
+ class TestMethods:
207
+
208
+ @pytest.mark.parametrize("in1,in2,out", [
209
+ ("", "", ""),
210
+ ("abc", "abc", "abcabc"),
211
+ ("12345", "12345", "1234512345"),
212
+ ("MixedCase", "MixedCase", "MixedCaseMixedCase"),
213
+ ("12345 \0 ", "12345 \0 ", "12345 \0 12345 \0 "),
214
+ ("UPPER", "UPPER", "UPPERUPPER"),
215
+ (["abc", "def"], ["hello", "world"], ["abchello", "defworld"]),
216
+ ])
217
+ def test_add(self, in1, in2, out, dt):
218
+ in1 = np.array(in1, dtype=dt)
219
+ in2 = np.array(in2, dtype=dt)
220
+ out = np.array(out, dtype=dt)
221
+ assert_array_equal(np.strings.add(in1, in2), out)
222
+
223
+ @pytest.mark.parametrize("in1,in2,out", [
224
+ ("abc", 3, "abcabcabc"),
225
+ ("abc", 0, ""),
226
+ ("abc", -1, ""),
227
+ (["abc", "def"], [1, 4], ["abc", "defdefdefdef"]),
228
+ ])
229
+ def test_multiply(self, in1, in2, out, dt):
230
+ in1 = np.array(in1, dtype=dt)
231
+ out = np.array(out, dtype=dt)
232
+ assert_array_equal(np.strings.multiply(in1, in2), out)
233
+
234
+ def test_multiply_raises(self, dt):
235
+ with pytest.raises(TypeError, match="unsupported type"):
236
+ np.strings.multiply(np.array("abc", dtype=dt), 3.14)
237
+
238
+ with pytest.raises(OverflowError):
239
+ np.strings.multiply(np.array("abc", dtype=dt), sys.maxsize)
240
+
241
+ def test_inplace_multiply(self, dt):
242
+ arr = np.array(['foo ', 'bar'], dtype=dt)
243
+ arr *= 2
244
+ if dt != "T":
245
+ assert_array_equal(arr, np.array(['foo ', 'barb'], dtype=dt))
246
+ else:
247
+ assert_array_equal(arr, ['foo foo ', 'barbar'])
248
+
249
+ with pytest.raises(OverflowError):
250
+ arr *= sys.maxsize
251
+
252
+ @pytest.mark.parametrize("i_dt", [np.int8, np.int16, np.int32,
253
+ np.int64, np.int_])
254
+ def test_multiply_integer_dtypes(self, i_dt, dt):
255
+ a = np.array("abc", dtype=dt)
256
+ i = np.array(3, dtype=i_dt)
257
+ res = np.array("abcabcabc", dtype=dt)
258
+ assert_array_equal(np.strings.multiply(a, i), res)
259
+
260
+ @pytest.mark.parametrize("in_,out", [
261
+ ("", False),
262
+ ("a", True),
263
+ ("A", True),
264
+ ("\n", False),
265
+ ("abc", True),
266
+ ("aBc123", False),
267
+ ("abc\n", False),
268
+ (["abc", "aBc123"], [True, False]),
269
+ ])
270
+ def test_isalpha(self, in_, out, dt):
271
+ in_ = np.array(in_, dtype=dt)
272
+ assert_array_equal(np.strings.isalpha(in_), out)
273
+
274
+ @pytest.mark.parametrize("in_,out", [
275
+ ('', False),
276
+ ('a', True),
277
+ ('A', True),
278
+ ('\n', False),
279
+ ('123abc456', True),
280
+ ('a1b3c', True),
281
+ ('aBc000 ', False),
282
+ ('abc\n', False),
283
+ ])
284
+ def test_isalnum(self, in_, out, dt):
285
+ in_ = np.array(in_, dtype=dt)
286
+ assert_array_equal(np.strings.isalnum(in_), out)
287
+
288
+ @pytest.mark.parametrize("in_,out", [
289
+ ("", False),
290
+ ("a", False),
291
+ ("0", True),
292
+ ("012345", True),
293
+ ("012345a", False),
294
+ (["a", "012345"], [False, True]),
295
+ ])
296
+ def test_isdigit(self, in_, out, dt):
297
+ in_ = np.array(in_, dtype=dt)
298
+ assert_array_equal(np.strings.isdigit(in_), out)
299
+
300
+ @pytest.mark.parametrize("in_,out", [
301
+ ("", False),
302
+ ("a", False),
303
+ ("1", False),
304
+ (" ", True),
305
+ ("\t", True),
306
+ ("\r", True),
307
+ ("\n", True),
308
+ (" \t\r \n", True),
309
+ (" \t\r\na", False),
310
+ (["\t1", " \t\r \n"], [False, True])
311
+ ])
312
+ def test_isspace(self, in_, out, dt):
313
+ in_ = np.array(in_, dtype=dt)
314
+ assert_array_equal(np.strings.isspace(in_), out)
315
+
316
+ @pytest.mark.parametrize("in_,out", [
317
+ ('', False),
318
+ ('a', True),
319
+ ('A', False),
320
+ ('\n', False),
321
+ ('abc', True),
322
+ ('aBc', False),
323
+ ('abc\n', True),
324
+ ])
325
+ def test_islower(self, in_, out, dt):
326
+ in_ = np.array(in_, dtype=dt)
327
+ assert_array_equal(np.strings.islower(in_), out)
328
+
329
+ @pytest.mark.parametrize("in_,out", [
330
+ ('', False),
331
+ ('a', False),
332
+ ('A', True),
333
+ ('\n', False),
334
+ ('ABC', True),
335
+ ('AbC', False),
336
+ ('ABC\n', True),
337
+ ])
338
+ def test_isupper(self, in_, out, dt):
339
+ in_ = np.array(in_, dtype=dt)
340
+ assert_array_equal(np.strings.isupper(in_), out)
341
+
342
+ @pytest.mark.parametrize("in_,out", [
343
+ ('', False),
344
+ ('a', False),
345
+ ('A', True),
346
+ ('\n', False),
347
+ ('A Titlecased Line', True),
348
+ ('A\nTitlecased Line', True),
349
+ ('A Titlecased, Line', True),
350
+ ('Not a capitalized String', False),
351
+ ('Not\ta Titlecase String', False),
352
+ ('Not--a Titlecase String', False),
353
+ ('NOT', False),
354
+ ])
355
+ def test_istitle(self, in_, out, dt):
356
+ in_ = np.array(in_, dtype=dt)
357
+ assert_array_equal(np.strings.istitle(in_), out)
358
+
359
+ @pytest.mark.parametrize("in_,out", [
360
+ ("", 0),
361
+ ("abc", 3),
362
+ ("12345", 5),
363
+ ("MixedCase", 9),
364
+ ("12345 \x00 ", 8),
365
+ ("UPPER", 5),
366
+ (["abc", "12345 \x00 "], [3, 8]),
367
+ ])
368
+ def test_str_len(self, in_, out, dt):
369
+ in_ = np.array(in_, dtype=dt)
370
+ assert_array_equal(np.strings.str_len(in_), out)
371
+
372
+ @pytest.mark.parametrize("a,sub,start,end,out", [
373
+ ("abcdefghiabc", "abc", 0, None, 0),
374
+ ("abcdefghiabc", "abc", 1, None, 9),
375
+ ("abcdefghiabc", "def", 4, None, -1),
376
+ ("abc", "", 0, None, 0),
377
+ ("abc", "", 3, None, 3),
378
+ ("abc", "", 4, None, -1),
379
+ ("rrarrrrrrrrra", "a", 0, None, 2),
380
+ ("rrarrrrrrrrra", "a", 4, None, 12),
381
+ ("rrarrrrrrrrra", "a", 4, 6, -1),
382
+ ("", "", 0, None, 0),
383
+ ("", "", 1, 1, -1),
384
+ ("", "", MAX, 0, -1),
385
+ ("", "xx", 0, None, -1),
386
+ ("", "xx", 1, 1, -1),
387
+ ("", "xx", MAX, 0, -1),
388
+ pytest.param(99 * "a" + "b", "b", 0, None, 99,
389
+ id="99*a+b-b-0-None-99"),
390
+ pytest.param(98 * "a" + "ba", "ba", 0, None, 98,
391
+ id="98*a+ba-ba-0-None-98"),
392
+ pytest.param(100 * "a", "b", 0, None, -1,
393
+ id="100*a-b-0-None--1"),
394
+ pytest.param(30000 * "a" + 100 * "b", 100 * "b", 0, None, 30000,
395
+ id="30000*a+100*b-100*b-0-None-30000"),
396
+ pytest.param(30000 * "a", 100 * "b", 0, None, -1,
397
+ id="30000*a-100*b-0-None--1"),
398
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "b", 0, None, 15000,
399
+ id="15000*a+15000*b-15000*b-0-None-15000"),
400
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "c", 0, None, -1,
401
+ id="15000*a+15000*b-15000*c-0-None--1"),
402
+ (["abcdefghiabc", "rrarrrrrrrrra"], ["def", "arr"], [0, 3],
403
+ None, [3, -1]),
404
+ ("Ae¢☃€ 😊" * 2, "😊", 0, None, 6),
405
+ ("Ae¢☃€ 😊" * 2, "😊", 7, None, 13),
406
+ pytest.param("A" * (2 ** 17), r"[\w]+\Z", 0, None, -1,
407
+ id=r"A*2**17-[\w]+\Z-0-None--1"),
408
+ ])
409
+ def test_find(self, a, sub, start, end, out, dt):
410
+ if "😊" in a and dt == "S":
411
+ pytest.skip("Bytes dtype does not support non-ascii input")
412
+ a = np.array(a, dtype=dt)
413
+ sub = np.array(sub, dtype=dt)
414
+ assert_array_equal(np.strings.find(a, sub, start, end), out)
415
+
416
+ @pytest.mark.parametrize("a,sub,start,end,out", [
417
+ ("abcdefghiabc", "abc", 0, None, 9),
418
+ ("abcdefghiabc", "", 0, None, 12),
419
+ ("abcdefghiabc", "abcd", 0, None, 0),
420
+ ("abcdefghiabc", "abcz", 0, None, -1),
421
+ ("abc", "", 0, None, 3),
422
+ ("abc", "", 3, None, 3),
423
+ ("abc", "", 4, None, -1),
424
+ ("rrarrrrrrrrra", "a", 0, None, 12),
425
+ ("rrarrrrrrrrra", "a", 4, None, 12),
426
+ ("rrarrrrrrrrra", "a", 4, 6, -1),
427
+ (["abcdefghiabc", "rrarrrrrrrrra"], ["abc", "a"], [0, 0],
428
+ None, [9, 12]),
429
+ ("Ae¢☃€ 😊" * 2, "😊", 0, None, 13),
430
+ ("Ae¢☃€ 😊" * 2, "😊", 0, 7, 6),
431
+ ])
432
+ def test_rfind(self, a, sub, start, end, out, dt):
433
+ if "😊" in a and dt == "S":
434
+ pytest.skip("Bytes dtype does not support non-ascii input")
435
+ a = np.array(a, dtype=dt)
436
+ sub = np.array(sub, dtype=dt)
437
+ assert_array_equal(np.strings.rfind(a, sub, start, end), out)
438
+
439
+ @pytest.mark.parametrize("a,sub,start,end,out", [
440
+ ("aaa", "a", 0, None, 3),
441
+ ("aaa", "b", 0, None, 0),
442
+ ("aaa", "a", 1, None, 2),
443
+ ("aaa", "a", 10, None, 0),
444
+ ("aaa", "a", -1, None, 1),
445
+ ("aaa", "a", -10, None, 3),
446
+ ("aaa", "a", 0, 1, 1),
447
+ ("aaa", "a", 0, 10, 3),
448
+ ("aaa", "a", 0, -1, 2),
449
+ ("aaa", "a", 0, -10, 0),
450
+ ("aaa", "", 1, None, 3),
451
+ ("aaa", "", 3, None, 1),
452
+ ("aaa", "", 10, None, 0),
453
+ ("aaa", "", -1, None, 2),
454
+ ("aaa", "", -10, None, 4),
455
+ ("aaa", "aaaa", 0, None, 0),
456
+ pytest.param(98 * "a" + "ba", "ba", 0, None, 1,
457
+ id="98*a+ba-ba-0-None-1"),
458
+ pytest.param(30000 * "a" + 100 * "b", 100 * "b", 0, None, 1,
459
+ id="30000*a+100*b-100*b-0-None-1"),
460
+ pytest.param(30000 * "a", 100 * "b", 0, None, 0,
461
+ id="30000*a-100*b-0-None-0"),
462
+ pytest.param(30000 * "a" + 100 * "ab", "ab", 0, None, 100,
463
+ id="30000*a+100*ab-ab-0-None-100"),
464
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "b", 0, None, 1,
465
+ id="15000*a+15000*b-15000*b-0-None-1"),
466
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "c", 0, None, 0,
467
+ id="15000*a+15000*b-15000*c-0-None-0"),
468
+ ("", "", 0, None, 1),
469
+ ("", "", 1, 1, 0),
470
+ ("", "", MAX, 0, 0),
471
+ ("", "xx", 0, None, 0),
472
+ ("", "xx", 1, 1, 0),
473
+ ("", "xx", MAX, 0, 0),
474
+ (["aaa", ""], ["a", ""], [0, 0], None, [3, 1]),
475
+ ("Ae¢☃€ 😊" * 100, "😊", 0, None, 100),
476
+ ])
477
+ def test_count(self, a, sub, start, end, out, dt):
478
+ if "😊" in a and dt == "S":
479
+ pytest.skip("Bytes dtype does not support non-ascii input")
480
+ a = np.array(a, dtype=dt)
481
+ sub = np.array(sub, dtype=dt)
482
+ assert_array_equal(np.strings.count(a, sub, start, end), out)
483
+
484
+ @pytest.mark.parametrize("a,prefix,start,end,out", [
485
+ ("hello", "he", 0, None, True),
486
+ ("hello", "hello", 0, None, True),
487
+ ("hello", "hello world", 0, None, False),
488
+ ("hello", "", 0, None, True),
489
+ ("hello", "ello", 0, None, False),
490
+ ("hello", "ello", 1, None, True),
491
+ ("hello", "o", 4, None, True),
492
+ ("hello", "o", 5, None, False),
493
+ ("hello", "", 5, None, True),
494
+ ("hello", "lo", 6, None, False),
495
+ ("helloworld", "lowo", 3, None, True),
496
+ ("helloworld", "lowo", 3, 7, True),
497
+ ("helloworld", "lowo", 3, 6, False),
498
+ ("", "", 0, 1, True),
499
+ ("", "", 0, 0, True),
500
+ ("", "", 1, 0, False),
501
+ ("hello", "he", 0, -1, True),
502
+ ("hello", "he", -53, -1, True),
503
+ ("hello", "hello", 0, -1, False),
504
+ ("hello", "hello world", -1, -10, False),
505
+ ("hello", "ello", -5, None, False),
506
+ ("hello", "ello", -4, None, True),
507
+ ("hello", "o", -2, None, False),
508
+ ("hello", "o", -1, None, True),
509
+ ("hello", "", -3, -3, True),
510
+ ("hello", "lo", -9, None, False),
511
+ (["hello", ""], ["he", ""], [0, 0], None, [True, True]),
512
+ ])
513
+ def test_startswith(self, a, prefix, start, end, out, dt):
514
+ a = np.array(a, dtype=dt)
515
+ prefix = np.array(prefix, dtype=dt)
516
+ assert_array_equal(np.strings.startswith(a, prefix, start, end), out)
517
+
518
+ @pytest.mark.parametrize("a,suffix,start,end,out", [
519
+ ("hello", "lo", 0, None, True),
520
+ ("hello", "he", 0, None, False),
521
+ ("hello", "", 0, None, True),
522
+ ("hello", "hello world", 0, None, False),
523
+ ("helloworld", "worl", 0, None, False),
524
+ ("helloworld", "worl", 3, 9, True),
525
+ ("helloworld", "world", 3, 12, True),
526
+ ("helloworld", "lowo", 1, 7, True),
527
+ ("helloworld", "lowo", 2, 7, True),
528
+ ("helloworld", "lowo", 3, 7, True),
529
+ ("helloworld", "lowo", 4, 7, False),
530
+ ("helloworld", "lowo", 3, 8, False),
531
+ ("ab", "ab", 0, 1, False),
532
+ ("ab", "ab", 0, 0, False),
533
+ ("", "", 0, 1, True),
534
+ ("", "", 0, 0, True),
535
+ ("", "", 1, 0, False),
536
+ ("hello", "lo", -2, None, True),
537
+ ("hello", "he", -2, None, False),
538
+ ("hello", "", -3, -3, True),
539
+ ("hello", "hello world", -10, -2, False),
540
+ ("helloworld", "worl", -6, None, False),
541
+ ("helloworld", "worl", -5, -1, True),
542
+ ("helloworld", "worl", -5, 9, True),
543
+ ("helloworld", "world", -7, 12, True),
544
+ ("helloworld", "lowo", -99, -3, True),
545
+ ("helloworld", "lowo", -8, -3, True),
546
+ ("helloworld", "lowo", -7, -3, True),
547
+ ("helloworld", "lowo", 3, -4, False),
548
+ ("helloworld", "lowo", -8, -2, False),
549
+ (["hello", "helloworld"], ["lo", "worl"], [0, -6], None,
550
+ [True, False]),
551
+ ])
552
+ def test_endswith(self, a, suffix, start, end, out, dt):
553
+ a = np.array(a, dtype=dt)
554
+ suffix = np.array(suffix, dtype=dt)
555
+ assert_array_equal(np.strings.endswith(a, suffix, start, end), out)
556
+
557
+ @pytest.mark.parametrize("a,chars,out", [
558
+ ("", None, ""),
559
+ (" hello ", None, "hello "),
560
+ ("hello", None, "hello"),
561
+ (" \t\n\r\f\vabc \t\n\r\f\v", None, "abc \t\n\r\f\v"),
562
+ ([" hello ", "hello"], None, ["hello ", "hello"]),
563
+ ("", "", ""),
564
+ ("", "xyz", ""),
565
+ ("hello", "", "hello"),
566
+ ("xyzzyhelloxyzzy", "xyz", "helloxyzzy"),
567
+ ("hello", "xyz", "hello"),
568
+ ("xyxz", "xyxz", ""),
569
+ ("xyxzx", "x", "yxzx"),
570
+ (["xyzzyhelloxyzzy", "hello"], ["xyz", "xyz"],
571
+ ["helloxyzzy", "hello"]),
572
+ (["ba", "ac", "baa", "bba"], "b", ["a", "ac", "aa", "a"]),
573
+ ])
574
+ def test_lstrip(self, a, chars, out, dt):
575
+ a = np.array(a, dtype=dt)
576
+ out = np.array(out, dtype=dt)
577
+ if chars is not None:
578
+ chars = np.array(chars, dtype=dt)
579
+ assert_array_equal(np.strings.lstrip(a, chars), out)
580
+ else:
581
+ assert_array_equal(np.strings.lstrip(a), out)
582
+
583
+ @pytest.mark.parametrize("a,chars,out", [
584
+ ("", None, ""),
585
+ (" hello ", None, " hello"),
586
+ ("hello", None, "hello"),
587
+ (" \t\n\r\f\vabc \t\n\r\f\v", None, " \t\n\r\f\vabc"),
588
+ ([" hello ", "hello"], None, [" hello", "hello"]),
589
+ ("", "", ""),
590
+ ("", "xyz", ""),
591
+ ("hello", "", "hello"),
592
+ (["hello ", "abcdefghijklmnop"], None,
593
+ ["hello", "abcdefghijklmnop"]),
594
+ ("xyzzyhelloxyzzy", "xyz", "xyzzyhello"),
595
+ ("hello", "xyz", "hello"),
596
+ ("xyxz", "xyxz", ""),
597
+ (" ", None, ""),
598
+ ("xyxzx", "x", "xyxz"),
599
+ (["xyzzyhelloxyzzy", "hello"], ["xyz", "xyz"],
600
+ ["xyzzyhello", "hello"]),
601
+ (["ab", "ac", "aab", "abb"], "b", ["a", "ac", "aa", "a"]),
602
+ ])
603
+ def test_rstrip(self, a, chars, out, dt):
604
+ a = np.array(a, dtype=dt)
605
+ out = np.array(out, dtype=dt)
606
+ if chars is not None:
607
+ chars = np.array(chars, dtype=dt)
608
+ assert_array_equal(np.strings.rstrip(a, chars), out)
609
+ else:
610
+ assert_array_equal(np.strings.rstrip(a), out)
611
+
612
+ @pytest.mark.parametrize("a,chars,out", [
613
+ ("", None, ""),
614
+ (" hello ", None, "hello"),
615
+ ("hello", None, "hello"),
616
+ (" \t\n\r\f\vabc \t\n\r\f\v", None, "abc"),
617
+ ([" hello ", "hello"], None, ["hello", "hello"]),
618
+ ("", "", ""),
619
+ ("", "xyz", ""),
620
+ ("hello", "", "hello"),
621
+ ("xyzzyhelloxyzzy", "xyz", "hello"),
622
+ ("hello", "xyz", "hello"),
623
+ ("xyxz", "xyxz", ""),
624
+ ("xyxzx", "x", "yxz"),
625
+ (["xyzzyhelloxyzzy", "hello"], ["xyz", "xyz"],
626
+ ["hello", "hello"]),
627
+ (["bab", "ac", "baab", "bbabb"], "b", ["a", "ac", "aa", "a"]),
628
+ ])
629
+ def test_strip(self, a, chars, out, dt):
630
+ a = np.array(a, dtype=dt)
631
+ if chars is not None:
632
+ chars = np.array(chars, dtype=dt)
633
+ out = np.array(out, dtype=dt)
634
+ assert_array_equal(np.strings.strip(a, chars), out)
635
+
636
+ @pytest.mark.parametrize("buf,old,new,count,res", [
637
+ ("", "", "", -1, ""),
638
+ ("", "", "A", -1, "A"),
639
+ ("", "A", "", -1, ""),
640
+ ("", "A", "A", -1, ""),
641
+ ("", "", "", 100, ""),
642
+ ("", "", "A", 100, "A"),
643
+ ("A", "", "", -1, "A"),
644
+ ("A", "", "*", -1, "*A*"),
645
+ ("A", "", "*1", -1, "*1A*1"),
646
+ ("A", "", "*-#", -1, "*-#A*-#"),
647
+ ("AA", "", "*-", -1, "*-A*-A*-"),
648
+ ("AA", "", "*-", -1, "*-A*-A*-"),
649
+ ("AA", "", "*-", 4, "*-A*-A*-"),
650
+ ("AA", "", "*-", 3, "*-A*-A*-"),
651
+ ("AA", "", "*-", 2, "*-A*-A"),
652
+ ("AA", "", "*-", 1, "*-AA"),
653
+ ("AA", "", "*-", 0, "AA"),
654
+ ("A", "A", "", -1, ""),
655
+ ("AAA", "A", "", -1, ""),
656
+ ("AAA", "A", "", -1, ""),
657
+ ("AAA", "A", "", 4, ""),
658
+ ("AAA", "A", "", 3, ""),
659
+ ("AAA", "A", "", 2, "A"),
660
+ ("AAA", "A", "", 1, "AA"),
661
+ ("AAA", "A", "", 0, "AAA"),
662
+ ("AAAAAAAAAA", "A", "", -1, ""),
663
+ ("ABACADA", "A", "", -1, "BCD"),
664
+ ("ABACADA", "A", "", -1, "BCD"),
665
+ ("ABACADA", "A", "", 5, "BCD"),
666
+ ("ABACADA", "A", "", 4, "BCD"),
667
+ ("ABACADA", "A", "", 3, "BCDA"),
668
+ ("ABACADA", "A", "", 2, "BCADA"),
669
+ ("ABACADA", "A", "", 1, "BACADA"),
670
+ ("ABACADA", "A", "", 0, "ABACADA"),
671
+ ("ABCAD", "A", "", -1, "BCD"),
672
+ ("ABCADAA", "A", "", -1, "BCD"),
673
+ ("BCD", "A", "", -1, "BCD"),
674
+ ("*************", "A", "", -1, "*************"),
675
+ ("^" + "A" * 1000 + "^", "A", "", 999, "^A^"),
676
+ ("the", "the", "", -1, ""),
677
+ ("theater", "the", "", -1, "ater"),
678
+ ("thethe", "the", "", -1, ""),
679
+ ("thethethethe", "the", "", -1, ""),
680
+ ("theatheatheathea", "the", "", -1, "aaaa"),
681
+ ("that", "the", "", -1, "that"),
682
+ ("thaet", "the", "", -1, "thaet"),
683
+ ("here and there", "the", "", -1, "here and re"),
684
+ ("here and there and there", "the", "", -1, "here and re and re"),
685
+ ("here and there and there", "the", "", 3, "here and re and re"),
686
+ ("here and there and there", "the", "", 2, "here and re and re"),
687
+ ("here and there and there", "the", "", 1, "here and re and there"),
688
+ ("here and there and there", "the", "", 0, "here and there and there"),
689
+ ("here and there and there", "the", "", -1, "here and re and re"),
690
+ ("abc", "the", "", -1, "abc"),
691
+ ("abcdefg", "the", "", -1, "abcdefg"),
692
+ ("bbobob", "bob", "", -1, "bob"),
693
+ ("bbobobXbbobob", "bob", "", -1, "bobXbob"),
694
+ ("aaaaaaabob", "bob", "", -1, "aaaaaaa"),
695
+ ("aaaaaaa", "bob", "", -1, "aaaaaaa"),
696
+ ("Who goes there?", "o", "o", -1, "Who goes there?"),
697
+ ("Who goes there?", "o", "O", -1, "WhO gOes there?"),
698
+ ("Who goes there?", "o", "O", -1, "WhO gOes there?"),
699
+ ("Who goes there?", "o", "O", 3, "WhO gOes there?"),
700
+ ("Who goes there?", "o", "O", 2, "WhO gOes there?"),
701
+ ("Who goes there?", "o", "O", 1, "WhO goes there?"),
702
+ ("Who goes there?", "o", "O", 0, "Who goes there?"),
703
+ ("Who goes there?", "a", "q", -1, "Who goes there?"),
704
+ ("Who goes there?", "W", "w", -1, "who goes there?"),
705
+ ("WWho goes there?WW", "W", "w", -1, "wwho goes there?ww"),
706
+ ("Who goes there?", "?", "!", -1, "Who goes there!"),
707
+ ("Who goes there??", "?", "!", -1, "Who goes there!!"),
708
+ ("Who goes there?", ".", "!", -1, "Who goes there?"),
709
+ ("This is a tissue", "is", "**", -1, "Th** ** a t**sue"),
710
+ ("This is a tissue", "is", "**", -1, "Th** ** a t**sue"),
711
+ ("This is a tissue", "is", "**", 4, "Th** ** a t**sue"),
712
+ ("This is a tissue", "is", "**", 3, "Th** ** a t**sue"),
713
+ ("This is a tissue", "is", "**", 2, "Th** ** a tissue"),
714
+ ("This is a tissue", "is", "**", 1, "Th** is a tissue"),
715
+ ("This is a tissue", "is", "**", 0, "This is a tissue"),
716
+ ("bobob", "bob", "cob", -1, "cobob"),
717
+ ("bobobXbobobob", "bob", "cob", -1, "cobobXcobocob"),
718
+ ("bobob", "bot", "bot", -1, "bobob"),
719
+ ("Reykjavik", "k", "KK", -1, "ReyKKjaviKK"),
720
+ ("Reykjavik", "k", "KK", -1, "ReyKKjaviKK"),
721
+ ("Reykjavik", "k", "KK", 2, "ReyKKjaviKK"),
722
+ ("Reykjavik", "k", "KK", 1, "ReyKKjavik"),
723
+ ("Reykjavik", "k", "KK", 0, "Reykjavik"),
724
+ ("A.B.C.", ".", "----", -1, "A----B----C----"),
725
+ ("Reykjavik", "q", "KK", -1, "Reykjavik"),
726
+ ("spam, spam, eggs and spam", "spam", "ham", -1,
727
+ "ham, ham, eggs and ham"),
728
+ ("spam, spam, eggs and spam", "spam", "ham", -1,
729
+ "ham, ham, eggs and ham"),
730
+ ("spam, spam, eggs and spam", "spam", "ham", 4,
731
+ "ham, ham, eggs and ham"),
732
+ ("spam, spam, eggs and spam", "spam", "ham", 3,
733
+ "ham, ham, eggs and ham"),
734
+ ("spam, spam, eggs and spam", "spam", "ham", 2,
735
+ "ham, ham, eggs and spam"),
736
+ ("spam, spam, eggs and spam", "spam", "ham", 1,
737
+ "ham, spam, eggs and spam"),
738
+ ("spam, spam, eggs and spam", "spam", "ham", 0,
739
+ "spam, spam, eggs and spam"),
740
+ ("bobobob", "bobob", "bob", -1, "bobob"),
741
+ ("bobobobXbobobob", "bobob", "bob", -1, "bobobXbobob"),
742
+ ("BOBOBOB", "bob", "bobby", -1, "BOBOBOB"),
743
+ ("one!two!three!", "!", "@", 1, "one@two!three!"),
744
+ ("one!two!three!", "!", "", -1, "onetwothree"),
745
+ ("one!two!three!", "!", "@", 2, "one@two@three!"),
746
+ ("one!two!three!", "!", "@", 3, "one@two@three@"),
747
+ ("one!two!three!", "!", "@", 4, "one@two@three@"),
748
+ ("one!two!three!", "!", "@", 0, "one!two!three!"),
749
+ ("one!two!three!", "!", "@", -1, "one@two@three@"),
750
+ ("one!two!three!", "x", "@", -1, "one!two!three!"),
751
+ ("one!two!three!", "x", "@", 2, "one!two!three!"),
752
+ ("abc", "", "-", -1, "-a-b-c-"),
753
+ ("abc", "", "-", 3, "-a-b-c"),
754
+ ("abc", "", "-", 0, "abc"),
755
+ ("abc", "ab", "--", 0, "abc"),
756
+ ("abc", "xy", "--", -1, "abc"),
757
+ (["abbc", "abbd"], "b", "z", [1, 2], ["azbc", "azzd"]),
758
+ ])
759
+ def test_replace(self, buf, old, new, count, res, dt):
760
+ if "😊" in buf and dt == "S":
761
+ pytest.skip("Bytes dtype does not support non-ascii input")
762
+ buf = np.array(buf, dtype=dt)
763
+ old = np.array(old, dtype=dt)
764
+ new = np.array(new, dtype=dt)
765
+ res = np.array(res, dtype=dt)
766
+ assert_array_equal(np.strings.replace(buf, old, new, count), res)
767
+
768
+ @pytest.mark.parametrize("buf,sub,start,end,res", [
769
+ ("abcdefghiabc", "", 0, None, 0),
770
+ ("abcdefghiabc", "def", 0, None, 3),
771
+ ("abcdefghiabc", "abc", 0, None, 0),
772
+ ("abcdefghiabc", "abc", 1, None, 9),
773
+ ])
774
+ def test_index(self, buf, sub, start, end, res, dt):
775
+ buf = np.array(buf, dtype=dt)
776
+ sub = np.array(sub, dtype=dt)
777
+ assert_array_equal(np.strings.index(buf, sub, start, end), res)
778
+
779
+ @pytest.mark.parametrize("buf,sub,start,end", [
780
+ ("abcdefghiabc", "hib", 0, None),
781
+ ("abcdefghiab", "abc", 1, None),
782
+ ("abcdefghi", "ghi", 8, None),
783
+ ("abcdefghi", "ghi", -1, None),
784
+ ("rrarrrrrrrrra", "a", 4, 6),
785
+ ])
786
+ def test_index_raises(self, buf, sub, start, end, dt):
787
+ buf = np.array(buf, dtype=dt)
788
+ sub = np.array(sub, dtype=dt)
789
+ with pytest.raises(ValueError, match="substring not found"):
790
+ np.strings.index(buf, sub, start, end)
791
+
792
+ @pytest.mark.parametrize("buf,sub,start,end,res", [
793
+ ("abcdefghiabc", "", 0, None, 12),
794
+ ("abcdefghiabc", "def", 0, None, 3),
795
+ ("abcdefghiabc", "abc", 0, None, 9),
796
+ ("abcdefghiabc", "abc", 0, -1, 0),
797
+ ])
798
+ def test_rindex(self, buf, sub, start, end, res, dt):
799
+ buf = np.array(buf, dtype=dt)
800
+ sub = np.array(sub, dtype=dt)
801
+ assert_array_equal(np.strings.rindex(buf, sub, start, end), res)
802
+
803
+ @pytest.mark.parametrize("buf,sub,start,end", [
804
+ ("abcdefghiabc", "hib", 0, None),
805
+ ("defghiabc", "def", 1, None),
806
+ ("defghiabc", "abc", 0, -1),
807
+ ("abcdefghi", "ghi", 0, 8),
808
+ ("abcdefghi", "ghi", 0, -1),
809
+ ("rrarrrrrrrrra", "a", 4, 6),
810
+ ])
811
+ def test_rindex_raises(self, buf, sub, start, end, dt):
812
+ buf = np.array(buf, dtype=dt)
813
+ sub = np.array(sub, dtype=dt)
814
+ with pytest.raises(ValueError, match="substring not found"):
815
+ np.strings.rindex(buf, sub, start, end)
816
+
817
+ @pytest.mark.parametrize("buf,tabsize,res", [
818
+ ("abc\rab\tdef\ng\thi", 8, "abc\rab def\ng hi"),
819
+ ("abc\rab\tdef\ng\thi", 4, "abc\rab def\ng hi"),
820
+ ("abc\r\nab\tdef\ng\thi", 8, "abc\r\nab def\ng hi"),
821
+ ("abc\r\nab\tdef\ng\thi", 4, "abc\r\nab def\ng hi"),
822
+ ("abc\r\nab\r\ndef\ng\r\nhi", 4, "abc\r\nab\r\ndef\ng\r\nhi"),
823
+ (" \ta\n\tb", 1, " a\n b"),
824
+ ])
825
+ def test_expandtabs(self, buf, tabsize, res, dt):
826
+ buf = np.array(buf, dtype=dt)
827
+ res = np.array(res, dtype=dt)
828
+ assert_array_equal(np.strings.expandtabs(buf, tabsize), res)
829
+
830
+ def test_expandtabs_raises_overflow(self, dt):
831
+ with pytest.raises(OverflowError, match="new string is too long"):
832
+ np.strings.expandtabs(np.array("\ta\n\tb", dtype=dt), sys.maxsize)
833
+ np.strings.expandtabs(np.array("\ta\n\tb", dtype=dt), 2**61)
834
+
835
+ def test_expandtabs_length_not_cause_segfault(self, dt):
836
+ # see gh-28829
837
+ with pytest.raises(
838
+ _UFuncNoLoopError,
839
+ match="did not contain a loop with signature matching types",
840
+ ):
841
+ np._core.strings._expandtabs_length.reduce(np.zeros(200))
842
+
843
+ with pytest.raises(
844
+ _UFuncNoLoopError,
845
+ match="did not contain a loop with signature matching types",
846
+ ):
847
+ np.strings.expandtabs(np.zeros(200))
848
+
849
+ FILL_ERROR = "The fill character must be exactly one character long"
850
+
851
+ def test_center_raises_multiple_character_fill(self, dt):
852
+ buf = np.array("abc", dtype=dt)
853
+ fill = np.array("**", dtype=dt)
854
+ with pytest.raises(TypeError, match=self.FILL_ERROR):
855
+ np.strings.center(buf, 10, fill)
856
+
857
+ def test_ljust_raises_multiple_character_fill(self, dt):
858
+ buf = np.array("abc", dtype=dt)
859
+ fill = np.array("**", dtype=dt)
860
+ with pytest.raises(TypeError, match=self.FILL_ERROR):
861
+ np.strings.ljust(buf, 10, fill)
862
+
863
+ def test_rjust_raises_multiple_character_fill(self, dt):
864
+ buf = np.array("abc", dtype=dt)
865
+ fill = np.array("**", dtype=dt)
866
+ with pytest.raises(TypeError, match=self.FILL_ERROR):
867
+ np.strings.rjust(buf, 10, fill)
868
+
869
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
870
+ ('abc', 10, ' ', ' abc '),
871
+ ('abc', 6, ' ', ' abc '),
872
+ ('abc', 3, ' ', 'abc'),
873
+ ('abc', 2, ' ', 'abc'),
874
+ ('abc', -2, ' ', 'abc'),
875
+ ('abc', 10, '*', '***abc****'),
876
+ ])
877
+ def test_center(self, buf, width, fillchar, res, dt):
878
+ buf = np.array(buf, dtype=dt)
879
+ fillchar = np.array(fillchar, dtype=dt)
880
+ res = np.array(res, dtype=dt)
881
+ assert_array_equal(np.strings.center(buf, width, fillchar), res)
882
+
883
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
884
+ ('abc', 10, ' ', 'abc '),
885
+ ('abc', 6, ' ', 'abc '),
886
+ ('abc', 3, ' ', 'abc'),
887
+ ('abc', 2, ' ', 'abc'),
888
+ ('abc', -2, ' ', 'abc'),
889
+ ('abc', 10, '*', 'abc*******'),
890
+ ])
891
+ def test_ljust(self, buf, width, fillchar, res, dt):
892
+ buf = np.array(buf, dtype=dt)
893
+ fillchar = np.array(fillchar, dtype=dt)
894
+ res = np.array(res, dtype=dt)
895
+ assert_array_equal(np.strings.ljust(buf, width, fillchar), res)
896
+
897
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
898
+ ('abc', 10, ' ', ' abc'),
899
+ ('abc', 6, ' ', ' abc'),
900
+ ('abc', 3, ' ', 'abc'),
901
+ ('abc', 2, ' ', 'abc'),
902
+ ('abc', -2, ' ', 'abc'),
903
+ ('abc', 10, '*', '*******abc'),
904
+ ])
905
+ def test_rjust(self, buf, width, fillchar, res, dt):
906
+ buf = np.array(buf, dtype=dt)
907
+ fillchar = np.array(fillchar, dtype=dt)
908
+ res = np.array(res, dtype=dt)
909
+ assert_array_equal(np.strings.rjust(buf, width, fillchar), res)
910
+
911
+ @pytest.mark.parametrize("buf,width,res", [
912
+ ('123', 2, '123'),
913
+ ('123', 3, '123'),
914
+ ('0123', 4, '0123'),
915
+ ('+123', 3, '+123'),
916
+ ('+123', 4, '+123'),
917
+ ('+123', 5, '+0123'),
918
+ ('+0123', 5, '+0123'),
919
+ ('-123', 3, '-123'),
920
+ ('-123', 4, '-123'),
921
+ ('-0123', 5, '-0123'),
922
+ ('000', 3, '000'),
923
+ ('34', 1, '34'),
924
+ ('34', -1, '34'),
925
+ ('0034', 4, '0034'),
926
+ ])
927
+ def test_zfill(self, buf, width, res, dt):
928
+ buf = np.array(buf, dtype=dt)
929
+ res = np.array(res, dtype=dt)
930
+ assert_array_equal(np.strings.zfill(buf, width), res)
931
+
932
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
933
+ ("this is the partition method", "ti", "this is the par",
934
+ "ti", "tion method"),
935
+ ("http://www.python.org", "://", "http", "://", "www.python.org"),
936
+ ("http://www.python.org", "?", "http://www.python.org", "", ""),
937
+ ("http://www.python.org", "http://", "", "http://", "www.python.org"),
938
+ ("http://www.python.org", "org", "http://www.python.", "org", ""),
939
+ ("http://www.python.org", ["://", "?", "http://", "org"],
940
+ ["http", "http://www.python.org", "", "http://www.python."],
941
+ ["://", "", "http://", "org"],
942
+ ["www.python.org", "", "www.python.org", ""]),
943
+ ("mississippi", "ss", "mi", "ss", "issippi"),
944
+ ("mississippi", "i", "m", "i", "ssissippi"),
945
+ ("mississippi", "w", "mississippi", "", ""),
946
+ ])
947
+ def test_partition(self, buf, sep, res1, res2, res3, dt):
948
+ buf = np.array(buf, dtype=dt)
949
+ sep = np.array(sep, dtype=dt)
950
+ res1 = np.array(res1, dtype=dt)
951
+ res2 = np.array(res2, dtype=dt)
952
+ res3 = np.array(res3, dtype=dt)
953
+ act1, act2, act3 = np.strings.partition(buf, sep)
954
+ assert_array_equal(act1, res1)
955
+ assert_array_equal(act2, res2)
956
+ assert_array_equal(act3, res3)
957
+ assert_array_equal(act1 + act2 + act3, buf)
958
+
959
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
960
+ ("this is the partition method", "ti", "this is the parti",
961
+ "ti", "on method"),
962
+ ("http://www.python.org", "://", "http", "://", "www.python.org"),
963
+ ("http://www.python.org", "?", "", "", "http://www.python.org"),
964
+ ("http://www.python.org", "http://", "", "http://", "www.python.org"),
965
+ ("http://www.python.org", "org", "http://www.python.", "org", ""),
966
+ ("http://www.python.org", ["://", "?", "http://", "org"],
967
+ ["http", "", "", "http://www.python."],
968
+ ["://", "", "http://", "org"],
969
+ ["www.python.org", "http://www.python.org", "www.python.org", ""]),
970
+ ("mississippi", "ss", "missi", "ss", "ippi"),
971
+ ("mississippi", "i", "mississipp", "i", ""),
972
+ ("mississippi", "w", "", "", "mississippi"),
973
+ ])
974
+ def test_rpartition(self, buf, sep, res1, res2, res3, dt):
975
+ buf = np.array(buf, dtype=dt)
976
+ sep = np.array(sep, dtype=dt)
977
+ res1 = np.array(res1, dtype=dt)
978
+ res2 = np.array(res2, dtype=dt)
979
+ res3 = np.array(res3, dtype=dt)
980
+ act1, act2, act3 = np.strings.rpartition(buf, sep)
981
+ assert_array_equal(act1, res1)
982
+ assert_array_equal(act2, res2)
983
+ assert_array_equal(act3, res3)
984
+ assert_array_equal(act1 + act2 + act3, buf)
985
+
986
+ @pytest.mark.parametrize("args", [
987
+ (None,),
988
+ (None, None),
989
+ (None, None, -1),
990
+ (0,),
991
+ (0, None),
992
+ (0, None, -1),
993
+ (1,),
994
+ (1, None),
995
+ (1, None, -1),
996
+ (3,),
997
+ (3, None),
998
+ (5,),
999
+ (5, None),
1000
+ (5, 5),
1001
+ (5, 5, -1),
1002
+ (6,), # test index past the end
1003
+ (6, None),
1004
+ (6, None, -1),
1005
+ (6, 7), # test start and stop index past the end
1006
+ (4, 3), # test start > stop index
1007
+ (-1,),
1008
+ (-1, None),
1009
+ (-1, None, -1),
1010
+ (-3,),
1011
+ (-3, None),
1012
+ ([3, 4],),
1013
+ ([3, 4], None),
1014
+ ([2, 4],),
1015
+ ([-3, 5],),
1016
+ ([-3, 5], None),
1017
+ ([-3, 5], None, -1),
1018
+ ([0, -5],),
1019
+ ([0, -5], None),
1020
+ ([0, -5], None, -1),
1021
+ (1, 4),
1022
+ (-3, 5),
1023
+ (None, -1),
1024
+ (0, [4, 2]),
1025
+ ([1, 2], [-1, -2]),
1026
+ (1, 5, 2),
1027
+ (None, None, -1),
1028
+ ([0, 6], [-1, 0], [2, -1]),
1029
+ ])
1030
+ @pytest.mark.parametrize("buf", [
1031
+ ["hello", "world"],
1032
+ ['hello world', 'γεια σου κόσμε', '你好世界', '👋 🌍'],
1033
+ ])
1034
+ def test_slice(self, args, buf, dt):
1035
+ if dt == "S" and "你好世界" in buf:
1036
+ pytest.skip("Bytes dtype does not support non-ascii input")
1037
+ if len(buf) == 4:
1038
+ args = tuple(s * 2 if isinstance(s, list) else s for s in args)
1039
+ buf = np.array(buf, dtype=dt)
1040
+ act = np.strings.slice(buf, *args)
1041
+ bcast_args = tuple(np.broadcast_to(arg, buf.shape) for arg in args)
1042
+ res = np.array([s[slice(*arg)]
1043
+ for s, arg in zip(buf, zip(*bcast_args))],
1044
+ dtype=dt)
1045
+ assert_array_equal(act, res)
1046
+
1047
+ def test_slice_unsupported(self, dt):
1048
+ with pytest.raises(TypeError, match="did not contain a loop"):
1049
+ np.strings.slice(np.array([1, 2, 3]), 4)
1050
+
1051
+ regexp = (r"Cannot cast ufunc '_slice' input .* "
1052
+ r"from .* to dtype\('int(64|32)'\)")
1053
+ with pytest.raises(TypeError, match=regexp):
1054
+ np.strings.slice(np.array(['foo', 'bar'], dtype=dt),
1055
+ np.array(['foo', 'bar'], dtype=dt))
1056
+
1057
+ @pytest.mark.parametrize("int_dt", [np.int8, np.int16, np.int32,
1058
+ np.int64, np.uint8, np.uint16,
1059
+ np.uint32, np.uint64])
1060
+ def test_slice_int_type_promotion(self, int_dt, dt):
1061
+ buf = np.array(["hello", "world"], dtype=dt)
1062
+ np_slice = np.strings.slice
1063
+ assert_array_equal(np_slice(buf, int_dt(4)),
1064
+ np.array(["hell", "worl"], dtype=dt))
1065
+ assert_array_equal(np_slice(buf, np.array([4, 4], dtype=int_dt)),
1066
+ np.array(["hell", "worl"], dtype=dt))
1067
+
1068
+ assert_array_equal(np_slice(buf, int_dt(2), int_dt(4)),
1069
+ np.array(["ll", "rl"], dtype=dt))
1070
+ assert_array_equal(np_slice(buf, np.array([2, 2], dtype=int_dt),
1071
+ np.array([4, 4], dtype=int_dt)),
1072
+ np.array(["ll", "rl"], dtype=dt))
1073
+
1074
+ assert_array_equal(np_slice(buf, int_dt(0), int_dt(4), int_dt(2)),
1075
+ np.array(["hl", "wr"], dtype=dt))
1076
+ assert_array_equal(np_slice(buf,
1077
+ np.array([0, 0], dtype=int_dt),
1078
+ np.array([4, 4], dtype=int_dt),
1079
+ np.array([2, 2], dtype=int_dt)),
1080
+ np.array(["hl", "wr"], dtype=dt))
1081
+
1082
+ @pytest.mark.parametrize("dt", ["U", "T"])
1083
+ class TestMethodsWithUnicode:
1084
+ @pytest.mark.parametrize("in_,out", [
1085
+ ("", False),
1086
+ ("a", False),
1087
+ ("0", True),
1088
+ ("\u2460", False), # CIRCLED DIGIT 1
1089
+ ("\xbc", False), # VULGAR FRACTION ONE QUARTER
1090
+ ("\u0660", True), # ARABIC_INDIC DIGIT ZERO
1091
+ ("012345", True),
1092
+ ("012345a", False),
1093
+ (["0", "a"], [True, False]),
1094
+ ])
1095
+ def test_isdecimal_unicode(self, in_, out, dt):
1096
+ buf = np.array(in_, dtype=dt)
1097
+ assert_array_equal(np.strings.isdecimal(buf), out)
1098
+
1099
+ @pytest.mark.parametrize("in_,out", [
1100
+ ("", False),
1101
+ ("a", False),
1102
+ ("0", True),
1103
+ ("\u2460", True), # CIRCLED DIGIT 1
1104
+ ("\xbc", True), # VULGAR FRACTION ONE QUARTER
1105
+ ("\u0660", True), # ARABIC_INDIC DIGIT ZERO
1106
+ ("012345", True),
1107
+ ("012345a", False),
1108
+ (["0", "a"], [True, False]),
1109
+ ])
1110
+ def test_isnumeric_unicode(self, in_, out, dt):
1111
+ buf = np.array(in_, dtype=dt)
1112
+ assert_array_equal(np.strings.isnumeric(buf), out)
1113
+
1114
+ @pytest.mark.parametrize("buf,old,new,count,res", [
1115
+ ("...\u043c......<", "<", "&lt;", -1, "...\u043c......&lt;"),
1116
+ ("Ae¢☃€ 😊" * 2, "A", "B", -1, "Be¢☃€ 😊Be¢☃€ 😊"),
1117
+ ("Ae¢☃€ 😊" * 2, "😊", "B", -1, "Ae¢☃€ BAe¢☃€ B"),
1118
+ ])
1119
+ def test_replace_unicode(self, buf, old, new, count, res, dt):
1120
+ buf = np.array(buf, dtype=dt)
1121
+ old = np.array(old, dtype=dt)
1122
+ new = np.array(new, dtype=dt)
1123
+ res = np.array(res, dtype=dt)
1124
+ assert_array_equal(np.strings.replace(buf, old, new, count), res)
1125
+
1126
+ @pytest.mark.parametrize("in_", [
1127
+ '\U00010401',
1128
+ '\U00010427',
1129
+ '\U00010429',
1130
+ '\U0001044E',
1131
+ '\U0001D7F6',
1132
+ '\U00011066',
1133
+ '\U000104A0',
1134
+ pytest.param('\U0001F107', marks=pytest.mark.xfail(
1135
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1136
+ reason="PYPY bug in Py_UNICODE_ISALNUM",
1137
+ strict=True)),
1138
+ ])
1139
+ def test_isalnum_unicode(self, in_, dt):
1140
+ in_ = np.array(in_, dtype=dt)
1141
+ assert_array_equal(np.strings.isalnum(in_), True)
1142
+
1143
+ @pytest.mark.parametrize("in_,out", [
1144
+ ('\u1FFc', False),
1145
+ ('\u2167', False),
1146
+ ('\U00010401', False),
1147
+ ('\U00010427', False),
1148
+ ('\U0001F40D', False),
1149
+ ('\U0001F46F', False),
1150
+ ('\u2177', True),
1151
+ pytest.param('\U00010429', True, marks=pytest.mark.xfail(
1152
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1153
+ reason="PYPY bug in Py_UNICODE_ISLOWER",
1154
+ strict=True)),
1155
+ ('\U0001044E', True),
1156
+ ])
1157
+ def test_islower_unicode(self, in_, out, dt):
1158
+ in_ = np.array(in_, dtype=dt)
1159
+ assert_array_equal(np.strings.islower(in_), out)
1160
+
1161
+ @pytest.mark.parametrize("in_,out", [
1162
+ ('\u1FFc', False),
1163
+ ('\u2167', True),
1164
+ ('\U00010401', True),
1165
+ ('\U00010427', True),
1166
+ ('\U0001F40D', False),
1167
+ ('\U0001F46F', False),
1168
+ ('\u2177', False),
1169
+ pytest.param('\U00010429', False, marks=pytest.mark.xfail(
1170
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1171
+ reason="PYPY bug in Py_UNICODE_ISUPPER",
1172
+ strict=True)),
1173
+ ('\U0001044E', False),
1174
+ ])
1175
+ def test_isupper_unicode(self, in_, out, dt):
1176
+ in_ = np.array(in_, dtype=dt)
1177
+ assert_array_equal(np.strings.isupper(in_), out)
1178
+
1179
+ @pytest.mark.parametrize("in_,out", [
1180
+ ('\u1FFc', True),
1181
+ ('Greek \u1FFcitlecases ...', True),
1182
+ pytest.param('\U00010401\U00010429', True, marks=pytest.mark.xfail(
1183
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1184
+ reason="PYPY bug in Py_UNICODE_ISISTITLE",
1185
+ strict=True)),
1186
+ ('\U00010427\U0001044E', True),
1187
+ pytest.param('\U00010429', False, marks=pytest.mark.xfail(
1188
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1189
+ reason="PYPY bug in Py_UNICODE_ISISTITLE",
1190
+ strict=True)),
1191
+ ('\U0001044E', False),
1192
+ ('\U0001F40D', False),
1193
+ ('\U0001F46F', False),
1194
+ ])
1195
+ def test_istitle_unicode(self, in_, out, dt):
1196
+ in_ = np.array(in_, dtype=dt)
1197
+ assert_array_equal(np.strings.istitle(in_), out)
1198
+
1199
+ @pytest.mark.parametrize("buf,sub,start,end,res", [
1200
+ ("Ae¢☃€ 😊" * 2, "😊", 0, None, 6),
1201
+ ("Ae¢☃€ 😊" * 2, "😊", 7, None, 13),
1202
+ ])
1203
+ def test_index_unicode(self, buf, sub, start, end, res, dt):
1204
+ buf = np.array(buf, dtype=dt)
1205
+ sub = np.array(sub, dtype=dt)
1206
+ assert_array_equal(np.strings.index(buf, sub, start, end), res)
1207
+
1208
+ def test_index_raises_unicode(self, dt):
1209
+ with pytest.raises(ValueError, match="substring not found"):
1210
+ np.strings.index("Ae¢☃€ 😊", "😀")
1211
+
1212
+ @pytest.mark.parametrize("buf,res", [
1213
+ ("Ae¢☃€ \t 😊", "Ae¢☃€ 😊"),
1214
+ ("\t\U0001044E", " \U0001044E"),
1215
+ ])
1216
+ def test_expandtabs(self, buf, res, dt):
1217
+ buf = np.array(buf, dtype=dt)
1218
+ res = np.array(res, dtype=dt)
1219
+ assert_array_equal(np.strings.expandtabs(buf), res)
1220
+
1221
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
1222
+ ('x', 2, '\U0001044E', 'x\U0001044E'),
1223
+ ('x', 3, '\U0001044E', '\U0001044Ex\U0001044E'),
1224
+ ('x', 4, '\U0001044E', '\U0001044Ex\U0001044E\U0001044E'),
1225
+ ])
1226
+ def test_center(self, buf, width, fillchar, res, dt):
1227
+ buf = np.array(buf, dtype=dt)
1228
+ fillchar = np.array(fillchar, dtype=dt)
1229
+ res = np.array(res, dtype=dt)
1230
+ assert_array_equal(np.strings.center(buf, width, fillchar), res)
1231
+
1232
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
1233
+ ('x', 2, '\U0001044E', 'x\U0001044E'),
1234
+ ('x', 3, '\U0001044E', 'x\U0001044E\U0001044E'),
1235
+ ('x', 4, '\U0001044E', 'x\U0001044E\U0001044E\U0001044E'),
1236
+ ])
1237
+ def test_ljust(self, buf, width, fillchar, res, dt):
1238
+ buf = np.array(buf, dtype=dt)
1239
+ fillchar = np.array(fillchar, dtype=dt)
1240
+ res = np.array(res, dtype=dt)
1241
+ assert_array_equal(np.strings.ljust(buf, width, fillchar), res)
1242
+
1243
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
1244
+ ('x', 2, '\U0001044E', '\U0001044Ex'),
1245
+ ('x', 3, '\U0001044E', '\U0001044E\U0001044Ex'),
1246
+ ('x', 4, '\U0001044E', '\U0001044E\U0001044E\U0001044Ex'),
1247
+ ])
1248
+ def test_rjust(self, buf, width, fillchar, res, dt):
1249
+ buf = np.array(buf, dtype=dt)
1250
+ fillchar = np.array(fillchar, dtype=dt)
1251
+ res = np.array(res, dtype=dt)
1252
+ assert_array_equal(np.strings.rjust(buf, width, fillchar), res)
1253
+
1254
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
1255
+ ("āāāāĀĀĀĀ", "Ă", "āāāāĀĀĀĀ", "", ""),
1256
+ ("āāāāĂĀĀĀĀ", "Ă", "āāāā", "Ă", "ĀĀĀĀ"),
1257
+ ("āāāāĂĂĀĀĀĀ", "ĂĂ", "āāāā", "ĂĂ", "ĀĀĀĀ"),
1258
+ ("𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀", "𐌂", "𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀", "", ""),
1259
+ ("𐌁𐌁𐌁𐌁𐌂𐌀𐌀𐌀𐌀", "𐌂", "𐌁𐌁𐌁𐌁", "𐌂", "𐌀𐌀𐌀𐌀"),
1260
+ ("𐌁𐌁𐌁𐌁𐌂𐌂𐌀𐌀𐌀𐌀", "𐌂𐌂", "𐌁𐌁𐌁𐌁", "𐌂𐌂", "𐌀𐌀𐌀𐌀"),
1261
+ ("𐌁𐌁𐌁𐌁𐌂𐌂𐌂𐌂𐌀𐌀𐌀𐌀", "𐌂𐌂𐌂𐌂", "𐌁𐌁𐌁𐌁", "𐌂𐌂𐌂𐌂", "𐌀𐌀𐌀𐌀"),
1262
+ ])
1263
+ def test_partition(self, buf, sep, res1, res2, res3, dt):
1264
+ buf = np.array(buf, dtype=dt)
1265
+ sep = np.array(sep, dtype=dt)
1266
+ res1 = np.array(res1, dtype=dt)
1267
+ res2 = np.array(res2, dtype=dt)
1268
+ res3 = np.array(res3, dtype=dt)
1269
+ act1, act2, act3 = np.strings.partition(buf, sep)
1270
+ assert_array_equal(act1, res1)
1271
+ assert_array_equal(act2, res2)
1272
+ assert_array_equal(act3, res3)
1273
+ assert_array_equal(act1 + act2 + act3, buf)
1274
+
1275
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
1276
+ ("āāāāĀĀĀĀ", "Ă", "", "", "āāāāĀĀĀĀ"),
1277
+ ("āāāāĂĀĀĀĀ", "Ă", "āāāā", "Ă", "ĀĀĀĀ"),
1278
+ ("āāāāĂĂĀĀĀĀ", "ĂĂ", "āāāā", "ĂĂ", "ĀĀĀĀ"),
1279
+ ("𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀", "𐌂", "", "", "𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀"),
1280
+ ("𐌁𐌁𐌁𐌁𐌂𐌀𐌀𐌀𐌀", "𐌂", "𐌁𐌁𐌁𐌁", "𐌂", "𐌀𐌀𐌀𐌀"),
1281
+ ("𐌁𐌁𐌁𐌁𐌂𐌂𐌀𐌀𐌀𐌀", "𐌂𐌂", "𐌁𐌁𐌁𐌁", "𐌂𐌂", "𐌀𐌀𐌀𐌀"),
1282
+ ])
1283
+ def test_rpartition(self, buf, sep, res1, res2, res3, dt):
1284
+ buf = np.array(buf, dtype=dt)
1285
+ sep = np.array(sep, dtype=dt)
1286
+ res1 = np.array(res1, dtype=dt)
1287
+ res2 = np.array(res2, dtype=dt)
1288
+ res3 = np.array(res3, dtype=dt)
1289
+ act1, act2, act3 = np.strings.rpartition(buf, sep)
1290
+ assert_array_equal(act1, res1)
1291
+ assert_array_equal(act2, res2)
1292
+ assert_array_equal(act3, res3)
1293
+ assert_array_equal(act1 + act2 + act3, buf)
1294
+
1295
+ @pytest.mark.parametrize("method", ["strip", "lstrip", "rstrip"])
1296
+ @pytest.mark.parametrize(
1297
+ "source,strip",
1298
+ [
1299
+ ("λμ", "μ"),
1300
+ ("λμ", "λ"),
1301
+ ("λ" * 5 + "μ" * 2, "μ"),
1302
+ ("λ" * 5 + "μ" * 2, "λ"),
1303
+ ("λ" * 5 + "A" + "μ" * 2, "μλ"),
1304
+ ("λμ" * 5, "μ"),
1305
+ ("λμ" * 5, "λ"),
1306
+ ])
1307
+ def test_strip_functions_unicode(self, source, strip, method, dt):
1308
+ src_array = np.array([source], dtype=dt)
1309
+
1310
+ npy_func = getattr(np.strings, method)
1311
+ py_func = getattr(str, method)
1312
+
1313
+ expected = np.array([py_func(source, strip)], dtype=dt)
1314
+ actual = npy_func(src_array, strip)
1315
+
1316
+ assert_array_equal(actual, expected)
1317
+
1318
+ @pytest.mark.parametrize("args", [
1319
+ (None,),
1320
+ (0,),
1321
+ (1,),
1322
+ (5,),
1323
+ (15,),
1324
+ (22,),
1325
+ (-1,),
1326
+ (-3,),
1327
+ ([3, 4],),
1328
+ ([-5, 5],),
1329
+ ([0, -8],),
1330
+ (1, 12),
1331
+ (-12, 15),
1332
+ (None, -1),
1333
+ (0, [17, 6]),
1334
+ ([1, 2], [-1, -2]),
1335
+ (1, 11, 2),
1336
+ (None, None, -1),
1337
+ ([0, 10], [-1, 0], [2, -1]),
1338
+ ])
1339
+ def test_slice(self, args, dt):
1340
+ buf = np.array(["Приве́т नमस्ते שָׁלוֹם", "😀😃😄😁😆😅🤣😂🙂🙃"],
1341
+ dtype=dt)
1342
+ act = np.strings.slice(buf, *args)
1343
+ bcast_args = tuple(np.broadcast_to(arg, buf.shape) for arg in args)
1344
+ res = np.array([s[slice(*arg)]
1345
+ for s, arg in zip(buf, zip(*bcast_args))],
1346
+ dtype=dt)
1347
+ assert_array_equal(act, res)
1348
+
1349
+
1350
+ class TestMixedTypeMethods:
1351
+ def test_center(self):
1352
+ buf = np.array("😊", dtype="U")
1353
+ fill = np.array("*", dtype="S")
1354
+ res = np.array("*😊*", dtype="U")
1355
+ assert_array_equal(np.strings.center(buf, 3, fill), res)
1356
+
1357
+ buf = np.array("s", dtype="S")
1358
+ fill = np.array("*", dtype="U")
1359
+ res = np.array("*s*", dtype="S")
1360
+ assert_array_equal(np.strings.center(buf, 3, fill), res)
1361
+
1362
+ with pytest.raises(ValueError, match="'ascii' codec can't encode"):
1363
+ buf = np.array("s", dtype="S")
1364
+ fill = np.array("😊", dtype="U")
1365
+ np.strings.center(buf, 3, fill)
1366
+
1367
+ def test_ljust(self):
1368
+ buf = np.array("😊", dtype="U")
1369
+ fill = np.array("*", dtype="S")
1370
+ res = np.array("😊**", dtype="U")
1371
+ assert_array_equal(np.strings.ljust(buf, 3, fill), res)
1372
+
1373
+ buf = np.array("s", dtype="S")
1374
+ fill = np.array("*", dtype="U")
1375
+ res = np.array("s**", dtype="S")
1376
+ assert_array_equal(np.strings.ljust(buf, 3, fill), res)
1377
+
1378
+ with pytest.raises(ValueError, match="'ascii' codec can't encode"):
1379
+ buf = np.array("s", dtype="S")
1380
+ fill = np.array("😊", dtype="U")
1381
+ np.strings.ljust(buf, 3, fill)
1382
+
1383
+ def test_rjust(self):
1384
+ buf = np.array("😊", dtype="U")
1385
+ fill = np.array("*", dtype="S")
1386
+ res = np.array("**😊", dtype="U")
1387
+ assert_array_equal(np.strings.rjust(buf, 3, fill), res)
1388
+
1389
+ buf = np.array("s", dtype="S")
1390
+ fill = np.array("*", dtype="U")
1391
+ res = np.array("**s", dtype="S")
1392
+ assert_array_equal(np.strings.rjust(buf, 3, fill), res)
1393
+
1394
+ with pytest.raises(ValueError, match="'ascii' codec can't encode"):
1395
+ buf = np.array("s", dtype="S")
1396
+ fill = np.array("😊", dtype="U")
1397
+ np.strings.rjust(buf, 3, fill)
1398
+
1399
+
1400
+ class TestUnicodeOnlyMethodsRaiseWithBytes:
1401
+ def test_isdecimal_raises(self):
1402
+ in_ = np.array(b"1")
1403
+ with assert_raises(TypeError):
1404
+ np.strings.isdecimal(in_)
1405
+
1406
+ def test_isnumeric_bytes(self):
1407
+ in_ = np.array(b"1")
1408
+ with assert_raises(TypeError):
1409
+ np.strings.isnumeric(in_)
1410
+
1411
+
1412
+ def check_itemsize(n_elem, dt):
1413
+ if dt == "T":
1414
+ return np.dtype(dt).itemsize
1415
+ if dt == "S":
1416
+ return n_elem
1417
+ if dt == "U":
1418
+ return n_elem * 4
1419
+
1420
+ @pytest.mark.parametrize("dt", ["S", "U", "T"])
1421
+ class TestReplaceOnArrays:
1422
+
1423
+ def test_replace_count_and_size(self, dt):
1424
+ a = np.array(["0123456789" * i for i in range(4)], dtype=dt)
1425
+ r1 = np.strings.replace(a, "5", "ABCDE")
1426
+ assert r1.dtype.itemsize == check_itemsize(3 * 10 + 3 * 4, dt)
1427
+ r1_res = np.array(["01234ABCDE6789" * i for i in range(4)], dtype=dt)
1428
+ assert_array_equal(r1, r1_res)
1429
+ r2 = np.strings.replace(a, "5", "ABCDE", 1)
1430
+ assert r2.dtype.itemsize == check_itemsize(3 * 10 + 4, dt)
1431
+ r3 = np.strings.replace(a, "5", "ABCDE", 0)
1432
+ assert r3.dtype.itemsize == a.dtype.itemsize
1433
+ assert_array_equal(r3, a)
1434
+ # Negative values mean to replace all.
1435
+ r4 = np.strings.replace(a, "5", "ABCDE", -1)
1436
+ assert r4.dtype.itemsize == check_itemsize(3 * 10 + 3 * 4, dt)
1437
+ assert_array_equal(r4, r1)
1438
+ # We can do count on an element-by-element basis.
1439
+ r5 = np.strings.replace(a, "5", "ABCDE", [-1, -1, -1, 1])
1440
+ assert r5.dtype.itemsize == check_itemsize(3 * 10 + 4, dt)
1441
+ assert_array_equal(r5, np.array(
1442
+ ["01234ABCDE6789" * i for i in range(3)]
1443
+ + ["01234ABCDE6789" + "0123456789" * 2], dtype=dt))
1444
+
1445
+ def test_replace_broadcasting(self, dt):
1446
+ a = np.array("0,0,0", dtype=dt)
1447
+ r1 = np.strings.replace(a, "0", "1", np.arange(3))
1448
+ assert r1.dtype == a.dtype
1449
+ assert_array_equal(r1, np.array(["0,0,0", "1,0,0", "1,1,0"], dtype=dt))
1450
+ r2 = np.strings.replace(a, "0", [["1"], ["2"]], np.arange(1, 4))
1451
+ assert_array_equal(r2, np.array([["1,0,0", "1,1,0", "1,1,1"],
1452
+ ["2,0,0", "2,2,0", "2,2,2"]],
1453
+ dtype=dt))
1454
+ r3 = np.strings.replace(a, ["0", "0,0", "0,0,0"], "X")
1455
+ assert_array_equal(r3, np.array(["X,X,X", "X,0", "X"], dtype=dt))
1456
+
1457
+
1458
+ class TestOverride:
1459
+ @classmethod
1460
+ def setup_class(cls):
1461
+ class Override:
1462
+
1463
+ def __array_function__(self, *args, **kwargs):
1464
+ return "function"
1465
+
1466
+ def __array_ufunc__(self, *args, **kwargs):
1467
+ return "ufunc"
1468
+
1469
+ cls.override = Override()
1470
+
1471
+ @pytest.mark.parametrize("func, kwargs", [
1472
+ (np.strings.center, dict(width=10)),
1473
+ (np.strings.capitalize, {}),
1474
+ (np.strings.decode, {}),
1475
+ (np.strings.encode, {}),
1476
+ (np.strings.expandtabs, {}),
1477
+ (np.strings.ljust, dict(width=10)),
1478
+ (np.strings.lower, {}),
1479
+ (np.strings.mod, dict(values=2)),
1480
+ (np.strings.multiply, dict(i=2)),
1481
+ (np.strings.partition, dict(sep="foo")),
1482
+ (np.strings.rjust, dict(width=10)),
1483
+ (np.strings.rpartition, dict(sep="foo")),
1484
+ (np.strings.swapcase, {}),
1485
+ (np.strings.title, {}),
1486
+ (np.strings.translate, dict(table=None)),
1487
+ (np.strings.upper, {}),
1488
+ (np.strings.zfill, dict(width=10)),
1489
+ ])
1490
+ def test_override_function(self, func, kwargs):
1491
+ assert func(self.override, **kwargs) == "function"
1492
+
1493
+ @pytest.mark.parametrize("func, args, kwargs", [
1494
+ (np.strings.add, (None, ), {}),
1495
+ (np.strings.lstrip, (), {}),
1496
+ (np.strings.rstrip, (), {}),
1497
+ (np.strings.strip, (), {}),
1498
+ (np.strings.equal, (None, ), {}),
1499
+ (np.strings.not_equal, (None, ), {}),
1500
+ (np.strings.greater_equal, (None, ), {}),
1501
+ (np.strings.less_equal, (None, ), {}),
1502
+ (np.strings.greater, (None, ), {}),
1503
+ (np.strings.less, (None, ), {}),
1504
+ (np.strings.count, ("foo", ), {}),
1505
+ (np.strings.endswith, ("foo", ), {}),
1506
+ (np.strings.find, ("foo", ), {}),
1507
+ (np.strings.index, ("foo", ), {}),
1508
+ (np.strings.isalnum, (), {}),
1509
+ (np.strings.isalpha, (), {}),
1510
+ (np.strings.isdecimal, (), {}),
1511
+ (np.strings.isdigit, (), {}),
1512
+ (np.strings.islower, (), {}),
1513
+ (np.strings.isnumeric, (), {}),
1514
+ (np.strings.isspace, (), {}),
1515
+ (np.strings.istitle, (), {}),
1516
+ (np.strings.isupper, (), {}),
1517
+ (np.strings.rfind, ("foo", ), {}),
1518
+ (np.strings.rindex, ("foo", ), {}),
1519
+ (np.strings.startswith, ("foo", ), {}),
1520
+ (np.strings.str_len, (), {}),
1521
+ ])
1522
+ def test_override_ufunc(self, func, args, kwargs):
1523
+ assert func(self.override, *args, **kwargs) == "ufunc"