numpy 2.4.0__cp313-cp313t-musllinux_1_2_aarch64.whl

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