numpy 2.3.5__cp313-cp313-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of numpy might be problematic. Click here for more details.

Files changed (897) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +102 -0
  3. numpy/__init__.cython-30.pxd +1241 -0
  4. numpy/__init__.pxd +1154 -0
  5. numpy/__init__.py +945 -0
  6. numpy/__init__.pyi +6147 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +207 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +186 -0
  12. numpy/_core/__init__.pyi +2 -0
  13. numpy/_core/_add_newdocs.py +6967 -0
  14. numpy/_core/_add_newdocs.pyi +3 -0
  15. numpy/_core/_add_newdocs_scalars.py +390 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +134 -0
  18. numpy/_core/_asarray.pyi +41 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +58 -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 +55 -0
  25. numpy/_core/_internal.py +958 -0
  26. numpy/_core/_internal.pyi +72 -0
  27. numpy/_core/_machar.py +355 -0
  28. numpy/_core/_machar.pyi +55 -0
  29. numpy/_core/_methods.py +255 -0
  30. numpy/_core/_methods.pyi +22 -0
  31. numpy/_core/_multiarray_tests.cpython-313-darwin.so +0 -0
  32. numpy/_core/_multiarray_umath.cpython-313-darwin.so +0 -0
  33. numpy/_core/_operand_flag_tests.cpython-313-darwin.so +0 -0
  34. numpy/_core/_rational_tests.cpython-313-darwin.so +0 -0
  35. numpy/_core/_simd.cpython-313-darwin.so +0 -0
  36. numpy/_core/_simd.pyi +25 -0
  37. numpy/_core/_string_helpers.py +100 -0
  38. numpy/_core/_string_helpers.pyi +12 -0
  39. numpy/_core/_struct_ufunc_tests.cpython-313-darwin.so +0 -0
  40. numpy/_core/_type_aliases.py +119 -0
  41. numpy/_core/_type_aliases.pyi +97 -0
  42. numpy/_core/_ufunc_config.py +491 -0
  43. numpy/_core/_ufunc_config.pyi +78 -0
  44. numpy/_core/_umath_tests.cpython-313-darwin.so +0 -0
  45. numpy/_core/arrayprint.py +1775 -0
  46. numpy/_core/arrayprint.pyi +238 -0
  47. numpy/_core/cversions.py +13 -0
  48. numpy/_core/defchararray.py +1427 -0
  49. numpy/_core/defchararray.pyi +1135 -0
  50. numpy/_core/einsumfunc.py +1498 -0
  51. numpy/_core/einsumfunc.pyi +184 -0
  52. numpy/_core/fromnumeric.py +4269 -0
  53. numpy/_core/fromnumeric.pyi +1750 -0
  54. numpy/_core/function_base.py +545 -0
  55. numpy/_core/function_base.pyi +278 -0
  56. numpy/_core/getlimits.py +748 -0
  57. numpy/_core/getlimits.pyi +3 -0
  58. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  59. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  60. numpy/_core/include/numpy/__ufunc_api.c +54 -0
  61. numpy/_core/include/numpy/__ufunc_api.h +341 -0
  62. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  63. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  64. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  65. numpy/_core/include/numpy/arrayobject.h +7 -0
  66. numpy/_core/include/numpy/arrayscalars.h +196 -0
  67. numpy/_core/include/numpy/dtype_api.h +480 -0
  68. numpy/_core/include/numpy/halffloat.h +70 -0
  69. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  70. numpy/_core/include/numpy/ndarraytypes.h +1950 -0
  71. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  72. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  73. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  74. numpy/_core/include/numpy/npy_common.h +977 -0
  75. numpy/_core/include/numpy/npy_cpu.h +124 -0
  76. numpy/_core/include/numpy/npy_endian.h +78 -0
  77. numpy/_core/include/numpy/npy_math.h +602 -0
  78. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  79. numpy/_core/include/numpy/npy_os.h +42 -0
  80. numpy/_core/include/numpy/numpyconfig.h +182 -0
  81. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  82. numpy/_core/include/numpy/random/bitgen.h +20 -0
  83. numpy/_core/include/numpy/random/distributions.h +209 -0
  84. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  85. numpy/_core/include/numpy/ufuncobject.h +343 -0
  86. numpy/_core/include/numpy/utils.h +37 -0
  87. numpy/_core/lib/libnpymath.a +0 -0
  88. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  89. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  90. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  91. numpy/_core/memmap.py +363 -0
  92. numpy/_core/memmap.pyi +3 -0
  93. numpy/_core/multiarray.py +1762 -0
  94. numpy/_core/multiarray.pyi +1285 -0
  95. numpy/_core/numeric.py +2760 -0
  96. numpy/_core/numeric.pyi +882 -0
  97. numpy/_core/numerictypes.py +633 -0
  98. numpy/_core/numerictypes.pyi +197 -0
  99. numpy/_core/overrides.py +183 -0
  100. numpy/_core/overrides.pyi +48 -0
  101. numpy/_core/printoptions.py +32 -0
  102. numpy/_core/printoptions.pyi +28 -0
  103. numpy/_core/records.py +1089 -0
  104. numpy/_core/records.pyi +333 -0
  105. numpy/_core/shape_base.py +998 -0
  106. numpy/_core/shape_base.pyi +175 -0
  107. numpy/_core/strings.py +1829 -0
  108. numpy/_core/strings.pyi +511 -0
  109. numpy/_core/tests/_locales.py +72 -0
  110. numpy/_core/tests/_natype.py +205 -0
  111. numpy/_core/tests/data/astype_copy.pkl +0 -0
  112. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  113. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  114. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  115. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  122. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  123. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  124. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  125. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  127. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  128. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  129. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  130. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  131. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  132. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  134. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  135. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  136. numpy/_core/tests/examples/cython/meson.build +43 -0
  137. numpy/_core/tests/examples/cython/setup.py +39 -0
  138. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  139. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  140. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  141. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  142. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  143. numpy/_core/tests/test__exceptions.py +90 -0
  144. numpy/_core/tests/test_abc.py +54 -0
  145. numpy/_core/tests/test_api.py +654 -0
  146. numpy/_core/tests/test_argparse.py +92 -0
  147. numpy/_core/tests/test_array_api_info.py +113 -0
  148. numpy/_core/tests/test_array_coercion.py +911 -0
  149. numpy/_core/tests/test_array_interface.py +222 -0
  150. numpy/_core/tests/test_arraymethod.py +84 -0
  151. numpy/_core/tests/test_arrayobject.py +75 -0
  152. numpy/_core/tests/test_arrayprint.py +1328 -0
  153. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  154. numpy/_core/tests/test_casting_unittests.py +817 -0
  155. numpy/_core/tests/test_conversion_utils.py +206 -0
  156. numpy/_core/tests/test_cpu_dispatcher.py +49 -0
  157. numpy/_core/tests/test_cpu_features.py +432 -0
  158. numpy/_core/tests/test_custom_dtypes.py +315 -0
  159. numpy/_core/tests/test_cython.py +351 -0
  160. numpy/_core/tests/test_datetime.py +2734 -0
  161. numpy/_core/tests/test_defchararray.py +825 -0
  162. numpy/_core/tests/test_deprecations.py +454 -0
  163. numpy/_core/tests/test_dlpack.py +190 -0
  164. numpy/_core/tests/test_dtype.py +1995 -0
  165. numpy/_core/tests/test_einsum.py +1317 -0
  166. numpy/_core/tests/test_errstate.py +131 -0
  167. numpy/_core/tests/test_extint128.py +217 -0
  168. numpy/_core/tests/test_function_base.py +503 -0
  169. numpy/_core/tests/test_getlimits.py +205 -0
  170. numpy/_core/tests/test_half.py +568 -0
  171. numpy/_core/tests/test_hashtable.py +35 -0
  172. numpy/_core/tests/test_indexerrors.py +125 -0
  173. numpy/_core/tests/test_indexing.py +1455 -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 +369 -0
  177. numpy/_core/tests/test_machar.py +30 -0
  178. numpy/_core/tests/test_mem_overlap.py +930 -0
  179. numpy/_core/tests/test_mem_policy.py +452 -0
  180. numpy/_core/tests/test_memmap.py +246 -0
  181. numpy/_core/tests/test_multiarray.py +10577 -0
  182. numpy/_core/tests/test_multithreading.py +292 -0
  183. numpy/_core/tests/test_nditer.py +3498 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4247 -0
  186. numpy/_core/tests/test_numerictypes.py +651 -0
  187. numpy/_core/tests/test_overrides.py +791 -0
  188. numpy/_core/tests/test_print.py +200 -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 +2670 -0
  192. numpy/_core/tests/test_scalar_ctors.py +207 -0
  193. numpy/_core/tests/test_scalar_methods.py +246 -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 +1176 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +891 -0
  199. numpy/_core/tests/test_simd.py +1341 -0
  200. numpy/_core/tests/test_simd_module.py +103 -0
  201. numpy/_core/tests/test_stringdtype.py +1814 -0
  202. numpy/_core/tests/test_strings.py +1499 -0
  203. numpy/_core/tests/test_ufunc.py +3313 -0
  204. numpy/_core/tests/test_umath.py +4928 -0
  205. numpy/_core/tests/test_umath_accuracy.py +124 -0
  206. numpy/_core/tests/test_umath_complex.py +626 -0
  207. numpy/_core/tests/test_unicode.py +368 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +197 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +79 -0
  213. numpy/_expired_attrs_2_0.pyi +62 -0
  214. numpy/_globals.py +96 -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 +13 -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 +148 -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 +40 -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 +941 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +30 -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 +71 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +121 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +258 -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 +33 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +245 -0
  277. numpy/doc/ufuncs.py +138 -0
  278. numpy/dtypes.py +41 -0
  279. numpy/dtypes.pyi +631 -0
  280. numpy/exceptions.py +247 -0
  281. numpy/exceptions.pyi +27 -0
  282. numpy/f2py/__init__.py +86 -0
  283. numpy/f2py/__init__.pyi +6 -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 +231 -0
  294. numpy/f2py/_backends/_meson.pyi +63 -0
  295. numpy/f2py/_backends/meson.build.template +55 -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 +29 -0
  300. numpy/f2py/auxfuncs.py +1004 -0
  301. numpy/f2py/auxfuncs.pyi +264 -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 +258 -0
  312. numpy/f2py/diagnose.py +149 -0
  313. numpy/f2py/diagnose.pyi +1 -0
  314. numpy/f2py/f2py2e.py +786 -0
  315. numpy/f2py/f2py2e.pyi +76 -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 +43 -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 +1516 -0
  326. numpy/f2py/symbolic.pyi +221 -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 +64 -0
  435. numpy/f2py/tests/test_f2cmap.py +17 -0
  436. numpy/f2py/tests/test_f2py2e.py +964 -0
  437. numpy/f2py/tests/test_isoc.py +56 -0
  438. numpy/f2py/tests/test_kind.py +53 -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 +495 -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 +215 -0
  460. numpy/fft/__init__.pyi +43 -0
  461. numpy/fft/_helper.py +235 -0
  462. numpy/fft/_helper.pyi +45 -0
  463. numpy/fft/_pocketfft.py +1693 -0
  464. numpy/fft/_pocketfft.pyi +138 -0
  465. numpy/fft/_pocketfft_umath.cpython-313-darwin.so +0 -0
  466. numpy/fft/helper.py +17 -0
  467. numpy/fft/helper.pyi +22 -0
  468. numpy/fft/tests/__init__.py +0 -0
  469. numpy/fft/tests/test_helper.py +167 -0
  470. numpy/fft/tests/test_pocketfft.py +589 -0
  471. numpy/lib/__init__.py +97 -0
  472. numpy/lib/__init__.pyi +44 -0
  473. numpy/lib/_array_utils_impl.py +62 -0
  474. numpy/lib/_array_utils_impl.pyi +26 -0
  475. numpy/lib/_arraypad_impl.py +890 -0
  476. numpy/lib/_arraypad_impl.pyi +89 -0
  477. numpy/lib/_arraysetops_impl.py +1260 -0
  478. numpy/lib/_arraysetops_impl.pyi +468 -0
  479. numpy/lib/_arrayterator_impl.py +224 -0
  480. numpy/lib/_arrayterator_impl.pyi +46 -0
  481. numpy/lib/_datasource.py +700 -0
  482. numpy/lib/_datasource.pyi +31 -0
  483. numpy/lib/_format_impl.py +1036 -0
  484. numpy/lib/_format_impl.pyi +26 -0
  485. numpy/lib/_function_base_impl.py +5844 -0
  486. numpy/lib/_function_base_impl.pyi +1164 -0
  487. numpy/lib/_histograms_impl.py +1085 -0
  488. numpy/lib/_histograms_impl.pyi +50 -0
  489. numpy/lib/_index_tricks_impl.py +1067 -0
  490. numpy/lib/_index_tricks_impl.pyi +208 -0
  491. numpy/lib/_iotools.py +900 -0
  492. numpy/lib/_iotools.pyi +114 -0
  493. numpy/lib/_nanfunctions_impl.py +2024 -0
  494. numpy/lib/_nanfunctions_impl.pyi +52 -0
  495. numpy/lib/_npyio_impl.py +2596 -0
  496. numpy/lib/_npyio_impl.pyi +301 -0
  497. numpy/lib/_polynomial_impl.py +1465 -0
  498. numpy/lib/_polynomial_impl.pyi +318 -0
  499. numpy/lib/_scimath_impl.py +642 -0
  500. numpy/lib/_scimath_impl.pyi +93 -0
  501. numpy/lib/_shape_base_impl.py +1301 -0
  502. numpy/lib/_shape_base_impl.pyi +235 -0
  503. numpy/lib/_stride_tricks_impl.py +549 -0
  504. numpy/lib/_stride_tricks_impl.pyi +74 -0
  505. numpy/lib/_twodim_base_impl.py +1201 -0
  506. numpy/lib/_twodim_base_impl.pyi +438 -0
  507. numpy/lib/_type_check_impl.py +699 -0
  508. numpy/lib/_type_check_impl.pyi +350 -0
  509. numpy/lib/_ufunclike_impl.py +207 -0
  510. numpy/lib/_ufunclike_impl.pyi +67 -0
  511. numpy/lib/_user_array_impl.py +299 -0
  512. numpy/lib/_user_array_impl.pyi +225 -0
  513. numpy/lib/_utils_impl.py +784 -0
  514. numpy/lib/_utils_impl.pyi +10 -0
  515. numpy/lib/_version.py +154 -0
  516. numpy/lib/_version.pyi +17 -0
  517. numpy/lib/array_utils.py +7 -0
  518. numpy/lib/array_utils.pyi +12 -0
  519. numpy/lib/format.py +24 -0
  520. numpy/lib/format.pyi +66 -0
  521. numpy/lib/introspect.py +95 -0
  522. numpy/lib/introspect.pyi +3 -0
  523. numpy/lib/mixins.py +180 -0
  524. numpy/lib/mixins.pyi +77 -0
  525. numpy/lib/npyio.py +1 -0
  526. numpy/lib/npyio.pyi +9 -0
  527. numpy/lib/recfunctions.py +1681 -0
  528. numpy/lib/recfunctions.pyi +435 -0
  529. numpy/lib/scimath.py +13 -0
  530. numpy/lib/scimath.pyi +30 -0
  531. numpy/lib/stride_tricks.py +1 -0
  532. numpy/lib/stride_tricks.pyi +6 -0
  533. numpy/lib/tests/__init__.py +0 -0
  534. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  535. numpy/lib/tests/data/py2-objarr.npy +0 -0
  536. numpy/lib/tests/data/py2-objarr.npz +0 -0
  537. numpy/lib/tests/data/py3-objarr.npy +0 -0
  538. numpy/lib/tests/data/py3-objarr.npz +0 -0
  539. numpy/lib/tests/data/python3.npy +0 -0
  540. numpy/lib/tests/data/win64python2.npy +0 -0
  541. numpy/lib/tests/test__datasource.py +352 -0
  542. numpy/lib/tests/test__iotools.py +360 -0
  543. numpy/lib/tests/test__version.py +64 -0
  544. numpy/lib/tests/test_array_utils.py +32 -0
  545. numpy/lib/tests/test_arraypad.py +1415 -0
  546. numpy/lib/tests/test_arraysetops.py +1074 -0
  547. numpy/lib/tests/test_arrayterator.py +46 -0
  548. numpy/lib/tests/test_format.py +1054 -0
  549. numpy/lib/tests/test_function_base.py +4573 -0
  550. numpy/lib/tests/test_histograms.py +855 -0
  551. numpy/lib/tests/test_index_tricks.py +573 -0
  552. numpy/lib/tests/test_io.py +2848 -0
  553. numpy/lib/tests/test_loadtxt.py +1101 -0
  554. numpy/lib/tests/test_mixins.py +215 -0
  555. numpy/lib/tests/test_nanfunctions.py +1438 -0
  556. numpy/lib/tests/test_packbits.py +376 -0
  557. numpy/lib/tests/test_polynomial.py +320 -0
  558. numpy/lib/tests/test_recfunctions.py +1052 -0
  559. numpy/lib/tests/test_regression.py +231 -0
  560. numpy/lib/tests/test_shape_base.py +813 -0
  561. numpy/lib/tests/test_stride_tricks.py +656 -0
  562. numpy/lib/tests/test_twodim_base.py +559 -0
  563. numpy/lib/tests/test_type_check.py +473 -0
  564. numpy/lib/tests/test_ufunclike.py +97 -0
  565. numpy/lib/tests/test_utils.py +80 -0
  566. numpy/lib/user_array.py +1 -0
  567. numpy/lib/user_array.pyi +1 -0
  568. numpy/linalg/__init__.py +98 -0
  569. numpy/linalg/__init__.pyi +73 -0
  570. numpy/linalg/_linalg.py +3682 -0
  571. numpy/linalg/_linalg.pyi +475 -0
  572. numpy/linalg/_umath_linalg.cpython-313-darwin.so +0 -0
  573. numpy/linalg/_umath_linalg.pyi +61 -0
  574. numpy/linalg/lapack_lite.cpython-313-darwin.so +0 -0
  575. numpy/linalg/lapack_lite.pyi +141 -0
  576. numpy/linalg/linalg.py +17 -0
  577. numpy/linalg/linalg.pyi +69 -0
  578. numpy/linalg/tests/__init__.py +0 -0
  579. numpy/linalg/tests/test_deprecations.py +20 -0
  580. numpy/linalg/tests/test_linalg.py +2443 -0
  581. numpy/linalg/tests/test_regression.py +181 -0
  582. numpy/ma/API_CHANGES.txt +135 -0
  583. numpy/ma/LICENSE +24 -0
  584. numpy/ma/README.rst +236 -0
  585. numpy/ma/__init__.py +53 -0
  586. numpy/ma/__init__.pyi +458 -0
  587. numpy/ma/core.py +8933 -0
  588. numpy/ma/core.pyi +1462 -0
  589. numpy/ma/extras.py +2344 -0
  590. numpy/ma/extras.pyi +138 -0
  591. numpy/ma/mrecords.py +773 -0
  592. numpy/ma/mrecords.pyi +96 -0
  593. numpy/ma/tests/__init__.py +0 -0
  594. numpy/ma/tests/test_arrayobject.py +40 -0
  595. numpy/ma/tests/test_core.py +5886 -0
  596. numpy/ma/tests/test_deprecations.py +87 -0
  597. numpy/ma/tests/test_extras.py +1998 -0
  598. numpy/ma/tests/test_mrecords.py +497 -0
  599. numpy/ma/tests/test_old_ma.py +942 -0
  600. numpy/ma/tests/test_regression.py +100 -0
  601. numpy/ma/tests/test_subclassing.py +469 -0
  602. numpy/ma/testutils.py +294 -0
  603. numpy/matlib.py +380 -0
  604. numpy/matlib.pyi +582 -0
  605. numpy/matrixlib/__init__.py +12 -0
  606. numpy/matrixlib/__init__.pyi +5 -0
  607. numpy/matrixlib/defmatrix.py +1119 -0
  608. numpy/matrixlib/defmatrix.pyi +17 -0
  609. numpy/matrixlib/tests/__init__.py +0 -0
  610. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  611. numpy/matrixlib/tests/test_interaction.py +360 -0
  612. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  613. numpy/matrixlib/tests/test_matrix_linalg.py +105 -0
  614. numpy/matrixlib/tests/test_multiarray.py +17 -0
  615. numpy/matrixlib/tests/test_numeric.py +18 -0
  616. numpy/matrixlib/tests/test_regression.py +31 -0
  617. numpy/polynomial/__init__.py +187 -0
  618. numpy/polynomial/__init__.pyi +25 -0
  619. numpy/polynomial/_polybase.py +1191 -0
  620. numpy/polynomial/_polybase.pyi +285 -0
  621. numpy/polynomial/_polytypes.pyi +892 -0
  622. numpy/polynomial/chebyshev.py +2003 -0
  623. numpy/polynomial/chebyshev.pyi +181 -0
  624. numpy/polynomial/hermite.py +1740 -0
  625. numpy/polynomial/hermite.pyi +107 -0
  626. numpy/polynomial/hermite_e.py +1642 -0
  627. numpy/polynomial/hermite_e.pyi +107 -0
  628. numpy/polynomial/laguerre.py +1675 -0
  629. numpy/polynomial/laguerre.pyi +100 -0
  630. numpy/polynomial/legendre.py +1605 -0
  631. numpy/polynomial/legendre.pyi +100 -0
  632. numpy/polynomial/polynomial.py +1616 -0
  633. numpy/polynomial/polynomial.pyi +89 -0
  634. numpy/polynomial/polyutils.py +759 -0
  635. numpy/polynomial/polyutils.pyi +423 -0
  636. numpy/polynomial/tests/__init__.py +0 -0
  637. numpy/polynomial/tests/test_chebyshev.py +623 -0
  638. numpy/polynomial/tests/test_classes.py +618 -0
  639. numpy/polynomial/tests/test_hermite.py +558 -0
  640. numpy/polynomial/tests/test_hermite_e.py +559 -0
  641. numpy/polynomial/tests/test_laguerre.py +540 -0
  642. numpy/polynomial/tests/test_legendre.py +571 -0
  643. numpy/polynomial/tests/test_polynomial.py +669 -0
  644. numpy/polynomial/tests/test_polyutils.py +128 -0
  645. numpy/polynomial/tests/test_printing.py +555 -0
  646. numpy/polynomial/tests/test_symbol.py +217 -0
  647. numpy/py.typed +0 -0
  648. numpy/random/LICENSE.md +71 -0
  649. numpy/random/__init__.pxd +14 -0
  650. numpy/random/__init__.py +213 -0
  651. numpy/random/__init__.pyi +124 -0
  652. numpy/random/_bounded_integers.cpython-313-darwin.so +0 -0
  653. numpy/random/_bounded_integers.pxd +29 -0
  654. numpy/random/_bounded_integers.pyi +1 -0
  655. numpy/random/_common.cpython-313-darwin.so +0 -0
  656. numpy/random/_common.pxd +107 -0
  657. numpy/random/_common.pyi +16 -0
  658. numpy/random/_examples/cffi/extending.py +44 -0
  659. numpy/random/_examples/cffi/parse.py +53 -0
  660. numpy/random/_examples/cython/extending.pyx +77 -0
  661. numpy/random/_examples/cython/extending_distributions.pyx +118 -0
  662. numpy/random/_examples/cython/meson.build +53 -0
  663. numpy/random/_examples/numba/extending.py +86 -0
  664. numpy/random/_examples/numba/extending_distributions.py +67 -0
  665. numpy/random/_generator.cpython-313-darwin.so +0 -0
  666. numpy/random/_generator.pyi +861 -0
  667. numpy/random/_mt19937.cpython-313-darwin.so +0 -0
  668. numpy/random/_mt19937.pyi +25 -0
  669. numpy/random/_pcg64.cpython-313-darwin.so +0 -0
  670. numpy/random/_pcg64.pyi +44 -0
  671. numpy/random/_philox.cpython-313-darwin.so +0 -0
  672. numpy/random/_philox.pyi +39 -0
  673. numpy/random/_pickle.py +88 -0
  674. numpy/random/_pickle.pyi +43 -0
  675. numpy/random/_sfc64.cpython-313-darwin.so +0 -0
  676. numpy/random/_sfc64.pyi +28 -0
  677. numpy/random/bit_generator.cpython-313-darwin.so +0 -0
  678. numpy/random/bit_generator.pxd +35 -0
  679. numpy/random/bit_generator.pyi +124 -0
  680. numpy/random/c_distributions.pxd +119 -0
  681. numpy/random/lib/libnpyrandom.a +0 -0
  682. numpy/random/mtrand.cpython-313-darwin.so +0 -0
  683. numpy/random/mtrand.pyi +703 -0
  684. numpy/random/tests/__init__.py +0 -0
  685. numpy/random/tests/data/__init__.py +0 -0
  686. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  687. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  688. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  689. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  690. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  691. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  692. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  693. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  694. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  695. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  696. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  697. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  698. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  699. numpy/random/tests/test_direct.py +592 -0
  700. numpy/random/tests/test_extending.py +127 -0
  701. numpy/random/tests/test_generator_mt19937.py +2809 -0
  702. numpy/random/tests/test_generator_mt19937_regressions.py +207 -0
  703. numpy/random/tests/test_random.py +1757 -0
  704. numpy/random/tests/test_randomstate.py +2130 -0
  705. numpy/random/tests/test_randomstate_regression.py +217 -0
  706. numpy/random/tests/test_regression.py +152 -0
  707. numpy/random/tests/test_seed_sequence.py +79 -0
  708. numpy/random/tests/test_smoke.py +819 -0
  709. numpy/rec/__init__.py +2 -0
  710. numpy/rec/__init__.pyi +23 -0
  711. numpy/strings/__init__.py +2 -0
  712. numpy/strings/__init__.pyi +97 -0
  713. numpy/testing/__init__.py +22 -0
  714. numpy/testing/__init__.pyi +102 -0
  715. numpy/testing/_private/__init__.py +0 -0
  716. numpy/testing/_private/__init__.pyi +0 -0
  717. numpy/testing/_private/extbuild.py +250 -0
  718. numpy/testing/_private/extbuild.pyi +25 -0
  719. numpy/testing/_private/utils.py +2752 -0
  720. numpy/testing/_private/utils.pyi +499 -0
  721. numpy/testing/overrides.py +84 -0
  722. numpy/testing/overrides.pyi +11 -0
  723. numpy/testing/print_coercion_tables.py +207 -0
  724. numpy/testing/print_coercion_tables.pyi +27 -0
  725. numpy/testing/tests/__init__.py +0 -0
  726. numpy/testing/tests/test_utils.py +1917 -0
  727. numpy/tests/__init__.py +0 -0
  728. numpy/tests/test__all__.py +10 -0
  729. numpy/tests/test_configtool.py +48 -0
  730. numpy/tests/test_ctypeslib.py +377 -0
  731. numpy/tests/test_lazyloading.py +38 -0
  732. numpy/tests/test_matlib.py +59 -0
  733. numpy/tests/test_numpy_config.py +46 -0
  734. numpy/tests/test_numpy_version.py +54 -0
  735. numpy/tests/test_public_api.py +806 -0
  736. numpy/tests/test_reloading.py +74 -0
  737. numpy/tests/test_scripts.py +49 -0
  738. numpy/tests/test_warnings.py +78 -0
  739. numpy/typing/__init__.py +201 -0
  740. numpy/typing/mypy_plugin.py +195 -0
  741. numpy/typing/tests/__init__.py +0 -0
  742. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  743. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  744. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  745. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  746. numpy/typing/tests/data/fail/arrayprint.pyi +16 -0
  747. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  748. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  749. numpy/typing/tests/data/fail/char.pyi +65 -0
  750. numpy/typing/tests/data/fail/chararray.pyi +62 -0
  751. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  752. numpy/typing/tests/data/fail/constants.pyi +3 -0
  753. numpy/typing/tests/data/fail/datasource.pyi +15 -0
  754. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  755. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  756. numpy/typing/tests/data/fail/flatiter.pyi +20 -0
  757. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  758. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  759. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  760. numpy/typing/tests/data/fail/lib_function_base.pyi +62 -0
  761. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  762. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  763. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  764. numpy/typing/tests/data/fail/linalg.pyi +48 -0
  765. numpy/typing/tests/data/fail/ma.pyi +143 -0
  766. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  767. numpy/typing/tests/data/fail/modules.pyi +17 -0
  768. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  769. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  770. numpy/typing/tests/data/fail/ndarray_misc.pyi +36 -0
  771. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  772. numpy/typing/tests/data/fail/nested_sequence.pyi +16 -0
  773. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  774. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  775. numpy/typing/tests/data/fail/random.pyi +62 -0
  776. numpy/typing/tests/data/fail/rec.pyi +17 -0
  777. numpy/typing/tests/data/fail/scalars.pyi +87 -0
  778. numpy/typing/tests/data/fail/shape.pyi +6 -0
  779. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  780. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  781. numpy/typing/tests/data/fail/strings.pyi +52 -0
  782. numpy/typing/tests/data/fail/testing.pyi +28 -0
  783. numpy/typing/tests/data/fail/twodim_base.pyi +32 -0
  784. numpy/typing/tests/data/fail/type_check.pyi +13 -0
  785. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  786. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  787. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  788. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  789. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  790. numpy/typing/tests/data/mypy.ini +9 -0
  791. numpy/typing/tests/data/pass/arithmetic.py +612 -0
  792. numpy/typing/tests/data/pass/array_constructors.py +137 -0
  793. numpy/typing/tests/data/pass/array_like.py +43 -0
  794. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  795. numpy/typing/tests/data/pass/arrayterator.py +27 -0
  796. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  797. numpy/typing/tests/data/pass/comparisons.py +315 -0
  798. numpy/typing/tests/data/pass/dtype.py +57 -0
  799. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  800. numpy/typing/tests/data/pass/flatiter.py +19 -0
  801. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  802. numpy/typing/tests/data/pass/index_tricks.py +60 -0
  803. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  804. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  805. numpy/typing/tests/data/pass/lib_version.py +18 -0
  806. numpy/typing/tests/data/pass/literal.py +51 -0
  807. numpy/typing/tests/data/pass/ma.py +174 -0
  808. numpy/typing/tests/data/pass/mod.py +149 -0
  809. numpy/typing/tests/data/pass/modules.py +45 -0
  810. numpy/typing/tests/data/pass/multiarray.py +76 -0
  811. numpy/typing/tests/data/pass/ndarray_conversion.py +87 -0
  812. numpy/typing/tests/data/pass/ndarray_misc.py +203 -0
  813. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  814. numpy/typing/tests/data/pass/nditer.py +4 -0
  815. numpy/typing/tests/data/pass/numeric.py +95 -0
  816. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  817. numpy/typing/tests/data/pass/random.py +1497 -0
  818. numpy/typing/tests/data/pass/recfunctions.py +161 -0
  819. numpy/typing/tests/data/pass/scalars.py +248 -0
  820. numpy/typing/tests/data/pass/shape.py +19 -0
  821. numpy/typing/tests/data/pass/simple.py +168 -0
  822. numpy/typing/tests/data/pass/simple_py3.py +6 -0
  823. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  824. numpy/typing/tests/data/pass/ufunclike.py +47 -0
  825. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  826. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  827. numpy/typing/tests/data/reveal/arithmetic.pyi +720 -0
  828. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  829. numpy/typing/tests/data/reveal/array_constructors.pyi +249 -0
  830. numpy/typing/tests/data/reveal/arraypad.pyi +22 -0
  831. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  832. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  833. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  834. numpy/typing/tests/data/reveal/bitwise_ops.pyi +167 -0
  835. numpy/typing/tests/data/reveal/char.pyi +224 -0
  836. numpy/typing/tests/data/reveal/chararray.pyi +137 -0
  837. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  838. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  839. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  840. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  841. numpy/typing/tests/data/reveal/dtype.pyi +136 -0
  842. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  843. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  844. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  845. numpy/typing/tests/data/reveal/flatiter.pyi +47 -0
  846. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  847. numpy/typing/tests/data/reveal/getlimits.pyi +51 -0
  848. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  849. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  850. numpy/typing/tests/data/reveal/lib_function_base.pyi +213 -0
  851. numpy/typing/tests/data/reveal/lib_polynomial.pyi +144 -0
  852. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  853. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  854. numpy/typing/tests/data/reveal/linalg.pyi +132 -0
  855. numpy/typing/tests/data/reveal/ma.pyi +369 -0
  856. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  857. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  858. numpy/typing/tests/data/reveal/mod.pyi +179 -0
  859. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  860. numpy/typing/tests/data/reveal/multiarray.pyi +194 -0
  861. numpy/typing/tests/data/reveal/nbit_base_example.pyi +21 -0
  862. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +77 -0
  863. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +85 -0
  864. numpy/typing/tests/data/reveal/ndarray_misc.pyi +247 -0
  865. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +39 -0
  866. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  867. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  868. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  869. numpy/typing/tests/data/reveal/numeric.pyi +134 -0
  870. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  871. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +220 -0
  872. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +219 -0
  873. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  874. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  875. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  876. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  877. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  878. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  879. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  880. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  881. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  882. numpy/typing/tests/data/reveal/twodim_base.pyi +145 -0
  883. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  884. numpy/typing/tests/data/reveal/ufunc_config.pyi +30 -0
  885. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  886. numpy/typing/tests/data/reveal/ufuncs.pyi +123 -0
  887. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  888. numpy/typing/tests/test_isfile.py +32 -0
  889. numpy/typing/tests/test_runtime.py +102 -0
  890. numpy/typing/tests/test_typing.py +205 -0
  891. numpy/version.py +11 -0
  892. numpy/version.pyi +18 -0
  893. numpy-2.3.5.dist-info/LICENSE.txt +971 -0
  894. numpy-2.3.5.dist-info/METADATA +1093 -0
  895. numpy-2.3.5.dist-info/RECORD +897 -0
  896. numpy-2.3.5.dist-info/WHEEL +6 -0
  897. numpy-2.3.5.dist-info/entry_points.txt +13 -0
@@ -0,0 +1,1438 @@
1
+ import inspect
2
+ import warnings
3
+ from functools import partial
4
+
5
+ import pytest
6
+
7
+ import numpy as np
8
+ from numpy._core.numeric import normalize_axis_tuple
9
+ from numpy.exceptions import AxisError, ComplexWarning
10
+ from numpy.lib._nanfunctions_impl import _nan_mask, _replace_nan
11
+ from numpy.testing import (
12
+ assert_,
13
+ assert_almost_equal,
14
+ assert_array_equal,
15
+ assert_equal,
16
+ assert_raises,
17
+ assert_raises_regex,
18
+ suppress_warnings,
19
+ )
20
+
21
+ # Test data
22
+ _ndat = np.array([[0.6244, np.nan, 0.2692, 0.0116, np.nan, 0.1170],
23
+ [0.5351, -0.9403, np.nan, 0.2100, 0.4759, 0.2833],
24
+ [np.nan, np.nan, np.nan, 0.1042, np.nan, -0.5954],
25
+ [0.1610, np.nan, np.nan, 0.1859, 0.3146, np.nan]])
26
+
27
+
28
+ # Rows of _ndat with nans removed
29
+ _rdat = [np.array([0.6244, 0.2692, 0.0116, 0.1170]),
30
+ np.array([0.5351, -0.9403, 0.2100, 0.4759, 0.2833]),
31
+ np.array([0.1042, -0.5954]),
32
+ np.array([0.1610, 0.1859, 0.3146])]
33
+
34
+ # Rows of _ndat with nans converted to ones
35
+ _ndat_ones = np.array([[0.6244, 1.0, 0.2692, 0.0116, 1.0, 0.1170],
36
+ [0.5351, -0.9403, 1.0, 0.2100, 0.4759, 0.2833],
37
+ [1.0, 1.0, 1.0, 0.1042, 1.0, -0.5954],
38
+ [0.1610, 1.0, 1.0, 0.1859, 0.3146, 1.0]])
39
+
40
+ # Rows of _ndat with nans converted to zeros
41
+ _ndat_zeros = np.array([[0.6244, 0.0, 0.2692, 0.0116, 0.0, 0.1170],
42
+ [0.5351, -0.9403, 0.0, 0.2100, 0.4759, 0.2833],
43
+ [0.0, 0.0, 0.0, 0.1042, 0.0, -0.5954],
44
+ [0.1610, 0.0, 0.0, 0.1859, 0.3146, 0.0]])
45
+
46
+
47
+ class TestSignatureMatch:
48
+ NANFUNCS = {
49
+ np.nanmin: np.amin,
50
+ np.nanmax: np.amax,
51
+ np.nanargmin: np.argmin,
52
+ np.nanargmax: np.argmax,
53
+ np.nansum: np.sum,
54
+ np.nanprod: np.prod,
55
+ np.nancumsum: np.cumsum,
56
+ np.nancumprod: np.cumprod,
57
+ np.nanmean: np.mean,
58
+ np.nanmedian: np.median,
59
+ np.nanpercentile: np.percentile,
60
+ np.nanquantile: np.quantile,
61
+ np.nanvar: np.var,
62
+ np.nanstd: np.std,
63
+ }
64
+ IDS = [k.__name__ for k in NANFUNCS]
65
+
66
+ @staticmethod
67
+ def get_signature(func, default="..."):
68
+ """Construct a signature and replace all default parameter-values."""
69
+ prm_list = []
70
+ signature = inspect.signature(func)
71
+ for prm in signature.parameters.values():
72
+ if prm.default is inspect.Parameter.empty:
73
+ prm_list.append(prm)
74
+ else:
75
+ prm_list.append(prm.replace(default=default))
76
+ return inspect.Signature(prm_list)
77
+
78
+ @pytest.mark.parametrize("nan_func,func", NANFUNCS.items(), ids=IDS)
79
+ def test_signature_match(self, nan_func, func):
80
+ # Ignore the default parameter-values as they can sometimes differ
81
+ # between the two functions (*e.g.* one has `False` while the other
82
+ # has `np._NoValue`)
83
+ signature = self.get_signature(func)
84
+ nan_signature = self.get_signature(nan_func)
85
+ np.testing.assert_equal(signature, nan_signature)
86
+
87
+ def test_exhaustiveness(self):
88
+ """Validate that all nan functions are actually tested."""
89
+ np.testing.assert_equal(
90
+ set(self.IDS), set(np.lib._nanfunctions_impl.__all__)
91
+ )
92
+
93
+
94
+ class TestNanFunctions_MinMax:
95
+
96
+ nanfuncs = [np.nanmin, np.nanmax]
97
+ stdfuncs = [np.min, np.max]
98
+
99
+ def test_mutation(self):
100
+ # Check that passed array is not modified.
101
+ ndat = _ndat.copy()
102
+ for f in self.nanfuncs:
103
+ f(ndat)
104
+ assert_equal(ndat, _ndat)
105
+
106
+ def test_keepdims(self):
107
+ mat = np.eye(3)
108
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
109
+ for axis in [None, 0, 1]:
110
+ tgt = rf(mat, axis=axis, keepdims=True)
111
+ res = nf(mat, axis=axis, keepdims=True)
112
+ assert_(res.ndim == tgt.ndim)
113
+
114
+ def test_out(self):
115
+ mat = np.eye(3)
116
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
117
+ resout = np.zeros(3)
118
+ tgt = rf(mat, axis=1)
119
+ res = nf(mat, axis=1, out=resout)
120
+ assert_almost_equal(res, resout)
121
+ assert_almost_equal(res, tgt)
122
+
123
+ def test_dtype_from_input(self):
124
+ codes = 'efdgFDG'
125
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
126
+ for c in codes:
127
+ mat = np.eye(3, dtype=c)
128
+ tgt = rf(mat, axis=1).dtype.type
129
+ res = nf(mat, axis=1).dtype.type
130
+ assert_(res is tgt)
131
+ # scalar case
132
+ tgt = rf(mat, axis=None).dtype.type
133
+ res = nf(mat, axis=None).dtype.type
134
+ assert_(res is tgt)
135
+
136
+ def test_result_values(self):
137
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
138
+ tgt = [rf(d) for d in _rdat]
139
+ res = nf(_ndat, axis=1)
140
+ assert_almost_equal(res, tgt)
141
+
142
+ @pytest.mark.parametrize("axis", [None, 0, 1])
143
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
144
+ @pytest.mark.parametrize("array", [
145
+ np.array(np.nan),
146
+ np.full((3, 3), np.nan),
147
+ ], ids=["0d", "2d"])
148
+ def test_allnans(self, axis, dtype, array):
149
+ if axis is not None and array.ndim == 0:
150
+ pytest.skip("`axis != None` not supported for 0d arrays")
151
+
152
+ array = array.astype(dtype)
153
+ match = "All-NaN slice encountered"
154
+ for func in self.nanfuncs:
155
+ with pytest.warns(RuntimeWarning, match=match):
156
+ out = func(array, axis=axis)
157
+ assert np.isnan(out).all()
158
+ assert out.dtype == array.dtype
159
+
160
+ def test_masked(self):
161
+ mat = np.ma.fix_invalid(_ndat)
162
+ msk = mat._mask.copy()
163
+ for f in [np.nanmin]:
164
+ res = f(mat, axis=1)
165
+ tgt = f(_ndat, axis=1)
166
+ assert_equal(res, tgt)
167
+ assert_equal(mat._mask, msk)
168
+ assert_(not np.isinf(mat).any())
169
+
170
+ def test_scalar(self):
171
+ for f in self.nanfuncs:
172
+ assert_(f(0.) == 0.)
173
+
174
+ def test_subclass(self):
175
+ class MyNDArray(np.ndarray):
176
+ pass
177
+
178
+ # Check that it works and that type and
179
+ # shape are preserved
180
+ mine = np.eye(3).view(MyNDArray)
181
+ for f in self.nanfuncs:
182
+ res = f(mine, axis=0)
183
+ assert_(isinstance(res, MyNDArray))
184
+ assert_(res.shape == (3,))
185
+ res = f(mine, axis=1)
186
+ assert_(isinstance(res, MyNDArray))
187
+ assert_(res.shape == (3,))
188
+ res = f(mine)
189
+ assert_(res.shape == ())
190
+
191
+ # check that rows of nan are dealt with for subclasses (#4628)
192
+ mine[1] = np.nan
193
+ for f in self.nanfuncs:
194
+ with warnings.catch_warnings(record=True) as w:
195
+ warnings.simplefilter('always')
196
+ res = f(mine, axis=0)
197
+ assert_(isinstance(res, MyNDArray))
198
+ assert_(not np.any(np.isnan(res)))
199
+ assert_(len(w) == 0)
200
+
201
+ with warnings.catch_warnings(record=True) as w:
202
+ warnings.simplefilter('always')
203
+ res = f(mine, axis=1)
204
+ assert_(isinstance(res, MyNDArray))
205
+ assert_(np.isnan(res[1]) and not np.isnan(res[0])
206
+ and not np.isnan(res[2]))
207
+ assert_(len(w) == 1, 'no warning raised')
208
+ assert_(issubclass(w[0].category, RuntimeWarning))
209
+
210
+ with warnings.catch_warnings(record=True) as w:
211
+ warnings.simplefilter('always')
212
+ res = f(mine)
213
+ assert_(res.shape == ())
214
+ assert_(res != np.nan)
215
+ assert_(len(w) == 0)
216
+
217
+ def test_object_array(self):
218
+ arr = np.array([[1.0, 2.0], [np.nan, 4.0], [np.nan, np.nan]], dtype=object)
219
+ assert_equal(np.nanmin(arr), 1.0)
220
+ assert_equal(np.nanmin(arr, axis=0), [1.0, 2.0])
221
+
222
+ with warnings.catch_warnings(record=True) as w:
223
+ warnings.simplefilter('always')
224
+ # assert_equal does not work on object arrays of nan
225
+ assert_equal(list(np.nanmin(arr, axis=1)), [1.0, 4.0, np.nan])
226
+ assert_(len(w) == 1, 'no warning raised')
227
+ assert_(issubclass(w[0].category, RuntimeWarning))
228
+
229
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
230
+ def test_initial(self, dtype):
231
+ class MyNDArray(np.ndarray):
232
+ pass
233
+
234
+ ar = np.arange(9).astype(dtype)
235
+ ar[:5] = np.nan
236
+
237
+ for f in self.nanfuncs:
238
+ initial = 100 if f is np.nanmax else 0
239
+
240
+ ret1 = f(ar, initial=initial)
241
+ assert ret1.dtype == dtype
242
+ assert ret1 == initial
243
+
244
+ ret2 = f(ar.view(MyNDArray), initial=initial)
245
+ assert ret2.dtype == dtype
246
+ assert ret2 == initial
247
+
248
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
249
+ def test_where(self, dtype):
250
+ class MyNDArray(np.ndarray):
251
+ pass
252
+
253
+ ar = np.arange(9).reshape(3, 3).astype(dtype)
254
+ ar[0, :] = np.nan
255
+ where = np.ones_like(ar, dtype=np.bool)
256
+ where[:, 0] = False
257
+
258
+ for f in self.nanfuncs:
259
+ reference = 4 if f is np.nanmin else 8
260
+
261
+ ret1 = f(ar, where=where, initial=5)
262
+ assert ret1.dtype == dtype
263
+ assert ret1 == reference
264
+
265
+ ret2 = f(ar.view(MyNDArray), where=where, initial=5)
266
+ assert ret2.dtype == dtype
267
+ assert ret2 == reference
268
+
269
+
270
+ class TestNanFunctions_ArgminArgmax:
271
+
272
+ nanfuncs = [np.nanargmin, np.nanargmax]
273
+
274
+ def test_mutation(self):
275
+ # Check that passed array is not modified.
276
+ ndat = _ndat.copy()
277
+ for f in self.nanfuncs:
278
+ f(ndat)
279
+ assert_equal(ndat, _ndat)
280
+
281
+ def test_result_values(self):
282
+ for f, fcmp in zip(self.nanfuncs, [np.greater, np.less]):
283
+ for row in _ndat:
284
+ with suppress_warnings() as sup:
285
+ sup.filter(RuntimeWarning, "invalid value encountered in")
286
+ ind = f(row)
287
+ val = row[ind]
288
+ # comparing with NaN is tricky as the result
289
+ # is always false except for NaN != NaN
290
+ assert_(not np.isnan(val))
291
+ assert_(not fcmp(val, row).any())
292
+ assert_(not np.equal(val, row[:ind]).any())
293
+
294
+ @pytest.mark.parametrize("axis", [None, 0, 1])
295
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
296
+ @pytest.mark.parametrize("array", [
297
+ np.array(np.nan),
298
+ np.full((3, 3), np.nan),
299
+ ], ids=["0d", "2d"])
300
+ def test_allnans(self, axis, dtype, array):
301
+ if axis is not None and array.ndim == 0:
302
+ pytest.skip("`axis != None` not supported for 0d arrays")
303
+
304
+ array = array.astype(dtype)
305
+ for func in self.nanfuncs:
306
+ with pytest.raises(ValueError, match="All-NaN slice encountered"):
307
+ func(array, axis=axis)
308
+
309
+ def test_empty(self):
310
+ mat = np.zeros((0, 3))
311
+ for f in self.nanfuncs:
312
+ for axis in [0, None]:
313
+ assert_raises_regex(
314
+ ValueError,
315
+ "attempt to get argm.. of an empty sequence",
316
+ f, mat, axis=axis)
317
+ for axis in [1]:
318
+ res = f(mat, axis=axis)
319
+ assert_equal(res, np.zeros(0))
320
+
321
+ def test_scalar(self):
322
+ for f in self.nanfuncs:
323
+ assert_(f(0.) == 0.)
324
+
325
+ def test_subclass(self):
326
+ class MyNDArray(np.ndarray):
327
+ pass
328
+
329
+ # Check that it works and that type and
330
+ # shape are preserved
331
+ mine = np.eye(3).view(MyNDArray)
332
+ for f in self.nanfuncs:
333
+ res = f(mine, axis=0)
334
+ assert_(isinstance(res, MyNDArray))
335
+ assert_(res.shape == (3,))
336
+ res = f(mine, axis=1)
337
+ assert_(isinstance(res, MyNDArray))
338
+ assert_(res.shape == (3,))
339
+ res = f(mine)
340
+ assert_(res.shape == ())
341
+
342
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
343
+ def test_keepdims(self, dtype):
344
+ ar = np.arange(9).astype(dtype)
345
+ ar[:5] = np.nan
346
+
347
+ for f in self.nanfuncs:
348
+ reference = 5 if f is np.nanargmin else 8
349
+ ret = f(ar, keepdims=True)
350
+ assert ret.ndim == ar.ndim
351
+ assert ret == reference
352
+
353
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
354
+ def test_out(self, dtype):
355
+ ar = np.arange(9).astype(dtype)
356
+ ar[:5] = np.nan
357
+
358
+ for f in self.nanfuncs:
359
+ out = np.zeros((), dtype=np.intp)
360
+ reference = 5 if f is np.nanargmin else 8
361
+ ret = f(ar, out=out)
362
+ assert ret is out
363
+ assert ret == reference
364
+
365
+
366
+ _TEST_ARRAYS = {
367
+ "0d": np.array(5),
368
+ "1d": np.array([127, 39, 93, 87, 46])
369
+ }
370
+ for _v in _TEST_ARRAYS.values():
371
+ _v.setflags(write=False)
372
+
373
+
374
+ @pytest.mark.parametrize(
375
+ "dtype",
376
+ np.typecodes["AllInteger"] + np.typecodes["AllFloat"] + "O",
377
+ )
378
+ @pytest.mark.parametrize("mat", _TEST_ARRAYS.values(), ids=_TEST_ARRAYS.keys())
379
+ class TestNanFunctions_NumberTypes:
380
+ nanfuncs = {
381
+ np.nanmin: np.min,
382
+ np.nanmax: np.max,
383
+ np.nanargmin: np.argmin,
384
+ np.nanargmax: np.argmax,
385
+ np.nansum: np.sum,
386
+ np.nanprod: np.prod,
387
+ np.nancumsum: np.cumsum,
388
+ np.nancumprod: np.cumprod,
389
+ np.nanmean: np.mean,
390
+ np.nanmedian: np.median,
391
+ np.nanvar: np.var,
392
+ np.nanstd: np.std,
393
+ }
394
+ nanfunc_ids = [i.__name__ for i in nanfuncs]
395
+
396
+ @pytest.mark.parametrize("nanfunc,func", nanfuncs.items(), ids=nanfunc_ids)
397
+ @np.errstate(over="ignore")
398
+ def test_nanfunc(self, mat, dtype, nanfunc, func):
399
+ mat = mat.astype(dtype)
400
+ tgt = func(mat)
401
+ out = nanfunc(mat)
402
+
403
+ assert_almost_equal(out, tgt)
404
+ if dtype == "O":
405
+ assert type(out) is type(tgt)
406
+ else:
407
+ assert out.dtype == tgt.dtype
408
+
409
+ @pytest.mark.parametrize(
410
+ "nanfunc,func",
411
+ [(np.nanquantile, np.quantile), (np.nanpercentile, np.percentile)],
412
+ ids=["nanquantile", "nanpercentile"],
413
+ )
414
+ def test_nanfunc_q(self, mat, dtype, nanfunc, func):
415
+ mat = mat.astype(dtype)
416
+ if mat.dtype.kind == "c":
417
+ assert_raises(TypeError, func, mat, q=1)
418
+ assert_raises(TypeError, nanfunc, mat, q=1)
419
+
420
+ else:
421
+ tgt = func(mat, q=1)
422
+ out = nanfunc(mat, q=1)
423
+
424
+ assert_almost_equal(out, tgt)
425
+
426
+ if dtype == "O":
427
+ assert type(out) is type(tgt)
428
+ else:
429
+ assert out.dtype == tgt.dtype
430
+
431
+ @pytest.mark.parametrize(
432
+ "nanfunc,func",
433
+ [(np.nanvar, np.var), (np.nanstd, np.std)],
434
+ ids=["nanvar", "nanstd"],
435
+ )
436
+ def test_nanfunc_ddof(self, mat, dtype, nanfunc, func):
437
+ mat = mat.astype(dtype)
438
+ tgt = func(mat, ddof=0.5)
439
+ out = nanfunc(mat, ddof=0.5)
440
+
441
+ assert_almost_equal(out, tgt)
442
+ if dtype == "O":
443
+ assert type(out) is type(tgt)
444
+ else:
445
+ assert out.dtype == tgt.dtype
446
+
447
+ @pytest.mark.parametrize(
448
+ "nanfunc", [np.nanvar, np.nanstd]
449
+ )
450
+ def test_nanfunc_correction(self, mat, dtype, nanfunc):
451
+ mat = mat.astype(dtype)
452
+ assert_almost_equal(
453
+ nanfunc(mat, correction=0.5), nanfunc(mat, ddof=0.5)
454
+ )
455
+
456
+ err_msg = "ddof and correction can't be provided simultaneously."
457
+ with assert_raises_regex(ValueError, err_msg):
458
+ nanfunc(mat, ddof=0.5, correction=0.5)
459
+
460
+ with assert_raises_regex(ValueError, err_msg):
461
+ nanfunc(mat, ddof=1, correction=0)
462
+
463
+
464
+ class SharedNanFunctionsTestsMixin:
465
+ def test_mutation(self):
466
+ # Check that passed array is not modified.
467
+ ndat = _ndat.copy()
468
+ for f in self.nanfuncs:
469
+ f(ndat)
470
+ assert_equal(ndat, _ndat)
471
+
472
+ def test_keepdims(self):
473
+ mat = np.eye(3)
474
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
475
+ for axis in [None, 0, 1]:
476
+ tgt = rf(mat, axis=axis, keepdims=True)
477
+ res = nf(mat, axis=axis, keepdims=True)
478
+ assert_(res.ndim == tgt.ndim)
479
+
480
+ def test_out(self):
481
+ mat = np.eye(3)
482
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
483
+ resout = np.zeros(3)
484
+ tgt = rf(mat, axis=1)
485
+ res = nf(mat, axis=1, out=resout)
486
+ assert_almost_equal(res, resout)
487
+ assert_almost_equal(res, tgt)
488
+
489
+ def test_dtype_from_dtype(self):
490
+ mat = np.eye(3)
491
+ codes = 'efdgFDG'
492
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
493
+ for c in codes:
494
+ with suppress_warnings() as sup:
495
+ if nf in {np.nanstd, np.nanvar} and c in 'FDG':
496
+ # Giving the warning is a small bug, see gh-8000
497
+ sup.filter(ComplexWarning)
498
+ tgt = rf(mat, dtype=np.dtype(c), axis=1).dtype.type
499
+ res = nf(mat, dtype=np.dtype(c), axis=1).dtype.type
500
+ assert_(res is tgt)
501
+ # scalar case
502
+ tgt = rf(mat, dtype=np.dtype(c), axis=None).dtype.type
503
+ res = nf(mat, dtype=np.dtype(c), axis=None).dtype.type
504
+ assert_(res is tgt)
505
+
506
+ def test_dtype_from_char(self):
507
+ mat = np.eye(3)
508
+ codes = 'efdgFDG'
509
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
510
+ for c in codes:
511
+ with suppress_warnings() as sup:
512
+ if nf in {np.nanstd, np.nanvar} and c in 'FDG':
513
+ # Giving the warning is a small bug, see gh-8000
514
+ sup.filter(ComplexWarning)
515
+ tgt = rf(mat, dtype=c, axis=1).dtype.type
516
+ res = nf(mat, dtype=c, axis=1).dtype.type
517
+ assert_(res is tgt)
518
+ # scalar case
519
+ tgt = rf(mat, dtype=c, axis=None).dtype.type
520
+ res = nf(mat, dtype=c, axis=None).dtype.type
521
+ assert_(res is tgt)
522
+
523
+ def test_dtype_from_input(self):
524
+ codes = 'efdgFDG'
525
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
526
+ for c in codes:
527
+ mat = np.eye(3, dtype=c)
528
+ tgt = rf(mat, axis=1).dtype.type
529
+ res = nf(mat, axis=1).dtype.type
530
+ assert_(res is tgt, f"res {res}, tgt {tgt}")
531
+ # scalar case
532
+ tgt = rf(mat, axis=None).dtype.type
533
+ res = nf(mat, axis=None).dtype.type
534
+ assert_(res is tgt)
535
+
536
+ def test_result_values(self):
537
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
538
+ tgt = [rf(d) for d in _rdat]
539
+ res = nf(_ndat, axis=1)
540
+ assert_almost_equal(res, tgt)
541
+
542
+ def test_scalar(self):
543
+ for f in self.nanfuncs:
544
+ assert_(f(0.) == 0.)
545
+
546
+ def test_subclass(self):
547
+ class MyNDArray(np.ndarray):
548
+ pass
549
+
550
+ # Check that it works and that type and
551
+ # shape are preserved
552
+ array = np.eye(3)
553
+ mine = array.view(MyNDArray)
554
+ for f in self.nanfuncs:
555
+ expected_shape = f(array, axis=0).shape
556
+ res = f(mine, axis=0)
557
+ assert_(isinstance(res, MyNDArray))
558
+ assert_(res.shape == expected_shape)
559
+ expected_shape = f(array, axis=1).shape
560
+ res = f(mine, axis=1)
561
+ assert_(isinstance(res, MyNDArray))
562
+ assert_(res.shape == expected_shape)
563
+ expected_shape = f(array).shape
564
+ res = f(mine)
565
+ assert_(isinstance(res, MyNDArray))
566
+ assert_(res.shape == expected_shape)
567
+
568
+
569
+ class TestNanFunctions_SumProd(SharedNanFunctionsTestsMixin):
570
+
571
+ nanfuncs = [np.nansum, np.nanprod]
572
+ stdfuncs = [np.sum, np.prod]
573
+
574
+ @pytest.mark.parametrize("axis", [None, 0, 1])
575
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
576
+ @pytest.mark.parametrize("array", [
577
+ np.array(np.nan),
578
+ np.full((3, 3), np.nan),
579
+ ], ids=["0d", "2d"])
580
+ def test_allnans(self, axis, dtype, array):
581
+ if axis is not None and array.ndim == 0:
582
+ pytest.skip("`axis != None` not supported for 0d arrays")
583
+
584
+ array = array.astype(dtype)
585
+ for func, identity in zip(self.nanfuncs, [0, 1]):
586
+ out = func(array, axis=axis)
587
+ assert np.all(out == identity)
588
+ assert out.dtype == array.dtype
589
+
590
+ def test_empty(self):
591
+ for f, tgt_value in zip([np.nansum, np.nanprod], [0, 1]):
592
+ mat = np.zeros((0, 3))
593
+ tgt = [tgt_value] * 3
594
+ res = f(mat, axis=0)
595
+ assert_equal(res, tgt)
596
+ tgt = []
597
+ res = f(mat, axis=1)
598
+ assert_equal(res, tgt)
599
+ tgt = tgt_value
600
+ res = f(mat, axis=None)
601
+ assert_equal(res, tgt)
602
+
603
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
604
+ def test_initial(self, dtype):
605
+ ar = np.arange(9).astype(dtype)
606
+ ar[:5] = np.nan
607
+
608
+ for f in self.nanfuncs:
609
+ reference = 28 if f is np.nansum else 3360
610
+ ret = f(ar, initial=2)
611
+ assert ret.dtype == dtype
612
+ assert ret == reference
613
+
614
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
615
+ def test_where(self, dtype):
616
+ ar = np.arange(9).reshape(3, 3).astype(dtype)
617
+ ar[0, :] = np.nan
618
+ where = np.ones_like(ar, dtype=np.bool)
619
+ where[:, 0] = False
620
+
621
+ for f in self.nanfuncs:
622
+ reference = 26 if f is np.nansum else 2240
623
+ ret = f(ar, where=where, initial=2)
624
+ assert ret.dtype == dtype
625
+ assert ret == reference
626
+
627
+
628
+ class TestNanFunctions_CumSumProd(SharedNanFunctionsTestsMixin):
629
+
630
+ nanfuncs = [np.nancumsum, np.nancumprod]
631
+ stdfuncs = [np.cumsum, np.cumprod]
632
+
633
+ @pytest.mark.parametrize("axis", [None, 0, 1])
634
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
635
+ @pytest.mark.parametrize("array", [
636
+ np.array(np.nan),
637
+ np.full((3, 3), np.nan)
638
+ ], ids=["0d", "2d"])
639
+ def test_allnans(self, axis, dtype, array):
640
+ if axis is not None and array.ndim == 0:
641
+ pytest.skip("`axis != None` not supported for 0d arrays")
642
+
643
+ array = array.astype(dtype)
644
+ for func, identity in zip(self.nanfuncs, [0, 1]):
645
+ out = func(array)
646
+ assert np.all(out == identity)
647
+ assert out.dtype == array.dtype
648
+
649
+ def test_empty(self):
650
+ for f, tgt_value in zip(self.nanfuncs, [0, 1]):
651
+ mat = np.zeros((0, 3))
652
+ tgt = tgt_value * np.ones((0, 3))
653
+ res = f(mat, axis=0)
654
+ assert_equal(res, tgt)
655
+ tgt = mat
656
+ res = f(mat, axis=1)
657
+ assert_equal(res, tgt)
658
+ tgt = np.zeros(0)
659
+ res = f(mat, axis=None)
660
+ assert_equal(res, tgt)
661
+
662
+ def test_keepdims(self):
663
+ for f, g in zip(self.nanfuncs, self.stdfuncs):
664
+ mat = np.eye(3)
665
+ for axis in [None, 0, 1]:
666
+ tgt = f(mat, axis=axis, out=None)
667
+ res = g(mat, axis=axis, out=None)
668
+ assert_(res.ndim == tgt.ndim)
669
+
670
+ for f in self.nanfuncs:
671
+ d = np.ones((3, 5, 7, 11))
672
+ # Randomly set some elements to NaN:
673
+ rs = np.random.RandomState(0)
674
+ d[rs.rand(*d.shape) < 0.5] = np.nan
675
+ res = f(d, axis=None)
676
+ assert_equal(res.shape, (1155,))
677
+ for axis in np.arange(4):
678
+ res = f(d, axis=axis)
679
+ assert_equal(res.shape, (3, 5, 7, 11))
680
+
681
+ def test_result_values(self):
682
+ for axis in (-2, -1, 0, 1, None):
683
+ tgt = np.cumprod(_ndat_ones, axis=axis)
684
+ res = np.nancumprod(_ndat, axis=axis)
685
+ assert_almost_equal(res, tgt)
686
+ tgt = np.cumsum(_ndat_zeros, axis=axis)
687
+ res = np.nancumsum(_ndat, axis=axis)
688
+ assert_almost_equal(res, tgt)
689
+
690
+ def test_out(self):
691
+ mat = np.eye(3)
692
+ for nf, rf in zip(self.nanfuncs, self.stdfuncs):
693
+ resout = np.eye(3)
694
+ for axis in (-2, -1, 0, 1):
695
+ tgt = rf(mat, axis=axis)
696
+ res = nf(mat, axis=axis, out=resout)
697
+ assert_almost_equal(res, resout)
698
+ assert_almost_equal(res, tgt)
699
+
700
+
701
+ class TestNanFunctions_MeanVarStd(SharedNanFunctionsTestsMixin):
702
+
703
+ nanfuncs = [np.nanmean, np.nanvar, np.nanstd]
704
+ stdfuncs = [np.mean, np.var, np.std]
705
+
706
+ def test_dtype_error(self):
707
+ for f in self.nanfuncs:
708
+ for dtype in [np.bool, np.int_, np.object_]:
709
+ assert_raises(TypeError, f, _ndat, axis=1, dtype=dtype)
710
+
711
+ def test_out_dtype_error(self):
712
+ for f in self.nanfuncs:
713
+ for dtype in [np.bool, np.int_, np.object_]:
714
+ out = np.empty(_ndat.shape[0], dtype=dtype)
715
+ assert_raises(TypeError, f, _ndat, axis=1, out=out)
716
+
717
+ def test_ddof(self):
718
+ nanfuncs = [np.nanvar, np.nanstd]
719
+ stdfuncs = [np.var, np.std]
720
+ for nf, rf in zip(nanfuncs, stdfuncs):
721
+ for ddof in [0, 1]:
722
+ tgt = [rf(d, ddof=ddof) for d in _rdat]
723
+ res = nf(_ndat, axis=1, ddof=ddof)
724
+ assert_almost_equal(res, tgt)
725
+
726
+ def test_ddof_too_big(self):
727
+ nanfuncs = [np.nanvar, np.nanstd]
728
+ stdfuncs = [np.var, np.std]
729
+ dsize = [len(d) for d in _rdat]
730
+ for nf, rf in zip(nanfuncs, stdfuncs):
731
+ for ddof in range(5):
732
+ with suppress_warnings() as sup:
733
+ sup.record(RuntimeWarning)
734
+ sup.filter(ComplexWarning)
735
+ tgt = [ddof >= d for d in dsize]
736
+ res = nf(_ndat, axis=1, ddof=ddof)
737
+ assert_equal(np.isnan(res), tgt)
738
+ if any(tgt):
739
+ assert_(len(sup.log) == 1)
740
+ else:
741
+ assert_(len(sup.log) == 0)
742
+
743
+ @pytest.mark.parametrize("axis", [None, 0, 1])
744
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
745
+ @pytest.mark.parametrize("array", [
746
+ np.array(np.nan),
747
+ np.full((3, 3), np.nan),
748
+ ], ids=["0d", "2d"])
749
+ def test_allnans(self, axis, dtype, array):
750
+ if axis is not None and array.ndim == 0:
751
+ pytest.skip("`axis != None` not supported for 0d arrays")
752
+
753
+ array = array.astype(dtype)
754
+ match = "(Degrees of freedom <= 0 for slice.)|(Mean of empty slice)"
755
+ for func in self.nanfuncs:
756
+ with pytest.warns(RuntimeWarning, match=match):
757
+ out = func(array, axis=axis)
758
+ assert np.isnan(out).all()
759
+
760
+ # `nanvar` and `nanstd` convert complex inputs to their
761
+ # corresponding floating dtype
762
+ if func is np.nanmean:
763
+ assert out.dtype == array.dtype
764
+ else:
765
+ assert out.dtype == np.abs(array).dtype
766
+
767
+ def test_empty(self):
768
+ mat = np.zeros((0, 3))
769
+ for f in self.nanfuncs:
770
+ for axis in [0, None]:
771
+ with warnings.catch_warnings(record=True) as w:
772
+ warnings.simplefilter('always')
773
+ assert_(np.isnan(f(mat, axis=axis)).all())
774
+ assert_(len(w) == 1)
775
+ assert_(issubclass(w[0].category, RuntimeWarning))
776
+ for axis in [1]:
777
+ with warnings.catch_warnings(record=True) as w:
778
+ warnings.simplefilter('always')
779
+ assert_equal(f(mat, axis=axis), np.zeros([]))
780
+ assert_(len(w) == 0)
781
+
782
+ @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
783
+ def test_where(self, dtype):
784
+ ar = np.arange(9).reshape(3, 3).astype(dtype)
785
+ ar[0, :] = np.nan
786
+ where = np.ones_like(ar, dtype=np.bool)
787
+ where[:, 0] = False
788
+
789
+ for f, f_std in zip(self.nanfuncs, self.stdfuncs):
790
+ reference = f_std(ar[where][2:])
791
+ dtype_reference = dtype if f is np.nanmean else ar.real.dtype
792
+
793
+ ret = f(ar, where=where)
794
+ assert ret.dtype == dtype_reference
795
+ np.testing.assert_allclose(ret, reference)
796
+
797
+ def test_nanstd_with_mean_keyword(self):
798
+ # Setting the seed to make the test reproducible
799
+ rng = np.random.RandomState(1234)
800
+ A = rng.randn(10, 20, 5) + 0.5
801
+ A[:, 5, :] = np.nan
802
+
803
+ mean_out = np.zeros((10, 1, 5))
804
+ std_out = np.zeros((10, 1, 5))
805
+
806
+ mean = np.nanmean(A,
807
+ out=mean_out,
808
+ axis=1,
809
+ keepdims=True)
810
+
811
+ # The returned object should be the object specified during calling
812
+ assert mean_out is mean
813
+
814
+ std = np.nanstd(A,
815
+ out=std_out,
816
+ axis=1,
817
+ keepdims=True,
818
+ mean=mean)
819
+
820
+ # The returned object should be the object specified during calling
821
+ assert std_out is std
822
+
823
+ # Shape of returned mean and std should be same
824
+ assert std.shape == mean.shape
825
+ assert std.shape == (10, 1, 5)
826
+
827
+ # Output should be the same as from the individual algorithms
828
+ std_old = np.nanstd(A, axis=1, keepdims=True)
829
+
830
+ assert std_old.shape == mean.shape
831
+ assert_almost_equal(std, std_old)
832
+
833
+
834
+ _TIME_UNITS = (
835
+ "Y", "M", "W", "D", "h", "m", "s", "ms", "us", "ns", "ps", "fs", "as"
836
+ )
837
+
838
+ # All `inexact` + `timdelta64` type codes
839
+ _TYPE_CODES = list(np.typecodes["AllFloat"])
840
+ _TYPE_CODES += [f"m8[{unit}]" for unit in _TIME_UNITS]
841
+
842
+
843
+ class TestNanFunctions_Median:
844
+
845
+ def test_mutation(self):
846
+ # Check that passed array is not modified.
847
+ ndat = _ndat.copy()
848
+ np.nanmedian(ndat)
849
+ assert_equal(ndat, _ndat)
850
+
851
+ def test_keepdims(self):
852
+ mat = np.eye(3)
853
+ for axis in [None, 0, 1]:
854
+ tgt = np.median(mat, axis=axis, out=None, overwrite_input=False)
855
+ res = np.nanmedian(mat, axis=axis, out=None, overwrite_input=False)
856
+ assert_(res.ndim == tgt.ndim)
857
+
858
+ d = np.ones((3, 5, 7, 11))
859
+ # Randomly set some elements to NaN:
860
+ w = np.random.random((4, 200)) * np.array(d.shape)[:, None]
861
+ w = w.astype(np.intp)
862
+ d[tuple(w)] = np.nan
863
+ with suppress_warnings() as sup:
864
+ sup.filter(RuntimeWarning)
865
+ res = np.nanmedian(d, axis=None, keepdims=True)
866
+ assert_equal(res.shape, (1, 1, 1, 1))
867
+ res = np.nanmedian(d, axis=(0, 1), keepdims=True)
868
+ assert_equal(res.shape, (1, 1, 7, 11))
869
+ res = np.nanmedian(d, axis=(0, 3), keepdims=True)
870
+ assert_equal(res.shape, (1, 5, 7, 1))
871
+ res = np.nanmedian(d, axis=(1,), keepdims=True)
872
+ assert_equal(res.shape, (3, 1, 7, 11))
873
+ res = np.nanmedian(d, axis=(0, 1, 2, 3), keepdims=True)
874
+ assert_equal(res.shape, (1, 1, 1, 1))
875
+ res = np.nanmedian(d, axis=(0, 1, 3), keepdims=True)
876
+ assert_equal(res.shape, (1, 1, 7, 1))
877
+
878
+ @pytest.mark.parametrize(
879
+ argnames='axis',
880
+ argvalues=[
881
+ None,
882
+ 1,
883
+ (1, ),
884
+ (0, 1),
885
+ (-3, -1),
886
+ ]
887
+ )
888
+ @pytest.mark.filterwarnings("ignore:All-NaN slice:RuntimeWarning")
889
+ def test_keepdims_out(self, axis):
890
+ d = np.ones((3, 5, 7, 11))
891
+ # Randomly set some elements to NaN:
892
+ w = np.random.random((4, 200)) * np.array(d.shape)[:, None]
893
+ w = w.astype(np.intp)
894
+ d[tuple(w)] = np.nan
895
+ if axis is None:
896
+ shape_out = (1,) * d.ndim
897
+ else:
898
+ axis_norm = normalize_axis_tuple(axis, d.ndim)
899
+ shape_out = tuple(
900
+ 1 if i in axis_norm else d.shape[i] for i in range(d.ndim))
901
+ out = np.empty(shape_out)
902
+ result = np.nanmedian(d, axis=axis, keepdims=True, out=out)
903
+ assert result is out
904
+ assert_equal(result.shape, shape_out)
905
+
906
+ def test_out(self):
907
+ mat = np.random.rand(3, 3)
908
+ nan_mat = np.insert(mat, [0, 2], np.nan, axis=1)
909
+ resout = np.zeros(3)
910
+ tgt = np.median(mat, axis=1)
911
+ res = np.nanmedian(nan_mat, axis=1, out=resout)
912
+ assert_almost_equal(res, resout)
913
+ assert_almost_equal(res, tgt)
914
+ # 0-d output:
915
+ resout = np.zeros(())
916
+ tgt = np.median(mat, axis=None)
917
+ res = np.nanmedian(nan_mat, axis=None, out=resout)
918
+ assert_almost_equal(res, resout)
919
+ assert_almost_equal(res, tgt)
920
+ res = np.nanmedian(nan_mat, axis=(0, 1), out=resout)
921
+ assert_almost_equal(res, resout)
922
+ assert_almost_equal(res, tgt)
923
+
924
+ def test_small_large(self):
925
+ # test the small and large code paths, current cutoff 400 elements
926
+ for s in [5, 20, 51, 200, 1000]:
927
+ d = np.random.randn(4, s)
928
+ # Randomly set some elements to NaN:
929
+ w = np.random.randint(0, d.size, size=d.size // 5)
930
+ d.ravel()[w] = np.nan
931
+ d[:, 0] = 1. # ensure at least one good value
932
+ # use normal median without nans to compare
933
+ tgt = []
934
+ for x in d:
935
+ nonan = np.compress(~np.isnan(x), x)
936
+ tgt.append(np.median(nonan, overwrite_input=True))
937
+
938
+ assert_array_equal(np.nanmedian(d, axis=-1), tgt)
939
+
940
+ def test_result_values(self):
941
+ tgt = [np.median(d) for d in _rdat]
942
+ res = np.nanmedian(_ndat, axis=1)
943
+ assert_almost_equal(res, tgt)
944
+
945
+ @pytest.mark.parametrize("axis", [None, 0, 1])
946
+ @pytest.mark.parametrize("dtype", _TYPE_CODES)
947
+ def test_allnans(self, dtype, axis):
948
+ mat = np.full((3, 3), np.nan).astype(dtype)
949
+ with suppress_warnings() as sup:
950
+ sup.record(RuntimeWarning)
951
+
952
+ output = np.nanmedian(mat, axis=axis)
953
+ assert output.dtype == mat.dtype
954
+ assert np.isnan(output).all()
955
+
956
+ if axis is None:
957
+ assert_(len(sup.log) == 1)
958
+ else:
959
+ assert_(len(sup.log) == 3)
960
+
961
+ # Check scalar
962
+ scalar = np.array(np.nan).astype(dtype)[()]
963
+ output_scalar = np.nanmedian(scalar)
964
+ assert output_scalar.dtype == scalar.dtype
965
+ assert np.isnan(output_scalar)
966
+
967
+ if axis is None:
968
+ assert_(len(sup.log) == 2)
969
+ else:
970
+ assert_(len(sup.log) == 4)
971
+
972
+ def test_empty(self):
973
+ mat = np.zeros((0, 3))
974
+ for axis in [0, None]:
975
+ with warnings.catch_warnings(record=True) as w:
976
+ warnings.simplefilter('always')
977
+ assert_(np.isnan(np.nanmedian(mat, axis=axis)).all())
978
+ assert_(len(w) == 1)
979
+ assert_(issubclass(w[0].category, RuntimeWarning))
980
+ for axis in [1]:
981
+ with warnings.catch_warnings(record=True) as w:
982
+ warnings.simplefilter('always')
983
+ assert_equal(np.nanmedian(mat, axis=axis), np.zeros([]))
984
+ assert_(len(w) == 0)
985
+
986
+ def test_scalar(self):
987
+ assert_(np.nanmedian(0.) == 0.)
988
+
989
+ def test_extended_axis_invalid(self):
990
+ d = np.ones((3, 5, 7, 11))
991
+ assert_raises(AxisError, np.nanmedian, d, axis=-5)
992
+ assert_raises(AxisError, np.nanmedian, d, axis=(0, -5))
993
+ assert_raises(AxisError, np.nanmedian, d, axis=4)
994
+ assert_raises(AxisError, np.nanmedian, d, axis=(0, 4))
995
+ assert_raises(ValueError, np.nanmedian, d, axis=(1, 1))
996
+
997
+ def test_float_special(self):
998
+ with suppress_warnings() as sup:
999
+ sup.filter(RuntimeWarning)
1000
+ for inf in [np.inf, -np.inf]:
1001
+ a = np.array([[inf, np.nan], [np.nan, np.nan]])
1002
+ assert_equal(np.nanmedian(a, axis=0), [inf, np.nan])
1003
+ assert_equal(np.nanmedian(a, axis=1), [inf, np.nan])
1004
+ assert_equal(np.nanmedian(a), inf)
1005
+
1006
+ # minimum fill value check
1007
+ a = np.array([[np.nan, np.nan, inf],
1008
+ [np.nan, np.nan, inf]])
1009
+ assert_equal(np.nanmedian(a), inf)
1010
+ assert_equal(np.nanmedian(a, axis=0), [np.nan, np.nan, inf])
1011
+ assert_equal(np.nanmedian(a, axis=1), inf)
1012
+
1013
+ # no mask path
1014
+ a = np.array([[inf, inf], [inf, inf]])
1015
+ assert_equal(np.nanmedian(a, axis=1), inf)
1016
+
1017
+ a = np.array([[inf, 7, -inf, -9],
1018
+ [-10, np.nan, np.nan, 5],
1019
+ [4, np.nan, np.nan, inf]],
1020
+ dtype=np.float32)
1021
+ if inf > 0:
1022
+ assert_equal(np.nanmedian(a, axis=0), [4., 7., -inf, 5.])
1023
+ assert_equal(np.nanmedian(a), 4.5)
1024
+ else:
1025
+ assert_equal(np.nanmedian(a, axis=0), [-10., 7., -inf, -9.])
1026
+ assert_equal(np.nanmedian(a), -2.5)
1027
+ assert_equal(np.nanmedian(a, axis=-1), [-1., -2.5, inf])
1028
+
1029
+ for i in range(10):
1030
+ for j in range(1, 10):
1031
+ a = np.array([([np.nan] * i) + ([inf] * j)] * 2)
1032
+ assert_equal(np.nanmedian(a), inf)
1033
+ assert_equal(np.nanmedian(a, axis=1), inf)
1034
+ assert_equal(np.nanmedian(a, axis=0),
1035
+ ([np.nan] * i) + [inf] * j)
1036
+
1037
+ a = np.array([([np.nan] * i) + ([-inf] * j)] * 2)
1038
+ assert_equal(np.nanmedian(a), -inf)
1039
+ assert_equal(np.nanmedian(a, axis=1), -inf)
1040
+ assert_equal(np.nanmedian(a, axis=0),
1041
+ ([np.nan] * i) + [-inf] * j)
1042
+
1043
+
1044
+ class TestNanFunctions_Percentile:
1045
+
1046
+ def test_mutation(self):
1047
+ # Check that passed array is not modified.
1048
+ ndat = _ndat.copy()
1049
+ np.nanpercentile(ndat, 30)
1050
+ assert_equal(ndat, _ndat)
1051
+
1052
+ def test_keepdims(self):
1053
+ mat = np.eye(3)
1054
+ for axis in [None, 0, 1]:
1055
+ tgt = np.percentile(mat, 70, axis=axis, out=None,
1056
+ overwrite_input=False)
1057
+ res = np.nanpercentile(mat, 70, axis=axis, out=None,
1058
+ overwrite_input=False)
1059
+ assert_(res.ndim == tgt.ndim)
1060
+
1061
+ d = np.ones((3, 5, 7, 11))
1062
+ # Randomly set some elements to NaN:
1063
+ w = np.random.random((4, 200)) * np.array(d.shape)[:, None]
1064
+ w = w.astype(np.intp)
1065
+ d[tuple(w)] = np.nan
1066
+ with suppress_warnings() as sup:
1067
+ sup.filter(RuntimeWarning)
1068
+ res = np.nanpercentile(d, 90, axis=None, keepdims=True)
1069
+ assert_equal(res.shape, (1, 1, 1, 1))
1070
+ res = np.nanpercentile(d, 90, axis=(0, 1), keepdims=True)
1071
+ assert_equal(res.shape, (1, 1, 7, 11))
1072
+ res = np.nanpercentile(d, 90, axis=(0, 3), keepdims=True)
1073
+ assert_equal(res.shape, (1, 5, 7, 1))
1074
+ res = np.nanpercentile(d, 90, axis=(1,), keepdims=True)
1075
+ assert_equal(res.shape, (3, 1, 7, 11))
1076
+ res = np.nanpercentile(d, 90, axis=(0, 1, 2, 3), keepdims=True)
1077
+ assert_equal(res.shape, (1, 1, 1, 1))
1078
+ res = np.nanpercentile(d, 90, axis=(0, 1, 3), keepdims=True)
1079
+ assert_equal(res.shape, (1, 1, 7, 1))
1080
+
1081
+ @pytest.mark.parametrize('q', [7, [1, 7]])
1082
+ @pytest.mark.parametrize(
1083
+ argnames='axis',
1084
+ argvalues=[
1085
+ None,
1086
+ 1,
1087
+ (1,),
1088
+ (0, 1),
1089
+ (-3, -1),
1090
+ ]
1091
+ )
1092
+ @pytest.mark.filterwarnings("ignore:All-NaN slice:RuntimeWarning")
1093
+ def test_keepdims_out(self, q, axis):
1094
+ d = np.ones((3, 5, 7, 11))
1095
+ # Randomly set some elements to NaN:
1096
+ w = np.random.random((4, 200)) * np.array(d.shape)[:, None]
1097
+ w = w.astype(np.intp)
1098
+ d[tuple(w)] = np.nan
1099
+ if axis is None:
1100
+ shape_out = (1,) * d.ndim
1101
+ else:
1102
+ axis_norm = normalize_axis_tuple(axis, d.ndim)
1103
+ shape_out = tuple(
1104
+ 1 if i in axis_norm else d.shape[i] for i in range(d.ndim))
1105
+ shape_out = np.shape(q) + shape_out
1106
+
1107
+ out = np.empty(shape_out)
1108
+ result = np.nanpercentile(d, q, axis=axis, keepdims=True, out=out)
1109
+ assert result is out
1110
+ assert_equal(result.shape, shape_out)
1111
+
1112
+ @pytest.mark.parametrize("weighted", [False, True])
1113
+ def test_out(self, weighted):
1114
+ mat = np.random.rand(3, 3)
1115
+ nan_mat = np.insert(mat, [0, 2], np.nan, axis=1)
1116
+ resout = np.zeros(3)
1117
+ if weighted:
1118
+ w_args = {"weights": np.ones_like(mat), "method": "inverted_cdf"}
1119
+ nan_w_args = {
1120
+ "weights": np.ones_like(nan_mat), "method": "inverted_cdf"
1121
+ }
1122
+ else:
1123
+ w_args = {}
1124
+ nan_w_args = {}
1125
+ tgt = np.percentile(mat, 42, axis=1, **w_args)
1126
+ res = np.nanpercentile(nan_mat, 42, axis=1, out=resout, **nan_w_args)
1127
+ assert_almost_equal(res, resout)
1128
+ assert_almost_equal(res, tgt)
1129
+ # 0-d output:
1130
+ resout = np.zeros(())
1131
+ tgt = np.percentile(mat, 42, axis=None, **w_args)
1132
+ res = np.nanpercentile(
1133
+ nan_mat, 42, axis=None, out=resout, **nan_w_args
1134
+ )
1135
+ assert_almost_equal(res, resout)
1136
+ assert_almost_equal(res, tgt)
1137
+ res = np.nanpercentile(
1138
+ nan_mat, 42, axis=(0, 1), out=resout, **nan_w_args
1139
+ )
1140
+ assert_almost_equal(res, resout)
1141
+ assert_almost_equal(res, tgt)
1142
+
1143
+ def test_complex(self):
1144
+ arr_c = np.array([0.5 + 3.0j, 2.1 + 0.5j, 1.6 + 2.3j], dtype='G')
1145
+ assert_raises(TypeError, np.nanpercentile, arr_c, 0.5)
1146
+ arr_c = np.array([0.5 + 3.0j, 2.1 + 0.5j, 1.6 + 2.3j], dtype='D')
1147
+ assert_raises(TypeError, np.nanpercentile, arr_c, 0.5)
1148
+ arr_c = np.array([0.5 + 3.0j, 2.1 + 0.5j, 1.6 + 2.3j], dtype='F')
1149
+ assert_raises(TypeError, np.nanpercentile, arr_c, 0.5)
1150
+
1151
+ @pytest.mark.parametrize("weighted", [False, True])
1152
+ @pytest.mark.parametrize("use_out", [False, True])
1153
+ def test_result_values(self, weighted, use_out):
1154
+ if weighted:
1155
+ percentile = partial(np.percentile, method="inverted_cdf")
1156
+ nanpercentile = partial(np.nanpercentile, method="inverted_cdf")
1157
+
1158
+ def gen_weights(d):
1159
+ return np.ones_like(d)
1160
+
1161
+ else:
1162
+ percentile = np.percentile
1163
+ nanpercentile = np.nanpercentile
1164
+
1165
+ def gen_weights(d):
1166
+ return None
1167
+
1168
+ tgt = [percentile(d, 28, weights=gen_weights(d)) for d in _rdat]
1169
+ out = np.empty_like(tgt) if use_out else None
1170
+ res = nanpercentile(_ndat, 28, axis=1,
1171
+ weights=gen_weights(_ndat), out=out)
1172
+ assert_almost_equal(res, tgt)
1173
+ # Transpose the array to fit the output convention of numpy.percentile
1174
+ tgt = np.transpose([percentile(d, (28, 98), weights=gen_weights(d))
1175
+ for d in _rdat])
1176
+ out = np.empty_like(tgt) if use_out else None
1177
+ res = nanpercentile(_ndat, (28, 98), axis=1,
1178
+ weights=gen_weights(_ndat), out=out)
1179
+ assert_almost_equal(res, tgt)
1180
+
1181
+ @pytest.mark.parametrize("axis", [None, 0, 1])
1182
+ @pytest.mark.parametrize("dtype", np.typecodes["Float"])
1183
+ @pytest.mark.parametrize("array", [
1184
+ np.array(np.nan),
1185
+ np.full((3, 3), np.nan),
1186
+ ], ids=["0d", "2d"])
1187
+ def test_allnans(self, axis, dtype, array):
1188
+ if axis is not None and array.ndim == 0:
1189
+ pytest.skip("`axis != None` not supported for 0d arrays")
1190
+
1191
+ array = array.astype(dtype)
1192
+ with pytest.warns(RuntimeWarning, match="All-NaN slice encountered"):
1193
+ out = np.nanpercentile(array, 60, axis=axis)
1194
+ assert np.isnan(out).all()
1195
+ assert out.dtype == array.dtype
1196
+
1197
+ def test_empty(self):
1198
+ mat = np.zeros((0, 3))
1199
+ for axis in [0, None]:
1200
+ with warnings.catch_warnings(record=True) as w:
1201
+ warnings.simplefilter('always')
1202
+ assert_(np.isnan(np.nanpercentile(mat, 40, axis=axis)).all())
1203
+ assert_(len(w) == 1)
1204
+ assert_(issubclass(w[0].category, RuntimeWarning))
1205
+ for axis in [1]:
1206
+ with warnings.catch_warnings(record=True) as w:
1207
+ warnings.simplefilter('always')
1208
+ assert_equal(np.nanpercentile(mat, 40, axis=axis), np.zeros([]))
1209
+ assert_(len(w) == 0)
1210
+
1211
+ def test_scalar(self):
1212
+ assert_equal(np.nanpercentile(0., 100), 0.)
1213
+ a = np.arange(6)
1214
+ r = np.nanpercentile(a, 50, axis=0)
1215
+ assert_equal(r, 2.5)
1216
+ assert_(np.isscalar(r))
1217
+
1218
+ def test_extended_axis_invalid(self):
1219
+ d = np.ones((3, 5, 7, 11))
1220
+ assert_raises(AxisError, np.nanpercentile, d, q=5, axis=-5)
1221
+ assert_raises(AxisError, np.nanpercentile, d, q=5, axis=(0, -5))
1222
+ assert_raises(AxisError, np.nanpercentile, d, q=5, axis=4)
1223
+ assert_raises(AxisError, np.nanpercentile, d, q=5, axis=(0, 4))
1224
+ assert_raises(ValueError, np.nanpercentile, d, q=5, axis=(1, 1))
1225
+
1226
+ def test_multiple_percentiles(self):
1227
+ perc = [50, 100]
1228
+ mat = np.ones((4, 3))
1229
+ nan_mat = np.nan * mat
1230
+ # For checking consistency in higher dimensional case
1231
+ large_mat = np.ones((3, 4, 5))
1232
+ large_mat[:, 0:2:4, :] = 0
1233
+ large_mat[:, :, 3:] *= 2
1234
+ for axis in [None, 0, 1]:
1235
+ for keepdim in [False, True]:
1236
+ with suppress_warnings() as sup:
1237
+ sup.filter(RuntimeWarning, "All-NaN slice encountered")
1238
+ val = np.percentile(mat, perc, axis=axis, keepdims=keepdim)
1239
+ nan_val = np.nanpercentile(nan_mat, perc, axis=axis,
1240
+ keepdims=keepdim)
1241
+ assert_equal(nan_val.shape, val.shape)
1242
+
1243
+ val = np.percentile(large_mat, perc, axis=axis,
1244
+ keepdims=keepdim)
1245
+ nan_val = np.nanpercentile(large_mat, perc, axis=axis,
1246
+ keepdims=keepdim)
1247
+ assert_equal(nan_val, val)
1248
+
1249
+ megamat = np.ones((3, 4, 5, 6))
1250
+ assert_equal(
1251
+ np.nanpercentile(megamat, perc, axis=(1, 2)).shape, (2, 3, 6)
1252
+ )
1253
+
1254
+ @pytest.mark.parametrize("nan_weight", [0, 1, 2, 3, 1e200])
1255
+ def test_nan_value_with_weight(self, nan_weight):
1256
+ x = [1, np.nan, 2, 3]
1257
+ result = np.float64(2.0)
1258
+ q_unweighted = np.nanpercentile(x, 50, method="inverted_cdf")
1259
+ assert_equal(q_unweighted, result)
1260
+
1261
+ # The weight value at the nan position should not matter.
1262
+ w = [1.0, nan_weight, 1.0, 1.0]
1263
+ q_weighted = np.nanpercentile(x, 50, weights=w, method="inverted_cdf")
1264
+ assert_equal(q_weighted, result)
1265
+
1266
+ @pytest.mark.parametrize("axis", [0, 1, 2])
1267
+ def test_nan_value_with_weight_ndim(self, axis):
1268
+ # Create a multi-dimensional array to test
1269
+ np.random.seed(1)
1270
+ x_no_nan = np.random.random(size=(100, 99, 2))
1271
+ # Set some places to NaN (not particularly smart) so there is always
1272
+ # some non-Nan.
1273
+ x = x_no_nan.copy()
1274
+ x[np.arange(99), np.arange(99), 0] = np.nan
1275
+
1276
+ p = np.array([[20., 50., 30], [70, 33, 80]])
1277
+
1278
+ # We just use ones as weights, but replace it with 0 or 1e200 at the
1279
+ # NaN positions below.
1280
+ weights = np.ones_like(x)
1281
+
1282
+ # For comparison use weighted normal percentile with nan weights at
1283
+ # 0 (and no NaNs); not sure this is strictly identical but should be
1284
+ # sufficiently so (if a percentile lies exactly on a 0 value).
1285
+ weights[np.isnan(x)] = 0
1286
+ p_expected = np.percentile(
1287
+ x_no_nan, p, axis=axis, weights=weights, method="inverted_cdf")
1288
+
1289
+ p_unweighted = np.nanpercentile(
1290
+ x, p, axis=axis, method="inverted_cdf")
1291
+ # The normal and unweighted versions should be identical:
1292
+ assert_equal(p_unweighted, p_expected)
1293
+
1294
+ weights[np.isnan(x)] = 1e200 # huge value, shouldn't matter
1295
+ p_weighted = np.nanpercentile(
1296
+ x, p, axis=axis, weights=weights, method="inverted_cdf")
1297
+ assert_equal(p_weighted, p_expected)
1298
+ # Also check with out passed:
1299
+ out = np.empty_like(p_weighted)
1300
+ res = np.nanpercentile(
1301
+ x, p, axis=axis, weights=weights, out=out, method="inverted_cdf")
1302
+
1303
+ assert res is out
1304
+ assert_equal(out, p_expected)
1305
+
1306
+
1307
+ class TestNanFunctions_Quantile:
1308
+ # most of this is already tested by TestPercentile
1309
+
1310
+ @pytest.mark.parametrize("weighted", [False, True])
1311
+ def test_regression(self, weighted):
1312
+ ar = np.arange(24).reshape(2, 3, 4).astype(float)
1313
+ ar[0][1] = np.nan
1314
+ if weighted:
1315
+ w_args = {"weights": np.ones_like(ar), "method": "inverted_cdf"}
1316
+ else:
1317
+ w_args = {}
1318
+
1319
+ assert_equal(np.nanquantile(ar, q=0.5, **w_args),
1320
+ np.nanpercentile(ar, q=50, **w_args))
1321
+ assert_equal(np.nanquantile(ar, q=0.5, axis=0, **w_args),
1322
+ np.nanpercentile(ar, q=50, axis=0, **w_args))
1323
+ assert_equal(np.nanquantile(ar, q=0.5, axis=1, **w_args),
1324
+ np.nanpercentile(ar, q=50, axis=1, **w_args))
1325
+ assert_equal(np.nanquantile(ar, q=[0.5], axis=1, **w_args),
1326
+ np.nanpercentile(ar, q=[50], axis=1, **w_args))
1327
+ assert_equal(np.nanquantile(ar, q=[0.25, 0.5, 0.75], axis=1, **w_args),
1328
+ np.nanpercentile(ar, q=[25, 50, 75], axis=1, **w_args))
1329
+
1330
+ def test_basic(self):
1331
+ x = np.arange(8) * 0.5
1332
+ assert_equal(np.nanquantile(x, 0), 0.)
1333
+ assert_equal(np.nanquantile(x, 1), 3.5)
1334
+ assert_equal(np.nanquantile(x, 0.5), 1.75)
1335
+
1336
+ def test_complex(self):
1337
+ arr_c = np.array([0.5 + 3.0j, 2.1 + 0.5j, 1.6 + 2.3j], dtype='G')
1338
+ assert_raises(TypeError, np.nanquantile, arr_c, 0.5)
1339
+ arr_c = np.array([0.5 + 3.0j, 2.1 + 0.5j, 1.6 + 2.3j], dtype='D')
1340
+ assert_raises(TypeError, np.nanquantile, arr_c, 0.5)
1341
+ arr_c = np.array([0.5 + 3.0j, 2.1 + 0.5j, 1.6 + 2.3j], dtype='F')
1342
+ assert_raises(TypeError, np.nanquantile, arr_c, 0.5)
1343
+
1344
+ def test_no_p_overwrite(self):
1345
+ # this is worth retesting, because quantile does not make a copy
1346
+ p0 = np.array([0, 0.75, 0.25, 0.5, 1.0])
1347
+ p = p0.copy()
1348
+ np.nanquantile(np.arange(100.), p, method="midpoint")
1349
+ assert_array_equal(p, p0)
1350
+
1351
+ p0 = p0.tolist()
1352
+ p = p.tolist()
1353
+ np.nanquantile(np.arange(100.), p, method="midpoint")
1354
+ assert_array_equal(p, p0)
1355
+
1356
+ @pytest.mark.parametrize("axis", [None, 0, 1])
1357
+ @pytest.mark.parametrize("dtype", np.typecodes["Float"])
1358
+ @pytest.mark.parametrize("array", [
1359
+ np.array(np.nan),
1360
+ np.full((3, 3), np.nan),
1361
+ ], ids=["0d", "2d"])
1362
+ def test_allnans(self, axis, dtype, array):
1363
+ if axis is not None and array.ndim == 0:
1364
+ pytest.skip("`axis != None` not supported for 0d arrays")
1365
+
1366
+ array = array.astype(dtype)
1367
+ with pytest.warns(RuntimeWarning, match="All-NaN slice encountered"):
1368
+ out = np.nanquantile(array, 1, axis=axis)
1369
+ assert np.isnan(out).all()
1370
+ assert out.dtype == array.dtype
1371
+
1372
+ @pytest.mark.parametrize("arr, expected", [
1373
+ # array of floats with some nans
1374
+ (np.array([np.nan, 5.0, np.nan, np.inf]),
1375
+ np.array([False, True, False, True])),
1376
+ # int64 array that can't possibly have nans
1377
+ (np.array([1, 5, 7, 9], dtype=np.int64),
1378
+ True),
1379
+ # bool array that can't possibly have nans
1380
+ (np.array([False, True, False, True]),
1381
+ True),
1382
+ # 2-D complex array with nans
1383
+ (np.array([[np.nan, 5.0],
1384
+ [np.nan, np.inf]], dtype=np.complex64),
1385
+ np.array([[False, True],
1386
+ [False, True]])),
1387
+ ])
1388
+ def test__nan_mask(arr, expected):
1389
+ for out in [None, np.empty(arr.shape, dtype=np.bool)]:
1390
+ actual = _nan_mask(arr, out=out)
1391
+ assert_equal(actual, expected)
1392
+ # the above won't distinguish between True proper
1393
+ # and an array of True values; we want True proper
1394
+ # for types that can't possibly contain NaN
1395
+ if type(expected) is not np.ndarray:
1396
+ assert actual is True
1397
+
1398
+
1399
+ def test__replace_nan():
1400
+ """ Test that _replace_nan returns the original array if there are no
1401
+ NaNs, not a copy.
1402
+ """
1403
+ for dtype in [np.bool, np.int32, np.int64]:
1404
+ arr = np.array([0, 1], dtype=dtype)
1405
+ result, mask = _replace_nan(arr, 0)
1406
+ assert mask is None
1407
+ # do not make a copy if there are no nans
1408
+ assert result is arr
1409
+
1410
+ for dtype in [np.float32, np.float64]:
1411
+ arr = np.array([0, 1], dtype=dtype)
1412
+ result, mask = _replace_nan(arr, 2)
1413
+ assert (mask == False).all()
1414
+ # mask is not None, so we make a copy
1415
+ assert result is not arr
1416
+ assert_equal(result, arr)
1417
+
1418
+ arr_nan = np.array([0, 1, np.nan], dtype=dtype)
1419
+ result_nan, mask_nan = _replace_nan(arr_nan, 2)
1420
+ assert_equal(mask_nan, np.array([False, False, True]))
1421
+ assert result_nan is not arr_nan
1422
+ assert_equal(result_nan, np.array([0, 1, 2]))
1423
+ assert np.isnan(arr_nan[-1])
1424
+
1425
+
1426
+ def test_memmap_takes_fast_route(tmpdir):
1427
+ # We want memory mapped arrays to take the fast route through nanmax,
1428
+ # which avoids creating a mask by using fmax.reduce (see gh-28721). So we
1429
+ # check that on bad input, the error is from fmax (rather than maximum).
1430
+ a = np.arange(10., dtype=float)
1431
+ with open(tmpdir.join("data.bin"), "w+b") as fh:
1432
+ fh.write(a.tobytes())
1433
+ mm = np.memmap(fh, dtype=a.dtype, shape=a.shape)
1434
+ with pytest.raises(ValueError, match="reduction operation fmax"):
1435
+ np.nanmax(mm, out=np.zeros(2))
1436
+ # For completeness, same for nanmin.
1437
+ with pytest.raises(ValueError, match="reduction operation fmin"):
1438
+ np.nanmin(mm, out=np.zeros(2))