numpy 2.4.0__cp314-cp314-musllinux_1_2_x86_64.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 (916) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +108 -0
  3. numpy/__init__.cython-30.pxd +1242 -0
  4. numpy/__init__.pxd +1155 -0
  5. numpy/__init__.py +942 -0
  6. numpy/__init__.pyi +6202 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +206 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +201 -0
  12. numpy/_core/__init__.pyi +666 -0
  13. numpy/_core/_add_newdocs.py +7151 -0
  14. numpy/_core/_add_newdocs.pyi +2 -0
  15. numpy/_core/_add_newdocs_scalars.py +381 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +130 -0
  18. numpy/_core/_asarray.pyi +43 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +56 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +54 -0
  25. numpy/_core/_internal.py +968 -0
  26. numpy/_core/_internal.pyi +61 -0
  27. numpy/_core/_methods.py +252 -0
  28. numpy/_core/_methods.pyi +22 -0
  29. numpy/_core/_multiarray_tests.cpython-314-x86_64-linux-musl.so +0 -0
  30. numpy/_core/_multiarray_umath.cpython-314-x86_64-linux-musl.so +0 -0
  31. numpy/_core/_operand_flag_tests.cpython-314-x86_64-linux-musl.so +0 -0
  32. numpy/_core/_rational_tests.cpython-314-x86_64-linux-musl.so +0 -0
  33. numpy/_core/_simd.cpython-314-x86_64-linux-musl.so +0 -0
  34. numpy/_core/_simd.pyi +35 -0
  35. numpy/_core/_string_helpers.py +100 -0
  36. numpy/_core/_string_helpers.pyi +12 -0
  37. numpy/_core/_struct_ufunc_tests.cpython-314-x86_64-linux-musl.so +0 -0
  38. numpy/_core/_type_aliases.py +131 -0
  39. numpy/_core/_type_aliases.pyi +86 -0
  40. numpy/_core/_ufunc_config.py +515 -0
  41. numpy/_core/_ufunc_config.pyi +69 -0
  42. numpy/_core/_umath_tests.cpython-314-x86_64-linux-musl.so +0 -0
  43. numpy/_core/_umath_tests.pyi +47 -0
  44. numpy/_core/arrayprint.py +1779 -0
  45. numpy/_core/arrayprint.pyi +158 -0
  46. numpy/_core/cversions.py +13 -0
  47. numpy/_core/defchararray.py +1414 -0
  48. numpy/_core/defchararray.pyi +1150 -0
  49. numpy/_core/einsumfunc.py +1650 -0
  50. numpy/_core/einsumfunc.pyi +184 -0
  51. numpy/_core/fromnumeric.py +4233 -0
  52. numpy/_core/fromnumeric.pyi +1735 -0
  53. numpy/_core/function_base.py +547 -0
  54. numpy/_core/function_base.pyi +276 -0
  55. numpy/_core/getlimits.py +462 -0
  56. numpy/_core/getlimits.pyi +124 -0
  57. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  58. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  59. numpy/_core/include/numpy/__ufunc_api.c +55 -0
  60. numpy/_core/include/numpy/__ufunc_api.h +349 -0
  61. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  62. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  63. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  64. numpy/_core/include/numpy/arrayobject.h +7 -0
  65. numpy/_core/include/numpy/arrayscalars.h +198 -0
  66. numpy/_core/include/numpy/dtype_api.h +547 -0
  67. numpy/_core/include/numpy/halffloat.h +70 -0
  68. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  69. numpy/_core/include/numpy/ndarraytypes.h +1982 -0
  70. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  71. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  72. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  73. numpy/_core/include/numpy/npy_common.h +989 -0
  74. numpy/_core/include/numpy/npy_cpu.h +126 -0
  75. numpy/_core/include/numpy/npy_endian.h +79 -0
  76. numpy/_core/include/numpy/npy_math.h +602 -0
  77. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  78. numpy/_core/include/numpy/npy_os.h +42 -0
  79. numpy/_core/include/numpy/numpyconfig.h +185 -0
  80. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  81. numpy/_core/include/numpy/random/bitgen.h +20 -0
  82. numpy/_core/include/numpy/random/distributions.h +209 -0
  83. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  84. numpy/_core/include/numpy/ufuncobject.h +343 -0
  85. numpy/_core/include/numpy/utils.h +37 -0
  86. numpy/_core/lib/libnpymath.a +0 -0
  87. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  88. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  89. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  90. numpy/_core/memmap.py +363 -0
  91. numpy/_core/memmap.pyi +3 -0
  92. numpy/_core/multiarray.py +1740 -0
  93. numpy/_core/multiarray.pyi +1316 -0
  94. numpy/_core/numeric.py +2758 -0
  95. numpy/_core/numeric.pyi +1276 -0
  96. numpy/_core/numerictypes.py +633 -0
  97. numpy/_core/numerictypes.pyi +196 -0
  98. numpy/_core/overrides.py +188 -0
  99. numpy/_core/overrides.pyi +47 -0
  100. numpy/_core/printoptions.py +32 -0
  101. numpy/_core/printoptions.pyi +28 -0
  102. numpy/_core/records.py +1088 -0
  103. numpy/_core/records.pyi +340 -0
  104. numpy/_core/shape_base.py +996 -0
  105. numpy/_core/shape_base.pyi +182 -0
  106. numpy/_core/strings.py +1813 -0
  107. numpy/_core/strings.pyi +536 -0
  108. numpy/_core/tests/_locales.py +72 -0
  109. numpy/_core/tests/_natype.py +144 -0
  110. numpy/_core/tests/data/astype_copy.pkl +0 -0
  111. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  112. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  113. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  114. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  115. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  122. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  123. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  124. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  125. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  127. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  128. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  129. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  130. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  131. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  132. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  134. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  135. numpy/_core/tests/examples/cython/meson.build +43 -0
  136. numpy/_core/tests/examples/cython/setup.py +39 -0
  137. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  138. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  139. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  140. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  141. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  142. numpy/_core/tests/test__exceptions.py +90 -0
  143. numpy/_core/tests/test_abc.py +54 -0
  144. numpy/_core/tests/test_api.py +655 -0
  145. numpy/_core/tests/test_argparse.py +90 -0
  146. numpy/_core/tests/test_array_api_info.py +113 -0
  147. numpy/_core/tests/test_array_coercion.py +928 -0
  148. numpy/_core/tests/test_array_interface.py +222 -0
  149. numpy/_core/tests/test_arraymethod.py +84 -0
  150. numpy/_core/tests/test_arrayobject.py +75 -0
  151. numpy/_core/tests/test_arrayprint.py +1324 -0
  152. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  153. numpy/_core/tests/test_casting_unittests.py +955 -0
  154. numpy/_core/tests/test_conversion_utils.py +209 -0
  155. numpy/_core/tests/test_cpu_dispatcher.py +48 -0
  156. numpy/_core/tests/test_cpu_features.py +450 -0
  157. numpy/_core/tests/test_custom_dtypes.py +393 -0
  158. numpy/_core/tests/test_cython.py +352 -0
  159. numpy/_core/tests/test_datetime.py +2792 -0
  160. numpy/_core/tests/test_defchararray.py +858 -0
  161. numpy/_core/tests/test_deprecations.py +460 -0
  162. numpy/_core/tests/test_dlpack.py +190 -0
  163. numpy/_core/tests/test_dtype.py +2110 -0
  164. numpy/_core/tests/test_einsum.py +1351 -0
  165. numpy/_core/tests/test_errstate.py +131 -0
  166. numpy/_core/tests/test_extint128.py +217 -0
  167. numpy/_core/tests/test_finfo.py +86 -0
  168. numpy/_core/tests/test_function_base.py +504 -0
  169. numpy/_core/tests/test_getlimits.py +171 -0
  170. numpy/_core/tests/test_half.py +593 -0
  171. numpy/_core/tests/test_hashtable.py +36 -0
  172. numpy/_core/tests/test_indexerrors.py +122 -0
  173. numpy/_core/tests/test_indexing.py +1692 -0
  174. numpy/_core/tests/test_item_selection.py +167 -0
  175. numpy/_core/tests/test_limited_api.py +102 -0
  176. numpy/_core/tests/test_longdouble.py +370 -0
  177. numpy/_core/tests/test_mem_overlap.py +933 -0
  178. numpy/_core/tests/test_mem_policy.py +453 -0
  179. numpy/_core/tests/test_memmap.py +248 -0
  180. numpy/_core/tests/test_multiarray.py +11008 -0
  181. numpy/_core/tests/test_multiprocessing.py +55 -0
  182. numpy/_core/tests/test_multithreading.py +353 -0
  183. numpy/_core/tests/test_nditer.py +3533 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4295 -0
  186. numpy/_core/tests/test_numerictypes.py +650 -0
  187. numpy/_core/tests/test_overrides.py +800 -0
  188. numpy/_core/tests/test_print.py +202 -0
  189. numpy/_core/tests/test_protocols.py +46 -0
  190. numpy/_core/tests/test_records.py +544 -0
  191. numpy/_core/tests/test_regression.py +2677 -0
  192. numpy/_core/tests/test_scalar_ctors.py +203 -0
  193. numpy/_core/tests/test_scalar_methods.py +328 -0
  194. numpy/_core/tests/test_scalarbuffer.py +153 -0
  195. numpy/_core/tests/test_scalarinherit.py +105 -0
  196. numpy/_core/tests/test_scalarmath.py +1168 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +904 -0
  199. numpy/_core/tests/test_simd.py +1345 -0
  200. numpy/_core/tests/test_simd_module.py +105 -0
  201. numpy/_core/tests/test_stringdtype.py +1855 -0
  202. numpy/_core/tests/test_strings.py +1515 -0
  203. numpy/_core/tests/test_ufunc.py +3405 -0
  204. numpy/_core/tests/test_umath.py +4962 -0
  205. numpy/_core/tests/test_umath_accuracy.py +132 -0
  206. numpy/_core/tests/test_umath_complex.py +631 -0
  207. numpy/_core/tests/test_unicode.py +369 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +232 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +78 -0
  213. numpy/_expired_attrs_2_0.pyi +61 -0
  214. numpy/_globals.py +121 -0
  215. numpy/_globals.pyi +17 -0
  216. numpy/_pyinstaller/__init__.py +0 -0
  217. numpy/_pyinstaller/__init__.pyi +0 -0
  218. numpy/_pyinstaller/hook-numpy.py +36 -0
  219. numpy/_pyinstaller/hook-numpy.pyi +6 -0
  220. numpy/_pyinstaller/tests/__init__.py +16 -0
  221. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  222. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  223. numpy/_pytesttester.py +201 -0
  224. numpy/_pytesttester.pyi +18 -0
  225. numpy/_typing/__init__.py +173 -0
  226. numpy/_typing/_add_docstring.py +153 -0
  227. numpy/_typing/_array_like.py +106 -0
  228. numpy/_typing/_char_codes.py +213 -0
  229. numpy/_typing/_dtype_like.py +114 -0
  230. numpy/_typing/_extended_precision.py +15 -0
  231. numpy/_typing/_nbit.py +19 -0
  232. numpy/_typing/_nbit_base.py +94 -0
  233. numpy/_typing/_nbit_base.pyi +39 -0
  234. numpy/_typing/_nested_sequence.py +79 -0
  235. numpy/_typing/_scalars.py +20 -0
  236. numpy/_typing/_shape.py +8 -0
  237. numpy/_typing/_ufunc.py +7 -0
  238. numpy/_typing/_ufunc.pyi +975 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +28 -0
  241. numpy/_utils/_convertions.py +18 -0
  242. numpy/_utils/_convertions.pyi +4 -0
  243. numpy/_utils/_inspect.py +192 -0
  244. numpy/_utils/_inspect.pyi +70 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +118 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +248 -0
  250. numpy/core/__init__.py +33 -0
  251. numpy/core/__init__.pyi +0 -0
  252. numpy/core/_dtype.py +10 -0
  253. numpy/core/_dtype.pyi +0 -0
  254. numpy/core/_dtype_ctypes.py +10 -0
  255. numpy/core/_dtype_ctypes.pyi +0 -0
  256. numpy/core/_internal.py +27 -0
  257. numpy/core/_multiarray_umath.py +57 -0
  258. numpy/core/_utils.py +21 -0
  259. numpy/core/arrayprint.py +10 -0
  260. numpy/core/defchararray.py +10 -0
  261. numpy/core/einsumfunc.py +10 -0
  262. numpy/core/fromnumeric.py +10 -0
  263. numpy/core/function_base.py +10 -0
  264. numpy/core/getlimits.py +10 -0
  265. numpy/core/multiarray.py +25 -0
  266. numpy/core/numeric.py +12 -0
  267. numpy/core/numerictypes.py +10 -0
  268. numpy/core/overrides.py +10 -0
  269. numpy/core/overrides.pyi +7 -0
  270. numpy/core/records.py +10 -0
  271. numpy/core/shape_base.py +10 -0
  272. numpy/core/umath.py +10 -0
  273. numpy/ctypeslib/__init__.py +13 -0
  274. numpy/ctypeslib/__init__.pyi +15 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +236 -0
  277. numpy/doc/ufuncs.py +138 -0
  278. numpy/dtypes.py +41 -0
  279. numpy/dtypes.pyi +630 -0
  280. numpy/exceptions.py +246 -0
  281. numpy/exceptions.pyi +27 -0
  282. numpy/f2py/__init__.py +86 -0
  283. numpy/f2py/__init__.pyi +5 -0
  284. numpy/f2py/__main__.py +5 -0
  285. numpy/f2py/__version__.py +1 -0
  286. numpy/f2py/__version__.pyi +1 -0
  287. numpy/f2py/_backends/__init__.py +9 -0
  288. numpy/f2py/_backends/__init__.pyi +5 -0
  289. numpy/f2py/_backends/_backend.py +44 -0
  290. numpy/f2py/_backends/_backend.pyi +46 -0
  291. numpy/f2py/_backends/_distutils.py +76 -0
  292. numpy/f2py/_backends/_distutils.pyi +13 -0
  293. numpy/f2py/_backends/_meson.py +244 -0
  294. numpy/f2py/_backends/_meson.pyi +62 -0
  295. numpy/f2py/_backends/meson.build.template +58 -0
  296. numpy/f2py/_isocbind.py +62 -0
  297. numpy/f2py/_isocbind.pyi +13 -0
  298. numpy/f2py/_src_pyf.py +247 -0
  299. numpy/f2py/_src_pyf.pyi +28 -0
  300. numpy/f2py/auxfuncs.py +1004 -0
  301. numpy/f2py/auxfuncs.pyi +262 -0
  302. numpy/f2py/capi_maps.py +811 -0
  303. numpy/f2py/capi_maps.pyi +33 -0
  304. numpy/f2py/cb_rules.py +665 -0
  305. numpy/f2py/cb_rules.pyi +17 -0
  306. numpy/f2py/cfuncs.py +1563 -0
  307. numpy/f2py/cfuncs.pyi +31 -0
  308. numpy/f2py/common_rules.py +143 -0
  309. numpy/f2py/common_rules.pyi +9 -0
  310. numpy/f2py/crackfortran.py +3725 -0
  311. numpy/f2py/crackfortran.pyi +266 -0
  312. numpy/f2py/diagnose.py +149 -0
  313. numpy/f2py/diagnose.pyi +1 -0
  314. numpy/f2py/f2py2e.py +788 -0
  315. numpy/f2py/f2py2e.pyi +74 -0
  316. numpy/f2py/f90mod_rules.py +269 -0
  317. numpy/f2py/f90mod_rules.pyi +16 -0
  318. numpy/f2py/func2subr.py +329 -0
  319. numpy/f2py/func2subr.pyi +7 -0
  320. numpy/f2py/rules.py +1629 -0
  321. numpy/f2py/rules.pyi +41 -0
  322. numpy/f2py/setup.cfg +3 -0
  323. numpy/f2py/src/fortranobject.c +1436 -0
  324. numpy/f2py/src/fortranobject.h +173 -0
  325. numpy/f2py/symbolic.py +1518 -0
  326. numpy/f2py/symbolic.pyi +219 -0
  327. numpy/f2py/tests/__init__.py +16 -0
  328. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  329. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  330. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  331. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  332. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  333. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  334. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  335. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  336. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  337. numpy/f2py/tests/src/callback/foo.f +62 -0
  338. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  339. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  340. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  341. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  342. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  343. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  344. numpy/f2py/tests/src/cli/hi77.f +3 -0
  345. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  346. numpy/f2py/tests/src/common/block.f +11 -0
  347. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  348. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  349. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  350. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  351. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  352. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  353. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  354. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  355. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  356. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  357. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  358. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  359. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  360. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  361. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  362. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  363. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  364. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  365. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  366. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  367. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  368. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  369. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  370. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  371. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  372. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  373. numpy/f2py/tests/src/mixed/foo.f +5 -0
  374. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  375. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  376. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  377. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  378. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  379. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  380. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  381. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  382. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  383. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  384. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  385. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  386. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  387. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  388. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  389. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  390. numpy/f2py/tests/src/regression/AB.inc +1 -0
  391. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  392. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  393. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  394. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  395. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  396. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  397. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  398. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  399. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  400. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  401. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  402. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  403. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  404. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  405. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  406. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  407. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  408. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  409. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  410. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  411. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  412. numpy/f2py/tests/src/routines/subrout.f +4 -0
  413. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  414. numpy/f2py/tests/src/size/foo.f90 +44 -0
  415. numpy/f2py/tests/src/string/char.f90 +29 -0
  416. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  417. numpy/f2py/tests/src/string/gh24008.f +8 -0
  418. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  419. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  420. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  421. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  422. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  423. numpy/f2py/tests/src/string/string.f +12 -0
  424. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  425. numpy/f2py/tests/test_abstract_interface.py +26 -0
  426. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  427. numpy/f2py/tests/test_assumed_shape.py +50 -0
  428. numpy/f2py/tests/test_block_docstring.py +20 -0
  429. numpy/f2py/tests/test_callback.py +263 -0
  430. numpy/f2py/tests/test_character.py +641 -0
  431. numpy/f2py/tests/test_common.py +23 -0
  432. numpy/f2py/tests/test_crackfortran.py +421 -0
  433. numpy/f2py/tests/test_data.py +71 -0
  434. numpy/f2py/tests/test_docs.py +66 -0
  435. numpy/f2py/tests/test_f2cmap.py +17 -0
  436. numpy/f2py/tests/test_f2py2e.py +983 -0
  437. numpy/f2py/tests/test_isoc.py +56 -0
  438. numpy/f2py/tests/test_kind.py +52 -0
  439. numpy/f2py/tests/test_mixed.py +35 -0
  440. numpy/f2py/tests/test_modules.py +83 -0
  441. numpy/f2py/tests/test_parameter.py +129 -0
  442. numpy/f2py/tests/test_pyf_src.py +43 -0
  443. numpy/f2py/tests/test_quoted_character.py +18 -0
  444. numpy/f2py/tests/test_regression.py +187 -0
  445. numpy/f2py/tests/test_return_character.py +48 -0
  446. numpy/f2py/tests/test_return_complex.py +67 -0
  447. numpy/f2py/tests/test_return_integer.py +55 -0
  448. numpy/f2py/tests/test_return_logical.py +65 -0
  449. numpy/f2py/tests/test_return_real.py +109 -0
  450. numpy/f2py/tests/test_routines.py +29 -0
  451. numpy/f2py/tests/test_semicolon_split.py +75 -0
  452. numpy/f2py/tests/test_size.py +45 -0
  453. numpy/f2py/tests/test_string.py +100 -0
  454. numpy/f2py/tests/test_symbolic.py +500 -0
  455. numpy/f2py/tests/test_value_attrspec.py +15 -0
  456. numpy/f2py/tests/util.py +442 -0
  457. numpy/f2py/use_rules.py +99 -0
  458. numpy/f2py/use_rules.pyi +9 -0
  459. numpy/fft/__init__.py +213 -0
  460. numpy/fft/__init__.pyi +38 -0
  461. numpy/fft/_helper.py +235 -0
  462. numpy/fft/_helper.pyi +44 -0
  463. numpy/fft/_pocketfft.py +1693 -0
  464. numpy/fft/_pocketfft.pyi +137 -0
  465. numpy/fft/_pocketfft_umath.cpython-314-x86_64-linux-musl.so +0 -0
  466. numpy/fft/tests/__init__.py +0 -0
  467. numpy/fft/tests/test_helper.py +167 -0
  468. numpy/fft/tests/test_pocketfft.py +589 -0
  469. numpy/lib/__init__.py +97 -0
  470. numpy/lib/__init__.pyi +52 -0
  471. numpy/lib/_array_utils_impl.py +62 -0
  472. numpy/lib/_array_utils_impl.pyi +10 -0
  473. numpy/lib/_arraypad_impl.py +926 -0
  474. numpy/lib/_arraypad_impl.pyi +88 -0
  475. numpy/lib/_arraysetops_impl.py +1158 -0
  476. numpy/lib/_arraysetops_impl.pyi +462 -0
  477. numpy/lib/_arrayterator_impl.py +224 -0
  478. numpy/lib/_arrayterator_impl.pyi +45 -0
  479. numpy/lib/_datasource.py +700 -0
  480. numpy/lib/_datasource.pyi +30 -0
  481. numpy/lib/_format_impl.py +1036 -0
  482. numpy/lib/_format_impl.pyi +56 -0
  483. numpy/lib/_function_base_impl.py +5758 -0
  484. numpy/lib/_function_base_impl.pyi +2324 -0
  485. numpy/lib/_histograms_impl.py +1085 -0
  486. numpy/lib/_histograms_impl.pyi +40 -0
  487. numpy/lib/_index_tricks_impl.py +1048 -0
  488. numpy/lib/_index_tricks_impl.pyi +267 -0
  489. numpy/lib/_iotools.py +900 -0
  490. numpy/lib/_iotools.pyi +116 -0
  491. numpy/lib/_nanfunctions_impl.py +2001 -0
  492. numpy/lib/_nanfunctions_impl.pyi +48 -0
  493. numpy/lib/_npyio_impl.py +2583 -0
  494. numpy/lib/_npyio_impl.pyi +299 -0
  495. numpy/lib/_polynomial_impl.py +1465 -0
  496. numpy/lib/_polynomial_impl.pyi +338 -0
  497. numpy/lib/_scimath_impl.py +642 -0
  498. numpy/lib/_scimath_impl.pyi +93 -0
  499. numpy/lib/_shape_base_impl.py +1289 -0
  500. numpy/lib/_shape_base_impl.pyi +236 -0
  501. numpy/lib/_stride_tricks_impl.py +582 -0
  502. numpy/lib/_stride_tricks_impl.pyi +73 -0
  503. numpy/lib/_twodim_base_impl.py +1201 -0
  504. numpy/lib/_twodim_base_impl.pyi +408 -0
  505. numpy/lib/_type_check_impl.py +710 -0
  506. numpy/lib/_type_check_impl.pyi +348 -0
  507. numpy/lib/_ufunclike_impl.py +199 -0
  508. numpy/lib/_ufunclike_impl.pyi +60 -0
  509. numpy/lib/_user_array_impl.py +310 -0
  510. numpy/lib/_user_array_impl.pyi +226 -0
  511. numpy/lib/_utils_impl.py +784 -0
  512. numpy/lib/_utils_impl.pyi +22 -0
  513. numpy/lib/_version.py +153 -0
  514. numpy/lib/_version.pyi +17 -0
  515. numpy/lib/array_utils.py +7 -0
  516. numpy/lib/array_utils.pyi +6 -0
  517. numpy/lib/format.py +24 -0
  518. numpy/lib/format.pyi +24 -0
  519. numpy/lib/introspect.py +94 -0
  520. numpy/lib/introspect.pyi +3 -0
  521. numpy/lib/mixins.py +180 -0
  522. numpy/lib/mixins.pyi +78 -0
  523. numpy/lib/npyio.py +1 -0
  524. numpy/lib/npyio.pyi +5 -0
  525. numpy/lib/recfunctions.py +1681 -0
  526. numpy/lib/recfunctions.pyi +444 -0
  527. numpy/lib/scimath.py +13 -0
  528. numpy/lib/scimath.pyi +12 -0
  529. numpy/lib/stride_tricks.py +1 -0
  530. numpy/lib/stride_tricks.pyi +4 -0
  531. numpy/lib/tests/__init__.py +0 -0
  532. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  533. numpy/lib/tests/data/py2-objarr.npy +0 -0
  534. numpy/lib/tests/data/py2-objarr.npz +0 -0
  535. numpy/lib/tests/data/py3-objarr.npy +0 -0
  536. numpy/lib/tests/data/py3-objarr.npz +0 -0
  537. numpy/lib/tests/data/python3.npy +0 -0
  538. numpy/lib/tests/data/win64python2.npy +0 -0
  539. numpy/lib/tests/test__datasource.py +328 -0
  540. numpy/lib/tests/test__iotools.py +358 -0
  541. numpy/lib/tests/test__version.py +64 -0
  542. numpy/lib/tests/test_array_utils.py +32 -0
  543. numpy/lib/tests/test_arraypad.py +1427 -0
  544. numpy/lib/tests/test_arraysetops.py +1302 -0
  545. numpy/lib/tests/test_arrayterator.py +45 -0
  546. numpy/lib/tests/test_format.py +1054 -0
  547. numpy/lib/tests/test_function_base.py +4705 -0
  548. numpy/lib/tests/test_histograms.py +855 -0
  549. numpy/lib/tests/test_index_tricks.py +693 -0
  550. numpy/lib/tests/test_io.py +2857 -0
  551. numpy/lib/tests/test_loadtxt.py +1099 -0
  552. numpy/lib/tests/test_mixins.py +215 -0
  553. numpy/lib/tests/test_nanfunctions.py +1438 -0
  554. numpy/lib/tests/test_packbits.py +376 -0
  555. numpy/lib/tests/test_polynomial.py +325 -0
  556. numpy/lib/tests/test_recfunctions.py +1042 -0
  557. numpy/lib/tests/test_regression.py +231 -0
  558. numpy/lib/tests/test_shape_base.py +813 -0
  559. numpy/lib/tests/test_stride_tricks.py +655 -0
  560. numpy/lib/tests/test_twodim_base.py +559 -0
  561. numpy/lib/tests/test_type_check.py +473 -0
  562. numpy/lib/tests/test_ufunclike.py +97 -0
  563. numpy/lib/tests/test_utils.py +80 -0
  564. numpy/lib/user_array.py +1 -0
  565. numpy/lib/user_array.pyi +1 -0
  566. numpy/linalg/__init__.py +95 -0
  567. numpy/linalg/__init__.pyi +71 -0
  568. numpy/linalg/_linalg.py +3657 -0
  569. numpy/linalg/_linalg.pyi +548 -0
  570. numpy/linalg/_umath_linalg.cpython-314-x86_64-linux-musl.so +0 -0
  571. numpy/linalg/_umath_linalg.pyi +60 -0
  572. numpy/linalg/lapack_lite.cpython-314-x86_64-linux-musl.so +0 -0
  573. numpy/linalg/lapack_lite.pyi +143 -0
  574. numpy/linalg/tests/__init__.py +0 -0
  575. numpy/linalg/tests/test_deprecations.py +21 -0
  576. numpy/linalg/tests/test_linalg.py +2442 -0
  577. numpy/linalg/tests/test_regression.py +182 -0
  578. numpy/ma/API_CHANGES.txt +135 -0
  579. numpy/ma/LICENSE +24 -0
  580. numpy/ma/README.rst +236 -0
  581. numpy/ma/__init__.py +53 -0
  582. numpy/ma/__init__.pyi +458 -0
  583. numpy/ma/core.py +8929 -0
  584. numpy/ma/core.pyi +3720 -0
  585. numpy/ma/extras.py +2266 -0
  586. numpy/ma/extras.pyi +297 -0
  587. numpy/ma/mrecords.py +762 -0
  588. numpy/ma/mrecords.pyi +96 -0
  589. numpy/ma/tests/__init__.py +0 -0
  590. numpy/ma/tests/test_arrayobject.py +40 -0
  591. numpy/ma/tests/test_core.py +6008 -0
  592. numpy/ma/tests/test_deprecations.py +65 -0
  593. numpy/ma/tests/test_extras.py +1945 -0
  594. numpy/ma/tests/test_mrecords.py +495 -0
  595. numpy/ma/tests/test_old_ma.py +939 -0
  596. numpy/ma/tests/test_regression.py +83 -0
  597. numpy/ma/tests/test_subclassing.py +469 -0
  598. numpy/ma/testutils.py +294 -0
  599. numpy/ma/testutils.pyi +69 -0
  600. numpy/matlib.py +380 -0
  601. numpy/matlib.pyi +580 -0
  602. numpy/matrixlib/__init__.py +12 -0
  603. numpy/matrixlib/__init__.pyi +3 -0
  604. numpy/matrixlib/defmatrix.py +1119 -0
  605. numpy/matrixlib/defmatrix.pyi +218 -0
  606. numpy/matrixlib/tests/__init__.py +0 -0
  607. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  608. numpy/matrixlib/tests/test_interaction.py +360 -0
  609. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  610. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  611. numpy/matrixlib/tests/test_multiarray.py +17 -0
  612. numpy/matrixlib/tests/test_numeric.py +18 -0
  613. numpy/matrixlib/tests/test_regression.py +31 -0
  614. numpy/polynomial/__init__.py +187 -0
  615. numpy/polynomial/__init__.pyi +31 -0
  616. numpy/polynomial/_polybase.py +1191 -0
  617. numpy/polynomial/_polybase.pyi +262 -0
  618. numpy/polynomial/_polytypes.pyi +501 -0
  619. numpy/polynomial/chebyshev.py +2001 -0
  620. numpy/polynomial/chebyshev.pyi +180 -0
  621. numpy/polynomial/hermite.py +1738 -0
  622. numpy/polynomial/hermite.pyi +106 -0
  623. numpy/polynomial/hermite_e.py +1640 -0
  624. numpy/polynomial/hermite_e.pyi +106 -0
  625. numpy/polynomial/laguerre.py +1673 -0
  626. numpy/polynomial/laguerre.pyi +100 -0
  627. numpy/polynomial/legendre.py +1603 -0
  628. numpy/polynomial/legendre.pyi +100 -0
  629. numpy/polynomial/polynomial.py +1625 -0
  630. numpy/polynomial/polynomial.pyi +109 -0
  631. numpy/polynomial/polyutils.py +759 -0
  632. numpy/polynomial/polyutils.pyi +307 -0
  633. numpy/polynomial/tests/__init__.py +0 -0
  634. numpy/polynomial/tests/test_chebyshev.py +618 -0
  635. numpy/polynomial/tests/test_classes.py +613 -0
  636. numpy/polynomial/tests/test_hermite.py +553 -0
  637. numpy/polynomial/tests/test_hermite_e.py +554 -0
  638. numpy/polynomial/tests/test_laguerre.py +535 -0
  639. numpy/polynomial/tests/test_legendre.py +566 -0
  640. numpy/polynomial/tests/test_polynomial.py +691 -0
  641. numpy/polynomial/tests/test_polyutils.py +123 -0
  642. numpy/polynomial/tests/test_printing.py +557 -0
  643. numpy/polynomial/tests/test_symbol.py +217 -0
  644. numpy/py.typed +0 -0
  645. numpy/random/LICENSE.md +71 -0
  646. numpy/random/__init__.pxd +14 -0
  647. numpy/random/__init__.py +213 -0
  648. numpy/random/__init__.pyi +124 -0
  649. numpy/random/_bounded_integers.cpython-314-x86_64-linux-musl.so +0 -0
  650. numpy/random/_bounded_integers.pxd +29 -0
  651. numpy/random/_bounded_integers.pyi +1 -0
  652. numpy/random/_common.cpython-314-x86_64-linux-musl.so +0 -0
  653. numpy/random/_common.pxd +107 -0
  654. numpy/random/_common.pyi +16 -0
  655. numpy/random/_examples/cffi/extending.py +44 -0
  656. numpy/random/_examples/cffi/parse.py +53 -0
  657. numpy/random/_examples/cython/extending.pyx +77 -0
  658. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  659. numpy/random/_examples/cython/meson.build +53 -0
  660. numpy/random/_examples/numba/extending.py +86 -0
  661. numpy/random/_examples/numba/extending_distributions.py +67 -0
  662. numpy/random/_generator.cpython-314-x86_64-linux-musl.so +0 -0
  663. numpy/random/_generator.pyi +862 -0
  664. numpy/random/_mt19937.cpython-314-x86_64-linux-musl.so +0 -0
  665. numpy/random/_mt19937.pyi +27 -0
  666. numpy/random/_pcg64.cpython-314-x86_64-linux-musl.so +0 -0
  667. numpy/random/_pcg64.pyi +41 -0
  668. numpy/random/_philox.cpython-314-x86_64-linux-musl.so +0 -0
  669. numpy/random/_philox.pyi +36 -0
  670. numpy/random/_pickle.py +88 -0
  671. numpy/random/_pickle.pyi +43 -0
  672. numpy/random/_sfc64.cpython-314-x86_64-linux-musl.so +0 -0
  673. numpy/random/_sfc64.pyi +25 -0
  674. numpy/random/bit_generator.cpython-314-x86_64-linux-musl.so +0 -0
  675. numpy/random/bit_generator.pxd +35 -0
  676. numpy/random/bit_generator.pyi +123 -0
  677. numpy/random/c_distributions.pxd +119 -0
  678. numpy/random/lib/libnpyrandom.a +0 -0
  679. numpy/random/mtrand.cpython-314-x86_64-linux-musl.so +0 -0
  680. numpy/random/mtrand.pyi +759 -0
  681. numpy/random/tests/__init__.py +0 -0
  682. numpy/random/tests/data/__init__.py +0 -0
  683. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  684. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  685. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  686. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  687. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  688. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  689. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  690. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  691. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  692. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  693. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  694. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  695. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  696. numpy/random/tests/test_direct.py +595 -0
  697. numpy/random/tests/test_extending.py +131 -0
  698. numpy/random/tests/test_generator_mt19937.py +2825 -0
  699. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  700. numpy/random/tests/test_random.py +1724 -0
  701. numpy/random/tests/test_randomstate.py +2099 -0
  702. numpy/random/tests/test_randomstate_regression.py +213 -0
  703. numpy/random/tests/test_regression.py +175 -0
  704. numpy/random/tests/test_seed_sequence.py +79 -0
  705. numpy/random/tests/test_smoke.py +882 -0
  706. numpy/rec/__init__.py +2 -0
  707. numpy/rec/__init__.pyi +23 -0
  708. numpy/strings/__init__.py +2 -0
  709. numpy/strings/__init__.pyi +97 -0
  710. numpy/testing/__init__.py +22 -0
  711. numpy/testing/__init__.pyi +107 -0
  712. numpy/testing/_private/__init__.py +0 -0
  713. numpy/testing/_private/__init__.pyi +0 -0
  714. numpy/testing/_private/extbuild.py +250 -0
  715. numpy/testing/_private/extbuild.pyi +25 -0
  716. numpy/testing/_private/utils.py +2830 -0
  717. numpy/testing/_private/utils.pyi +505 -0
  718. numpy/testing/overrides.py +84 -0
  719. numpy/testing/overrides.pyi +10 -0
  720. numpy/testing/print_coercion_tables.py +207 -0
  721. numpy/testing/print_coercion_tables.pyi +26 -0
  722. numpy/testing/tests/__init__.py +0 -0
  723. numpy/testing/tests/test_utils.py +2123 -0
  724. numpy/tests/__init__.py +0 -0
  725. numpy/tests/test__all__.py +10 -0
  726. numpy/tests/test_configtool.py +51 -0
  727. numpy/tests/test_ctypeslib.py +383 -0
  728. numpy/tests/test_lazyloading.py +42 -0
  729. numpy/tests/test_matlib.py +59 -0
  730. numpy/tests/test_numpy_config.py +47 -0
  731. numpy/tests/test_numpy_version.py +54 -0
  732. numpy/tests/test_public_api.py +804 -0
  733. numpy/tests/test_reloading.py +76 -0
  734. numpy/tests/test_scripts.py +48 -0
  735. numpy/tests/test_warnings.py +79 -0
  736. numpy/typing/__init__.py +233 -0
  737. numpy/typing/__init__.pyi +3 -0
  738. numpy/typing/mypy_plugin.py +200 -0
  739. numpy/typing/tests/__init__.py +0 -0
  740. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  741. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  742. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  743. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  744. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  745. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  746. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  747. numpy/typing/tests/data/fail/char.pyi +63 -0
  748. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  749. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  750. numpy/typing/tests/data/fail/constants.pyi +3 -0
  751. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  752. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  753. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  754. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  755. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  756. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  757. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  758. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  759. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  760. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  761. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  762. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  763. numpy/typing/tests/data/fail/ma.pyi +155 -0
  764. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  765. numpy/typing/tests/data/fail/modules.pyi +17 -0
  766. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  767. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  768. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  769. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  770. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  771. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  772. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  773. numpy/typing/tests/data/fail/random.pyi +62 -0
  774. numpy/typing/tests/data/fail/rec.pyi +17 -0
  775. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  776. numpy/typing/tests/data/fail/shape.pyi +7 -0
  777. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  778. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  779. numpy/typing/tests/data/fail/strings.pyi +52 -0
  780. numpy/typing/tests/data/fail/testing.pyi +28 -0
  781. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  782. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  783. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  784. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  785. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  786. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  787. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  788. numpy/typing/tests/data/mypy.ini +8 -0
  789. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  790. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  791. numpy/typing/tests/data/pass/array_like.py +43 -0
  792. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  793. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  794. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  795. numpy/typing/tests/data/pass/comparisons.py +316 -0
  796. numpy/typing/tests/data/pass/dtype.py +57 -0
  797. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  798. numpy/typing/tests/data/pass/flatiter.py +26 -0
  799. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  800. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  801. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  802. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  803. numpy/typing/tests/data/pass/lib_version.py +18 -0
  804. numpy/typing/tests/data/pass/literal.py +52 -0
  805. numpy/typing/tests/data/pass/ma.py +199 -0
  806. numpy/typing/tests/data/pass/mod.py +149 -0
  807. numpy/typing/tests/data/pass/modules.py +45 -0
  808. numpy/typing/tests/data/pass/multiarray.py +77 -0
  809. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  810. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  811. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  812. numpy/typing/tests/data/pass/nditer.py +4 -0
  813. numpy/typing/tests/data/pass/numeric.py +90 -0
  814. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  815. numpy/typing/tests/data/pass/random.py +1498 -0
  816. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  817. numpy/typing/tests/data/pass/scalars.py +249 -0
  818. numpy/typing/tests/data/pass/shape.py +19 -0
  819. numpy/typing/tests/data/pass/simple.py +170 -0
  820. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  821. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  822. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  823. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  824. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  825. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  826. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  827. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  828. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  829. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  830. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  831. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  832. numpy/typing/tests/data/reveal/char.pyi +225 -0
  833. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  834. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  835. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  836. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  837. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  838. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  839. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  840. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  841. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  842. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  843. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  844. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  845. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  846. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  847. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  848. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  849. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  850. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  851. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  852. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  853. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  854. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  855. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  856. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  857. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  858. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  859. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  860. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  861. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  862. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  863. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  864. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  865. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  866. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  867. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  868. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  869. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  870. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  871. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  872. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  873. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  874. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  875. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  876. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  877. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  878. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  879. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  880. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  881. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  882. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  883. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  884. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  885. numpy/typing/tests/test_isfile.py +38 -0
  886. numpy/typing/tests/test_runtime.py +110 -0
  887. numpy/typing/tests/test_typing.py +205 -0
  888. numpy/version.py +11 -0
  889. numpy/version.pyi +9 -0
  890. numpy-2.4.0.dist-info/METADATA +139 -0
  891. numpy-2.4.0.dist-info/RECORD +916 -0
  892. numpy-2.4.0.dist-info/WHEEL +5 -0
  893. numpy-2.4.0.dist-info/entry_points.txt +13 -0
  894. numpy-2.4.0.dist-info/licenses/LICENSE.txt +935 -0
  895. numpy-2.4.0.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  896. numpy-2.4.0.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  897. numpy-2.4.0.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  898. numpy-2.4.0.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  899. numpy-2.4.0.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  900. numpy-2.4.0.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  901. numpy-2.4.0.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  902. numpy-2.4.0.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  903. numpy-2.4.0.dist-info/licenses/numpy/ma/LICENSE +24 -0
  904. numpy-2.4.0.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  905. numpy-2.4.0.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  906. numpy-2.4.0.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  907. numpy-2.4.0.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  908. numpy-2.4.0.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  909. numpy-2.4.0.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  910. numpy-2.4.0.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
  911. numpy.libs/libgcc_s-0cd532bd-c8f934f9.so.1 +0 -0
  912. numpy.libs/libgcc_s-0cd532bd.so.1 +0 -0
  913. numpy.libs/libgfortran-2c33b284-17a27ac2.so.5.0.0 +0 -0
  914. numpy.libs/libquadmath-bb76a5fc-feb0f212.so.0.0.0 +0 -0
  915. numpy.libs/libscipy_openblas64_-55393b74.so +0 -0
  916. numpy.libs/libstdc++-5d72f927.so.6.0.33 +0 -0
@@ -0,0 +1,1515 @@
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", ["S", "U", "T"])
198
+ class TestMethods:
199
+
200
+ @pytest.mark.parametrize("in1,in2,out", [
201
+ ("", "", ""),
202
+ ("abc", "abc", "abcabc"),
203
+ ("12345", "12345", "1234512345"),
204
+ ("MixedCase", "MixedCase", "MixedCaseMixedCase"),
205
+ ("12345 \0 ", "12345 \0 ", "12345 \0 12345 \0 "),
206
+ ("UPPER", "UPPER", "UPPERUPPER"),
207
+ (["abc", "def"], ["hello", "world"], ["abchello", "defworld"]),
208
+ ])
209
+ def test_add(self, in1, in2, out, dt):
210
+ in1 = np.array(in1, dtype=dt)
211
+ in2 = np.array(in2, dtype=dt)
212
+ out = np.array(out, dtype=dt)
213
+ assert_array_equal(np.strings.add(in1, in2), out)
214
+
215
+ @pytest.mark.parametrize("in1,in2,out", [
216
+ ("abc", 3, "abcabcabc"),
217
+ ("abc", 0, ""),
218
+ ("abc", -1, ""),
219
+ (["abc", "def"], [1, 4], ["abc", "defdefdefdef"]),
220
+ ])
221
+ def test_multiply(self, in1, in2, out, dt):
222
+ in1 = np.array(in1, dtype=dt)
223
+ out = np.array(out, dtype=dt)
224
+ assert_array_equal(np.strings.multiply(in1, in2), out)
225
+
226
+ def test_multiply_raises(self, dt):
227
+ with pytest.raises(TypeError, match="unsupported type"):
228
+ np.strings.multiply(np.array("abc", dtype=dt), 3.14)
229
+
230
+ with pytest.raises(OverflowError):
231
+ np.strings.multiply(np.array("abc", dtype=dt), sys.maxsize)
232
+
233
+ def test_inplace_multiply(self, dt):
234
+ arr = np.array(['foo ', 'bar'], dtype=dt)
235
+ arr *= 2
236
+ if dt != "T":
237
+ assert_array_equal(arr, np.array(['foo ', 'barb'], dtype=dt))
238
+ else:
239
+ assert_array_equal(arr, ['foo foo ', 'barbar'])
240
+
241
+ with pytest.raises(OverflowError):
242
+ arr *= sys.maxsize
243
+
244
+ @pytest.mark.parametrize("i_dt", [np.int8, np.int16, np.int32,
245
+ np.int64, np.int_])
246
+ def test_multiply_integer_dtypes(self, i_dt, dt):
247
+ a = np.array("abc", dtype=dt)
248
+ i = np.array(3, dtype=i_dt)
249
+ res = np.array("abcabcabc", dtype=dt)
250
+ assert_array_equal(np.strings.multiply(a, i), res)
251
+
252
+ @pytest.mark.parametrize("in_,out", [
253
+ ("", False),
254
+ ("a", True),
255
+ ("A", True),
256
+ ("\n", False),
257
+ ("abc", True),
258
+ ("aBc123", False),
259
+ ("abc\n", False),
260
+ (["abc", "aBc123"], [True, False]),
261
+ ])
262
+ def test_isalpha(self, in_, out, dt):
263
+ in_ = np.array(in_, dtype=dt)
264
+ assert_array_equal(np.strings.isalpha(in_), out)
265
+
266
+ @pytest.mark.parametrize("in_,out", [
267
+ ('', False),
268
+ ('a', True),
269
+ ('A', True),
270
+ ('\n', False),
271
+ ('123abc456', True),
272
+ ('a1b3c', True),
273
+ ('aBc000 ', False),
274
+ ('abc\n', False),
275
+ ])
276
+ def test_isalnum(self, in_, out, dt):
277
+ in_ = np.array(in_, dtype=dt)
278
+ assert_array_equal(np.strings.isalnum(in_), out)
279
+
280
+ @pytest.mark.parametrize("in_,out", [
281
+ ("", False),
282
+ ("a", False),
283
+ ("0", True),
284
+ ("012345", True),
285
+ ("012345a", False),
286
+ (["a", "012345"], [False, True]),
287
+ ])
288
+ def test_isdigit(self, in_, out, dt):
289
+ in_ = np.array(in_, dtype=dt)
290
+ assert_array_equal(np.strings.isdigit(in_), out)
291
+
292
+ @pytest.mark.parametrize("in_,out", [
293
+ ("", False),
294
+ ("a", False),
295
+ ("1", False),
296
+ (" ", True),
297
+ ("\t", True),
298
+ ("\r", True),
299
+ ("\n", True),
300
+ (" \t\r \n", True),
301
+ (" \t\r\na", False),
302
+ (["\t1", " \t\r \n"], [False, True])
303
+ ])
304
+ def test_isspace(self, in_, out, dt):
305
+ in_ = np.array(in_, dtype=dt)
306
+ assert_array_equal(np.strings.isspace(in_), out)
307
+
308
+ @pytest.mark.parametrize("in_,out", [
309
+ ('', False),
310
+ ('a', True),
311
+ ('A', False),
312
+ ('\n', False),
313
+ ('abc', True),
314
+ ('aBc', False),
315
+ ('abc\n', True),
316
+ ])
317
+ def test_islower(self, in_, out, dt):
318
+ in_ = np.array(in_, dtype=dt)
319
+ assert_array_equal(np.strings.islower(in_), out)
320
+
321
+ @pytest.mark.parametrize("in_,out", [
322
+ ('', False),
323
+ ('a', False),
324
+ ('A', True),
325
+ ('\n', False),
326
+ ('ABC', True),
327
+ ('AbC', False),
328
+ ('ABC\n', True),
329
+ ])
330
+ def test_isupper(self, in_, out, dt):
331
+ in_ = np.array(in_, dtype=dt)
332
+ assert_array_equal(np.strings.isupper(in_), out)
333
+
334
+ @pytest.mark.parametrize("in_,out", [
335
+ ('', False),
336
+ ('a', False),
337
+ ('A', True),
338
+ ('\n', False),
339
+ ('A Titlecased Line', True),
340
+ ('A\nTitlecased Line', True),
341
+ ('A Titlecased, Line', True),
342
+ ('Not a capitalized String', False),
343
+ ('Not\ta Titlecase String', False),
344
+ ('Not--a Titlecase String', False),
345
+ ('NOT', False),
346
+ ])
347
+ def test_istitle(self, in_, out, dt):
348
+ in_ = np.array(in_, dtype=dt)
349
+ assert_array_equal(np.strings.istitle(in_), out)
350
+
351
+ @pytest.mark.parametrize("in_,out", [
352
+ ("", 0),
353
+ ("abc", 3),
354
+ ("12345", 5),
355
+ ("MixedCase", 9),
356
+ ("12345 \x00 ", 8),
357
+ ("UPPER", 5),
358
+ (["abc", "12345 \x00 "], [3, 8]),
359
+ ])
360
+ def test_str_len(self, in_, out, dt):
361
+ in_ = np.array(in_, dtype=dt)
362
+ assert_array_equal(np.strings.str_len(in_), out)
363
+
364
+ @pytest.mark.parametrize("a,sub,start,end,out", [
365
+ ("abcdefghiabc", "abc", 0, None, 0),
366
+ ("abcdefghiabc", "abc", 1, None, 9),
367
+ ("abcdefghiabc", "def", 4, None, -1),
368
+ ("abc", "", 0, None, 0),
369
+ ("abc", "", 3, None, 3),
370
+ ("abc", "", 4, None, -1),
371
+ ("rrarrrrrrrrra", "a", 0, None, 2),
372
+ ("rrarrrrrrrrra", "a", 4, None, 12),
373
+ ("rrarrrrrrrrra", "a", 4, 6, -1),
374
+ ("", "", 0, None, 0),
375
+ ("", "", 1, 1, -1),
376
+ ("", "", MAX, 0, -1),
377
+ ("", "xx", 0, None, -1),
378
+ ("", "xx", 1, 1, -1),
379
+ ("", "xx", MAX, 0, -1),
380
+ pytest.param(99 * "a" + "b", "b", 0, None, 99,
381
+ id="99*a+b-b-0-None-99"),
382
+ pytest.param(98 * "a" + "ba", "ba", 0, None, 98,
383
+ id="98*a+ba-ba-0-None-98"),
384
+ pytest.param(100 * "a", "b", 0, None, -1,
385
+ id="100*a-b-0-None--1"),
386
+ pytest.param(30000 * "a" + 100 * "b", 100 * "b", 0, None, 30000,
387
+ id="30000*a+100*b-100*b-0-None-30000"),
388
+ pytest.param(30000 * "a", 100 * "b", 0, None, -1,
389
+ id="30000*a-100*b-0-None--1"),
390
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "b", 0, None, 15000,
391
+ id="15000*a+15000*b-15000*b-0-None-15000"),
392
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "c", 0, None, -1,
393
+ id="15000*a+15000*b-15000*c-0-None--1"),
394
+ (["abcdefghiabc", "rrarrrrrrrrra"], ["def", "arr"], [0, 3],
395
+ None, [3, -1]),
396
+ ("Ae¢☃€ 😊" * 2, "😊", 0, None, 6),
397
+ ("Ae¢☃€ 😊" * 2, "😊", 7, None, 13),
398
+ pytest.param("A" * (2 ** 17), r"[\w]+\Z", 0, None, -1,
399
+ id=r"A*2**17-[\w]+\Z-0-None--1"),
400
+ ])
401
+ def test_find(self, a, sub, start, end, out, dt):
402
+ if "😊" in a and dt == "S":
403
+ pytest.skip("Bytes dtype does not support non-ascii input")
404
+ a = np.array(a, dtype=dt)
405
+ sub = np.array(sub, dtype=dt)
406
+ assert_array_equal(np.strings.find(a, sub, start, end), out)
407
+
408
+ @pytest.mark.parametrize("a,sub,start,end,out", [
409
+ ("abcdefghiabc", "abc", 0, None, 9),
410
+ ("abcdefghiabc", "", 0, None, 12),
411
+ ("abcdefghiabc", "abcd", 0, None, 0),
412
+ ("abcdefghiabc", "abcz", 0, None, -1),
413
+ ("abc", "", 0, None, 3),
414
+ ("abc", "", 3, None, 3),
415
+ ("abc", "", 4, None, -1),
416
+ ("rrarrrrrrrrra", "a", 0, None, 12),
417
+ ("rrarrrrrrrrra", "a", 4, None, 12),
418
+ ("rrarrrrrrrrra", "a", 4, 6, -1),
419
+ (["abcdefghiabc", "rrarrrrrrrrra"], ["abc", "a"], [0, 0],
420
+ None, [9, 12]),
421
+ ("Ae¢☃€ 😊" * 2, "😊", 0, None, 13),
422
+ ("Ae¢☃€ 😊" * 2, "😊", 0, 7, 6),
423
+ ])
424
+ def test_rfind(self, a, sub, start, end, out, dt):
425
+ if "😊" in a and dt == "S":
426
+ pytest.skip("Bytes dtype does not support non-ascii input")
427
+ a = np.array(a, dtype=dt)
428
+ sub = np.array(sub, dtype=dt)
429
+ assert_array_equal(np.strings.rfind(a, sub, start, end), out)
430
+
431
+ @pytest.mark.parametrize("a,sub,start,end,out", [
432
+ ("aaa", "a", 0, None, 3),
433
+ ("aaa", "b", 0, None, 0),
434
+ ("aaa", "a", 1, None, 2),
435
+ ("aaa", "a", 10, None, 0),
436
+ ("aaa", "a", -1, None, 1),
437
+ ("aaa", "a", -10, None, 3),
438
+ ("aaa", "a", 0, 1, 1),
439
+ ("aaa", "a", 0, 10, 3),
440
+ ("aaa", "a", 0, -1, 2),
441
+ ("aaa", "a", 0, -10, 0),
442
+ ("aaa", "", 1, None, 3),
443
+ ("aaa", "", 3, None, 1),
444
+ ("aaa", "", 10, None, 0),
445
+ ("aaa", "", -1, None, 2),
446
+ ("aaa", "", -10, None, 4),
447
+ ("aaa", "aaaa", 0, None, 0),
448
+ pytest.param(98 * "a" + "ba", "ba", 0, None, 1,
449
+ id="98*a+ba-ba-0-None-1"),
450
+ pytest.param(30000 * "a" + 100 * "b", 100 * "b", 0, None, 1,
451
+ id="30000*a+100*b-100*b-0-None-1"),
452
+ pytest.param(30000 * "a", 100 * "b", 0, None, 0,
453
+ id="30000*a-100*b-0-None-0"),
454
+ pytest.param(30000 * "a" + 100 * "ab", "ab", 0, None, 100,
455
+ id="30000*a+100*ab-ab-0-None-100"),
456
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "b", 0, None, 1,
457
+ id="15000*a+15000*b-15000*b-0-None-1"),
458
+ pytest.param(15000 * "a" + 15000 * "b", 15000 * "c", 0, None, 0,
459
+ id="15000*a+15000*b-15000*c-0-None-0"),
460
+ ("", "", 0, None, 1),
461
+ ("", "", 1, 1, 0),
462
+ ("", "", MAX, 0, 0),
463
+ ("", "xx", 0, None, 0),
464
+ ("", "xx", 1, 1, 0),
465
+ ("", "xx", MAX, 0, 0),
466
+ (["aaa", ""], ["a", ""], [0, 0], None, [3, 1]),
467
+ ("Ae¢☃€ 😊" * 100, "😊", 0, None, 100),
468
+ ])
469
+ def test_count(self, a, sub, start, end, out, dt):
470
+ if "😊" in a and dt == "S":
471
+ pytest.skip("Bytes dtype does not support non-ascii input")
472
+ a = np.array(a, dtype=dt)
473
+ sub = np.array(sub, dtype=dt)
474
+ assert_array_equal(np.strings.count(a, sub, start, end), out)
475
+
476
+ @pytest.mark.parametrize("a,prefix,start,end,out", [
477
+ ("hello", "he", 0, None, True),
478
+ ("hello", "hello", 0, None, True),
479
+ ("hello", "hello world", 0, None, False),
480
+ ("hello", "", 0, None, True),
481
+ ("hello", "ello", 0, None, False),
482
+ ("hello", "ello", 1, None, True),
483
+ ("hello", "o", 4, None, True),
484
+ ("hello", "o", 5, None, False),
485
+ ("hello", "", 5, None, True),
486
+ ("hello", "lo", 6, None, False),
487
+ ("helloworld", "lowo", 3, None, True),
488
+ ("helloworld", "lowo", 3, 7, True),
489
+ ("helloworld", "lowo", 3, 6, False),
490
+ ("", "", 0, 1, True),
491
+ ("", "", 0, 0, True),
492
+ ("", "", 1, 0, False),
493
+ ("hello", "he", 0, -1, True),
494
+ ("hello", "he", -53, -1, True),
495
+ ("hello", "hello", 0, -1, False),
496
+ ("hello", "hello world", -1, -10, False),
497
+ ("hello", "ello", -5, None, False),
498
+ ("hello", "ello", -4, None, True),
499
+ ("hello", "o", -2, None, False),
500
+ ("hello", "o", -1, None, True),
501
+ ("hello", "", -3, -3, True),
502
+ ("hello", "lo", -9, None, False),
503
+ (["hello", ""], ["he", ""], [0, 0], None, [True, True]),
504
+ ])
505
+ def test_startswith(self, a, prefix, start, end, out, dt):
506
+ a = np.array(a, dtype=dt)
507
+ prefix = np.array(prefix, dtype=dt)
508
+ assert_array_equal(np.strings.startswith(a, prefix, start, end), out)
509
+
510
+ @pytest.mark.parametrize("a,suffix,start,end,out", [
511
+ ("hello", "lo", 0, None, True),
512
+ ("hello", "he", 0, None, False),
513
+ ("hello", "", 0, None, True),
514
+ ("hello", "hello world", 0, None, False),
515
+ ("helloworld", "worl", 0, None, False),
516
+ ("helloworld", "worl", 3, 9, True),
517
+ ("helloworld", "world", 3, 12, True),
518
+ ("helloworld", "lowo", 1, 7, True),
519
+ ("helloworld", "lowo", 2, 7, True),
520
+ ("helloworld", "lowo", 3, 7, True),
521
+ ("helloworld", "lowo", 4, 7, False),
522
+ ("helloworld", "lowo", 3, 8, False),
523
+ ("ab", "ab", 0, 1, False),
524
+ ("ab", "ab", 0, 0, False),
525
+ ("", "", 0, 1, True),
526
+ ("", "", 0, 0, True),
527
+ ("", "", 1, 0, False),
528
+ ("hello", "lo", -2, None, True),
529
+ ("hello", "he", -2, None, False),
530
+ ("hello", "", -3, -3, True),
531
+ ("hello", "hello world", -10, -2, False),
532
+ ("helloworld", "worl", -6, None, False),
533
+ ("helloworld", "worl", -5, -1, True),
534
+ ("helloworld", "worl", -5, 9, True),
535
+ ("helloworld", "world", -7, 12, True),
536
+ ("helloworld", "lowo", -99, -3, True),
537
+ ("helloworld", "lowo", -8, -3, True),
538
+ ("helloworld", "lowo", -7, -3, True),
539
+ ("helloworld", "lowo", 3, -4, False),
540
+ ("helloworld", "lowo", -8, -2, False),
541
+ (["hello", "helloworld"], ["lo", "worl"], [0, -6], None,
542
+ [True, False]),
543
+ ])
544
+ def test_endswith(self, a, suffix, start, end, out, dt):
545
+ a = np.array(a, dtype=dt)
546
+ suffix = np.array(suffix, dtype=dt)
547
+ assert_array_equal(np.strings.endswith(a, suffix, start, end), out)
548
+
549
+ @pytest.mark.parametrize("a,chars,out", [
550
+ ("", None, ""),
551
+ (" hello ", None, "hello "),
552
+ ("hello", None, "hello"),
553
+ (" \t\n\r\f\vabc \t\n\r\f\v", None, "abc \t\n\r\f\v"),
554
+ ([" hello ", "hello"], None, ["hello ", "hello"]),
555
+ ("", "", ""),
556
+ ("", "xyz", ""),
557
+ ("hello", "", "hello"),
558
+ ("xyzzyhelloxyzzy", "xyz", "helloxyzzy"),
559
+ ("hello", "xyz", "hello"),
560
+ ("xyxz", "xyxz", ""),
561
+ ("xyxzx", "x", "yxzx"),
562
+ (["xyzzyhelloxyzzy", "hello"], ["xyz", "xyz"],
563
+ ["helloxyzzy", "hello"]),
564
+ (["ba", "ac", "baa", "bba"], "b", ["a", "ac", "aa", "a"]),
565
+ ])
566
+ def test_lstrip(self, a, chars, out, dt):
567
+ a = np.array(a, dtype=dt)
568
+ out = np.array(out, dtype=dt)
569
+ if chars is not None:
570
+ chars = np.array(chars, dtype=dt)
571
+ assert_array_equal(np.strings.lstrip(a, chars), out)
572
+ else:
573
+ assert_array_equal(np.strings.lstrip(a), out)
574
+
575
+ @pytest.mark.parametrize("a,chars,out", [
576
+ ("", None, ""),
577
+ (" hello ", None, " hello"),
578
+ ("hello", None, "hello"),
579
+ (" \t\n\r\f\vabc \t\n\r\f\v", None, " \t\n\r\f\vabc"),
580
+ ([" hello ", "hello"], None, [" hello", "hello"]),
581
+ ("", "", ""),
582
+ ("", "xyz", ""),
583
+ ("hello", "", "hello"),
584
+ (["hello ", "abcdefghijklmnop"], None,
585
+ ["hello", "abcdefghijklmnop"]),
586
+ ("xyzzyhelloxyzzy", "xyz", "xyzzyhello"),
587
+ ("hello", "xyz", "hello"),
588
+ ("xyxz", "xyxz", ""),
589
+ (" ", None, ""),
590
+ ("xyxzx", "x", "xyxz"),
591
+ (["xyzzyhelloxyzzy", "hello"], ["xyz", "xyz"],
592
+ ["xyzzyhello", "hello"]),
593
+ (["ab", "ac", "aab", "abb"], "b", ["a", "ac", "aa", "a"]),
594
+ ])
595
+ def test_rstrip(self, a, chars, out, dt):
596
+ a = np.array(a, dtype=dt)
597
+ out = np.array(out, dtype=dt)
598
+ if chars is not None:
599
+ chars = np.array(chars, dtype=dt)
600
+ assert_array_equal(np.strings.rstrip(a, chars), out)
601
+ else:
602
+ assert_array_equal(np.strings.rstrip(a), out)
603
+
604
+ @pytest.mark.parametrize("a,chars,out", [
605
+ ("", None, ""),
606
+ (" hello ", None, "hello"),
607
+ ("hello", None, "hello"),
608
+ (" \t\n\r\f\vabc \t\n\r\f\v", None, "abc"),
609
+ ([" hello ", "hello"], None, ["hello", "hello"]),
610
+ ("", "", ""),
611
+ ("", "xyz", ""),
612
+ ("hello", "", "hello"),
613
+ ("xyzzyhelloxyzzy", "xyz", "hello"),
614
+ ("hello", "xyz", "hello"),
615
+ ("xyxz", "xyxz", ""),
616
+ ("xyxzx", "x", "yxz"),
617
+ (["xyzzyhelloxyzzy", "hello"], ["xyz", "xyz"],
618
+ ["hello", "hello"]),
619
+ (["bab", "ac", "baab", "bbabb"], "b", ["a", "ac", "aa", "a"]),
620
+ ])
621
+ def test_strip(self, a, chars, out, dt):
622
+ a = np.array(a, dtype=dt)
623
+ if chars is not None:
624
+ chars = np.array(chars, dtype=dt)
625
+ out = np.array(out, dtype=dt)
626
+ assert_array_equal(np.strings.strip(a, chars), out)
627
+
628
+ @pytest.mark.parametrize("buf,old,new,count,res", [
629
+ ("", "", "", -1, ""),
630
+ ("", "", "A", -1, "A"),
631
+ ("", "A", "", -1, ""),
632
+ ("", "A", "A", -1, ""),
633
+ ("", "", "", 100, ""),
634
+ ("", "", "A", 100, "A"),
635
+ ("A", "", "", -1, "A"),
636
+ ("A", "", "*", -1, "*A*"),
637
+ ("A", "", "*1", -1, "*1A*1"),
638
+ ("A", "", "*-#", -1, "*-#A*-#"),
639
+ ("AA", "", "*-", -1, "*-A*-A*-"),
640
+ ("AA", "", "*-", -1, "*-A*-A*-"),
641
+ ("AA", "", "*-", 4, "*-A*-A*-"),
642
+ ("AA", "", "*-", 3, "*-A*-A*-"),
643
+ ("AA", "", "*-", 2, "*-A*-A"),
644
+ ("AA", "", "*-", 1, "*-AA"),
645
+ ("AA", "", "*-", 0, "AA"),
646
+ ("A", "A", "", -1, ""),
647
+ ("AAA", "A", "", -1, ""),
648
+ ("AAA", "A", "", -1, ""),
649
+ ("AAA", "A", "", 4, ""),
650
+ ("AAA", "A", "", 3, ""),
651
+ ("AAA", "A", "", 2, "A"),
652
+ ("AAA", "A", "", 1, "AA"),
653
+ ("AAA", "A", "", 0, "AAA"),
654
+ ("AAAAAAAAAA", "A", "", -1, ""),
655
+ ("ABACADA", "A", "", -1, "BCD"),
656
+ ("ABACADA", "A", "", -1, "BCD"),
657
+ ("ABACADA", "A", "", 5, "BCD"),
658
+ ("ABACADA", "A", "", 4, "BCD"),
659
+ ("ABACADA", "A", "", 3, "BCDA"),
660
+ ("ABACADA", "A", "", 2, "BCADA"),
661
+ ("ABACADA", "A", "", 1, "BACADA"),
662
+ ("ABACADA", "A", "", 0, "ABACADA"),
663
+ ("ABCAD", "A", "", -1, "BCD"),
664
+ ("ABCADAA", "A", "", -1, "BCD"),
665
+ ("BCD", "A", "", -1, "BCD"),
666
+ ("*************", "A", "", -1, "*************"),
667
+ ("^" + "A" * 1000 + "^", "A", "", 999, "^A^"),
668
+ ("the", "the", "", -1, ""),
669
+ ("theater", "the", "", -1, "ater"),
670
+ ("thethe", "the", "", -1, ""),
671
+ ("thethethethe", "the", "", -1, ""),
672
+ ("theatheatheathea", "the", "", -1, "aaaa"),
673
+ ("that", "the", "", -1, "that"),
674
+ ("thaet", "the", "", -1, "thaet"),
675
+ ("here and there", "the", "", -1, "here and re"),
676
+ ("here and there and there", "the", "", -1, "here and re and re"),
677
+ ("here and there and there", "the", "", 3, "here and re and re"),
678
+ ("here and there and there", "the", "", 2, "here and re and re"),
679
+ ("here and there and there", "the", "", 1, "here and re and there"),
680
+ ("here and there and there", "the", "", 0, "here and there and there"),
681
+ ("here and there and there", "the", "", -1, "here and re and re"),
682
+ ("abc", "the", "", -1, "abc"),
683
+ ("abcdefg", "the", "", -1, "abcdefg"),
684
+ ("bbobob", "bob", "", -1, "bob"),
685
+ ("bbobobXbbobob", "bob", "", -1, "bobXbob"),
686
+ ("aaaaaaabob", "bob", "", -1, "aaaaaaa"),
687
+ ("aaaaaaa", "bob", "", -1, "aaaaaaa"),
688
+ ("Who goes there?", "o", "o", -1, "Who goes there?"),
689
+ ("Who goes there?", "o", "O", -1, "WhO gOes there?"),
690
+ ("Who goes there?", "o", "O", -1, "WhO gOes there?"),
691
+ ("Who goes there?", "o", "O", 3, "WhO gOes there?"),
692
+ ("Who goes there?", "o", "O", 2, "WhO gOes there?"),
693
+ ("Who goes there?", "o", "O", 1, "WhO goes there?"),
694
+ ("Who goes there?", "o", "O", 0, "Who goes there?"),
695
+ ("Who goes there?", "a", "q", -1, "Who goes there?"),
696
+ ("Who goes there?", "W", "w", -1, "who goes there?"),
697
+ ("WWho goes there?WW", "W", "w", -1, "wwho goes there?ww"),
698
+ ("Who goes there?", "?", "!", -1, "Who goes there!"),
699
+ ("Who goes there??", "?", "!", -1, "Who goes there!!"),
700
+ ("Who goes there?", ".", "!", -1, "Who goes there?"),
701
+ ("This is a tissue", "is", "**", -1, "Th** ** a t**sue"),
702
+ ("This is a tissue", "is", "**", -1, "Th** ** a t**sue"),
703
+ ("This is a tissue", "is", "**", 4, "Th** ** a t**sue"),
704
+ ("This is a tissue", "is", "**", 3, "Th** ** a t**sue"),
705
+ ("This is a tissue", "is", "**", 2, "Th** ** a tissue"),
706
+ ("This is a tissue", "is", "**", 1, "Th** is a tissue"),
707
+ ("This is a tissue", "is", "**", 0, "This is a tissue"),
708
+ ("bobob", "bob", "cob", -1, "cobob"),
709
+ ("bobobXbobobob", "bob", "cob", -1, "cobobXcobocob"),
710
+ ("bobob", "bot", "bot", -1, "bobob"),
711
+ ("Reykjavik", "k", "KK", -1, "ReyKKjaviKK"),
712
+ ("Reykjavik", "k", "KK", -1, "ReyKKjaviKK"),
713
+ ("Reykjavik", "k", "KK", 2, "ReyKKjaviKK"),
714
+ ("Reykjavik", "k", "KK", 1, "ReyKKjavik"),
715
+ ("Reykjavik", "k", "KK", 0, "Reykjavik"),
716
+ ("A.B.C.", ".", "----", -1, "A----B----C----"),
717
+ ("Reykjavik", "q", "KK", -1, "Reykjavik"),
718
+ ("spam, spam, eggs and spam", "spam", "ham", -1,
719
+ "ham, ham, eggs and ham"),
720
+ ("spam, spam, eggs and spam", "spam", "ham", -1,
721
+ "ham, ham, eggs and ham"),
722
+ ("spam, spam, eggs and spam", "spam", "ham", 4,
723
+ "ham, ham, eggs and ham"),
724
+ ("spam, spam, eggs and spam", "spam", "ham", 3,
725
+ "ham, ham, eggs and ham"),
726
+ ("spam, spam, eggs and spam", "spam", "ham", 2,
727
+ "ham, ham, eggs and spam"),
728
+ ("spam, spam, eggs and spam", "spam", "ham", 1,
729
+ "ham, spam, eggs and spam"),
730
+ ("spam, spam, eggs and spam", "spam", "ham", 0,
731
+ "spam, spam, eggs and spam"),
732
+ ("bobobob", "bobob", "bob", -1, "bobob"),
733
+ ("bobobobXbobobob", "bobob", "bob", -1, "bobobXbobob"),
734
+ ("BOBOBOB", "bob", "bobby", -1, "BOBOBOB"),
735
+ ("one!two!three!", "!", "@", 1, "one@two!three!"),
736
+ ("one!two!three!", "!", "", -1, "onetwothree"),
737
+ ("one!two!three!", "!", "@", 2, "one@two@three!"),
738
+ ("one!two!three!", "!", "@", 3, "one@two@three@"),
739
+ ("one!two!three!", "!", "@", 4, "one@two@three@"),
740
+ ("one!two!three!", "!", "@", 0, "one!two!three!"),
741
+ ("one!two!three!", "!", "@", -1, "one@two@three@"),
742
+ ("one!two!three!", "x", "@", -1, "one!two!three!"),
743
+ ("one!two!three!", "x", "@", 2, "one!two!three!"),
744
+ ("abc", "", "-", -1, "-a-b-c-"),
745
+ ("abc", "", "-", 3, "-a-b-c"),
746
+ ("abc", "", "-", 0, "abc"),
747
+ ("abc", "ab", "--", 0, "abc"),
748
+ ("abc", "xy", "--", -1, "abc"),
749
+ (["abbc", "abbd"], "b", "z", [1, 2], ["azbc", "azzd"]),
750
+ ])
751
+ def test_replace(self, buf, old, new, count, res, dt):
752
+ if "😊" in buf and dt == "S":
753
+ pytest.skip("Bytes dtype does not support non-ascii input")
754
+ buf = np.array(buf, dtype=dt)
755
+ old = np.array(old, dtype=dt)
756
+ new = np.array(new, dtype=dt)
757
+ res = np.array(res, dtype=dt)
758
+ assert_array_equal(np.strings.replace(buf, old, new, count), res)
759
+
760
+ @pytest.mark.parametrize("buf,sub,start,end,res", [
761
+ ("abcdefghiabc", "", 0, None, 0),
762
+ ("abcdefghiabc", "def", 0, None, 3),
763
+ ("abcdefghiabc", "abc", 0, None, 0),
764
+ ("abcdefghiabc", "abc", 1, None, 9),
765
+ ])
766
+ def test_index(self, buf, sub, start, end, res, dt):
767
+ buf = np.array(buf, dtype=dt)
768
+ sub = np.array(sub, dtype=dt)
769
+ assert_array_equal(np.strings.index(buf, sub, start, end), res)
770
+
771
+ @pytest.mark.parametrize("buf,sub,start,end", [
772
+ ("abcdefghiabc", "hib", 0, None),
773
+ ("abcdefghiab", "abc", 1, None),
774
+ ("abcdefghi", "ghi", 8, None),
775
+ ("abcdefghi", "ghi", -1, None),
776
+ ("rrarrrrrrrrra", "a", 4, 6),
777
+ ])
778
+ def test_index_raises(self, buf, sub, start, end, dt):
779
+ buf = np.array(buf, dtype=dt)
780
+ sub = np.array(sub, dtype=dt)
781
+ with pytest.raises(ValueError, match="substring not found"):
782
+ np.strings.index(buf, sub, start, end)
783
+
784
+ @pytest.mark.parametrize("buf,sub,start,end,res", [
785
+ ("abcdefghiabc", "", 0, None, 12),
786
+ ("abcdefghiabc", "def", 0, None, 3),
787
+ ("abcdefghiabc", "abc", 0, None, 9),
788
+ ("abcdefghiabc", "abc", 0, -1, 0),
789
+ ])
790
+ def test_rindex(self, buf, sub, start, end, res, dt):
791
+ buf = np.array(buf, dtype=dt)
792
+ sub = np.array(sub, dtype=dt)
793
+ assert_array_equal(np.strings.rindex(buf, sub, start, end), res)
794
+
795
+ @pytest.mark.parametrize("buf,sub,start,end", [
796
+ ("abcdefghiabc", "hib", 0, None),
797
+ ("defghiabc", "def", 1, None),
798
+ ("defghiabc", "abc", 0, -1),
799
+ ("abcdefghi", "ghi", 0, 8),
800
+ ("abcdefghi", "ghi", 0, -1),
801
+ ("rrarrrrrrrrra", "a", 4, 6),
802
+ ])
803
+ def test_rindex_raises(self, buf, sub, start, end, dt):
804
+ buf = np.array(buf, dtype=dt)
805
+ sub = np.array(sub, dtype=dt)
806
+ with pytest.raises(ValueError, match="substring not found"):
807
+ np.strings.rindex(buf, sub, start, end)
808
+
809
+ @pytest.mark.parametrize("buf,tabsize,res", [
810
+ ("abc\rab\tdef\ng\thi", 8, "abc\rab def\ng hi"),
811
+ ("abc\rab\tdef\ng\thi", 4, "abc\rab def\ng hi"),
812
+ ("abc\r\nab\tdef\ng\thi", 8, "abc\r\nab def\ng hi"),
813
+ ("abc\r\nab\tdef\ng\thi", 4, "abc\r\nab def\ng hi"),
814
+ ("abc\r\nab\r\ndef\ng\r\nhi", 4, "abc\r\nab\r\ndef\ng\r\nhi"),
815
+ (" \ta\n\tb", 1, " a\n b"),
816
+ ])
817
+ def test_expandtabs(self, buf, tabsize, res, dt):
818
+ buf = np.array(buf, dtype=dt)
819
+ res = np.array(res, dtype=dt)
820
+ assert_array_equal(np.strings.expandtabs(buf, tabsize), res)
821
+
822
+ def test_expandtabs_raises_overflow(self, dt):
823
+ with pytest.raises(OverflowError, match="new string is too long"):
824
+ np.strings.expandtabs(np.array("\ta\n\tb", dtype=dt), sys.maxsize)
825
+ np.strings.expandtabs(np.array("\ta\n\tb", dtype=dt), 2**61)
826
+
827
+ def test_expandtabs_length_not_cause_segfault(self, dt):
828
+ # see gh-28829
829
+ with pytest.raises(
830
+ _UFuncNoLoopError,
831
+ match="did not contain a loop with signature matching types",
832
+ ):
833
+ np._core.strings._expandtabs_length.reduce(np.zeros(200))
834
+
835
+ with pytest.raises(
836
+ _UFuncNoLoopError,
837
+ match="did not contain a loop with signature matching types",
838
+ ):
839
+ np.strings.expandtabs(np.zeros(200))
840
+
841
+ FILL_ERROR = "The fill character must be exactly one character long"
842
+
843
+ def test_center_raises_multiple_character_fill(self, dt):
844
+ buf = np.array("abc", dtype=dt)
845
+ fill = np.array("**", dtype=dt)
846
+ with pytest.raises(TypeError, match=self.FILL_ERROR):
847
+ np.strings.center(buf, 10, fill)
848
+
849
+ def test_ljust_raises_multiple_character_fill(self, dt):
850
+ buf = np.array("abc", dtype=dt)
851
+ fill = np.array("**", dtype=dt)
852
+ with pytest.raises(TypeError, match=self.FILL_ERROR):
853
+ np.strings.ljust(buf, 10, fill)
854
+
855
+ def test_rjust_raises_multiple_character_fill(self, dt):
856
+ buf = np.array("abc", dtype=dt)
857
+ fill = np.array("**", dtype=dt)
858
+ with pytest.raises(TypeError, match=self.FILL_ERROR):
859
+ np.strings.rjust(buf, 10, fill)
860
+
861
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
862
+ ('abc', 10, ' ', ' abc '),
863
+ ('abc', 6, ' ', ' abc '),
864
+ ('abc', 3, ' ', 'abc'),
865
+ ('abc', 2, ' ', 'abc'),
866
+ ('abc', -2, ' ', 'abc'),
867
+ ('abc', 10, '*', '***abc****'),
868
+ ])
869
+ def test_center(self, buf, width, fillchar, res, dt):
870
+ buf = np.array(buf, dtype=dt)
871
+ fillchar = np.array(fillchar, dtype=dt)
872
+ res = np.array(res, dtype=dt)
873
+ assert_array_equal(np.strings.center(buf, width, fillchar), res)
874
+
875
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
876
+ ('abc', 10, ' ', 'abc '),
877
+ ('abc', 6, ' ', 'abc '),
878
+ ('abc', 3, ' ', 'abc'),
879
+ ('abc', 2, ' ', 'abc'),
880
+ ('abc', -2, ' ', 'abc'),
881
+ ('abc', 10, '*', 'abc*******'),
882
+ ])
883
+ def test_ljust(self, buf, width, fillchar, res, dt):
884
+ buf = np.array(buf, dtype=dt)
885
+ fillchar = np.array(fillchar, dtype=dt)
886
+ res = np.array(res, dtype=dt)
887
+ assert_array_equal(np.strings.ljust(buf, width, fillchar), res)
888
+
889
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
890
+ ('abc', 10, ' ', ' abc'),
891
+ ('abc', 6, ' ', ' abc'),
892
+ ('abc', 3, ' ', 'abc'),
893
+ ('abc', 2, ' ', 'abc'),
894
+ ('abc', -2, ' ', 'abc'),
895
+ ('abc', 10, '*', '*******abc'),
896
+ ])
897
+ def test_rjust(self, buf, width, fillchar, res, dt):
898
+ buf = np.array(buf, dtype=dt)
899
+ fillchar = np.array(fillchar, dtype=dt)
900
+ res = np.array(res, dtype=dt)
901
+ assert_array_equal(np.strings.rjust(buf, width, fillchar), res)
902
+
903
+ @pytest.mark.parametrize("buf,width,res", [
904
+ ('123', 2, '123'),
905
+ ('123', 3, '123'),
906
+ ('0123', 4, '0123'),
907
+ ('+123', 3, '+123'),
908
+ ('+123', 4, '+123'),
909
+ ('+123', 5, '+0123'),
910
+ ('+0123', 5, '+0123'),
911
+ ('-123', 3, '-123'),
912
+ ('-123', 4, '-123'),
913
+ ('-0123', 5, '-0123'),
914
+ ('000', 3, '000'),
915
+ ('34', 1, '34'),
916
+ ('34', -1, '34'),
917
+ ('0034', 4, '0034'),
918
+ ])
919
+ def test_zfill(self, buf, width, res, dt):
920
+ buf = np.array(buf, dtype=dt)
921
+ res = np.array(res, dtype=dt)
922
+ assert_array_equal(np.strings.zfill(buf, width), res)
923
+
924
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
925
+ ("this is the partition method", "ti", "this is the par",
926
+ "ti", "tion method"),
927
+ ("http://www.python.org", "://", "http", "://", "www.python.org"),
928
+ ("http://www.python.org", "?", "http://www.python.org", "", ""),
929
+ ("http://www.python.org", "http://", "", "http://", "www.python.org"),
930
+ ("http://www.python.org", "org", "http://www.python.", "org", ""),
931
+ ("http://www.python.org", ["://", "?", "http://", "org"],
932
+ ["http", "http://www.python.org", "", "http://www.python."],
933
+ ["://", "", "http://", "org"],
934
+ ["www.python.org", "", "www.python.org", ""]),
935
+ ("mississippi", "ss", "mi", "ss", "issippi"),
936
+ ("mississippi", "i", "m", "i", "ssissippi"),
937
+ ("mississippi", "w", "mississippi", "", ""),
938
+ ])
939
+ def test_partition(self, buf, sep, res1, res2, res3, dt):
940
+ buf = np.array(buf, dtype=dt)
941
+ sep = np.array(sep, dtype=dt)
942
+ res1 = np.array(res1, dtype=dt)
943
+ res2 = np.array(res2, dtype=dt)
944
+ res3 = np.array(res3, dtype=dt)
945
+ act1, act2, act3 = np.strings.partition(buf, sep)
946
+ assert_array_equal(act1, res1)
947
+ assert_array_equal(act2, res2)
948
+ assert_array_equal(act3, res3)
949
+ assert_array_equal(act1 + act2 + act3, buf)
950
+
951
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
952
+ ("this is the partition method", "ti", "this is the parti",
953
+ "ti", "on method"),
954
+ ("http://www.python.org", "://", "http", "://", "www.python.org"),
955
+ ("http://www.python.org", "?", "", "", "http://www.python.org"),
956
+ ("http://www.python.org", "http://", "", "http://", "www.python.org"),
957
+ ("http://www.python.org", "org", "http://www.python.", "org", ""),
958
+ ("http://www.python.org", ["://", "?", "http://", "org"],
959
+ ["http", "", "", "http://www.python."],
960
+ ["://", "", "http://", "org"],
961
+ ["www.python.org", "http://www.python.org", "www.python.org", ""]),
962
+ ("mississippi", "ss", "missi", "ss", "ippi"),
963
+ ("mississippi", "i", "mississipp", "i", ""),
964
+ ("mississippi", "w", "", "", "mississippi"),
965
+ ])
966
+ def test_rpartition(self, buf, sep, res1, res2, res3, dt):
967
+ buf = np.array(buf, dtype=dt)
968
+ sep = np.array(sep, dtype=dt)
969
+ res1 = np.array(res1, dtype=dt)
970
+ res2 = np.array(res2, dtype=dt)
971
+ res3 = np.array(res3, dtype=dt)
972
+ act1, act2, act3 = np.strings.rpartition(buf, sep)
973
+ assert_array_equal(act1, res1)
974
+ assert_array_equal(act2, res2)
975
+ assert_array_equal(act3, res3)
976
+ assert_array_equal(act1 + act2 + act3, buf)
977
+
978
+ @pytest.mark.parametrize("args", [
979
+ (None,),
980
+ (None, None),
981
+ (None, None, -1),
982
+ (0,),
983
+ (0, None),
984
+ (0, None, -1),
985
+ (1,),
986
+ (1, None),
987
+ (1, None, -1),
988
+ (3,),
989
+ (3, None),
990
+ (5,),
991
+ (5, None),
992
+ (5, 5),
993
+ (5, 5, -1),
994
+ (6,), # test index past the end
995
+ (6, None),
996
+ (6, None, -1),
997
+ (6, 7), # test start and stop index past the end
998
+ (4, 3), # test start > stop index
999
+ (-1,),
1000
+ (-1, None),
1001
+ (-1, None, -1),
1002
+ (-3,),
1003
+ (-3, None),
1004
+ ([3, 4],),
1005
+ ([3, 4], None),
1006
+ ([2, 4],),
1007
+ ([-3, 5],),
1008
+ ([-3, 5], None),
1009
+ ([-3, 5], None, -1),
1010
+ ([0, -5],),
1011
+ ([0, -5], None),
1012
+ ([0, -5], None, -1),
1013
+ (1, 4),
1014
+ (-3, 5),
1015
+ (None, -1),
1016
+ (0, [4, 2]),
1017
+ ([1, 2], [-1, -2]),
1018
+ (1, 5, 2),
1019
+ (None, None, -1),
1020
+ ([0, 6], [-1, 0], [2, -1]),
1021
+ ])
1022
+ @pytest.mark.parametrize("buf", [
1023
+ ["hello", "world"],
1024
+ ['hello world', 'γεια σου κόσμε', '你好世界', '👋 🌍'],
1025
+ ])
1026
+ def test_slice(self, args, buf, dt):
1027
+ if dt == "S" and "你好世界" in buf:
1028
+ pytest.skip("Bytes dtype does not support non-ascii input")
1029
+ if len(buf) == 4:
1030
+ args = tuple(s * 2 if isinstance(s, list) else s for s in args)
1031
+ buf = np.array(buf, dtype=dt)
1032
+ act = np.strings.slice(buf, *args)
1033
+ bcast_args = tuple(np.broadcast_to(arg, buf.shape) for arg in args)
1034
+ res = np.array([s[slice(*arg)]
1035
+ for s, arg in zip(buf, zip(*bcast_args))],
1036
+ dtype=dt)
1037
+ assert_array_equal(act, res)
1038
+
1039
+ def test_slice_unsupported(self, dt):
1040
+ with pytest.raises(TypeError, match="did not contain a loop"):
1041
+ np.strings.slice(np.array([1, 2, 3]), 4)
1042
+
1043
+ regexp = (r"Cannot cast ufunc '_slice' input .* "
1044
+ r"from .* to dtype\('int(64|32)'\)")
1045
+ with pytest.raises(TypeError, match=regexp):
1046
+ np.strings.slice(np.array(['foo', 'bar'], dtype=dt),
1047
+ np.array(['foo', 'bar'], dtype=dt))
1048
+
1049
+ @pytest.mark.parametrize("int_dt", [np.int8, np.int16, np.int32,
1050
+ np.int64, np.uint8, np.uint16,
1051
+ np.uint32, np.uint64])
1052
+ def test_slice_int_type_promotion(self, int_dt, dt):
1053
+ buf = np.array(["hello", "world"], dtype=dt)
1054
+ np_slice = np.strings.slice
1055
+ assert_array_equal(np_slice(buf, int_dt(4)),
1056
+ np.array(["hell", "worl"], dtype=dt))
1057
+ assert_array_equal(np_slice(buf, np.array([4, 4], dtype=int_dt)),
1058
+ np.array(["hell", "worl"], dtype=dt))
1059
+
1060
+ assert_array_equal(np_slice(buf, int_dt(2), int_dt(4)),
1061
+ np.array(["ll", "rl"], dtype=dt))
1062
+ assert_array_equal(np_slice(buf, np.array([2, 2], dtype=int_dt),
1063
+ np.array([4, 4], dtype=int_dt)),
1064
+ np.array(["ll", "rl"], dtype=dt))
1065
+
1066
+ assert_array_equal(np_slice(buf, int_dt(0), int_dt(4), int_dt(2)),
1067
+ np.array(["hl", "wr"], dtype=dt))
1068
+ assert_array_equal(np_slice(buf,
1069
+ np.array([0, 0], dtype=int_dt),
1070
+ np.array([4, 4], dtype=int_dt),
1071
+ np.array([2, 2], dtype=int_dt)),
1072
+ np.array(["hl", "wr"], dtype=dt))
1073
+
1074
+ @pytest.mark.parametrize("dt", ["U", "T"])
1075
+ class TestMethodsWithUnicode:
1076
+ @pytest.mark.parametrize("in_,out", [
1077
+ ("", False),
1078
+ ("a", False),
1079
+ ("0", True),
1080
+ ("\u2460", False), # CIRCLED DIGIT 1
1081
+ ("\xbc", False), # VULGAR FRACTION ONE QUARTER
1082
+ ("\u0660", True), # ARABIC_INDIC DIGIT ZERO
1083
+ ("012345", True),
1084
+ ("012345a", False),
1085
+ (["0", "a"], [True, False]),
1086
+ ])
1087
+ def test_isdecimal_unicode(self, in_, out, dt):
1088
+ buf = np.array(in_, dtype=dt)
1089
+ assert_array_equal(np.strings.isdecimal(buf), out)
1090
+
1091
+ @pytest.mark.parametrize("in_,out", [
1092
+ ("", False),
1093
+ ("a", False),
1094
+ ("0", True),
1095
+ ("\u2460", True), # CIRCLED DIGIT 1
1096
+ ("\xbc", True), # VULGAR FRACTION ONE QUARTER
1097
+ ("\u0660", True), # ARABIC_INDIC DIGIT ZERO
1098
+ ("012345", True),
1099
+ ("012345a", False),
1100
+ (["0", "a"], [True, False]),
1101
+ ])
1102
+ def test_isnumeric_unicode(self, in_, out, dt):
1103
+ buf = np.array(in_, dtype=dt)
1104
+ assert_array_equal(np.strings.isnumeric(buf), out)
1105
+
1106
+ @pytest.mark.parametrize("buf,old,new,count,res", [
1107
+ ("...\u043c......<", "<", "&lt;", -1, "...\u043c......&lt;"),
1108
+ ("Ae¢☃€ 😊" * 2, "A", "B", -1, "Be¢☃€ 😊Be¢☃€ 😊"),
1109
+ ("Ae¢☃€ 😊" * 2, "😊", "B", -1, "Ae¢☃€ BAe¢☃€ B"),
1110
+ ])
1111
+ def test_replace_unicode(self, buf, old, new, count, res, dt):
1112
+ buf = np.array(buf, dtype=dt)
1113
+ old = np.array(old, dtype=dt)
1114
+ new = np.array(new, dtype=dt)
1115
+ res = np.array(res, dtype=dt)
1116
+ assert_array_equal(np.strings.replace(buf, old, new, count), res)
1117
+
1118
+ @pytest.mark.parametrize("in_", [
1119
+ '\U00010401',
1120
+ '\U00010427',
1121
+ '\U00010429',
1122
+ '\U0001044E',
1123
+ '\U0001D7F6',
1124
+ '\U00011066',
1125
+ '\U000104A0',
1126
+ pytest.param('\U0001F107', marks=pytest.mark.xfail(
1127
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1128
+ reason="PYPY bug in Py_UNICODE_ISALNUM",
1129
+ strict=True)),
1130
+ ])
1131
+ def test_isalnum_unicode(self, in_, dt):
1132
+ in_ = np.array(in_, dtype=dt)
1133
+ assert_array_equal(np.strings.isalnum(in_), True)
1134
+
1135
+ @pytest.mark.parametrize("in_,out", [
1136
+ ('\u1FFc', False),
1137
+ ('\u2167', False),
1138
+ ('\U00010401', False),
1139
+ ('\U00010427', False),
1140
+ ('\U0001F40D', False),
1141
+ ('\U0001F46F', False),
1142
+ ('\u2177', True),
1143
+ pytest.param('\U00010429', True, marks=pytest.mark.xfail(
1144
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1145
+ reason="PYPY bug in Py_UNICODE_ISLOWER",
1146
+ strict=True)),
1147
+ ('\U0001044E', True),
1148
+ ])
1149
+ def test_islower_unicode(self, in_, out, dt):
1150
+ in_ = np.array(in_, dtype=dt)
1151
+ assert_array_equal(np.strings.islower(in_), out)
1152
+
1153
+ @pytest.mark.parametrize("in_,out", [
1154
+ ('\u1FFc', False),
1155
+ ('\u2167', True),
1156
+ ('\U00010401', True),
1157
+ ('\U00010427', True),
1158
+ ('\U0001F40D', False),
1159
+ ('\U0001F46F', False),
1160
+ ('\u2177', False),
1161
+ pytest.param('\U00010429', False, marks=pytest.mark.xfail(
1162
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1163
+ reason="PYPY bug in Py_UNICODE_ISUPPER",
1164
+ strict=True)),
1165
+ ('\U0001044E', False),
1166
+ ])
1167
+ def test_isupper_unicode(self, in_, out, dt):
1168
+ in_ = np.array(in_, dtype=dt)
1169
+ assert_array_equal(np.strings.isupper(in_), out)
1170
+
1171
+ @pytest.mark.parametrize("in_,out", [
1172
+ ('\u1FFc', True),
1173
+ ('Greek \u1FFcitlecases ...', True),
1174
+ pytest.param('\U00010401\U00010429', True, marks=pytest.mark.xfail(
1175
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1176
+ reason="PYPY bug in Py_UNICODE_ISISTITLE",
1177
+ strict=True)),
1178
+ ('\U00010427\U0001044E', True),
1179
+ pytest.param('\U00010429', False, marks=pytest.mark.xfail(
1180
+ sys.platform == 'win32' and IS_PYPY_LT_7_3_16,
1181
+ reason="PYPY bug in Py_UNICODE_ISISTITLE",
1182
+ strict=True)),
1183
+ ('\U0001044E', False),
1184
+ ('\U0001F40D', False),
1185
+ ('\U0001F46F', False),
1186
+ ])
1187
+ def test_istitle_unicode(self, in_, out, dt):
1188
+ in_ = np.array(in_, dtype=dt)
1189
+ assert_array_equal(np.strings.istitle(in_), out)
1190
+
1191
+ @pytest.mark.parametrize("buf,sub,start,end,res", [
1192
+ ("Ae¢☃€ 😊" * 2, "😊", 0, None, 6),
1193
+ ("Ae¢☃€ 😊" * 2, "😊", 7, None, 13),
1194
+ ])
1195
+ def test_index_unicode(self, buf, sub, start, end, res, dt):
1196
+ buf = np.array(buf, dtype=dt)
1197
+ sub = np.array(sub, dtype=dt)
1198
+ assert_array_equal(np.strings.index(buf, sub, start, end), res)
1199
+
1200
+ def test_index_raises_unicode(self, dt):
1201
+ with pytest.raises(ValueError, match="substring not found"):
1202
+ np.strings.index("Ae¢☃€ 😊", "😀")
1203
+
1204
+ @pytest.mark.parametrize("buf,res", [
1205
+ ("Ae¢☃€ \t 😊", "Ae¢☃€ 😊"),
1206
+ ("\t\U0001044E", " \U0001044E"),
1207
+ ])
1208
+ def test_expandtabs(self, buf, res, dt):
1209
+ buf = np.array(buf, dtype=dt)
1210
+ res = np.array(res, dtype=dt)
1211
+ assert_array_equal(np.strings.expandtabs(buf), res)
1212
+
1213
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
1214
+ ('x', 2, '\U0001044E', 'x\U0001044E'),
1215
+ ('x', 3, '\U0001044E', '\U0001044Ex\U0001044E'),
1216
+ ('x', 4, '\U0001044E', '\U0001044Ex\U0001044E\U0001044E'),
1217
+ ])
1218
+ def test_center(self, buf, width, fillchar, res, dt):
1219
+ buf = np.array(buf, dtype=dt)
1220
+ fillchar = np.array(fillchar, dtype=dt)
1221
+ res = np.array(res, dtype=dt)
1222
+ assert_array_equal(np.strings.center(buf, width, fillchar), res)
1223
+
1224
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
1225
+ ('x', 2, '\U0001044E', 'x\U0001044E'),
1226
+ ('x', 3, '\U0001044E', 'x\U0001044E\U0001044E'),
1227
+ ('x', 4, '\U0001044E', 'x\U0001044E\U0001044E\U0001044E'),
1228
+ ])
1229
+ def test_ljust(self, buf, width, fillchar, res, dt):
1230
+ buf = np.array(buf, dtype=dt)
1231
+ fillchar = np.array(fillchar, dtype=dt)
1232
+ res = np.array(res, dtype=dt)
1233
+ assert_array_equal(np.strings.ljust(buf, width, fillchar), res)
1234
+
1235
+ @pytest.mark.parametrize("buf,width,fillchar,res", [
1236
+ ('x', 2, '\U0001044E', '\U0001044Ex'),
1237
+ ('x', 3, '\U0001044E', '\U0001044E\U0001044Ex'),
1238
+ ('x', 4, '\U0001044E', '\U0001044E\U0001044E\U0001044Ex'),
1239
+ ])
1240
+ def test_rjust(self, buf, width, fillchar, res, dt):
1241
+ buf = np.array(buf, dtype=dt)
1242
+ fillchar = np.array(fillchar, dtype=dt)
1243
+ res = np.array(res, dtype=dt)
1244
+ assert_array_equal(np.strings.rjust(buf, width, fillchar), res)
1245
+
1246
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
1247
+ ("āāāāĀĀĀĀ", "Ă", "āāāāĀĀĀĀ", "", ""),
1248
+ ("āāāāĂĀĀĀĀ", "Ă", "āāāā", "Ă", "ĀĀĀĀ"),
1249
+ ("āāāāĂĂĀĀĀĀ", "ĂĂ", "āāāā", "ĂĂ", "ĀĀĀĀ"),
1250
+ ("𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀", "𐌂", "𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀", "", ""),
1251
+ ("𐌁𐌁𐌁𐌁𐌂𐌀𐌀𐌀𐌀", "𐌂", "𐌁𐌁𐌁𐌁", "𐌂", "𐌀𐌀𐌀𐌀"),
1252
+ ("𐌁𐌁𐌁𐌁𐌂𐌂𐌀𐌀𐌀𐌀", "𐌂𐌂", "𐌁𐌁𐌁𐌁", "𐌂𐌂", "𐌀𐌀𐌀𐌀"),
1253
+ ("𐌁𐌁𐌁𐌁𐌂𐌂𐌂𐌂𐌀𐌀𐌀𐌀", "𐌂𐌂𐌂𐌂", "𐌁𐌁𐌁𐌁", "𐌂𐌂𐌂𐌂", "𐌀𐌀𐌀𐌀"),
1254
+ ])
1255
+ def test_partition(self, buf, sep, res1, res2, res3, dt):
1256
+ buf = np.array(buf, dtype=dt)
1257
+ sep = np.array(sep, dtype=dt)
1258
+ res1 = np.array(res1, dtype=dt)
1259
+ res2 = np.array(res2, dtype=dt)
1260
+ res3 = np.array(res3, dtype=dt)
1261
+ act1, act2, act3 = np.strings.partition(buf, sep)
1262
+ assert_array_equal(act1, res1)
1263
+ assert_array_equal(act2, res2)
1264
+ assert_array_equal(act3, res3)
1265
+ assert_array_equal(act1 + act2 + act3, buf)
1266
+
1267
+ @pytest.mark.parametrize("buf,sep,res1,res2,res3", [
1268
+ ("āāāāĀĀĀĀ", "Ă", "", "", "āāāāĀĀĀĀ"),
1269
+ ("āāāāĂĀĀĀĀ", "Ă", "āāāā", "Ă", "ĀĀĀĀ"),
1270
+ ("āāāāĂĂĀĀĀĀ", "ĂĂ", "āāāā", "ĂĂ", "ĀĀĀĀ"),
1271
+ ("𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀", "𐌂", "", "", "𐌁𐌁𐌁𐌁𐌀𐌀𐌀𐌀"),
1272
+ ("𐌁𐌁𐌁𐌁𐌂𐌀𐌀𐌀𐌀", "𐌂", "𐌁𐌁𐌁𐌁", "𐌂", "𐌀𐌀𐌀𐌀"),
1273
+ ("𐌁𐌁𐌁𐌁𐌂𐌂𐌀𐌀𐌀𐌀", "𐌂𐌂", "𐌁𐌁𐌁𐌁", "𐌂𐌂", "𐌀𐌀𐌀𐌀"),
1274
+ ])
1275
+ def test_rpartition(self, buf, sep, res1, res2, res3, dt):
1276
+ buf = np.array(buf, dtype=dt)
1277
+ sep = np.array(sep, dtype=dt)
1278
+ res1 = np.array(res1, dtype=dt)
1279
+ res2 = np.array(res2, dtype=dt)
1280
+ res3 = np.array(res3, dtype=dt)
1281
+ act1, act2, act3 = np.strings.rpartition(buf, sep)
1282
+ assert_array_equal(act1, res1)
1283
+ assert_array_equal(act2, res2)
1284
+ assert_array_equal(act3, res3)
1285
+ assert_array_equal(act1 + act2 + act3, buf)
1286
+
1287
+ @pytest.mark.parametrize("method", ["strip", "lstrip", "rstrip"])
1288
+ @pytest.mark.parametrize(
1289
+ "source,strip",
1290
+ [
1291
+ ("λμ", "μ"),
1292
+ ("λμ", "λ"),
1293
+ ("λ" * 5 + "μ" * 2, "μ"),
1294
+ ("λ" * 5 + "μ" * 2, "λ"),
1295
+ ("λ" * 5 + "A" + "μ" * 2, "μλ"),
1296
+ ("λμ" * 5, "μ"),
1297
+ ("λμ" * 5, "λ"),
1298
+ ])
1299
+ def test_strip_functions_unicode(self, source, strip, method, dt):
1300
+ src_array = np.array([source], dtype=dt)
1301
+
1302
+ npy_func = getattr(np.strings, method)
1303
+ py_func = getattr(str, method)
1304
+
1305
+ expected = np.array([py_func(source, strip)], dtype=dt)
1306
+ actual = npy_func(src_array, strip)
1307
+
1308
+ assert_array_equal(actual, expected)
1309
+
1310
+ @pytest.mark.parametrize("args", [
1311
+ (None,),
1312
+ (0,),
1313
+ (1,),
1314
+ (5,),
1315
+ (15,),
1316
+ (22,),
1317
+ (-1,),
1318
+ (-3,),
1319
+ ([3, 4],),
1320
+ ([-5, 5],),
1321
+ ([0, -8],),
1322
+ (1, 12),
1323
+ (-12, 15),
1324
+ (None, -1),
1325
+ (0, [17, 6]),
1326
+ ([1, 2], [-1, -2]),
1327
+ (1, 11, 2),
1328
+ (None, None, -1),
1329
+ ([0, 10], [-1, 0], [2, -1]),
1330
+ ])
1331
+ def test_slice(self, args, dt):
1332
+ buf = np.array(["Приве́т नमस्ते שָׁלוֹם", "😀😃😄😁😆😅🤣😂🙂🙃"],
1333
+ dtype=dt)
1334
+ act = np.strings.slice(buf, *args)
1335
+ bcast_args = tuple(np.broadcast_to(arg, buf.shape) for arg in args)
1336
+ res = np.array([s[slice(*arg)]
1337
+ for s, arg in zip(buf, zip(*bcast_args))],
1338
+ dtype=dt)
1339
+ assert_array_equal(act, res)
1340
+
1341
+
1342
+ class TestMixedTypeMethods:
1343
+ def test_center(self):
1344
+ buf = np.array("😊", dtype="U")
1345
+ fill = np.array("*", dtype="S")
1346
+ res = np.array("*😊*", dtype="U")
1347
+ assert_array_equal(np.strings.center(buf, 3, fill), res)
1348
+
1349
+ buf = np.array("s", dtype="S")
1350
+ fill = np.array("*", dtype="U")
1351
+ res = np.array("*s*", dtype="S")
1352
+ assert_array_equal(np.strings.center(buf, 3, fill), res)
1353
+
1354
+ with pytest.raises(ValueError, match="'ascii' codec can't encode"):
1355
+ buf = np.array("s", dtype="S")
1356
+ fill = np.array("😊", dtype="U")
1357
+ np.strings.center(buf, 3, fill)
1358
+
1359
+ def test_ljust(self):
1360
+ buf = np.array("😊", dtype="U")
1361
+ fill = np.array("*", dtype="S")
1362
+ res = np.array("😊**", dtype="U")
1363
+ assert_array_equal(np.strings.ljust(buf, 3, fill), res)
1364
+
1365
+ buf = np.array("s", dtype="S")
1366
+ fill = np.array("*", dtype="U")
1367
+ res = np.array("s**", dtype="S")
1368
+ assert_array_equal(np.strings.ljust(buf, 3, fill), res)
1369
+
1370
+ with pytest.raises(ValueError, match="'ascii' codec can't encode"):
1371
+ buf = np.array("s", dtype="S")
1372
+ fill = np.array("😊", dtype="U")
1373
+ np.strings.ljust(buf, 3, fill)
1374
+
1375
+ def test_rjust(self):
1376
+ buf = np.array("😊", dtype="U")
1377
+ fill = np.array("*", dtype="S")
1378
+ res = np.array("**😊", dtype="U")
1379
+ assert_array_equal(np.strings.rjust(buf, 3, fill), res)
1380
+
1381
+ buf = np.array("s", dtype="S")
1382
+ fill = np.array("*", dtype="U")
1383
+ res = np.array("**s", dtype="S")
1384
+ assert_array_equal(np.strings.rjust(buf, 3, fill), res)
1385
+
1386
+ with pytest.raises(ValueError, match="'ascii' codec can't encode"):
1387
+ buf = np.array("s", dtype="S")
1388
+ fill = np.array("😊", dtype="U")
1389
+ np.strings.rjust(buf, 3, fill)
1390
+
1391
+
1392
+ class TestUnicodeOnlyMethodsRaiseWithBytes:
1393
+ def test_isdecimal_raises(self):
1394
+ in_ = np.array(b"1")
1395
+ with assert_raises(TypeError):
1396
+ np.strings.isdecimal(in_)
1397
+
1398
+ def test_isnumeric_bytes(self):
1399
+ in_ = np.array(b"1")
1400
+ with assert_raises(TypeError):
1401
+ np.strings.isnumeric(in_)
1402
+
1403
+
1404
+ def check_itemsize(n_elem, dt):
1405
+ if dt == "T":
1406
+ return np.dtype(dt).itemsize
1407
+ if dt == "S":
1408
+ return n_elem
1409
+ if dt == "U":
1410
+ return n_elem * 4
1411
+
1412
+ @pytest.mark.parametrize("dt", ["S", "U", "T"])
1413
+ class TestReplaceOnArrays:
1414
+
1415
+ def test_replace_count_and_size(self, dt):
1416
+ a = np.array(["0123456789" * i for i in range(4)], dtype=dt)
1417
+ r1 = np.strings.replace(a, "5", "ABCDE")
1418
+ assert r1.dtype.itemsize == check_itemsize(3 * 10 + 3 * 4, dt)
1419
+ r1_res = np.array(["01234ABCDE6789" * i for i in range(4)], dtype=dt)
1420
+ assert_array_equal(r1, r1_res)
1421
+ r2 = np.strings.replace(a, "5", "ABCDE", 1)
1422
+ assert r2.dtype.itemsize == check_itemsize(3 * 10 + 4, dt)
1423
+ r3 = np.strings.replace(a, "5", "ABCDE", 0)
1424
+ assert r3.dtype.itemsize == a.dtype.itemsize
1425
+ assert_array_equal(r3, a)
1426
+ # Negative values mean to replace all.
1427
+ r4 = np.strings.replace(a, "5", "ABCDE", -1)
1428
+ assert r4.dtype.itemsize == check_itemsize(3 * 10 + 3 * 4, dt)
1429
+ assert_array_equal(r4, r1)
1430
+ # We can do count on an element-by-element basis.
1431
+ r5 = np.strings.replace(a, "5", "ABCDE", [-1, -1, -1, 1])
1432
+ assert r5.dtype.itemsize == check_itemsize(3 * 10 + 4, dt)
1433
+ assert_array_equal(r5, np.array(
1434
+ ["01234ABCDE6789" * i for i in range(3)]
1435
+ + ["01234ABCDE6789" + "0123456789" * 2], dtype=dt))
1436
+
1437
+ def test_replace_broadcasting(self, dt):
1438
+ a = np.array("0,0,0", dtype=dt)
1439
+ r1 = np.strings.replace(a, "0", "1", np.arange(3))
1440
+ assert r1.dtype == a.dtype
1441
+ assert_array_equal(r1, np.array(["0,0,0", "1,0,0", "1,1,0"], dtype=dt))
1442
+ r2 = np.strings.replace(a, "0", [["1"], ["2"]], np.arange(1, 4))
1443
+ assert_array_equal(r2, np.array([["1,0,0", "1,1,0", "1,1,1"],
1444
+ ["2,0,0", "2,2,0", "2,2,2"]],
1445
+ dtype=dt))
1446
+ r3 = np.strings.replace(a, ["0", "0,0", "0,0,0"], "X")
1447
+ assert_array_equal(r3, np.array(["X,X,X", "X,0", "X"], dtype=dt))
1448
+
1449
+
1450
+ class TestOverride:
1451
+ @classmethod
1452
+ def setup_class(cls):
1453
+ class Override:
1454
+
1455
+ def __array_function__(self, *args, **kwargs):
1456
+ return "function"
1457
+
1458
+ def __array_ufunc__(self, *args, **kwargs):
1459
+ return "ufunc"
1460
+
1461
+ cls.override = Override()
1462
+
1463
+ @pytest.mark.parametrize("func, kwargs", [
1464
+ (np.strings.center, dict(width=10)),
1465
+ (np.strings.capitalize, {}),
1466
+ (np.strings.decode, {}),
1467
+ (np.strings.encode, {}),
1468
+ (np.strings.expandtabs, {}),
1469
+ (np.strings.ljust, dict(width=10)),
1470
+ (np.strings.lower, {}),
1471
+ (np.strings.mod, dict(values=2)),
1472
+ (np.strings.multiply, dict(i=2)),
1473
+ (np.strings.partition, dict(sep="foo")),
1474
+ (np.strings.rjust, dict(width=10)),
1475
+ (np.strings.rpartition, dict(sep="foo")),
1476
+ (np.strings.swapcase, {}),
1477
+ (np.strings.title, {}),
1478
+ (np.strings.translate, dict(table=None)),
1479
+ (np.strings.upper, {}),
1480
+ (np.strings.zfill, dict(width=10)),
1481
+ ])
1482
+ def test_override_function(self, func, kwargs):
1483
+ assert func(self.override, **kwargs) == "function"
1484
+
1485
+ @pytest.mark.parametrize("func, args, kwargs", [
1486
+ (np.strings.add, (None, ), {}),
1487
+ (np.strings.lstrip, (), {}),
1488
+ (np.strings.rstrip, (), {}),
1489
+ (np.strings.strip, (), {}),
1490
+ (np.strings.equal, (None, ), {}),
1491
+ (np.strings.not_equal, (None, ), {}),
1492
+ (np.strings.greater_equal, (None, ), {}),
1493
+ (np.strings.less_equal, (None, ), {}),
1494
+ (np.strings.greater, (None, ), {}),
1495
+ (np.strings.less, (None, ), {}),
1496
+ (np.strings.count, ("foo", ), {}),
1497
+ (np.strings.endswith, ("foo", ), {}),
1498
+ (np.strings.find, ("foo", ), {}),
1499
+ (np.strings.index, ("foo", ), {}),
1500
+ (np.strings.isalnum, (), {}),
1501
+ (np.strings.isalpha, (), {}),
1502
+ (np.strings.isdecimal, (), {}),
1503
+ (np.strings.isdigit, (), {}),
1504
+ (np.strings.islower, (), {}),
1505
+ (np.strings.isnumeric, (), {}),
1506
+ (np.strings.isspace, (), {}),
1507
+ (np.strings.istitle, (), {}),
1508
+ (np.strings.isupper, (), {}),
1509
+ (np.strings.rfind, ("foo", ), {}),
1510
+ (np.strings.rindex, ("foo", ), {}),
1511
+ (np.strings.startswith, ("foo", ), {}),
1512
+ (np.strings.str_len, (), {}),
1513
+ ])
1514
+ def test_override_ufunc(self, func, args, kwargs):
1515
+ assert func(self.override, *args, **kwargs) == "ufunc"