numpy 2.3.5__cp313-cp313-macosx_14_0_arm64.whl

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

Potentially problematic release.


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

Files changed (897) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +102 -0
  3. numpy/__init__.cython-30.pxd +1241 -0
  4. numpy/__init__.pxd +1154 -0
  5. numpy/__init__.py +945 -0
  6. numpy/__init__.pyi +6147 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +207 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +186 -0
  12. numpy/_core/__init__.pyi +2 -0
  13. numpy/_core/_add_newdocs.py +6967 -0
  14. numpy/_core/_add_newdocs.pyi +3 -0
  15. numpy/_core/_add_newdocs_scalars.py +390 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +134 -0
  18. numpy/_core/_asarray.pyi +41 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +58 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +55 -0
  25. numpy/_core/_internal.py +958 -0
  26. numpy/_core/_internal.pyi +72 -0
  27. numpy/_core/_machar.py +355 -0
  28. numpy/_core/_machar.pyi +55 -0
  29. numpy/_core/_methods.py +255 -0
  30. numpy/_core/_methods.pyi +22 -0
  31. numpy/_core/_multiarray_tests.cpython-313-darwin.so +0 -0
  32. numpy/_core/_multiarray_umath.cpython-313-darwin.so +0 -0
  33. numpy/_core/_operand_flag_tests.cpython-313-darwin.so +0 -0
  34. numpy/_core/_rational_tests.cpython-313-darwin.so +0 -0
  35. numpy/_core/_simd.cpython-313-darwin.so +0 -0
  36. numpy/_core/_simd.pyi +25 -0
  37. numpy/_core/_string_helpers.py +100 -0
  38. numpy/_core/_string_helpers.pyi +12 -0
  39. numpy/_core/_struct_ufunc_tests.cpython-313-darwin.so +0 -0
  40. numpy/_core/_type_aliases.py +119 -0
  41. numpy/_core/_type_aliases.pyi +97 -0
  42. numpy/_core/_ufunc_config.py +491 -0
  43. numpy/_core/_ufunc_config.pyi +78 -0
  44. numpy/_core/_umath_tests.cpython-313-darwin.so +0 -0
  45. numpy/_core/arrayprint.py +1775 -0
  46. numpy/_core/arrayprint.pyi +238 -0
  47. numpy/_core/cversions.py +13 -0
  48. numpy/_core/defchararray.py +1427 -0
  49. numpy/_core/defchararray.pyi +1135 -0
  50. numpy/_core/einsumfunc.py +1498 -0
  51. numpy/_core/einsumfunc.pyi +184 -0
  52. numpy/_core/fromnumeric.py +4269 -0
  53. numpy/_core/fromnumeric.pyi +1750 -0
  54. numpy/_core/function_base.py +545 -0
  55. numpy/_core/function_base.pyi +278 -0
  56. numpy/_core/getlimits.py +748 -0
  57. numpy/_core/getlimits.pyi +3 -0
  58. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  59. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  60. numpy/_core/include/numpy/__ufunc_api.c +54 -0
  61. numpy/_core/include/numpy/__ufunc_api.h +341 -0
  62. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  63. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  64. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  65. numpy/_core/include/numpy/arrayobject.h +7 -0
  66. numpy/_core/include/numpy/arrayscalars.h +196 -0
  67. numpy/_core/include/numpy/dtype_api.h +480 -0
  68. numpy/_core/include/numpy/halffloat.h +70 -0
  69. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  70. numpy/_core/include/numpy/ndarraytypes.h +1950 -0
  71. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  72. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  73. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  74. numpy/_core/include/numpy/npy_common.h +977 -0
  75. numpy/_core/include/numpy/npy_cpu.h +124 -0
  76. numpy/_core/include/numpy/npy_endian.h +78 -0
  77. numpy/_core/include/numpy/npy_math.h +602 -0
  78. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  79. numpy/_core/include/numpy/npy_os.h +42 -0
  80. numpy/_core/include/numpy/numpyconfig.h +182 -0
  81. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  82. numpy/_core/include/numpy/random/bitgen.h +20 -0
  83. numpy/_core/include/numpy/random/distributions.h +209 -0
  84. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  85. numpy/_core/include/numpy/ufuncobject.h +343 -0
  86. numpy/_core/include/numpy/utils.h +37 -0
  87. numpy/_core/lib/libnpymath.a +0 -0
  88. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  89. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  90. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  91. numpy/_core/memmap.py +363 -0
  92. numpy/_core/memmap.pyi +3 -0
  93. numpy/_core/multiarray.py +1762 -0
  94. numpy/_core/multiarray.pyi +1285 -0
  95. numpy/_core/numeric.py +2760 -0
  96. numpy/_core/numeric.pyi +882 -0
  97. numpy/_core/numerictypes.py +633 -0
  98. numpy/_core/numerictypes.pyi +197 -0
  99. numpy/_core/overrides.py +183 -0
  100. numpy/_core/overrides.pyi +48 -0
  101. numpy/_core/printoptions.py +32 -0
  102. numpy/_core/printoptions.pyi +28 -0
  103. numpy/_core/records.py +1089 -0
  104. numpy/_core/records.pyi +333 -0
  105. numpy/_core/shape_base.py +998 -0
  106. numpy/_core/shape_base.pyi +175 -0
  107. numpy/_core/strings.py +1829 -0
  108. numpy/_core/strings.pyi +511 -0
  109. numpy/_core/tests/_locales.py +72 -0
  110. numpy/_core/tests/_natype.py +205 -0
  111. numpy/_core/tests/data/astype_copy.pkl +0 -0
  112. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  113. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  114. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  115. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  122. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  123. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  124. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  125. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  127. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  128. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  129. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  130. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  131. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  132. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  134. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  135. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  136. numpy/_core/tests/examples/cython/meson.build +43 -0
  137. numpy/_core/tests/examples/cython/setup.py +39 -0
  138. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  139. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  140. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  141. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  142. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  143. numpy/_core/tests/test__exceptions.py +90 -0
  144. numpy/_core/tests/test_abc.py +54 -0
  145. numpy/_core/tests/test_api.py +654 -0
  146. numpy/_core/tests/test_argparse.py +92 -0
  147. numpy/_core/tests/test_array_api_info.py +113 -0
  148. numpy/_core/tests/test_array_coercion.py +911 -0
  149. numpy/_core/tests/test_array_interface.py +222 -0
  150. numpy/_core/tests/test_arraymethod.py +84 -0
  151. numpy/_core/tests/test_arrayobject.py +75 -0
  152. numpy/_core/tests/test_arrayprint.py +1328 -0
  153. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  154. numpy/_core/tests/test_casting_unittests.py +817 -0
  155. numpy/_core/tests/test_conversion_utils.py +206 -0
  156. numpy/_core/tests/test_cpu_dispatcher.py +49 -0
  157. numpy/_core/tests/test_cpu_features.py +432 -0
  158. numpy/_core/tests/test_custom_dtypes.py +315 -0
  159. numpy/_core/tests/test_cython.py +351 -0
  160. numpy/_core/tests/test_datetime.py +2734 -0
  161. numpy/_core/tests/test_defchararray.py +825 -0
  162. numpy/_core/tests/test_deprecations.py +454 -0
  163. numpy/_core/tests/test_dlpack.py +190 -0
  164. numpy/_core/tests/test_dtype.py +1995 -0
  165. numpy/_core/tests/test_einsum.py +1317 -0
  166. numpy/_core/tests/test_errstate.py +131 -0
  167. numpy/_core/tests/test_extint128.py +217 -0
  168. numpy/_core/tests/test_function_base.py +503 -0
  169. numpy/_core/tests/test_getlimits.py +205 -0
  170. numpy/_core/tests/test_half.py +568 -0
  171. numpy/_core/tests/test_hashtable.py +35 -0
  172. numpy/_core/tests/test_indexerrors.py +125 -0
  173. numpy/_core/tests/test_indexing.py +1455 -0
  174. numpy/_core/tests/test_item_selection.py +167 -0
  175. numpy/_core/tests/test_limited_api.py +102 -0
  176. numpy/_core/tests/test_longdouble.py +369 -0
  177. numpy/_core/tests/test_machar.py +30 -0
  178. numpy/_core/tests/test_mem_overlap.py +930 -0
  179. numpy/_core/tests/test_mem_policy.py +452 -0
  180. numpy/_core/tests/test_memmap.py +246 -0
  181. numpy/_core/tests/test_multiarray.py +10577 -0
  182. numpy/_core/tests/test_multithreading.py +292 -0
  183. numpy/_core/tests/test_nditer.py +3498 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4247 -0
  186. numpy/_core/tests/test_numerictypes.py +651 -0
  187. numpy/_core/tests/test_overrides.py +791 -0
  188. numpy/_core/tests/test_print.py +200 -0
  189. numpy/_core/tests/test_protocols.py +46 -0
  190. numpy/_core/tests/test_records.py +544 -0
  191. numpy/_core/tests/test_regression.py +2670 -0
  192. numpy/_core/tests/test_scalar_ctors.py +207 -0
  193. numpy/_core/tests/test_scalar_methods.py +246 -0
  194. numpy/_core/tests/test_scalarbuffer.py +153 -0
  195. numpy/_core/tests/test_scalarinherit.py +105 -0
  196. numpy/_core/tests/test_scalarmath.py +1176 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +891 -0
  199. numpy/_core/tests/test_simd.py +1341 -0
  200. numpy/_core/tests/test_simd_module.py +103 -0
  201. numpy/_core/tests/test_stringdtype.py +1814 -0
  202. numpy/_core/tests/test_strings.py +1499 -0
  203. numpy/_core/tests/test_ufunc.py +3313 -0
  204. numpy/_core/tests/test_umath.py +4928 -0
  205. numpy/_core/tests/test_umath_accuracy.py +124 -0
  206. numpy/_core/tests/test_umath_complex.py +626 -0
  207. numpy/_core/tests/test_unicode.py +368 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +197 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +79 -0
  213. numpy/_expired_attrs_2_0.pyi +62 -0
  214. numpy/_globals.py +96 -0
  215. numpy/_globals.pyi +17 -0
  216. numpy/_pyinstaller/__init__.py +0 -0
  217. numpy/_pyinstaller/__init__.pyi +0 -0
  218. numpy/_pyinstaller/hook-numpy.py +36 -0
  219. numpy/_pyinstaller/hook-numpy.pyi +13 -0
  220. numpy/_pyinstaller/tests/__init__.py +16 -0
  221. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  222. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  223. numpy/_pytesttester.py +201 -0
  224. numpy/_pytesttester.pyi +18 -0
  225. numpy/_typing/__init__.py +148 -0
  226. numpy/_typing/_add_docstring.py +153 -0
  227. numpy/_typing/_array_like.py +106 -0
  228. numpy/_typing/_char_codes.py +213 -0
  229. numpy/_typing/_dtype_like.py +114 -0
  230. numpy/_typing/_extended_precision.py +15 -0
  231. numpy/_typing/_nbit.py +19 -0
  232. numpy/_typing/_nbit_base.py +94 -0
  233. numpy/_typing/_nbit_base.pyi +40 -0
  234. numpy/_typing/_nested_sequence.py +79 -0
  235. numpy/_typing/_scalars.py +20 -0
  236. numpy/_typing/_shape.py +8 -0
  237. numpy/_typing/_ufunc.py +7 -0
  238. numpy/_typing/_ufunc.pyi +941 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +30 -0
  241. numpy/_utils/_convertions.py +18 -0
  242. numpy/_utils/_convertions.pyi +4 -0
  243. numpy/_utils/_inspect.py +192 -0
  244. numpy/_utils/_inspect.pyi +71 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +121 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +258 -0
  250. numpy/core/__init__.py +33 -0
  251. numpy/core/__init__.pyi +0 -0
  252. numpy/core/_dtype.py +10 -0
  253. numpy/core/_dtype.pyi +0 -0
  254. numpy/core/_dtype_ctypes.py +10 -0
  255. numpy/core/_dtype_ctypes.pyi +0 -0
  256. numpy/core/_internal.py +27 -0
  257. numpy/core/_multiarray_umath.py +57 -0
  258. numpy/core/_utils.py +21 -0
  259. numpy/core/arrayprint.py +10 -0
  260. numpy/core/defchararray.py +10 -0
  261. numpy/core/einsumfunc.py +10 -0
  262. numpy/core/fromnumeric.py +10 -0
  263. numpy/core/function_base.py +10 -0
  264. numpy/core/getlimits.py +10 -0
  265. numpy/core/multiarray.py +25 -0
  266. numpy/core/numeric.py +12 -0
  267. numpy/core/numerictypes.py +10 -0
  268. numpy/core/overrides.py +10 -0
  269. numpy/core/overrides.pyi +7 -0
  270. numpy/core/records.py +10 -0
  271. numpy/core/shape_base.py +10 -0
  272. numpy/core/umath.py +10 -0
  273. numpy/ctypeslib/__init__.py +13 -0
  274. numpy/ctypeslib/__init__.pyi +33 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +245 -0
  277. numpy/doc/ufuncs.py +138 -0
  278. numpy/dtypes.py +41 -0
  279. numpy/dtypes.pyi +631 -0
  280. numpy/exceptions.py +247 -0
  281. numpy/exceptions.pyi +27 -0
  282. numpy/f2py/__init__.py +86 -0
  283. numpy/f2py/__init__.pyi +6 -0
  284. numpy/f2py/__main__.py +5 -0
  285. numpy/f2py/__version__.py +1 -0
  286. numpy/f2py/__version__.pyi +1 -0
  287. numpy/f2py/_backends/__init__.py +9 -0
  288. numpy/f2py/_backends/__init__.pyi +5 -0
  289. numpy/f2py/_backends/_backend.py +44 -0
  290. numpy/f2py/_backends/_backend.pyi +46 -0
  291. numpy/f2py/_backends/_distutils.py +76 -0
  292. numpy/f2py/_backends/_distutils.pyi +13 -0
  293. numpy/f2py/_backends/_meson.py +231 -0
  294. numpy/f2py/_backends/_meson.pyi +63 -0
  295. numpy/f2py/_backends/meson.build.template +55 -0
  296. numpy/f2py/_isocbind.py +62 -0
  297. numpy/f2py/_isocbind.pyi +13 -0
  298. numpy/f2py/_src_pyf.py +247 -0
  299. numpy/f2py/_src_pyf.pyi +29 -0
  300. numpy/f2py/auxfuncs.py +1004 -0
  301. numpy/f2py/auxfuncs.pyi +264 -0
  302. numpy/f2py/capi_maps.py +811 -0
  303. numpy/f2py/capi_maps.pyi +33 -0
  304. numpy/f2py/cb_rules.py +665 -0
  305. numpy/f2py/cb_rules.pyi +17 -0
  306. numpy/f2py/cfuncs.py +1563 -0
  307. numpy/f2py/cfuncs.pyi +31 -0
  308. numpy/f2py/common_rules.py +143 -0
  309. numpy/f2py/common_rules.pyi +9 -0
  310. numpy/f2py/crackfortran.py +3725 -0
  311. numpy/f2py/crackfortran.pyi +258 -0
  312. numpy/f2py/diagnose.py +149 -0
  313. numpy/f2py/diagnose.pyi +1 -0
  314. numpy/f2py/f2py2e.py +786 -0
  315. numpy/f2py/f2py2e.pyi +76 -0
  316. numpy/f2py/f90mod_rules.py +269 -0
  317. numpy/f2py/f90mod_rules.pyi +16 -0
  318. numpy/f2py/func2subr.py +329 -0
  319. numpy/f2py/func2subr.pyi +7 -0
  320. numpy/f2py/rules.py +1629 -0
  321. numpy/f2py/rules.pyi +43 -0
  322. numpy/f2py/setup.cfg +3 -0
  323. numpy/f2py/src/fortranobject.c +1436 -0
  324. numpy/f2py/src/fortranobject.h +173 -0
  325. numpy/f2py/symbolic.py +1516 -0
  326. numpy/f2py/symbolic.pyi +221 -0
  327. numpy/f2py/tests/__init__.py +16 -0
  328. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  329. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  330. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  331. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  332. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  333. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  334. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  335. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  336. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  337. numpy/f2py/tests/src/callback/foo.f +62 -0
  338. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  339. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  340. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  341. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  342. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  343. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  344. numpy/f2py/tests/src/cli/hi77.f +3 -0
  345. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  346. numpy/f2py/tests/src/common/block.f +11 -0
  347. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  348. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  349. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  350. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  351. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  352. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  353. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  354. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  355. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  356. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  357. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  358. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  359. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  360. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  361. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  362. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  363. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  364. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  365. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  366. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  367. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  368. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  369. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  370. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  371. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  372. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  373. numpy/f2py/tests/src/mixed/foo.f +5 -0
  374. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  375. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  376. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  377. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  378. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  379. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  380. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  381. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  382. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  383. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  384. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  385. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  386. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  387. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  388. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  389. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  390. numpy/f2py/tests/src/regression/AB.inc +1 -0
  391. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  392. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  393. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  394. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  395. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  396. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  397. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  398. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  399. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  400. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  401. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  402. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  403. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  404. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  405. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  406. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  407. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  408. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  409. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  410. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  411. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  412. numpy/f2py/tests/src/routines/subrout.f +4 -0
  413. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  414. numpy/f2py/tests/src/size/foo.f90 +44 -0
  415. numpy/f2py/tests/src/string/char.f90 +29 -0
  416. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  417. numpy/f2py/tests/src/string/gh24008.f +8 -0
  418. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  419. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  420. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  421. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  422. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  423. numpy/f2py/tests/src/string/string.f +12 -0
  424. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  425. numpy/f2py/tests/test_abstract_interface.py +26 -0
  426. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  427. numpy/f2py/tests/test_assumed_shape.py +50 -0
  428. numpy/f2py/tests/test_block_docstring.py +20 -0
  429. numpy/f2py/tests/test_callback.py +263 -0
  430. numpy/f2py/tests/test_character.py +641 -0
  431. numpy/f2py/tests/test_common.py +23 -0
  432. numpy/f2py/tests/test_crackfortran.py +421 -0
  433. numpy/f2py/tests/test_data.py +71 -0
  434. numpy/f2py/tests/test_docs.py +64 -0
  435. numpy/f2py/tests/test_f2cmap.py +17 -0
  436. numpy/f2py/tests/test_f2py2e.py +964 -0
  437. numpy/f2py/tests/test_isoc.py +56 -0
  438. numpy/f2py/tests/test_kind.py +53 -0
  439. numpy/f2py/tests/test_mixed.py +35 -0
  440. numpy/f2py/tests/test_modules.py +83 -0
  441. numpy/f2py/tests/test_parameter.py +129 -0
  442. numpy/f2py/tests/test_pyf_src.py +43 -0
  443. numpy/f2py/tests/test_quoted_character.py +18 -0
  444. numpy/f2py/tests/test_regression.py +187 -0
  445. numpy/f2py/tests/test_return_character.py +48 -0
  446. numpy/f2py/tests/test_return_complex.py +67 -0
  447. numpy/f2py/tests/test_return_integer.py +55 -0
  448. numpy/f2py/tests/test_return_logical.py +65 -0
  449. numpy/f2py/tests/test_return_real.py +109 -0
  450. numpy/f2py/tests/test_routines.py +29 -0
  451. numpy/f2py/tests/test_semicolon_split.py +75 -0
  452. numpy/f2py/tests/test_size.py +45 -0
  453. numpy/f2py/tests/test_string.py +100 -0
  454. numpy/f2py/tests/test_symbolic.py +495 -0
  455. numpy/f2py/tests/test_value_attrspec.py +15 -0
  456. numpy/f2py/tests/util.py +442 -0
  457. numpy/f2py/use_rules.py +99 -0
  458. numpy/f2py/use_rules.pyi +9 -0
  459. numpy/fft/__init__.py +215 -0
  460. numpy/fft/__init__.pyi +43 -0
  461. numpy/fft/_helper.py +235 -0
  462. numpy/fft/_helper.pyi +45 -0
  463. numpy/fft/_pocketfft.py +1693 -0
  464. numpy/fft/_pocketfft.pyi +138 -0
  465. numpy/fft/_pocketfft_umath.cpython-313-darwin.so +0 -0
  466. numpy/fft/helper.py +17 -0
  467. numpy/fft/helper.pyi +22 -0
  468. numpy/fft/tests/__init__.py +0 -0
  469. numpy/fft/tests/test_helper.py +167 -0
  470. numpy/fft/tests/test_pocketfft.py +589 -0
  471. numpy/lib/__init__.py +97 -0
  472. numpy/lib/__init__.pyi +44 -0
  473. numpy/lib/_array_utils_impl.py +62 -0
  474. numpy/lib/_array_utils_impl.pyi +26 -0
  475. numpy/lib/_arraypad_impl.py +890 -0
  476. numpy/lib/_arraypad_impl.pyi +89 -0
  477. numpy/lib/_arraysetops_impl.py +1260 -0
  478. numpy/lib/_arraysetops_impl.pyi +468 -0
  479. numpy/lib/_arrayterator_impl.py +224 -0
  480. numpy/lib/_arrayterator_impl.pyi +46 -0
  481. numpy/lib/_datasource.py +700 -0
  482. numpy/lib/_datasource.pyi +31 -0
  483. numpy/lib/_format_impl.py +1036 -0
  484. numpy/lib/_format_impl.pyi +26 -0
  485. numpy/lib/_function_base_impl.py +5844 -0
  486. numpy/lib/_function_base_impl.pyi +1164 -0
  487. numpy/lib/_histograms_impl.py +1085 -0
  488. numpy/lib/_histograms_impl.pyi +50 -0
  489. numpy/lib/_index_tricks_impl.py +1067 -0
  490. numpy/lib/_index_tricks_impl.pyi +208 -0
  491. numpy/lib/_iotools.py +900 -0
  492. numpy/lib/_iotools.pyi +114 -0
  493. numpy/lib/_nanfunctions_impl.py +2024 -0
  494. numpy/lib/_nanfunctions_impl.pyi +52 -0
  495. numpy/lib/_npyio_impl.py +2596 -0
  496. numpy/lib/_npyio_impl.pyi +301 -0
  497. numpy/lib/_polynomial_impl.py +1465 -0
  498. numpy/lib/_polynomial_impl.pyi +318 -0
  499. numpy/lib/_scimath_impl.py +642 -0
  500. numpy/lib/_scimath_impl.pyi +93 -0
  501. numpy/lib/_shape_base_impl.py +1301 -0
  502. numpy/lib/_shape_base_impl.pyi +235 -0
  503. numpy/lib/_stride_tricks_impl.py +549 -0
  504. numpy/lib/_stride_tricks_impl.pyi +74 -0
  505. numpy/lib/_twodim_base_impl.py +1201 -0
  506. numpy/lib/_twodim_base_impl.pyi +438 -0
  507. numpy/lib/_type_check_impl.py +699 -0
  508. numpy/lib/_type_check_impl.pyi +350 -0
  509. numpy/lib/_ufunclike_impl.py +207 -0
  510. numpy/lib/_ufunclike_impl.pyi +67 -0
  511. numpy/lib/_user_array_impl.py +299 -0
  512. numpy/lib/_user_array_impl.pyi +225 -0
  513. numpy/lib/_utils_impl.py +784 -0
  514. numpy/lib/_utils_impl.pyi +10 -0
  515. numpy/lib/_version.py +154 -0
  516. numpy/lib/_version.pyi +17 -0
  517. numpy/lib/array_utils.py +7 -0
  518. numpy/lib/array_utils.pyi +12 -0
  519. numpy/lib/format.py +24 -0
  520. numpy/lib/format.pyi +66 -0
  521. numpy/lib/introspect.py +95 -0
  522. numpy/lib/introspect.pyi +3 -0
  523. numpy/lib/mixins.py +180 -0
  524. numpy/lib/mixins.pyi +77 -0
  525. numpy/lib/npyio.py +1 -0
  526. numpy/lib/npyio.pyi +9 -0
  527. numpy/lib/recfunctions.py +1681 -0
  528. numpy/lib/recfunctions.pyi +435 -0
  529. numpy/lib/scimath.py +13 -0
  530. numpy/lib/scimath.pyi +30 -0
  531. numpy/lib/stride_tricks.py +1 -0
  532. numpy/lib/stride_tricks.pyi +6 -0
  533. numpy/lib/tests/__init__.py +0 -0
  534. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  535. numpy/lib/tests/data/py2-objarr.npy +0 -0
  536. numpy/lib/tests/data/py2-objarr.npz +0 -0
  537. numpy/lib/tests/data/py3-objarr.npy +0 -0
  538. numpy/lib/tests/data/py3-objarr.npz +0 -0
  539. numpy/lib/tests/data/python3.npy +0 -0
  540. numpy/lib/tests/data/win64python2.npy +0 -0
  541. numpy/lib/tests/test__datasource.py +352 -0
  542. numpy/lib/tests/test__iotools.py +360 -0
  543. numpy/lib/tests/test__version.py +64 -0
  544. numpy/lib/tests/test_array_utils.py +32 -0
  545. numpy/lib/tests/test_arraypad.py +1415 -0
  546. numpy/lib/tests/test_arraysetops.py +1074 -0
  547. numpy/lib/tests/test_arrayterator.py +46 -0
  548. numpy/lib/tests/test_format.py +1054 -0
  549. numpy/lib/tests/test_function_base.py +4573 -0
  550. numpy/lib/tests/test_histograms.py +855 -0
  551. numpy/lib/tests/test_index_tricks.py +573 -0
  552. numpy/lib/tests/test_io.py +2848 -0
  553. numpy/lib/tests/test_loadtxt.py +1101 -0
  554. numpy/lib/tests/test_mixins.py +215 -0
  555. numpy/lib/tests/test_nanfunctions.py +1438 -0
  556. numpy/lib/tests/test_packbits.py +376 -0
  557. numpy/lib/tests/test_polynomial.py +320 -0
  558. numpy/lib/tests/test_recfunctions.py +1052 -0
  559. numpy/lib/tests/test_regression.py +231 -0
  560. numpy/lib/tests/test_shape_base.py +813 -0
  561. numpy/lib/tests/test_stride_tricks.py +656 -0
  562. numpy/lib/tests/test_twodim_base.py +559 -0
  563. numpy/lib/tests/test_type_check.py +473 -0
  564. numpy/lib/tests/test_ufunclike.py +97 -0
  565. numpy/lib/tests/test_utils.py +80 -0
  566. numpy/lib/user_array.py +1 -0
  567. numpy/lib/user_array.pyi +1 -0
  568. numpy/linalg/__init__.py +98 -0
  569. numpy/linalg/__init__.pyi +73 -0
  570. numpy/linalg/_linalg.py +3682 -0
  571. numpy/linalg/_linalg.pyi +475 -0
  572. numpy/linalg/_umath_linalg.cpython-313-darwin.so +0 -0
  573. numpy/linalg/_umath_linalg.pyi +61 -0
  574. numpy/linalg/lapack_lite.cpython-313-darwin.so +0 -0
  575. numpy/linalg/lapack_lite.pyi +141 -0
  576. numpy/linalg/linalg.py +17 -0
  577. numpy/linalg/linalg.pyi +69 -0
  578. numpy/linalg/tests/__init__.py +0 -0
  579. numpy/linalg/tests/test_deprecations.py +20 -0
  580. numpy/linalg/tests/test_linalg.py +2443 -0
  581. numpy/linalg/tests/test_regression.py +181 -0
  582. numpy/ma/API_CHANGES.txt +135 -0
  583. numpy/ma/LICENSE +24 -0
  584. numpy/ma/README.rst +236 -0
  585. numpy/ma/__init__.py +53 -0
  586. numpy/ma/__init__.pyi +458 -0
  587. numpy/ma/core.py +8933 -0
  588. numpy/ma/core.pyi +1462 -0
  589. numpy/ma/extras.py +2344 -0
  590. numpy/ma/extras.pyi +138 -0
  591. numpy/ma/mrecords.py +773 -0
  592. numpy/ma/mrecords.pyi +96 -0
  593. numpy/ma/tests/__init__.py +0 -0
  594. numpy/ma/tests/test_arrayobject.py +40 -0
  595. numpy/ma/tests/test_core.py +5886 -0
  596. numpy/ma/tests/test_deprecations.py +87 -0
  597. numpy/ma/tests/test_extras.py +1998 -0
  598. numpy/ma/tests/test_mrecords.py +497 -0
  599. numpy/ma/tests/test_old_ma.py +942 -0
  600. numpy/ma/tests/test_regression.py +100 -0
  601. numpy/ma/tests/test_subclassing.py +469 -0
  602. numpy/ma/testutils.py +294 -0
  603. numpy/matlib.py +380 -0
  604. numpy/matlib.pyi +582 -0
  605. numpy/matrixlib/__init__.py +12 -0
  606. numpy/matrixlib/__init__.pyi +5 -0
  607. numpy/matrixlib/defmatrix.py +1119 -0
  608. numpy/matrixlib/defmatrix.pyi +17 -0
  609. numpy/matrixlib/tests/__init__.py +0 -0
  610. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  611. numpy/matrixlib/tests/test_interaction.py +360 -0
  612. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  613. numpy/matrixlib/tests/test_matrix_linalg.py +105 -0
  614. numpy/matrixlib/tests/test_multiarray.py +17 -0
  615. numpy/matrixlib/tests/test_numeric.py +18 -0
  616. numpy/matrixlib/tests/test_regression.py +31 -0
  617. numpy/polynomial/__init__.py +187 -0
  618. numpy/polynomial/__init__.pyi +25 -0
  619. numpy/polynomial/_polybase.py +1191 -0
  620. numpy/polynomial/_polybase.pyi +285 -0
  621. numpy/polynomial/_polytypes.pyi +892 -0
  622. numpy/polynomial/chebyshev.py +2003 -0
  623. numpy/polynomial/chebyshev.pyi +181 -0
  624. numpy/polynomial/hermite.py +1740 -0
  625. numpy/polynomial/hermite.pyi +107 -0
  626. numpy/polynomial/hermite_e.py +1642 -0
  627. numpy/polynomial/hermite_e.pyi +107 -0
  628. numpy/polynomial/laguerre.py +1675 -0
  629. numpy/polynomial/laguerre.pyi +100 -0
  630. numpy/polynomial/legendre.py +1605 -0
  631. numpy/polynomial/legendre.pyi +100 -0
  632. numpy/polynomial/polynomial.py +1616 -0
  633. numpy/polynomial/polynomial.pyi +89 -0
  634. numpy/polynomial/polyutils.py +759 -0
  635. numpy/polynomial/polyutils.pyi +423 -0
  636. numpy/polynomial/tests/__init__.py +0 -0
  637. numpy/polynomial/tests/test_chebyshev.py +623 -0
  638. numpy/polynomial/tests/test_classes.py +618 -0
  639. numpy/polynomial/tests/test_hermite.py +558 -0
  640. numpy/polynomial/tests/test_hermite_e.py +559 -0
  641. numpy/polynomial/tests/test_laguerre.py +540 -0
  642. numpy/polynomial/tests/test_legendre.py +571 -0
  643. numpy/polynomial/tests/test_polynomial.py +669 -0
  644. numpy/polynomial/tests/test_polyutils.py +128 -0
  645. numpy/polynomial/tests/test_printing.py +555 -0
  646. numpy/polynomial/tests/test_symbol.py +217 -0
  647. numpy/py.typed +0 -0
  648. numpy/random/LICENSE.md +71 -0
  649. numpy/random/__init__.pxd +14 -0
  650. numpy/random/__init__.py +213 -0
  651. numpy/random/__init__.pyi +124 -0
  652. numpy/random/_bounded_integers.cpython-313-darwin.so +0 -0
  653. numpy/random/_bounded_integers.pxd +29 -0
  654. numpy/random/_bounded_integers.pyi +1 -0
  655. numpy/random/_common.cpython-313-darwin.so +0 -0
  656. numpy/random/_common.pxd +107 -0
  657. numpy/random/_common.pyi +16 -0
  658. numpy/random/_examples/cffi/extending.py +44 -0
  659. numpy/random/_examples/cffi/parse.py +53 -0
  660. numpy/random/_examples/cython/extending.pyx +77 -0
  661. numpy/random/_examples/cython/extending_distributions.pyx +118 -0
  662. numpy/random/_examples/cython/meson.build +53 -0
  663. numpy/random/_examples/numba/extending.py +86 -0
  664. numpy/random/_examples/numba/extending_distributions.py +67 -0
  665. numpy/random/_generator.cpython-313-darwin.so +0 -0
  666. numpy/random/_generator.pyi +861 -0
  667. numpy/random/_mt19937.cpython-313-darwin.so +0 -0
  668. numpy/random/_mt19937.pyi +25 -0
  669. numpy/random/_pcg64.cpython-313-darwin.so +0 -0
  670. numpy/random/_pcg64.pyi +44 -0
  671. numpy/random/_philox.cpython-313-darwin.so +0 -0
  672. numpy/random/_philox.pyi +39 -0
  673. numpy/random/_pickle.py +88 -0
  674. numpy/random/_pickle.pyi +43 -0
  675. numpy/random/_sfc64.cpython-313-darwin.so +0 -0
  676. numpy/random/_sfc64.pyi +28 -0
  677. numpy/random/bit_generator.cpython-313-darwin.so +0 -0
  678. numpy/random/bit_generator.pxd +35 -0
  679. numpy/random/bit_generator.pyi +124 -0
  680. numpy/random/c_distributions.pxd +119 -0
  681. numpy/random/lib/libnpyrandom.a +0 -0
  682. numpy/random/mtrand.cpython-313-darwin.so +0 -0
  683. numpy/random/mtrand.pyi +703 -0
  684. numpy/random/tests/__init__.py +0 -0
  685. numpy/random/tests/data/__init__.py +0 -0
  686. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  687. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  688. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  689. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  690. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  691. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  692. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  693. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  694. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  695. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  696. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  697. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  698. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  699. numpy/random/tests/test_direct.py +592 -0
  700. numpy/random/tests/test_extending.py +127 -0
  701. numpy/random/tests/test_generator_mt19937.py +2809 -0
  702. numpy/random/tests/test_generator_mt19937_regressions.py +207 -0
  703. numpy/random/tests/test_random.py +1757 -0
  704. numpy/random/tests/test_randomstate.py +2130 -0
  705. numpy/random/tests/test_randomstate_regression.py +217 -0
  706. numpy/random/tests/test_regression.py +152 -0
  707. numpy/random/tests/test_seed_sequence.py +79 -0
  708. numpy/random/tests/test_smoke.py +819 -0
  709. numpy/rec/__init__.py +2 -0
  710. numpy/rec/__init__.pyi +23 -0
  711. numpy/strings/__init__.py +2 -0
  712. numpy/strings/__init__.pyi +97 -0
  713. numpy/testing/__init__.py +22 -0
  714. numpy/testing/__init__.pyi +102 -0
  715. numpy/testing/_private/__init__.py +0 -0
  716. numpy/testing/_private/__init__.pyi +0 -0
  717. numpy/testing/_private/extbuild.py +250 -0
  718. numpy/testing/_private/extbuild.pyi +25 -0
  719. numpy/testing/_private/utils.py +2752 -0
  720. numpy/testing/_private/utils.pyi +499 -0
  721. numpy/testing/overrides.py +84 -0
  722. numpy/testing/overrides.pyi +11 -0
  723. numpy/testing/print_coercion_tables.py +207 -0
  724. numpy/testing/print_coercion_tables.pyi +27 -0
  725. numpy/testing/tests/__init__.py +0 -0
  726. numpy/testing/tests/test_utils.py +1917 -0
  727. numpy/tests/__init__.py +0 -0
  728. numpy/tests/test__all__.py +10 -0
  729. numpy/tests/test_configtool.py +48 -0
  730. numpy/tests/test_ctypeslib.py +377 -0
  731. numpy/tests/test_lazyloading.py +38 -0
  732. numpy/tests/test_matlib.py +59 -0
  733. numpy/tests/test_numpy_config.py +46 -0
  734. numpy/tests/test_numpy_version.py +54 -0
  735. numpy/tests/test_public_api.py +806 -0
  736. numpy/tests/test_reloading.py +74 -0
  737. numpy/tests/test_scripts.py +49 -0
  738. numpy/tests/test_warnings.py +78 -0
  739. numpy/typing/__init__.py +201 -0
  740. numpy/typing/mypy_plugin.py +195 -0
  741. numpy/typing/tests/__init__.py +0 -0
  742. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  743. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  744. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  745. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  746. numpy/typing/tests/data/fail/arrayprint.pyi +16 -0
  747. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  748. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  749. numpy/typing/tests/data/fail/char.pyi +65 -0
  750. numpy/typing/tests/data/fail/chararray.pyi +62 -0
  751. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  752. numpy/typing/tests/data/fail/constants.pyi +3 -0
  753. numpy/typing/tests/data/fail/datasource.pyi +15 -0
  754. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  755. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  756. numpy/typing/tests/data/fail/flatiter.pyi +20 -0
  757. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  758. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  759. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  760. numpy/typing/tests/data/fail/lib_function_base.pyi +62 -0
  761. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  762. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  763. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  764. numpy/typing/tests/data/fail/linalg.pyi +48 -0
  765. numpy/typing/tests/data/fail/ma.pyi +143 -0
  766. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  767. numpy/typing/tests/data/fail/modules.pyi +17 -0
  768. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  769. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  770. numpy/typing/tests/data/fail/ndarray_misc.pyi +36 -0
  771. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  772. numpy/typing/tests/data/fail/nested_sequence.pyi +16 -0
  773. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  774. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  775. numpy/typing/tests/data/fail/random.pyi +62 -0
  776. numpy/typing/tests/data/fail/rec.pyi +17 -0
  777. numpy/typing/tests/data/fail/scalars.pyi +87 -0
  778. numpy/typing/tests/data/fail/shape.pyi +6 -0
  779. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  780. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  781. numpy/typing/tests/data/fail/strings.pyi +52 -0
  782. numpy/typing/tests/data/fail/testing.pyi +28 -0
  783. numpy/typing/tests/data/fail/twodim_base.pyi +32 -0
  784. numpy/typing/tests/data/fail/type_check.pyi +13 -0
  785. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  786. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  787. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  788. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  789. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  790. numpy/typing/tests/data/mypy.ini +9 -0
  791. numpy/typing/tests/data/pass/arithmetic.py +612 -0
  792. numpy/typing/tests/data/pass/array_constructors.py +137 -0
  793. numpy/typing/tests/data/pass/array_like.py +43 -0
  794. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  795. numpy/typing/tests/data/pass/arrayterator.py +27 -0
  796. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  797. numpy/typing/tests/data/pass/comparisons.py +315 -0
  798. numpy/typing/tests/data/pass/dtype.py +57 -0
  799. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  800. numpy/typing/tests/data/pass/flatiter.py +19 -0
  801. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  802. numpy/typing/tests/data/pass/index_tricks.py +60 -0
  803. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  804. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  805. numpy/typing/tests/data/pass/lib_version.py +18 -0
  806. numpy/typing/tests/data/pass/literal.py +51 -0
  807. numpy/typing/tests/data/pass/ma.py +174 -0
  808. numpy/typing/tests/data/pass/mod.py +149 -0
  809. numpy/typing/tests/data/pass/modules.py +45 -0
  810. numpy/typing/tests/data/pass/multiarray.py +76 -0
  811. numpy/typing/tests/data/pass/ndarray_conversion.py +87 -0
  812. numpy/typing/tests/data/pass/ndarray_misc.py +203 -0
  813. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  814. numpy/typing/tests/data/pass/nditer.py +4 -0
  815. numpy/typing/tests/data/pass/numeric.py +95 -0
  816. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  817. numpy/typing/tests/data/pass/random.py +1497 -0
  818. numpy/typing/tests/data/pass/recfunctions.py +161 -0
  819. numpy/typing/tests/data/pass/scalars.py +248 -0
  820. numpy/typing/tests/data/pass/shape.py +19 -0
  821. numpy/typing/tests/data/pass/simple.py +168 -0
  822. numpy/typing/tests/data/pass/simple_py3.py +6 -0
  823. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  824. numpy/typing/tests/data/pass/ufunclike.py +47 -0
  825. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  826. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  827. numpy/typing/tests/data/reveal/arithmetic.pyi +720 -0
  828. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  829. numpy/typing/tests/data/reveal/array_constructors.pyi +249 -0
  830. numpy/typing/tests/data/reveal/arraypad.pyi +22 -0
  831. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  832. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  833. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  834. numpy/typing/tests/data/reveal/bitwise_ops.pyi +167 -0
  835. numpy/typing/tests/data/reveal/char.pyi +224 -0
  836. numpy/typing/tests/data/reveal/chararray.pyi +137 -0
  837. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  838. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  839. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  840. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  841. numpy/typing/tests/data/reveal/dtype.pyi +136 -0
  842. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  843. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  844. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  845. numpy/typing/tests/data/reveal/flatiter.pyi +47 -0
  846. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  847. numpy/typing/tests/data/reveal/getlimits.pyi +51 -0
  848. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  849. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  850. numpy/typing/tests/data/reveal/lib_function_base.pyi +213 -0
  851. numpy/typing/tests/data/reveal/lib_polynomial.pyi +144 -0
  852. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  853. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  854. numpy/typing/tests/data/reveal/linalg.pyi +132 -0
  855. numpy/typing/tests/data/reveal/ma.pyi +369 -0
  856. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  857. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  858. numpy/typing/tests/data/reveal/mod.pyi +179 -0
  859. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  860. numpy/typing/tests/data/reveal/multiarray.pyi +194 -0
  861. numpy/typing/tests/data/reveal/nbit_base_example.pyi +21 -0
  862. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +77 -0
  863. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +85 -0
  864. numpy/typing/tests/data/reveal/ndarray_misc.pyi +247 -0
  865. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +39 -0
  866. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  867. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  868. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  869. numpy/typing/tests/data/reveal/numeric.pyi +134 -0
  870. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  871. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +220 -0
  872. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +219 -0
  873. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  874. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  875. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  876. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  877. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  878. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  879. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  880. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  881. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  882. numpy/typing/tests/data/reveal/twodim_base.pyi +145 -0
  883. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  884. numpy/typing/tests/data/reveal/ufunc_config.pyi +30 -0
  885. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  886. numpy/typing/tests/data/reveal/ufuncs.pyi +123 -0
  887. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  888. numpy/typing/tests/test_isfile.py +32 -0
  889. numpy/typing/tests/test_runtime.py +102 -0
  890. numpy/typing/tests/test_typing.py +205 -0
  891. numpy/version.py +11 -0
  892. numpy/version.pyi +18 -0
  893. numpy-2.3.5.dist-info/LICENSE.txt +971 -0
  894. numpy-2.3.5.dist-info/METADATA +1093 -0
  895. numpy-2.3.5.dist-info/RECORD +897 -0
  896. numpy-2.3.5.dist-info/WHEEL +6 -0
  897. numpy-2.3.5.dist-info/entry_points.txt +13 -0
@@ -0,0 +1,1998 @@
1
+ """Tests suite for MaskedArray.
2
+ Adapted from the original test_ma by Pierre Gerard-Marchant
3
+
4
+ :author: Pierre Gerard-Marchant
5
+ :contact: pierregm_at_uga_dot_edu
6
+
7
+ """
8
+ import itertools
9
+ import warnings
10
+
11
+ import pytest
12
+
13
+ import numpy as np
14
+ from numpy._core.numeric import normalize_axis_tuple
15
+ from numpy.ma.core import (
16
+ MaskedArray,
17
+ arange,
18
+ array,
19
+ count,
20
+ getmaskarray,
21
+ masked,
22
+ masked_array,
23
+ nomask,
24
+ ones,
25
+ shape,
26
+ zeros,
27
+ )
28
+ from numpy.ma.extras import (
29
+ _covhelper,
30
+ apply_along_axis,
31
+ apply_over_axes,
32
+ atleast_1d,
33
+ atleast_2d,
34
+ atleast_3d,
35
+ average,
36
+ clump_masked,
37
+ clump_unmasked,
38
+ compress_nd,
39
+ compress_rowcols,
40
+ corrcoef,
41
+ cov,
42
+ diagflat,
43
+ dot,
44
+ ediff1d,
45
+ flatnotmasked_contiguous,
46
+ in1d,
47
+ intersect1d,
48
+ isin,
49
+ mask_rowcols,
50
+ masked_all,
51
+ masked_all_like,
52
+ median,
53
+ mr_,
54
+ ndenumerate,
55
+ notmasked_contiguous,
56
+ notmasked_edges,
57
+ polyfit,
58
+ setdiff1d,
59
+ setxor1d,
60
+ stack,
61
+ union1d,
62
+ unique,
63
+ vstack,
64
+ )
65
+ from numpy.ma.testutils import (
66
+ assert_,
67
+ assert_almost_equal,
68
+ assert_array_equal,
69
+ assert_equal,
70
+ )
71
+ from numpy.testing import assert_warns, suppress_warnings
72
+
73
+
74
+ class TestGeneric:
75
+ #
76
+ def test_masked_all(self):
77
+ # Tests masked_all
78
+ # Standard dtype
79
+ test = masked_all((2,), dtype=float)
80
+ control = array([1, 1], mask=[1, 1], dtype=float)
81
+ assert_equal(test, control)
82
+ # Flexible dtype
83
+ dt = np.dtype({'names': ['a', 'b'], 'formats': ['f', 'f']})
84
+ test = masked_all((2,), dtype=dt)
85
+ control = array([(0, 0), (0, 0)], mask=[(1, 1), (1, 1)], dtype=dt)
86
+ assert_equal(test, control)
87
+ test = masked_all((2, 2), dtype=dt)
88
+ control = array([[(0, 0), (0, 0)], [(0, 0), (0, 0)]],
89
+ mask=[[(1, 1), (1, 1)], [(1, 1), (1, 1)]],
90
+ dtype=dt)
91
+ assert_equal(test, control)
92
+ # Nested dtype
93
+ dt = np.dtype([('a', 'f'), ('b', [('ba', 'f'), ('bb', 'f')])])
94
+ test = masked_all((2,), dtype=dt)
95
+ control = array([(1, (1, 1)), (1, (1, 1))],
96
+ mask=[(1, (1, 1)), (1, (1, 1))], dtype=dt)
97
+ assert_equal(test, control)
98
+ test = masked_all((2,), dtype=dt)
99
+ control = array([(1, (1, 1)), (1, (1, 1))],
100
+ mask=[(1, (1, 1)), (1, (1, 1))], dtype=dt)
101
+ assert_equal(test, control)
102
+ test = masked_all((1, 1), dtype=dt)
103
+ control = array([[(1, (1, 1))]], mask=[[(1, (1, 1))]], dtype=dt)
104
+ assert_equal(test, control)
105
+
106
+ def test_masked_all_with_object_nested(self):
107
+ # Test masked_all works with nested array with dtype of an 'object'
108
+ # refers to issue #15895
109
+ my_dtype = np.dtype([('b', ([('c', object)], (1,)))])
110
+ masked_arr = np.ma.masked_all((1,), my_dtype)
111
+
112
+ assert_equal(type(masked_arr['b']), np.ma.core.MaskedArray)
113
+ assert_equal(type(masked_arr['b']['c']), np.ma.core.MaskedArray)
114
+ assert_equal(len(masked_arr['b']['c']), 1)
115
+ assert_equal(masked_arr['b']['c'].shape, (1, 1))
116
+ assert_equal(masked_arr['b']['c']._fill_value.shape, ())
117
+
118
+ def test_masked_all_with_object(self):
119
+ # same as above except that the array is not nested
120
+ my_dtype = np.dtype([('b', (object, (1,)))])
121
+ masked_arr = np.ma.masked_all((1,), my_dtype)
122
+
123
+ assert_equal(type(masked_arr['b']), np.ma.core.MaskedArray)
124
+ assert_equal(len(masked_arr['b']), 1)
125
+ assert_equal(masked_arr['b'].shape, (1, 1))
126
+ assert_equal(masked_arr['b']._fill_value.shape, ())
127
+
128
+ def test_masked_all_like(self):
129
+ # Tests masked_all
130
+ # Standard dtype
131
+ base = array([1, 2], dtype=float)
132
+ test = masked_all_like(base)
133
+ control = array([1, 1], mask=[1, 1], dtype=float)
134
+ assert_equal(test, control)
135
+ # Flexible dtype
136
+ dt = np.dtype({'names': ['a', 'b'], 'formats': ['f', 'f']})
137
+ base = array([(0, 0), (0, 0)], mask=[(1, 1), (1, 1)], dtype=dt)
138
+ test = masked_all_like(base)
139
+ control = array([(10, 10), (10, 10)], mask=[(1, 1), (1, 1)], dtype=dt)
140
+ assert_equal(test, control)
141
+ # Nested dtype
142
+ dt = np.dtype([('a', 'f'), ('b', [('ba', 'f'), ('bb', 'f')])])
143
+ control = array([(1, (1, 1)), (1, (1, 1))],
144
+ mask=[(1, (1, 1)), (1, (1, 1))], dtype=dt)
145
+ test = masked_all_like(control)
146
+ assert_equal(test, control)
147
+
148
+ def check_clump(self, f):
149
+ for i in range(1, 7):
150
+ for j in range(2**i):
151
+ k = np.arange(i, dtype=int)
152
+ ja = np.full(i, j, dtype=int)
153
+ a = masked_array(2**k)
154
+ a.mask = (ja & (2**k)) != 0
155
+ s = 0
156
+ for sl in f(a):
157
+ s += a.data[sl].sum()
158
+ if f == clump_unmasked:
159
+ assert_equal(a.compressed().sum(), s)
160
+ else:
161
+ a.mask = ~a.mask
162
+ assert_equal(a.compressed().sum(), s)
163
+
164
+ def test_clump_masked(self):
165
+ # Test clump_masked
166
+ a = masked_array(np.arange(10))
167
+ a[[0, 1, 2, 6, 8, 9]] = masked
168
+ #
169
+ test = clump_masked(a)
170
+ control = [slice(0, 3), slice(6, 7), slice(8, 10)]
171
+ assert_equal(test, control)
172
+
173
+ self.check_clump(clump_masked)
174
+
175
+ def test_clump_unmasked(self):
176
+ # Test clump_unmasked
177
+ a = masked_array(np.arange(10))
178
+ a[[0, 1, 2, 6, 8, 9]] = masked
179
+ test = clump_unmasked(a)
180
+ control = [slice(3, 6), slice(7, 8), ]
181
+ assert_equal(test, control)
182
+
183
+ self.check_clump(clump_unmasked)
184
+
185
+ def test_flatnotmasked_contiguous(self):
186
+ # Test flatnotmasked_contiguous
187
+ a = arange(10)
188
+ # No mask
189
+ test = flatnotmasked_contiguous(a)
190
+ assert_equal(test, [slice(0, a.size)])
191
+ # mask of all false
192
+ a.mask = np.zeros(10, dtype=bool)
193
+ assert_equal(test, [slice(0, a.size)])
194
+ # Some mask
195
+ a[(a < 3) | (a > 8) | (a == 5)] = masked
196
+ test = flatnotmasked_contiguous(a)
197
+ assert_equal(test, [slice(3, 5), slice(6, 9)])
198
+ #
199
+ a[:] = masked
200
+ test = flatnotmasked_contiguous(a)
201
+ assert_equal(test, [])
202
+
203
+
204
+ class TestAverage:
205
+ # Several tests of average. Why so many ? Good point...
206
+ def test_testAverage1(self):
207
+ # Test of average.
208
+ ott = array([0., 1., 2., 3.], mask=[True, False, False, False])
209
+ assert_equal(2.0, average(ott, axis=0))
210
+ assert_equal(2.0, average(ott, weights=[1., 1., 2., 1.]))
211
+ result, wts = average(ott, weights=[1., 1., 2., 1.], returned=True)
212
+ assert_equal(2.0, result)
213
+ assert_(wts == 4.0)
214
+ ott[:] = masked
215
+ assert_equal(average(ott, axis=0).mask, [True])
216
+ ott = array([0., 1., 2., 3.], mask=[True, False, False, False])
217
+ ott = ott.reshape(2, 2)
218
+ ott[:, 1] = masked
219
+ assert_equal(average(ott, axis=0), [2.0, 0.0])
220
+ assert_equal(average(ott, axis=1).mask[0], [True])
221
+ assert_equal([2., 0.], average(ott, axis=0))
222
+ result, wts = average(ott, axis=0, returned=True)
223
+ assert_equal(wts, [1., 0.])
224
+
225
+ def test_testAverage2(self):
226
+ # More tests of average.
227
+ w1 = [0, 1, 1, 1, 1, 0]
228
+ w2 = [[0, 1, 1, 1, 1, 0], [1, 0, 0, 0, 0, 1]]
229
+ x = arange(6, dtype=np.float64)
230
+ assert_equal(average(x, axis=0), 2.5)
231
+ assert_equal(average(x, axis=0, weights=w1), 2.5)
232
+ y = array([arange(6, dtype=np.float64), 2.0 * arange(6)])
233
+ assert_equal(average(y, None), np.add.reduce(np.arange(6)) * 3. / 12.)
234
+ assert_equal(average(y, axis=0), np.arange(6) * 3. / 2.)
235
+ assert_equal(average(y, axis=1),
236
+ [average(x, axis=0), average(x, axis=0) * 2.0])
237
+ assert_equal(average(y, None, weights=w2), 20. / 6.)
238
+ assert_equal(average(y, axis=0, weights=w2),
239
+ [0., 1., 2., 3., 4., 10.])
240
+ assert_equal(average(y, axis=1),
241
+ [average(x, axis=0), average(x, axis=0) * 2.0])
242
+ m1 = zeros(6)
243
+ m2 = [0, 0, 1, 1, 0, 0]
244
+ m3 = [[0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 1, 0]]
245
+ m4 = ones(6)
246
+ m5 = [0, 1, 1, 1, 1, 1]
247
+ assert_equal(average(masked_array(x, m1), axis=0), 2.5)
248
+ assert_equal(average(masked_array(x, m2), axis=0), 2.5)
249
+ assert_equal(average(masked_array(x, m4), axis=0).mask, [True])
250
+ assert_equal(average(masked_array(x, m5), axis=0), 0.0)
251
+ assert_equal(count(average(masked_array(x, m4), axis=0)), 0)
252
+ z = masked_array(y, m3)
253
+ assert_equal(average(z, None), 20. / 6.)
254
+ assert_equal(average(z, axis=0), [0., 1., 99., 99., 4.0, 7.5])
255
+ assert_equal(average(z, axis=1), [2.5, 5.0])
256
+ assert_equal(average(z, axis=0, weights=w2),
257
+ [0., 1., 99., 99., 4.0, 10.0])
258
+
259
+ def test_testAverage3(self):
260
+ # Yet more tests of average!
261
+ a = arange(6)
262
+ b = arange(6) * 3
263
+ r1, w1 = average([[a, b], [b, a]], axis=1, returned=True)
264
+ assert_equal(shape(r1), shape(w1))
265
+ assert_equal(r1.shape, w1.shape)
266
+ r2, w2 = average(ones((2, 2, 3)), axis=0, weights=[3, 1], returned=True)
267
+ assert_equal(shape(w2), shape(r2))
268
+ r2, w2 = average(ones((2, 2, 3)), returned=True)
269
+ assert_equal(shape(w2), shape(r2))
270
+ r2, w2 = average(ones((2, 2, 3)), weights=ones((2, 2, 3)), returned=True)
271
+ assert_equal(shape(w2), shape(r2))
272
+ a2d = array([[1, 2], [0, 4]], float)
273
+ a2dm = masked_array(a2d, [[False, False], [True, False]])
274
+ a2da = average(a2d, axis=0)
275
+ assert_equal(a2da, [0.5, 3.0])
276
+ a2dma = average(a2dm, axis=0)
277
+ assert_equal(a2dma, [1.0, 3.0])
278
+ a2dma = average(a2dm, axis=None)
279
+ assert_equal(a2dma, 7. / 3.)
280
+ a2dma = average(a2dm, axis=1)
281
+ assert_equal(a2dma, [1.5, 4.0])
282
+
283
+ def test_testAverage4(self):
284
+ # Test that `keepdims` works with average
285
+ x = np.array([2, 3, 4]).reshape(3, 1)
286
+ b = np.ma.array(x, mask=[[False], [False], [True]])
287
+ w = np.array([4, 5, 6]).reshape(3, 1)
288
+ actual = average(b, weights=w, axis=1, keepdims=True)
289
+ desired = masked_array([[2.], [3.], [4.]], [[False], [False], [True]])
290
+ assert_equal(actual, desired)
291
+
292
+ def test_weight_and_input_dims_different(self):
293
+ # this test mirrors a test for np.average()
294
+ # in lib/test/test_function_base.py
295
+ y = np.arange(12).reshape(2, 2, 3)
296
+ w = np.array([0., 0., 1., .5, .5, 0., 0., .5, .5, 1., 0., 0.])\
297
+ .reshape(2, 2, 3)
298
+
299
+ m = np.full((2, 2, 3), False)
300
+ yma = np.ma.array(y, mask=m)
301
+ subw0 = w[:, :, 0]
302
+
303
+ actual = average(yma, axis=(0, 1), weights=subw0)
304
+ desired = masked_array([7., 8., 9.], mask=[False, False, False])
305
+ assert_almost_equal(actual, desired)
306
+
307
+ m = np.full((2, 2, 3), False)
308
+ m[:, :, 0] = True
309
+ m[0, 0, 1] = True
310
+ yma = np.ma.array(y, mask=m)
311
+ actual = average(yma, axis=(0, 1), weights=subw0)
312
+ desired = masked_array(
313
+ [np.nan, 8., 9.],
314
+ mask=[True, False, False])
315
+ assert_almost_equal(actual, desired)
316
+
317
+ m = np.full((2, 2, 3), False)
318
+ yma = np.ma.array(y, mask=m)
319
+
320
+ subw1 = w[1, :, :]
321
+ actual = average(yma, axis=(1, 2), weights=subw1)
322
+ desired = masked_array([2.25, 8.25], mask=[False, False])
323
+ assert_almost_equal(actual, desired)
324
+
325
+ # here the weights have the wrong shape for the specified axes
326
+ with pytest.raises(
327
+ ValueError,
328
+ match="Shape of weights must be consistent with "
329
+ "shape of a along specified axis"):
330
+ average(yma, axis=(0, 1, 2), weights=subw0)
331
+
332
+ with pytest.raises(
333
+ ValueError,
334
+ match="Shape of weights must be consistent with "
335
+ "shape of a along specified axis"):
336
+ average(yma, axis=(0, 1), weights=subw1)
337
+
338
+ # swapping the axes should be same as transposing weights
339
+ actual = average(yma, axis=(1, 0), weights=subw0)
340
+ desired = average(yma, axis=(0, 1), weights=subw0.T)
341
+ assert_almost_equal(actual, desired)
342
+
343
+ def test_onintegers_with_mask(self):
344
+ # Test average on integers with mask
345
+ a = average(array([1, 2]))
346
+ assert_equal(a, 1.5)
347
+ a = average(array([1, 2, 3, 4], mask=[False, False, True, True]))
348
+ assert_equal(a, 1.5)
349
+
350
+ def test_complex(self):
351
+ # Test with complex data.
352
+ # (Regression test for https://github.com/numpy/numpy/issues/2684)
353
+ mask = np.array([[0, 0, 0, 1, 0],
354
+ [0, 1, 0, 0, 0]], dtype=bool)
355
+ a = masked_array([[0, 1 + 2j, 3 + 4j, 5 + 6j, 7 + 8j],
356
+ [9j, 0 + 1j, 2 + 3j, 4 + 5j, 7 + 7j]],
357
+ mask=mask)
358
+
359
+ av = average(a)
360
+ expected = np.average(a.compressed())
361
+ assert_almost_equal(av.real, expected.real)
362
+ assert_almost_equal(av.imag, expected.imag)
363
+
364
+ av0 = average(a, axis=0)
365
+ expected0 = average(a.real, axis=0) + average(a.imag, axis=0) * 1j
366
+ assert_almost_equal(av0.real, expected0.real)
367
+ assert_almost_equal(av0.imag, expected0.imag)
368
+
369
+ av1 = average(a, axis=1)
370
+ expected1 = average(a.real, axis=1) + average(a.imag, axis=1) * 1j
371
+ assert_almost_equal(av1.real, expected1.real)
372
+ assert_almost_equal(av1.imag, expected1.imag)
373
+
374
+ # Test with the 'weights' argument.
375
+ wts = np.array([[0.5, 1.0, 2.0, 1.0, 0.5],
376
+ [1.0, 1.0, 1.0, 1.0, 1.0]])
377
+ wav = average(a, weights=wts)
378
+ expected = np.average(a.compressed(), weights=wts[~mask])
379
+ assert_almost_equal(wav.real, expected.real)
380
+ assert_almost_equal(wav.imag, expected.imag)
381
+
382
+ wav0 = average(a, weights=wts, axis=0)
383
+ expected0 = (average(a.real, weights=wts, axis=0) +
384
+ average(a.imag, weights=wts, axis=0) * 1j)
385
+ assert_almost_equal(wav0.real, expected0.real)
386
+ assert_almost_equal(wav0.imag, expected0.imag)
387
+
388
+ wav1 = average(a, weights=wts, axis=1)
389
+ expected1 = (average(a.real, weights=wts, axis=1) +
390
+ average(a.imag, weights=wts, axis=1) * 1j)
391
+ assert_almost_equal(wav1.real, expected1.real)
392
+ assert_almost_equal(wav1.imag, expected1.imag)
393
+
394
+ @pytest.mark.parametrize(
395
+ 'x, axis, expected_avg, weights, expected_wavg, expected_wsum',
396
+ [([1, 2, 3], None, [2.0], [3, 4, 1], [1.75], [8.0]),
397
+ ([[1, 2, 5], [1, 6, 11]], 0, [[1.0, 4.0, 8.0]],
398
+ [1, 3], [[1.0, 5.0, 9.5]], [[4, 4, 4]])],
399
+ )
400
+ def test_basic_keepdims(self, x, axis, expected_avg,
401
+ weights, expected_wavg, expected_wsum):
402
+ avg = np.ma.average(x, axis=axis, keepdims=True)
403
+ assert avg.shape == np.shape(expected_avg)
404
+ assert_array_equal(avg, expected_avg)
405
+
406
+ wavg = np.ma.average(x, axis=axis, weights=weights, keepdims=True)
407
+ assert wavg.shape == np.shape(expected_wavg)
408
+ assert_array_equal(wavg, expected_wavg)
409
+
410
+ wavg, wsum = np.ma.average(x, axis=axis, weights=weights,
411
+ returned=True, keepdims=True)
412
+ assert wavg.shape == np.shape(expected_wavg)
413
+ assert_array_equal(wavg, expected_wavg)
414
+ assert wsum.shape == np.shape(expected_wsum)
415
+ assert_array_equal(wsum, expected_wsum)
416
+
417
+ def test_masked_weights(self):
418
+ # Test with masked weights.
419
+ # (Regression test for https://github.com/numpy/numpy/issues/10438)
420
+ a = np.ma.array(np.arange(9).reshape(3, 3),
421
+ mask=[[1, 0, 0], [1, 0, 0], [0, 0, 0]])
422
+ weights_unmasked = masked_array([5, 28, 31], mask=False)
423
+ weights_masked = masked_array([5, 28, 31], mask=[1, 0, 0])
424
+
425
+ avg_unmasked = average(a, axis=0,
426
+ weights=weights_unmasked, returned=False)
427
+ expected_unmasked = np.array([6.0, 5.21875, 6.21875])
428
+ assert_almost_equal(avg_unmasked, expected_unmasked)
429
+
430
+ avg_masked = average(a, axis=0, weights=weights_masked, returned=False)
431
+ expected_masked = np.array([6.0, 5.576271186440678, 6.576271186440678])
432
+ assert_almost_equal(avg_masked, expected_masked)
433
+
434
+ # weights should be masked if needed
435
+ # depending on the array mask. This is to avoid summing
436
+ # masked nan or other values that are not cancelled by a zero
437
+ a = np.ma.array([1.0, 2.0, 3.0, 4.0],
438
+ mask=[False, False, True, True])
439
+ avg_unmasked = average(a, weights=[1, 1, 1, np.nan])
440
+
441
+ assert_almost_equal(avg_unmasked, 1.5)
442
+
443
+ a = np.ma.array([
444
+ [1.0, 2.0, 3.0, 4.0],
445
+ [5.0, 6.0, 7.0, 8.0],
446
+ [9.0, 1.0, 2.0, 3.0],
447
+ ], mask=[
448
+ [False, True, True, False],
449
+ [True, False, True, True],
450
+ [True, False, True, False],
451
+ ])
452
+
453
+ avg_masked = np.ma.average(a, weights=[1, np.nan, 1], axis=0)
454
+ avg_expected = np.ma.array([1.0, np.nan, np.nan, 3.5],
455
+ mask=[False, True, True, False])
456
+
457
+ assert_almost_equal(avg_masked, avg_expected)
458
+ assert_equal(avg_masked.mask, avg_expected.mask)
459
+
460
+
461
+ class TestConcatenator:
462
+ # Tests for mr_, the equivalent of r_ for masked arrays.
463
+
464
+ def test_1d(self):
465
+ # Tests mr_ on 1D arrays.
466
+ assert_array_equal(mr_[1, 2, 3, 4, 5, 6], array([1, 2, 3, 4, 5, 6]))
467
+ b = ones(5)
468
+ m = [1, 0, 0, 0, 0]
469
+ d = masked_array(b, mask=m)
470
+ c = mr_[d, 0, 0, d]
471
+ assert_(isinstance(c, MaskedArray))
472
+ assert_array_equal(c, [1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1])
473
+ assert_array_equal(c.mask, mr_[m, 0, 0, m])
474
+
475
+ def test_2d(self):
476
+ # Tests mr_ on 2D arrays.
477
+ a_1 = np.random.rand(5, 5)
478
+ a_2 = np.random.rand(5, 5)
479
+ m_1 = np.round(np.random.rand(5, 5), 0)
480
+ m_2 = np.round(np.random.rand(5, 5), 0)
481
+ b_1 = masked_array(a_1, mask=m_1)
482
+ b_2 = masked_array(a_2, mask=m_2)
483
+ # append columns
484
+ d = mr_['1', b_1, b_2]
485
+ assert_(d.shape == (5, 10))
486
+ assert_array_equal(d[:, :5], b_1)
487
+ assert_array_equal(d[:, 5:], b_2)
488
+ assert_array_equal(d.mask, np.r_['1', m_1, m_2])
489
+ d = mr_[b_1, b_2]
490
+ assert_(d.shape == (10, 5))
491
+ assert_array_equal(d[:5, :], b_1)
492
+ assert_array_equal(d[5:, :], b_2)
493
+ assert_array_equal(d.mask, np.r_[m_1, m_2])
494
+
495
+ def test_masked_constant(self):
496
+ actual = mr_[np.ma.masked, 1]
497
+ assert_equal(actual.mask, [True, False])
498
+ assert_equal(actual.data[1], 1)
499
+
500
+ actual = mr_[[1, 2], np.ma.masked]
501
+ assert_equal(actual.mask, [False, False, True])
502
+ assert_equal(actual.data[:2], [1, 2])
503
+
504
+
505
+ class TestNotMasked:
506
+ # Tests notmasked_edges and notmasked_contiguous.
507
+
508
+ def test_edges(self):
509
+ # Tests unmasked_edges
510
+ data = masked_array(np.arange(25).reshape(5, 5),
511
+ mask=[[0, 0, 1, 0, 0],
512
+ [0, 0, 0, 1, 1],
513
+ [1, 1, 0, 0, 0],
514
+ [0, 0, 0, 0, 0],
515
+ [1, 1, 1, 0, 0]],)
516
+ test = notmasked_edges(data, None)
517
+ assert_equal(test, [0, 24])
518
+ test = notmasked_edges(data, 0)
519
+ assert_equal(test[0], [(0, 0, 1, 0, 0), (0, 1, 2, 3, 4)])
520
+ assert_equal(test[1], [(3, 3, 3, 4, 4), (0, 1, 2, 3, 4)])
521
+ test = notmasked_edges(data, 1)
522
+ assert_equal(test[0], [(0, 1, 2, 3, 4), (0, 0, 2, 0, 3)])
523
+ assert_equal(test[1], [(0, 1, 2, 3, 4), (4, 2, 4, 4, 4)])
524
+ #
525
+ test = notmasked_edges(data.data, None)
526
+ assert_equal(test, [0, 24])
527
+ test = notmasked_edges(data.data, 0)
528
+ assert_equal(test[0], [(0, 0, 0, 0, 0), (0, 1, 2, 3, 4)])
529
+ assert_equal(test[1], [(4, 4, 4, 4, 4), (0, 1, 2, 3, 4)])
530
+ test = notmasked_edges(data.data, -1)
531
+ assert_equal(test[0], [(0, 1, 2, 3, 4), (0, 0, 0, 0, 0)])
532
+ assert_equal(test[1], [(0, 1, 2, 3, 4), (4, 4, 4, 4, 4)])
533
+ #
534
+ data[-2] = masked
535
+ test = notmasked_edges(data, 0)
536
+ assert_equal(test[0], [(0, 0, 1, 0, 0), (0, 1, 2, 3, 4)])
537
+ assert_equal(test[1], [(1, 1, 2, 4, 4), (0, 1, 2, 3, 4)])
538
+ test = notmasked_edges(data, -1)
539
+ assert_equal(test[0], [(0, 1, 2, 4), (0, 0, 2, 3)])
540
+ assert_equal(test[1], [(0, 1, 2, 4), (4, 2, 4, 4)])
541
+
542
+ def test_contiguous(self):
543
+ # Tests notmasked_contiguous
544
+ a = masked_array(np.arange(24).reshape(3, 8),
545
+ mask=[[0, 0, 0, 0, 1, 1, 1, 1],
546
+ [1, 1, 1, 1, 1, 1, 1, 1],
547
+ [0, 0, 0, 0, 0, 0, 1, 0]])
548
+ tmp = notmasked_contiguous(a, None)
549
+ assert_equal(tmp, [
550
+ slice(0, 4, None),
551
+ slice(16, 22, None),
552
+ slice(23, 24, None)
553
+ ])
554
+
555
+ tmp = notmasked_contiguous(a, 0)
556
+ assert_equal(tmp, [
557
+ [slice(0, 1, None), slice(2, 3, None)],
558
+ [slice(0, 1, None), slice(2, 3, None)],
559
+ [slice(0, 1, None), slice(2, 3, None)],
560
+ [slice(0, 1, None), slice(2, 3, None)],
561
+ [slice(2, 3, None)],
562
+ [slice(2, 3, None)],
563
+ [],
564
+ [slice(2, 3, None)]
565
+ ])
566
+ #
567
+ tmp = notmasked_contiguous(a, 1)
568
+ assert_equal(tmp, [
569
+ [slice(0, 4, None)],
570
+ [],
571
+ [slice(0, 6, None), slice(7, 8, None)]
572
+ ])
573
+
574
+
575
+ class TestCompressFunctions:
576
+
577
+ def test_compress_nd(self):
578
+ # Tests compress_nd
579
+ x = np.array(list(range(3 * 4 * 5))).reshape(3, 4, 5)
580
+ m = np.zeros((3, 4, 5)).astype(bool)
581
+ m[1, 1, 1] = True
582
+ x = array(x, mask=m)
583
+
584
+ # axis=None
585
+ a = compress_nd(x)
586
+ assert_equal(a, [[[ 0, 2, 3, 4],
587
+ [10, 12, 13, 14],
588
+ [15, 17, 18, 19]],
589
+ [[40, 42, 43, 44],
590
+ [50, 52, 53, 54],
591
+ [55, 57, 58, 59]]])
592
+
593
+ # axis=0
594
+ a = compress_nd(x, 0)
595
+ assert_equal(a, [[[ 0, 1, 2, 3, 4],
596
+ [ 5, 6, 7, 8, 9],
597
+ [10, 11, 12, 13, 14],
598
+ [15, 16, 17, 18, 19]],
599
+ [[40, 41, 42, 43, 44],
600
+ [45, 46, 47, 48, 49],
601
+ [50, 51, 52, 53, 54],
602
+ [55, 56, 57, 58, 59]]])
603
+
604
+ # axis=1
605
+ a = compress_nd(x, 1)
606
+ assert_equal(a, [[[ 0, 1, 2, 3, 4],
607
+ [10, 11, 12, 13, 14],
608
+ [15, 16, 17, 18, 19]],
609
+ [[20, 21, 22, 23, 24],
610
+ [30, 31, 32, 33, 34],
611
+ [35, 36, 37, 38, 39]],
612
+ [[40, 41, 42, 43, 44],
613
+ [50, 51, 52, 53, 54],
614
+ [55, 56, 57, 58, 59]]])
615
+
616
+ a2 = compress_nd(x, (1,))
617
+ a3 = compress_nd(x, -2)
618
+ a4 = compress_nd(x, (-2,))
619
+ assert_equal(a, a2)
620
+ assert_equal(a, a3)
621
+ assert_equal(a, a4)
622
+
623
+ # axis=2
624
+ a = compress_nd(x, 2)
625
+ assert_equal(a, [[[ 0, 2, 3, 4],
626
+ [ 5, 7, 8, 9],
627
+ [10, 12, 13, 14],
628
+ [15, 17, 18, 19]],
629
+ [[20, 22, 23, 24],
630
+ [25, 27, 28, 29],
631
+ [30, 32, 33, 34],
632
+ [35, 37, 38, 39]],
633
+ [[40, 42, 43, 44],
634
+ [45, 47, 48, 49],
635
+ [50, 52, 53, 54],
636
+ [55, 57, 58, 59]]])
637
+
638
+ a2 = compress_nd(x, (2,))
639
+ a3 = compress_nd(x, -1)
640
+ a4 = compress_nd(x, (-1,))
641
+ assert_equal(a, a2)
642
+ assert_equal(a, a3)
643
+ assert_equal(a, a4)
644
+
645
+ # axis=(0, 1)
646
+ a = compress_nd(x, (0, 1))
647
+ assert_equal(a, [[[ 0, 1, 2, 3, 4],
648
+ [10, 11, 12, 13, 14],
649
+ [15, 16, 17, 18, 19]],
650
+ [[40, 41, 42, 43, 44],
651
+ [50, 51, 52, 53, 54],
652
+ [55, 56, 57, 58, 59]]])
653
+ a2 = compress_nd(x, (0, -2))
654
+ assert_equal(a, a2)
655
+
656
+ # axis=(1, 2)
657
+ a = compress_nd(x, (1, 2))
658
+ assert_equal(a, [[[ 0, 2, 3, 4],
659
+ [10, 12, 13, 14],
660
+ [15, 17, 18, 19]],
661
+ [[20, 22, 23, 24],
662
+ [30, 32, 33, 34],
663
+ [35, 37, 38, 39]],
664
+ [[40, 42, 43, 44],
665
+ [50, 52, 53, 54],
666
+ [55, 57, 58, 59]]])
667
+
668
+ a2 = compress_nd(x, (-2, 2))
669
+ a3 = compress_nd(x, (1, -1))
670
+ a4 = compress_nd(x, (-2, -1))
671
+ assert_equal(a, a2)
672
+ assert_equal(a, a3)
673
+ assert_equal(a, a4)
674
+
675
+ # axis=(0, 2)
676
+ a = compress_nd(x, (0, 2))
677
+ assert_equal(a, [[[ 0, 2, 3, 4],
678
+ [ 5, 7, 8, 9],
679
+ [10, 12, 13, 14],
680
+ [15, 17, 18, 19]],
681
+ [[40, 42, 43, 44],
682
+ [45, 47, 48, 49],
683
+ [50, 52, 53, 54],
684
+ [55, 57, 58, 59]]])
685
+
686
+ a2 = compress_nd(x, (0, -1))
687
+ assert_equal(a, a2)
688
+
689
+ def test_compress_rowcols(self):
690
+ # Tests compress_rowcols
691
+ x = array(np.arange(9).reshape(3, 3),
692
+ mask=[[1, 0, 0], [0, 0, 0], [0, 0, 0]])
693
+ assert_equal(compress_rowcols(x), [[4, 5], [7, 8]])
694
+ assert_equal(compress_rowcols(x, 0), [[3, 4, 5], [6, 7, 8]])
695
+ assert_equal(compress_rowcols(x, 1), [[1, 2], [4, 5], [7, 8]])
696
+ x = array(x._data, mask=[[0, 0, 0], [0, 1, 0], [0, 0, 0]])
697
+ assert_equal(compress_rowcols(x), [[0, 2], [6, 8]])
698
+ assert_equal(compress_rowcols(x, 0), [[0, 1, 2], [6, 7, 8]])
699
+ assert_equal(compress_rowcols(x, 1), [[0, 2], [3, 5], [6, 8]])
700
+ x = array(x._data, mask=[[1, 0, 0], [0, 1, 0], [0, 0, 0]])
701
+ assert_equal(compress_rowcols(x), [[8]])
702
+ assert_equal(compress_rowcols(x, 0), [[6, 7, 8]])
703
+ assert_equal(compress_rowcols(x, 1,), [[2], [5], [8]])
704
+ x = array(x._data, mask=[[1, 0, 0], [0, 1, 0], [0, 0, 1]])
705
+ assert_equal(compress_rowcols(x).size, 0)
706
+ assert_equal(compress_rowcols(x, 0).size, 0)
707
+ assert_equal(compress_rowcols(x, 1).size, 0)
708
+
709
+ def test_mask_rowcols(self):
710
+ # Tests mask_rowcols.
711
+ x = array(np.arange(9).reshape(3, 3),
712
+ mask=[[1, 0, 0], [0, 0, 0], [0, 0, 0]])
713
+ assert_equal(mask_rowcols(x).mask,
714
+ [[1, 1, 1], [1, 0, 0], [1, 0, 0]])
715
+ assert_equal(mask_rowcols(x, 0).mask,
716
+ [[1, 1, 1], [0, 0, 0], [0, 0, 0]])
717
+ assert_equal(mask_rowcols(x, 1).mask,
718
+ [[1, 0, 0], [1, 0, 0], [1, 0, 0]])
719
+ x = array(x._data, mask=[[0, 0, 0], [0, 1, 0], [0, 0, 0]])
720
+ assert_equal(mask_rowcols(x).mask,
721
+ [[0, 1, 0], [1, 1, 1], [0, 1, 0]])
722
+ assert_equal(mask_rowcols(x, 0).mask,
723
+ [[0, 0, 0], [1, 1, 1], [0, 0, 0]])
724
+ assert_equal(mask_rowcols(x, 1).mask,
725
+ [[0, 1, 0], [0, 1, 0], [0, 1, 0]])
726
+ x = array(x._data, mask=[[1, 0, 0], [0, 1, 0], [0, 0, 0]])
727
+ assert_equal(mask_rowcols(x).mask,
728
+ [[1, 1, 1], [1, 1, 1], [1, 1, 0]])
729
+ assert_equal(mask_rowcols(x, 0).mask,
730
+ [[1, 1, 1], [1, 1, 1], [0, 0, 0]])
731
+ assert_equal(mask_rowcols(x, 1,).mask,
732
+ [[1, 1, 0], [1, 1, 0], [1, 1, 0]])
733
+ x = array(x._data, mask=[[1, 0, 0], [0, 1, 0], [0, 0, 1]])
734
+ assert_(mask_rowcols(x).all() is masked)
735
+ assert_(mask_rowcols(x, 0).all() is masked)
736
+ assert_(mask_rowcols(x, 1).all() is masked)
737
+ assert_(mask_rowcols(x).mask.all())
738
+ assert_(mask_rowcols(x, 0).mask.all())
739
+ assert_(mask_rowcols(x, 1).mask.all())
740
+
741
+ @pytest.mark.parametrize("axis", [None, 0, 1])
742
+ @pytest.mark.parametrize(["func", "rowcols_axis"],
743
+ [(np.ma.mask_rows, 0), (np.ma.mask_cols, 1)])
744
+ def test_mask_row_cols_axis_deprecation(self, axis, func, rowcols_axis):
745
+ # Test deprecation of the axis argument to `mask_rows` and `mask_cols`
746
+ x = array(np.arange(9).reshape(3, 3),
747
+ mask=[[1, 0, 0], [0, 0, 0], [0, 0, 0]])
748
+
749
+ with assert_warns(DeprecationWarning):
750
+ res = func(x, axis=axis)
751
+ assert_equal(res, mask_rowcols(x, rowcols_axis))
752
+
753
+ def test_dot(self):
754
+ # Tests dot product
755
+ n = np.arange(1, 7)
756
+ #
757
+ m = [1, 0, 0, 0, 0, 0]
758
+ a = masked_array(n, mask=m).reshape(2, 3)
759
+ b = masked_array(n, mask=m).reshape(3, 2)
760
+ c = dot(a, b, strict=True)
761
+ assert_equal(c.mask, [[1, 1], [1, 0]])
762
+ c = dot(b, a, strict=True)
763
+ assert_equal(c.mask, [[1, 1, 1], [1, 0, 0], [1, 0, 0]])
764
+ c = dot(a, b, strict=False)
765
+ assert_equal(c, np.dot(a.filled(0), b.filled(0)))
766
+ c = dot(b, a, strict=False)
767
+ assert_equal(c, np.dot(b.filled(0), a.filled(0)))
768
+ #
769
+ m = [0, 0, 0, 0, 0, 1]
770
+ a = masked_array(n, mask=m).reshape(2, 3)
771
+ b = masked_array(n, mask=m).reshape(3, 2)
772
+ c = dot(a, b, strict=True)
773
+ assert_equal(c.mask, [[0, 1], [1, 1]])
774
+ c = dot(b, a, strict=True)
775
+ assert_equal(c.mask, [[0, 0, 1], [0, 0, 1], [1, 1, 1]])
776
+ c = dot(a, b, strict=False)
777
+ assert_equal(c, np.dot(a.filled(0), b.filled(0)))
778
+ assert_equal(c, dot(a, b))
779
+ c = dot(b, a, strict=False)
780
+ assert_equal(c, np.dot(b.filled(0), a.filled(0)))
781
+ #
782
+ m = [0, 0, 0, 0, 0, 0]
783
+ a = masked_array(n, mask=m).reshape(2, 3)
784
+ b = masked_array(n, mask=m).reshape(3, 2)
785
+ c = dot(a, b)
786
+ assert_equal(c.mask, nomask)
787
+ c = dot(b, a)
788
+ assert_equal(c.mask, nomask)
789
+ #
790
+ a = masked_array(n, mask=[1, 0, 0, 0, 0, 0]).reshape(2, 3)
791
+ b = masked_array(n, mask=[0, 0, 0, 0, 0, 0]).reshape(3, 2)
792
+ c = dot(a, b, strict=True)
793
+ assert_equal(c.mask, [[1, 1], [0, 0]])
794
+ c = dot(a, b, strict=False)
795
+ assert_equal(c, np.dot(a.filled(0), b.filled(0)))
796
+ c = dot(b, a, strict=True)
797
+ assert_equal(c.mask, [[1, 0, 0], [1, 0, 0], [1, 0, 0]])
798
+ c = dot(b, a, strict=False)
799
+ assert_equal(c, np.dot(b.filled(0), a.filled(0)))
800
+ #
801
+ a = masked_array(n, mask=[0, 0, 0, 0, 0, 1]).reshape(2, 3)
802
+ b = masked_array(n, mask=[0, 0, 0, 0, 0, 0]).reshape(3, 2)
803
+ c = dot(a, b, strict=True)
804
+ assert_equal(c.mask, [[0, 0], [1, 1]])
805
+ c = dot(a, b)
806
+ assert_equal(c, np.dot(a.filled(0), b.filled(0)))
807
+ c = dot(b, a, strict=True)
808
+ assert_equal(c.mask, [[0, 0, 1], [0, 0, 1], [0, 0, 1]])
809
+ c = dot(b, a, strict=False)
810
+ assert_equal(c, np.dot(b.filled(0), a.filled(0)))
811
+ #
812
+ a = masked_array(n, mask=[0, 0, 0, 0, 0, 1]).reshape(2, 3)
813
+ b = masked_array(n, mask=[0, 0, 1, 0, 0, 0]).reshape(3, 2)
814
+ c = dot(a, b, strict=True)
815
+ assert_equal(c.mask, [[1, 0], [1, 1]])
816
+ c = dot(a, b, strict=False)
817
+ assert_equal(c, np.dot(a.filled(0), b.filled(0)))
818
+ c = dot(b, a, strict=True)
819
+ assert_equal(c.mask, [[0, 0, 1], [1, 1, 1], [0, 0, 1]])
820
+ c = dot(b, a, strict=False)
821
+ assert_equal(c, np.dot(b.filled(0), a.filled(0)))
822
+ #
823
+ a = masked_array(np.arange(8).reshape(2, 2, 2),
824
+ mask=[[[1, 0], [0, 0]], [[0, 0], [0, 0]]])
825
+ b = masked_array(np.arange(8).reshape(2, 2, 2),
826
+ mask=[[[0, 0], [0, 0]], [[0, 0], [0, 1]]])
827
+ c = dot(a, b, strict=True)
828
+ assert_equal(c.mask,
829
+ [[[[1, 1], [1, 1]], [[0, 0], [0, 1]]],
830
+ [[[0, 0], [0, 1]], [[0, 0], [0, 1]]]])
831
+ c = dot(a, b, strict=False)
832
+ assert_equal(c.mask,
833
+ [[[[0, 0], [0, 1]], [[0, 0], [0, 0]]],
834
+ [[[0, 0], [0, 0]], [[0, 0], [0, 0]]]])
835
+ c = dot(b, a, strict=True)
836
+ assert_equal(c.mask,
837
+ [[[[1, 0], [0, 0]], [[1, 0], [0, 0]]],
838
+ [[[1, 0], [0, 0]], [[1, 1], [1, 1]]]])
839
+ c = dot(b, a, strict=False)
840
+ assert_equal(c.mask,
841
+ [[[[0, 0], [0, 0]], [[0, 0], [0, 0]]],
842
+ [[[0, 0], [0, 0]], [[1, 0], [0, 0]]]])
843
+ #
844
+ a = masked_array(np.arange(8).reshape(2, 2, 2),
845
+ mask=[[[1, 0], [0, 0]], [[0, 0], [0, 0]]])
846
+ b = 5.
847
+ c = dot(a, b, strict=True)
848
+ assert_equal(c.mask, [[[1, 0], [0, 0]], [[0, 0], [0, 0]]])
849
+ c = dot(a, b, strict=False)
850
+ assert_equal(c.mask, [[[1, 0], [0, 0]], [[0, 0], [0, 0]]])
851
+ c = dot(b, a, strict=True)
852
+ assert_equal(c.mask, [[[1, 0], [0, 0]], [[0, 0], [0, 0]]])
853
+ c = dot(b, a, strict=False)
854
+ assert_equal(c.mask, [[[1, 0], [0, 0]], [[0, 0], [0, 0]]])
855
+ #
856
+ a = masked_array(np.arange(8).reshape(2, 2, 2),
857
+ mask=[[[1, 0], [0, 0]], [[0, 0], [0, 0]]])
858
+ b = masked_array(np.arange(2), mask=[0, 1])
859
+ c = dot(a, b, strict=True)
860
+ assert_equal(c.mask, [[1, 1], [1, 1]])
861
+ c = dot(a, b, strict=False)
862
+ assert_equal(c.mask, [[1, 0], [0, 0]])
863
+
864
+ def test_dot_returns_maskedarray(self):
865
+ # See gh-6611
866
+ a = np.eye(3)
867
+ b = array(a)
868
+ assert_(type(dot(a, a)) is MaskedArray)
869
+ assert_(type(dot(a, b)) is MaskedArray)
870
+ assert_(type(dot(b, a)) is MaskedArray)
871
+ assert_(type(dot(b, b)) is MaskedArray)
872
+
873
+ def test_dot_out(self):
874
+ a = array(np.eye(3))
875
+ out = array(np.zeros((3, 3)))
876
+ res = dot(a, a, out=out)
877
+ assert_(res is out)
878
+ assert_equal(a, res)
879
+
880
+
881
+ class TestApplyAlongAxis:
882
+ # Tests 2D functions
883
+ def test_3d(self):
884
+ a = arange(12.).reshape(2, 2, 3)
885
+
886
+ def myfunc(b):
887
+ return b[1]
888
+
889
+ xa = apply_along_axis(myfunc, 2, a)
890
+ assert_equal(xa, [[1, 4], [7, 10]])
891
+
892
+ # Tests kwargs functions
893
+ def test_3d_kwargs(self):
894
+ a = arange(12).reshape(2, 2, 3)
895
+
896
+ def myfunc(b, offset=0):
897
+ return b[1 + offset]
898
+
899
+ xa = apply_along_axis(myfunc, 2, a, offset=1)
900
+ assert_equal(xa, [[2, 5], [8, 11]])
901
+
902
+
903
+ class TestApplyOverAxes:
904
+ # Tests apply_over_axes
905
+ def test_basic(self):
906
+ a = arange(24).reshape(2, 3, 4)
907
+ test = apply_over_axes(np.sum, a, [0, 2])
908
+ ctrl = np.array([[[60], [92], [124]]])
909
+ assert_equal(test, ctrl)
910
+ a[(a % 2).astype(bool)] = masked
911
+ test = apply_over_axes(np.sum, a, [0, 2])
912
+ ctrl = np.array([[[28], [44], [60]]])
913
+ assert_equal(test, ctrl)
914
+
915
+
916
+ class TestMedian:
917
+ def test_pytype(self):
918
+ r = np.ma.median([[np.inf, np.inf], [np.inf, np.inf]], axis=-1)
919
+ assert_equal(r, np.inf)
920
+
921
+ def test_inf(self):
922
+ # test that even which computes handles inf / x = masked
923
+ r = np.ma.median(np.ma.masked_array([[np.inf, np.inf],
924
+ [np.inf, np.inf]]), axis=-1)
925
+ assert_equal(r, np.inf)
926
+ r = np.ma.median(np.ma.masked_array([[np.inf, np.inf],
927
+ [np.inf, np.inf]]), axis=None)
928
+ assert_equal(r, np.inf)
929
+ # all masked
930
+ r = np.ma.median(np.ma.masked_array([[np.inf, np.inf],
931
+ [np.inf, np.inf]], mask=True),
932
+ axis=-1)
933
+ assert_equal(r.mask, True)
934
+ r = np.ma.median(np.ma.masked_array([[np.inf, np.inf],
935
+ [np.inf, np.inf]], mask=True),
936
+ axis=None)
937
+ assert_equal(r.mask, True)
938
+
939
+ def test_non_masked(self):
940
+ x = np.arange(9)
941
+ assert_equal(np.ma.median(x), 4.)
942
+ assert_(type(np.ma.median(x)) is not MaskedArray)
943
+ x = range(8)
944
+ assert_equal(np.ma.median(x), 3.5)
945
+ assert_(type(np.ma.median(x)) is not MaskedArray)
946
+ x = 5
947
+ assert_equal(np.ma.median(x), 5.)
948
+ assert_(type(np.ma.median(x)) is not MaskedArray)
949
+ # integer
950
+ x = np.arange(9 * 8).reshape(9, 8)
951
+ assert_equal(np.ma.median(x, axis=0), np.median(x, axis=0))
952
+ assert_equal(np.ma.median(x, axis=1), np.median(x, axis=1))
953
+ assert_(np.ma.median(x, axis=1) is not MaskedArray)
954
+ # float
955
+ x = np.arange(9 * 8.).reshape(9, 8)
956
+ assert_equal(np.ma.median(x, axis=0), np.median(x, axis=0))
957
+ assert_equal(np.ma.median(x, axis=1), np.median(x, axis=1))
958
+ assert_(np.ma.median(x, axis=1) is not MaskedArray)
959
+
960
+ def test_docstring_examples(self):
961
+ "test the examples given in the docstring of ma.median"
962
+ x = array(np.arange(8), mask=[0] * 4 + [1] * 4)
963
+ assert_equal(np.ma.median(x), 1.5)
964
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
965
+ assert_(type(np.ma.median(x)) is not MaskedArray)
966
+ x = array(np.arange(10).reshape(2, 5), mask=[0] * 6 + [1] * 4)
967
+ assert_equal(np.ma.median(x), 2.5)
968
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
969
+ assert_(type(np.ma.median(x)) is not MaskedArray)
970
+ ma_x = np.ma.median(x, axis=-1, overwrite_input=True)
971
+ assert_equal(ma_x, [2., 5.])
972
+ assert_equal(ma_x.shape, (2,), "shape mismatch")
973
+ assert_(type(ma_x) is MaskedArray)
974
+
975
+ def test_axis_argument_errors(self):
976
+ msg = "mask = %s, ndim = %s, axis = %s, overwrite_input = %s"
977
+ for ndmin in range(5):
978
+ for mask in [False, True]:
979
+ x = array(1, ndmin=ndmin, mask=mask)
980
+
981
+ # Valid axis values should not raise exception
982
+ args = itertools.product(range(-ndmin, ndmin), [False, True])
983
+ for axis, over in args:
984
+ try:
985
+ np.ma.median(x, axis=axis, overwrite_input=over)
986
+ except Exception:
987
+ raise AssertionError(msg % (mask, ndmin, axis, over))
988
+
989
+ # Invalid axis values should raise exception
990
+ args = itertools.product([-(ndmin + 1), ndmin], [False, True])
991
+ for axis, over in args:
992
+ try:
993
+ np.ma.median(x, axis=axis, overwrite_input=over)
994
+ except np.exceptions.AxisError:
995
+ pass
996
+ else:
997
+ raise AssertionError(msg % (mask, ndmin, axis, over))
998
+
999
+ def test_masked_0d(self):
1000
+ # Check values
1001
+ x = array(1, mask=False)
1002
+ assert_equal(np.ma.median(x), 1)
1003
+ x = array(1, mask=True)
1004
+ assert_equal(np.ma.median(x), np.ma.masked)
1005
+
1006
+ def test_masked_1d(self):
1007
+ x = array(np.arange(5), mask=True)
1008
+ assert_equal(np.ma.median(x), np.ma.masked)
1009
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1010
+ assert_(type(np.ma.median(x)) is np.ma.core.MaskedConstant)
1011
+ x = array(np.arange(5), mask=False)
1012
+ assert_equal(np.ma.median(x), 2.)
1013
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1014
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1015
+ x = array(np.arange(5), mask=[0, 1, 0, 0, 0])
1016
+ assert_equal(np.ma.median(x), 2.5)
1017
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1018
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1019
+ x = array(np.arange(5), mask=[0, 1, 1, 1, 1])
1020
+ assert_equal(np.ma.median(x), 0.)
1021
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1022
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1023
+ # integer
1024
+ x = array(np.arange(5), mask=[0, 1, 1, 0, 0])
1025
+ assert_equal(np.ma.median(x), 3.)
1026
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1027
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1028
+ # float
1029
+ x = array(np.arange(5.), mask=[0, 1, 1, 0, 0])
1030
+ assert_equal(np.ma.median(x), 3.)
1031
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1032
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1033
+ # integer
1034
+ x = array(np.arange(6), mask=[0, 1, 1, 1, 1, 0])
1035
+ assert_equal(np.ma.median(x), 2.5)
1036
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1037
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1038
+ # float
1039
+ x = array(np.arange(6.), mask=[0, 1, 1, 1, 1, 0])
1040
+ assert_equal(np.ma.median(x), 2.5)
1041
+ assert_equal(np.ma.median(x).shape, (), "shape mismatch")
1042
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1043
+
1044
+ def test_1d_shape_consistency(self):
1045
+ assert_equal(np.ma.median(array([1, 2, 3], mask=[0, 0, 0])).shape,
1046
+ np.ma.median(array([1, 2, 3], mask=[0, 1, 0])).shape)
1047
+
1048
+ def test_2d(self):
1049
+ # Tests median w/ 2D
1050
+ (n, p) = (101, 30)
1051
+ x = masked_array(np.linspace(-1., 1., n),)
1052
+ x[:10] = x[-10:] = masked
1053
+ z = masked_array(np.empty((n, p), dtype=float))
1054
+ z[:, 0] = x[:]
1055
+ idx = np.arange(len(x))
1056
+ for i in range(1, p):
1057
+ np.random.shuffle(idx)
1058
+ z[:, i] = x[idx]
1059
+ assert_equal(median(z[:, 0]), 0)
1060
+ assert_equal(median(z), 0)
1061
+ assert_equal(median(z, axis=0), np.zeros(p))
1062
+ assert_equal(median(z.T, axis=1), np.zeros(p))
1063
+
1064
+ def test_2d_waxis(self):
1065
+ # Tests median w/ 2D arrays and different axis.
1066
+ x = masked_array(np.arange(30).reshape(10, 3))
1067
+ x[:3] = x[-3:] = masked
1068
+ assert_equal(median(x), 14.5)
1069
+ assert_(type(np.ma.median(x)) is not MaskedArray)
1070
+ assert_equal(median(x, axis=0), [13.5, 14.5, 15.5])
1071
+ assert_(type(np.ma.median(x, axis=0)) is MaskedArray)
1072
+ assert_equal(median(x, axis=1), [0, 0, 0, 10, 13, 16, 19, 0, 0, 0])
1073
+ assert_(type(np.ma.median(x, axis=1)) is MaskedArray)
1074
+ assert_equal(median(x, axis=1).mask, [1, 1, 1, 0, 0, 0, 0, 1, 1, 1])
1075
+
1076
+ def test_3d(self):
1077
+ # Tests median w/ 3D
1078
+ x = np.ma.arange(24).reshape(3, 4, 2)
1079
+ x[x % 3 == 0] = masked
1080
+ assert_equal(median(x, 0), [[12, 9], [6, 15], [12, 9], [18, 15]])
1081
+ x.shape = (4, 3, 2)
1082
+ assert_equal(median(x, 0), [[99, 10], [11, 99], [13, 14]])
1083
+ x = np.ma.arange(24).reshape(4, 3, 2)
1084
+ x[x % 5 == 0] = masked
1085
+ assert_equal(median(x, 0), [[12, 10], [8, 9], [16, 17]])
1086
+
1087
+ def test_neg_axis(self):
1088
+ x = masked_array(np.arange(30).reshape(10, 3))
1089
+ x[:3] = x[-3:] = masked
1090
+ assert_equal(median(x, axis=-1), median(x, axis=1))
1091
+
1092
+ def test_out_1d(self):
1093
+ # integer float even odd
1094
+ for v in (30, 30., 31, 31.):
1095
+ x = masked_array(np.arange(v))
1096
+ x[:3] = x[-3:] = masked
1097
+ out = masked_array(np.ones(()))
1098
+ r = median(x, out=out)
1099
+ if v == 30:
1100
+ assert_equal(out, 14.5)
1101
+ else:
1102
+ assert_equal(out, 15.)
1103
+ assert_(r is out)
1104
+ assert_(type(r) is MaskedArray)
1105
+
1106
+ def test_out(self):
1107
+ # integer float even odd
1108
+ for v in (40, 40., 30, 30.):
1109
+ x = masked_array(np.arange(v).reshape(10, -1))
1110
+ x[:3] = x[-3:] = masked
1111
+ out = masked_array(np.ones(10))
1112
+ r = median(x, axis=1, out=out)
1113
+ if v == 30:
1114
+ e = masked_array([0.] * 3 + [10, 13, 16, 19] + [0.] * 3,
1115
+ mask=[True] * 3 + [False] * 4 + [True] * 3)
1116
+ else:
1117
+ e = masked_array([0.] * 3 + [13.5, 17.5, 21.5, 25.5] + [0.] * 3,
1118
+ mask=[True] * 3 + [False] * 4 + [True] * 3)
1119
+ assert_equal(r, e)
1120
+ assert_(r is out)
1121
+ assert_(type(r) is MaskedArray)
1122
+
1123
+ @pytest.mark.parametrize(
1124
+ argnames='axis',
1125
+ argvalues=[
1126
+ None,
1127
+ 1,
1128
+ (1, ),
1129
+ (0, 1),
1130
+ (-3, -1),
1131
+ ]
1132
+ )
1133
+ def test_keepdims_out(self, axis):
1134
+ mask = np.zeros((3, 5, 7, 11), dtype=bool)
1135
+ # Randomly set some elements to True:
1136
+ w = np.random.random((4, 200)) * np.array(mask.shape)[:, None]
1137
+ w = w.astype(np.intp)
1138
+ mask[tuple(w)] = np.nan
1139
+ d = masked_array(np.ones(mask.shape), mask=mask)
1140
+ if axis is None:
1141
+ shape_out = (1,) * d.ndim
1142
+ else:
1143
+ axis_norm = normalize_axis_tuple(axis, d.ndim)
1144
+ shape_out = tuple(
1145
+ 1 if i in axis_norm else d.shape[i] for i in range(d.ndim))
1146
+ out = masked_array(np.empty(shape_out))
1147
+ result = median(d, axis=axis, keepdims=True, out=out)
1148
+ assert result is out
1149
+ assert_equal(result.shape, shape_out)
1150
+
1151
+ def test_single_non_masked_value_on_axis(self):
1152
+ data = [[1., 0.],
1153
+ [0., 3.],
1154
+ [0., 0.]]
1155
+ masked_arr = np.ma.masked_equal(data, 0)
1156
+ expected = [1., 3.]
1157
+ assert_array_equal(np.ma.median(masked_arr, axis=0),
1158
+ expected)
1159
+
1160
+ def test_nan(self):
1161
+ for mask in (False, np.zeros(6, dtype=bool)):
1162
+ dm = np.ma.array([[1, np.nan, 3], [1, 2, 3]])
1163
+ dm.mask = mask
1164
+
1165
+ # scalar result
1166
+ r = np.ma.median(dm, axis=None)
1167
+ assert_(np.isscalar(r))
1168
+ assert_array_equal(r, np.nan)
1169
+ r = np.ma.median(dm.ravel(), axis=0)
1170
+ assert_(np.isscalar(r))
1171
+ assert_array_equal(r, np.nan)
1172
+
1173
+ r = np.ma.median(dm, axis=0)
1174
+ assert_equal(type(r), MaskedArray)
1175
+ assert_array_equal(r, [1, np.nan, 3])
1176
+ r = np.ma.median(dm, axis=1)
1177
+ assert_equal(type(r), MaskedArray)
1178
+ assert_array_equal(r, [np.nan, 2])
1179
+ r = np.ma.median(dm, axis=-1)
1180
+ assert_equal(type(r), MaskedArray)
1181
+ assert_array_equal(r, [np.nan, 2])
1182
+
1183
+ dm = np.ma.array([[1, np.nan, 3], [1, 2, 3]])
1184
+ dm[:, 2] = np.ma.masked
1185
+ assert_array_equal(np.ma.median(dm, axis=None), np.nan)
1186
+ assert_array_equal(np.ma.median(dm, axis=0), [1, np.nan, 3])
1187
+ assert_array_equal(np.ma.median(dm, axis=1), [np.nan, 1.5])
1188
+
1189
+ def test_out_nan(self):
1190
+ o = np.ma.masked_array(np.zeros((4,)))
1191
+ d = np.ma.masked_array(np.ones((3, 4)))
1192
+ d[2, 1] = np.nan
1193
+ d[2, 2] = np.ma.masked
1194
+ assert_equal(np.ma.median(d, 0, out=o), o)
1195
+ o = np.ma.masked_array(np.zeros((3,)))
1196
+ assert_equal(np.ma.median(d, 1, out=o), o)
1197
+ o = np.ma.masked_array(np.zeros(()))
1198
+ assert_equal(np.ma.median(d, out=o), o)
1199
+
1200
+ def test_nan_behavior(self):
1201
+ a = np.ma.masked_array(np.arange(24, dtype=float))
1202
+ a[::3] = np.ma.masked
1203
+ a[2] = np.nan
1204
+ assert_array_equal(np.ma.median(a), np.nan)
1205
+ assert_array_equal(np.ma.median(a, axis=0), np.nan)
1206
+
1207
+ a = np.ma.masked_array(np.arange(24, dtype=float).reshape(2, 3, 4))
1208
+ a.mask = np.arange(a.size) % 2 == 1
1209
+ aorig = a.copy()
1210
+ a[1, 2, 3] = np.nan
1211
+ a[1, 1, 2] = np.nan
1212
+
1213
+ # no axis
1214
+ assert_array_equal(np.ma.median(a), np.nan)
1215
+ assert_(np.isscalar(np.ma.median(a)))
1216
+
1217
+ # axis0
1218
+ b = np.ma.median(aorig, axis=0)
1219
+ b[2, 3] = np.nan
1220
+ b[1, 2] = np.nan
1221
+ assert_equal(np.ma.median(a, 0), b)
1222
+
1223
+ # axis1
1224
+ b = np.ma.median(aorig, axis=1)
1225
+ b[1, 3] = np.nan
1226
+ b[1, 2] = np.nan
1227
+ assert_equal(np.ma.median(a, 1), b)
1228
+
1229
+ # axis02
1230
+ b = np.ma.median(aorig, axis=(0, 2))
1231
+ b[1] = np.nan
1232
+ b[2] = np.nan
1233
+ assert_equal(np.ma.median(a, (0, 2)), b)
1234
+
1235
+ def test_ambigous_fill(self):
1236
+ # 255 is max value, used as filler for sort
1237
+ a = np.array([[3, 3, 255], [3, 3, 255]], dtype=np.uint8)
1238
+ a = np.ma.masked_array(a, mask=a == 3)
1239
+ assert_array_equal(np.ma.median(a, axis=1), 255)
1240
+ assert_array_equal(np.ma.median(a, axis=1).mask, False)
1241
+ assert_array_equal(np.ma.median(a, axis=0), a[0])
1242
+ assert_array_equal(np.ma.median(a), 255)
1243
+
1244
+ def test_special(self):
1245
+ for inf in [np.inf, -np.inf]:
1246
+ a = np.array([[inf, np.nan], [np.nan, np.nan]])
1247
+ a = np.ma.masked_array(a, mask=np.isnan(a))
1248
+ assert_equal(np.ma.median(a, axis=0), [inf, np.nan])
1249
+ assert_equal(np.ma.median(a, axis=1), [inf, np.nan])
1250
+ assert_equal(np.ma.median(a), inf)
1251
+
1252
+ a = np.array([[np.nan, np.nan, inf], [np.nan, np.nan, inf]])
1253
+ a = np.ma.masked_array(a, mask=np.isnan(a))
1254
+ assert_array_equal(np.ma.median(a, axis=1), inf)
1255
+ assert_array_equal(np.ma.median(a, axis=1).mask, False)
1256
+ assert_array_equal(np.ma.median(a, axis=0), a[0])
1257
+ assert_array_equal(np.ma.median(a), inf)
1258
+
1259
+ # no mask
1260
+ a = np.array([[inf, inf], [inf, inf]])
1261
+ assert_equal(np.ma.median(a), inf)
1262
+ assert_equal(np.ma.median(a, axis=0), inf)
1263
+ assert_equal(np.ma.median(a, axis=1), inf)
1264
+
1265
+ a = np.array([[inf, 7, -inf, -9],
1266
+ [-10, np.nan, np.nan, 5],
1267
+ [4, np.nan, np.nan, inf]],
1268
+ dtype=np.float32)
1269
+ a = np.ma.masked_array(a, mask=np.isnan(a))
1270
+ if inf > 0:
1271
+ assert_equal(np.ma.median(a, axis=0), [4., 7., -inf, 5.])
1272
+ assert_equal(np.ma.median(a), 4.5)
1273
+ else:
1274
+ assert_equal(np.ma.median(a, axis=0), [-10., 7., -inf, -9.])
1275
+ assert_equal(np.ma.median(a), -2.5)
1276
+ assert_equal(np.ma.median(a, axis=1), [-1., -2.5, inf])
1277
+
1278
+ for i in range(10):
1279
+ for j in range(1, 10):
1280
+ a = np.array([([np.nan] * i) + ([inf] * j)] * 2)
1281
+ a = np.ma.masked_array(a, mask=np.isnan(a))
1282
+ assert_equal(np.ma.median(a), inf)
1283
+ assert_equal(np.ma.median(a, axis=1), inf)
1284
+ assert_equal(np.ma.median(a, axis=0),
1285
+ ([np.nan] * i) + [inf] * j)
1286
+
1287
+ def test_empty(self):
1288
+ # empty arrays
1289
+ a = np.ma.masked_array(np.array([], dtype=float))
1290
+ with suppress_warnings() as w:
1291
+ w.record(RuntimeWarning)
1292
+ assert_array_equal(np.ma.median(a), np.nan)
1293
+ assert_(w.log[0].category is RuntimeWarning)
1294
+
1295
+ # multiple dimensions
1296
+ a = np.ma.masked_array(np.array([], dtype=float, ndmin=3))
1297
+ # no axis
1298
+ with suppress_warnings() as w:
1299
+ w.record(RuntimeWarning)
1300
+ warnings.filterwarnings('always', '', RuntimeWarning)
1301
+ assert_array_equal(np.ma.median(a), np.nan)
1302
+ assert_(w.log[0].category is RuntimeWarning)
1303
+
1304
+ # axis 0 and 1
1305
+ b = np.ma.masked_array(np.array([], dtype=float, ndmin=2))
1306
+ assert_equal(np.ma.median(a, axis=0), b)
1307
+ assert_equal(np.ma.median(a, axis=1), b)
1308
+
1309
+ # axis 2
1310
+ b = np.ma.masked_array(np.array(np.nan, dtype=float, ndmin=2))
1311
+ with warnings.catch_warnings(record=True) as w:
1312
+ warnings.filterwarnings('always', '', RuntimeWarning)
1313
+ assert_equal(np.ma.median(a, axis=2), b)
1314
+ assert_(w[0].category is RuntimeWarning)
1315
+
1316
+ def test_object(self):
1317
+ o = np.ma.masked_array(np.arange(7.))
1318
+ assert_(type(np.ma.median(o.astype(object))), float)
1319
+ o[2] = np.nan
1320
+ assert_(type(np.ma.median(o.astype(object))), float)
1321
+
1322
+
1323
+ class TestCov:
1324
+
1325
+ def setup_method(self):
1326
+ self.data = array(np.random.rand(12))
1327
+
1328
+ def test_covhelper(self):
1329
+ x = self.data
1330
+ # Test not mask output type is a float.
1331
+ assert_(_covhelper(x, rowvar=True)[1].dtype, np.float32)
1332
+ assert_(_covhelper(x, y=x, rowvar=False)[1].dtype, np.float32)
1333
+ # Test not mask output is equal after casting to float.
1334
+ mask = x > 0.5
1335
+ assert_array_equal(
1336
+ _covhelper(
1337
+ np.ma.masked_array(x, mask), rowvar=True
1338
+ )[1].astype(bool),
1339
+ ~mask.reshape(1, -1),
1340
+ )
1341
+ assert_array_equal(
1342
+ _covhelper(
1343
+ np.ma.masked_array(x, mask), y=x, rowvar=False
1344
+ )[1].astype(bool),
1345
+ np.vstack((~mask, ~mask)),
1346
+ )
1347
+
1348
+ def test_1d_without_missing(self):
1349
+ # Test cov on 1D variable w/o missing values
1350
+ x = self.data
1351
+ assert_almost_equal(np.cov(x), cov(x))
1352
+ assert_almost_equal(np.cov(x, rowvar=False), cov(x, rowvar=False))
1353
+ assert_almost_equal(np.cov(x, rowvar=False, bias=True),
1354
+ cov(x, rowvar=False, bias=True))
1355
+
1356
+ def test_2d_without_missing(self):
1357
+ # Test cov on 1 2D variable w/o missing values
1358
+ x = self.data.reshape(3, 4)
1359
+ assert_almost_equal(np.cov(x), cov(x))
1360
+ assert_almost_equal(np.cov(x, rowvar=False), cov(x, rowvar=False))
1361
+ assert_almost_equal(np.cov(x, rowvar=False, bias=True),
1362
+ cov(x, rowvar=False, bias=True))
1363
+
1364
+ def test_1d_with_missing(self):
1365
+ # Test cov 1 1D variable w/missing values
1366
+ x = self.data
1367
+ x[-1] = masked
1368
+ x -= x.mean()
1369
+ nx = x.compressed()
1370
+ assert_almost_equal(np.cov(nx), cov(x))
1371
+ assert_almost_equal(np.cov(nx, rowvar=False), cov(x, rowvar=False))
1372
+ assert_almost_equal(np.cov(nx, rowvar=False, bias=True),
1373
+ cov(x, rowvar=False, bias=True))
1374
+ #
1375
+ try:
1376
+ cov(x, allow_masked=False)
1377
+ except ValueError:
1378
+ pass
1379
+ #
1380
+ # 2 1D variables w/ missing values
1381
+ nx = x[1:-1]
1382
+ assert_almost_equal(np.cov(nx, nx[::-1]), cov(x, x[::-1]))
1383
+ assert_almost_equal(np.cov(nx, nx[::-1], rowvar=False),
1384
+ cov(x, x[::-1], rowvar=False))
1385
+ assert_almost_equal(np.cov(nx, nx[::-1], rowvar=False, bias=True),
1386
+ cov(x, x[::-1], rowvar=False, bias=True))
1387
+
1388
+ def test_2d_with_missing(self):
1389
+ # Test cov on 2D variable w/ missing value
1390
+ x = self.data
1391
+ x[-1] = masked
1392
+ x = x.reshape(3, 4)
1393
+ valid = np.logical_not(getmaskarray(x)).astype(int)
1394
+ frac = np.dot(valid, valid.T)
1395
+ xf = (x - x.mean(1)[:, None]).filled(0)
1396
+ assert_almost_equal(cov(x),
1397
+ np.cov(xf) * (x.shape[1] - 1) / (frac - 1.))
1398
+ assert_almost_equal(cov(x, bias=True),
1399
+ np.cov(xf, bias=True) * x.shape[1] / frac)
1400
+ frac = np.dot(valid.T, valid)
1401
+ xf = (x - x.mean(0)).filled(0)
1402
+ assert_almost_equal(cov(x, rowvar=False),
1403
+ (np.cov(xf, rowvar=False) *
1404
+ (x.shape[0] - 1) / (frac - 1.)))
1405
+ assert_almost_equal(cov(x, rowvar=False, bias=True),
1406
+ (np.cov(xf, rowvar=False, bias=True) *
1407
+ x.shape[0] / frac))
1408
+
1409
+
1410
+ class TestCorrcoef:
1411
+
1412
+ def setup_method(self):
1413
+ self.data = array(np.random.rand(12))
1414
+ self.data2 = array(np.random.rand(12))
1415
+
1416
+ def test_ddof(self):
1417
+ # ddof raises DeprecationWarning
1418
+ x, y = self.data, self.data2
1419
+ expected = np.corrcoef(x)
1420
+ expected2 = np.corrcoef(x, y)
1421
+ with suppress_warnings() as sup:
1422
+ warnings.simplefilter("always")
1423
+ assert_warns(DeprecationWarning, corrcoef, x, ddof=-1)
1424
+ sup.filter(DeprecationWarning, "bias and ddof have no effect")
1425
+ # ddof has no or negligible effect on the function
1426
+ assert_almost_equal(np.corrcoef(x, ddof=0), corrcoef(x, ddof=0))
1427
+ assert_almost_equal(corrcoef(x, ddof=-1), expected)
1428
+ assert_almost_equal(corrcoef(x, y, ddof=-1), expected2)
1429
+ assert_almost_equal(corrcoef(x, ddof=3), expected)
1430
+ assert_almost_equal(corrcoef(x, y, ddof=3), expected2)
1431
+
1432
+ def test_bias(self):
1433
+ x, y = self.data, self.data2
1434
+ expected = np.corrcoef(x)
1435
+ # bias raises DeprecationWarning
1436
+ with suppress_warnings() as sup:
1437
+ warnings.simplefilter("always")
1438
+ assert_warns(DeprecationWarning, corrcoef, x, y, True, False)
1439
+ assert_warns(DeprecationWarning, corrcoef, x, y, True, True)
1440
+ assert_warns(DeprecationWarning, corrcoef, x, bias=False)
1441
+ sup.filter(DeprecationWarning, "bias and ddof have no effect")
1442
+ # bias has no or negligible effect on the function
1443
+ assert_almost_equal(corrcoef(x, bias=1), expected)
1444
+
1445
+ def test_1d_without_missing(self):
1446
+ # Test cov on 1D variable w/o missing values
1447
+ x = self.data
1448
+ assert_almost_equal(np.corrcoef(x), corrcoef(x))
1449
+ assert_almost_equal(np.corrcoef(x, rowvar=False),
1450
+ corrcoef(x, rowvar=False))
1451
+ with suppress_warnings() as sup:
1452
+ sup.filter(DeprecationWarning, "bias and ddof have no effect")
1453
+ assert_almost_equal(np.corrcoef(x, rowvar=False, bias=True),
1454
+ corrcoef(x, rowvar=False, bias=True))
1455
+
1456
+ def test_2d_without_missing(self):
1457
+ # Test corrcoef on 1 2D variable w/o missing values
1458
+ x = self.data.reshape(3, 4)
1459
+ assert_almost_equal(np.corrcoef(x), corrcoef(x))
1460
+ assert_almost_equal(np.corrcoef(x, rowvar=False),
1461
+ corrcoef(x, rowvar=False))
1462
+ with suppress_warnings() as sup:
1463
+ sup.filter(DeprecationWarning, "bias and ddof have no effect")
1464
+ assert_almost_equal(np.corrcoef(x, rowvar=False, bias=True),
1465
+ corrcoef(x, rowvar=False, bias=True))
1466
+
1467
+ def test_1d_with_missing(self):
1468
+ # Test corrcoef 1 1D variable w/missing values
1469
+ x = self.data
1470
+ x[-1] = masked
1471
+ x -= x.mean()
1472
+ nx = x.compressed()
1473
+ assert_almost_equal(np.corrcoef(nx), corrcoef(x))
1474
+ assert_almost_equal(np.corrcoef(nx, rowvar=False),
1475
+ corrcoef(x, rowvar=False))
1476
+ with suppress_warnings() as sup:
1477
+ sup.filter(DeprecationWarning, "bias and ddof have no effect")
1478
+ assert_almost_equal(np.corrcoef(nx, rowvar=False, bias=True),
1479
+ corrcoef(x, rowvar=False, bias=True))
1480
+ try:
1481
+ corrcoef(x, allow_masked=False)
1482
+ except ValueError:
1483
+ pass
1484
+ # 2 1D variables w/ missing values
1485
+ nx = x[1:-1]
1486
+ assert_almost_equal(np.corrcoef(nx, nx[::-1]), corrcoef(x, x[::-1]))
1487
+ assert_almost_equal(np.corrcoef(nx, nx[::-1], rowvar=False),
1488
+ corrcoef(x, x[::-1], rowvar=False))
1489
+ with suppress_warnings() as sup:
1490
+ sup.filter(DeprecationWarning, "bias and ddof have no effect")
1491
+ # ddof and bias have no or negligible effect on the function
1492
+ assert_almost_equal(np.corrcoef(nx, nx[::-1]),
1493
+ corrcoef(x, x[::-1], bias=1))
1494
+ assert_almost_equal(np.corrcoef(nx, nx[::-1]),
1495
+ corrcoef(x, x[::-1], ddof=2))
1496
+
1497
+ def test_2d_with_missing(self):
1498
+ # Test corrcoef on 2D variable w/ missing value
1499
+ x = self.data
1500
+ x[-1] = masked
1501
+ x = x.reshape(3, 4)
1502
+
1503
+ test = corrcoef(x)
1504
+ control = np.corrcoef(x)
1505
+ assert_almost_equal(test[:-1, :-1], control[:-1, :-1])
1506
+ with suppress_warnings() as sup:
1507
+ sup.filter(DeprecationWarning, "bias and ddof have no effect")
1508
+ # ddof and bias have no or negligible effect on the function
1509
+ assert_almost_equal(corrcoef(x, ddof=-2)[:-1, :-1],
1510
+ control[:-1, :-1])
1511
+ assert_almost_equal(corrcoef(x, ddof=3)[:-1, :-1],
1512
+ control[:-1, :-1])
1513
+ assert_almost_equal(corrcoef(x, bias=1)[:-1, :-1],
1514
+ control[:-1, :-1])
1515
+
1516
+
1517
+ class TestPolynomial:
1518
+ #
1519
+ def test_polyfit(self):
1520
+ # Tests polyfit
1521
+ # On ndarrays
1522
+ x = np.random.rand(10)
1523
+ y = np.random.rand(20).reshape(-1, 2)
1524
+ assert_almost_equal(polyfit(x, y, 3), np.polyfit(x, y, 3))
1525
+ # ON 1D maskedarrays
1526
+ x = x.view(MaskedArray)
1527
+ x[0] = masked
1528
+ y = y.view(MaskedArray)
1529
+ y[0, 0] = y[-1, -1] = masked
1530
+ #
1531
+ (C, R, K, S, D) = polyfit(x, y[:, 0], 3, full=True)
1532
+ (c, r, k, s, d) = np.polyfit(x[1:], y[1:, 0].compressed(), 3,
1533
+ full=True)
1534
+ for (a, a_) in zip((C, R, K, S, D), (c, r, k, s, d)):
1535
+ assert_almost_equal(a, a_)
1536
+ #
1537
+ (C, R, K, S, D) = polyfit(x, y[:, -1], 3, full=True)
1538
+ (c, r, k, s, d) = np.polyfit(x[1:-1], y[1:-1, -1], 3, full=True)
1539
+ for (a, a_) in zip((C, R, K, S, D), (c, r, k, s, d)):
1540
+ assert_almost_equal(a, a_)
1541
+ #
1542
+ (C, R, K, S, D) = polyfit(x, y, 3, full=True)
1543
+ (c, r, k, s, d) = np.polyfit(x[1:-1], y[1:-1, :], 3, full=True)
1544
+ for (a, a_) in zip((C, R, K, S, D), (c, r, k, s, d)):
1545
+ assert_almost_equal(a, a_)
1546
+ #
1547
+ w = np.random.rand(10) + 1
1548
+ wo = w.copy()
1549
+ xs = x[1:-1]
1550
+ ys = y[1:-1]
1551
+ ws = w[1:-1]
1552
+ (C, R, K, S, D) = polyfit(x, y, 3, full=True, w=w)
1553
+ (c, r, k, s, d) = np.polyfit(xs, ys, 3, full=True, w=ws)
1554
+ assert_equal(w, wo)
1555
+ for (a, a_) in zip((C, R, K, S, D), (c, r, k, s, d)):
1556
+ assert_almost_equal(a, a_)
1557
+
1558
+ def test_polyfit_with_masked_NaNs(self):
1559
+ x = np.random.rand(10)
1560
+ y = np.random.rand(20).reshape(-1, 2)
1561
+
1562
+ x[0] = np.nan
1563
+ y[-1, -1] = np.nan
1564
+ x = x.view(MaskedArray)
1565
+ y = y.view(MaskedArray)
1566
+ x[0] = masked
1567
+ y[-1, -1] = masked
1568
+
1569
+ (C, R, K, S, D) = polyfit(x, y, 3, full=True)
1570
+ (c, r, k, s, d) = np.polyfit(x[1:-1], y[1:-1, :], 3, full=True)
1571
+ for (a, a_) in zip((C, R, K, S, D), (c, r, k, s, d)):
1572
+ assert_almost_equal(a, a_)
1573
+
1574
+
1575
+ class TestArraySetOps:
1576
+
1577
+ def test_unique_onlist(self):
1578
+ # Test unique on list
1579
+ data = [1, 1, 1, 2, 2, 3]
1580
+ test = unique(data, return_index=True, return_inverse=True)
1581
+ assert_(isinstance(test[0], MaskedArray))
1582
+ assert_equal(test[0], masked_array([1, 2, 3], mask=[0, 0, 0]))
1583
+ assert_equal(test[1], [0, 3, 5])
1584
+ assert_equal(test[2], [0, 0, 0, 1, 1, 2])
1585
+
1586
+ def test_unique_onmaskedarray(self):
1587
+ # Test unique on masked data w/use_mask=True
1588
+ data = masked_array([1, 1, 1, 2, 2, 3], mask=[0, 0, 1, 0, 1, 0])
1589
+ test = unique(data, return_index=True, return_inverse=True)
1590
+ assert_equal(test[0], masked_array([1, 2, 3, -1], mask=[0, 0, 0, 1]))
1591
+ assert_equal(test[1], [0, 3, 5, 2])
1592
+ assert_equal(test[2], [0, 0, 3, 1, 3, 2])
1593
+ #
1594
+ data.fill_value = 3
1595
+ data = masked_array(data=[1, 1, 1, 2, 2, 3],
1596
+ mask=[0, 0, 1, 0, 1, 0], fill_value=3)
1597
+ test = unique(data, return_index=True, return_inverse=True)
1598
+ assert_equal(test[0], masked_array([1, 2, 3, -1], mask=[0, 0, 0, 1]))
1599
+ assert_equal(test[1], [0, 3, 5, 2])
1600
+ assert_equal(test[2], [0, 0, 3, 1, 3, 2])
1601
+
1602
+ def test_unique_allmasked(self):
1603
+ # Test all masked
1604
+ data = masked_array([1, 1, 1], mask=True)
1605
+ test = unique(data, return_index=True, return_inverse=True)
1606
+ assert_equal(test[0], masked_array([1, ], mask=[True]))
1607
+ assert_equal(test[1], [0])
1608
+ assert_equal(test[2], [0, 0, 0])
1609
+ #
1610
+ # Test masked
1611
+ data = masked
1612
+ test = unique(data, return_index=True, return_inverse=True)
1613
+ assert_equal(test[0], masked_array(masked))
1614
+ assert_equal(test[1], [0])
1615
+ assert_equal(test[2], [0])
1616
+
1617
+ def test_ediff1d(self):
1618
+ # Tests mediff1d
1619
+ x = masked_array(np.arange(5), mask=[1, 0, 0, 0, 1])
1620
+ control = array([1, 1, 1, 4], mask=[1, 0, 0, 1])
1621
+ test = ediff1d(x)
1622
+ assert_equal(test, control)
1623
+ assert_equal(test.filled(0), control.filled(0))
1624
+ assert_equal(test.mask, control.mask)
1625
+
1626
+ def test_ediff1d_tobegin(self):
1627
+ # Test ediff1d w/ to_begin
1628
+ x = masked_array(np.arange(5), mask=[1, 0, 0, 0, 1])
1629
+ test = ediff1d(x, to_begin=masked)
1630
+ control = array([0, 1, 1, 1, 4], mask=[1, 1, 0, 0, 1])
1631
+ assert_equal(test, control)
1632
+ assert_equal(test.filled(0), control.filled(0))
1633
+ assert_equal(test.mask, control.mask)
1634
+ #
1635
+ test = ediff1d(x, to_begin=[1, 2, 3])
1636
+ control = array([1, 2, 3, 1, 1, 1, 4], mask=[0, 0, 0, 1, 0, 0, 1])
1637
+ assert_equal(test, control)
1638
+ assert_equal(test.filled(0), control.filled(0))
1639
+ assert_equal(test.mask, control.mask)
1640
+
1641
+ def test_ediff1d_toend(self):
1642
+ # Test ediff1d w/ to_end
1643
+ x = masked_array(np.arange(5), mask=[1, 0, 0, 0, 1])
1644
+ test = ediff1d(x, to_end=masked)
1645
+ control = array([1, 1, 1, 4, 0], mask=[1, 0, 0, 1, 1])
1646
+ assert_equal(test, control)
1647
+ assert_equal(test.filled(0), control.filled(0))
1648
+ assert_equal(test.mask, control.mask)
1649
+ #
1650
+ test = ediff1d(x, to_end=[1, 2, 3])
1651
+ control = array([1, 1, 1, 4, 1, 2, 3], mask=[1, 0, 0, 1, 0, 0, 0])
1652
+ assert_equal(test, control)
1653
+ assert_equal(test.filled(0), control.filled(0))
1654
+ assert_equal(test.mask, control.mask)
1655
+
1656
+ def test_ediff1d_tobegin_toend(self):
1657
+ # Test ediff1d w/ to_begin and to_end
1658
+ x = masked_array(np.arange(5), mask=[1, 0, 0, 0, 1])
1659
+ test = ediff1d(x, to_end=masked, to_begin=masked)
1660
+ control = array([0, 1, 1, 1, 4, 0], mask=[1, 1, 0, 0, 1, 1])
1661
+ assert_equal(test, control)
1662
+ assert_equal(test.filled(0), control.filled(0))
1663
+ assert_equal(test.mask, control.mask)
1664
+ #
1665
+ test = ediff1d(x, to_end=[1, 2, 3], to_begin=masked)
1666
+ control = array([0, 1, 1, 1, 4, 1, 2, 3],
1667
+ mask=[1, 1, 0, 0, 1, 0, 0, 0])
1668
+ assert_equal(test, control)
1669
+ assert_equal(test.filled(0), control.filled(0))
1670
+ assert_equal(test.mask, control.mask)
1671
+
1672
+ def test_ediff1d_ndarray(self):
1673
+ # Test ediff1d w/ a ndarray
1674
+ x = np.arange(5)
1675
+ test = ediff1d(x)
1676
+ control = array([1, 1, 1, 1], mask=[0, 0, 0, 0])
1677
+ assert_equal(test, control)
1678
+ assert_(isinstance(test, MaskedArray))
1679
+ assert_equal(test.filled(0), control.filled(0))
1680
+ assert_equal(test.mask, control.mask)
1681
+ #
1682
+ test = ediff1d(x, to_end=masked, to_begin=masked)
1683
+ control = array([0, 1, 1, 1, 1, 0], mask=[1, 0, 0, 0, 0, 1])
1684
+ assert_(isinstance(test, MaskedArray))
1685
+ assert_equal(test.filled(0), control.filled(0))
1686
+ assert_equal(test.mask, control.mask)
1687
+
1688
+ def test_intersect1d(self):
1689
+ # Test intersect1d
1690
+ x = array([1, 3, 3, 3], mask=[0, 0, 0, 1])
1691
+ y = array([3, 1, 1, 1], mask=[0, 0, 0, 1])
1692
+ test = intersect1d(x, y)
1693
+ control = array([1, 3, -1], mask=[0, 0, 1])
1694
+ assert_equal(test, control)
1695
+
1696
+ def test_setxor1d(self):
1697
+ # Test setxor1d
1698
+ a = array([1, 2, 5, 7, -1], mask=[0, 0, 0, 0, 1])
1699
+ b = array([1, 2, 3, 4, 5, -1], mask=[0, 0, 0, 0, 0, 1])
1700
+ test = setxor1d(a, b)
1701
+ assert_equal(test, array([3, 4, 7]))
1702
+ #
1703
+ a = array([1, 2, 5, 7, -1], mask=[0, 0, 0, 0, 1])
1704
+ b = [1, 2, 3, 4, 5]
1705
+ test = setxor1d(a, b)
1706
+ assert_equal(test, array([3, 4, 7, -1], mask=[0, 0, 0, 1]))
1707
+ #
1708
+ a = array([1, 2, 3])
1709
+ b = array([6, 5, 4])
1710
+ test = setxor1d(a, b)
1711
+ assert_(isinstance(test, MaskedArray))
1712
+ assert_equal(test, [1, 2, 3, 4, 5, 6])
1713
+ #
1714
+ a = array([1, 8, 2, 3], mask=[0, 1, 0, 0])
1715
+ b = array([6, 5, 4, 8], mask=[0, 0, 0, 1])
1716
+ test = setxor1d(a, b)
1717
+ assert_(isinstance(test, MaskedArray))
1718
+ assert_equal(test, [1, 2, 3, 4, 5, 6])
1719
+ #
1720
+ assert_array_equal([], setxor1d([], []))
1721
+
1722
+ def test_setxor1d_unique(self):
1723
+ # Test setxor1d with assume_unique=True
1724
+ a = array([1, 2, 5, 7, -1], mask=[0, 0, 0, 0, 1])
1725
+ b = [1, 2, 3, 4, 5]
1726
+ test = setxor1d(a, b, assume_unique=True)
1727
+ assert_equal(test, array([3, 4, 7, -1], mask=[0, 0, 0, 1]))
1728
+ #
1729
+ a = array([1, 8, 2, 3], mask=[0, 1, 0, 0])
1730
+ b = array([6, 5, 4, 8], mask=[0, 0, 0, 1])
1731
+ test = setxor1d(a, b, assume_unique=True)
1732
+ assert_(isinstance(test, MaskedArray))
1733
+ assert_equal(test, [1, 2, 3, 4, 5, 6])
1734
+ #
1735
+ a = array([[1], [8], [2], [3]])
1736
+ b = array([[6, 5], [4, 8]])
1737
+ test = setxor1d(a, b, assume_unique=True)
1738
+ assert_(isinstance(test, MaskedArray))
1739
+ assert_equal(test, [1, 2, 3, 4, 5, 6])
1740
+
1741
+ def test_isin(self):
1742
+ # the tests for in1d cover most of isin's behavior
1743
+ # if in1d is removed, would need to change those tests to test
1744
+ # isin instead.
1745
+ a = np.arange(24).reshape([2, 3, 4])
1746
+ mask = np.zeros([2, 3, 4])
1747
+ mask[1, 2, 0] = 1
1748
+ a = array(a, mask=mask)
1749
+ b = array(data=[0, 10, 20, 30, 1, 3, 11, 22, 33],
1750
+ mask=[0, 1, 0, 1, 0, 1, 0, 1, 0])
1751
+ ec = zeros((2, 3, 4), dtype=bool)
1752
+ ec[0, 0, 0] = True
1753
+ ec[0, 0, 1] = True
1754
+ ec[0, 2, 3] = True
1755
+ c = isin(a, b)
1756
+ assert_(isinstance(c, MaskedArray))
1757
+ assert_array_equal(c, ec)
1758
+ # compare results of np.isin to ma.isin
1759
+ d = np.isin(a, b[~b.mask]) & ~a.mask
1760
+ assert_array_equal(c, d)
1761
+
1762
+ def test_in1d(self):
1763
+ # Test in1d
1764
+ a = array([1, 2, 5, 7, -1], mask=[0, 0, 0, 0, 1])
1765
+ b = array([1, 2, 3, 4, 5, -1], mask=[0, 0, 0, 0, 0, 1])
1766
+ test = in1d(a, b)
1767
+ assert_equal(test, [True, True, True, False, True])
1768
+ #
1769
+ a = array([5, 5, 2, 1, -1], mask=[0, 0, 0, 0, 1])
1770
+ b = array([1, 5, -1], mask=[0, 0, 1])
1771
+ test = in1d(a, b)
1772
+ assert_equal(test, [True, True, False, True, True])
1773
+ #
1774
+ assert_array_equal([], in1d([], []))
1775
+
1776
+ def test_in1d_invert(self):
1777
+ # Test in1d's invert parameter
1778
+ a = array([1, 2, 5, 7, -1], mask=[0, 0, 0, 0, 1])
1779
+ b = array([1, 2, 3, 4, 5, -1], mask=[0, 0, 0, 0, 0, 1])
1780
+ assert_equal(np.invert(in1d(a, b)), in1d(a, b, invert=True))
1781
+
1782
+ a = array([5, 5, 2, 1, -1], mask=[0, 0, 0, 0, 1])
1783
+ b = array([1, 5, -1], mask=[0, 0, 1])
1784
+ assert_equal(np.invert(in1d(a, b)), in1d(a, b, invert=True))
1785
+
1786
+ assert_array_equal([], in1d([], [], invert=True))
1787
+
1788
+ def test_union1d(self):
1789
+ # Test union1d
1790
+ a = array([1, 2, 5, 7, 5, -1], mask=[0, 0, 0, 0, 0, 1])
1791
+ b = array([1, 2, 3, 4, 5, -1], mask=[0, 0, 0, 0, 0, 1])
1792
+ test = union1d(a, b)
1793
+ control = array([1, 2, 3, 4, 5, 7, -1], mask=[0, 0, 0, 0, 0, 0, 1])
1794
+ assert_equal(test, control)
1795
+
1796
+ # Tests gh-10340, arguments to union1d should be
1797
+ # flattened if they are not already 1D
1798
+ x = array([[0, 1, 2], [3, 4, 5]], mask=[[0, 0, 0], [0, 0, 1]])
1799
+ y = array([0, 1, 2, 3, 4], mask=[0, 0, 0, 0, 1])
1800
+ ez = array([0, 1, 2, 3, 4, 5], mask=[0, 0, 0, 0, 0, 1])
1801
+ z = union1d(x, y)
1802
+ assert_equal(z, ez)
1803
+ #
1804
+ assert_array_equal([], union1d([], []))
1805
+
1806
+ def test_setdiff1d(self):
1807
+ # Test setdiff1d
1808
+ a = array([6, 5, 4, 7, 7, 1, 2, 1], mask=[0, 0, 0, 0, 0, 0, 0, 1])
1809
+ b = array([2, 4, 3, 3, 2, 1, 5])
1810
+ test = setdiff1d(a, b)
1811
+ assert_equal(test, array([6, 7, -1], mask=[0, 0, 1]))
1812
+ #
1813
+ a = arange(10)
1814
+ b = arange(8)
1815
+ assert_equal(setdiff1d(a, b), array([8, 9]))
1816
+ a = array([], np.uint32, mask=[])
1817
+ assert_equal(setdiff1d(a, []).dtype, np.uint32)
1818
+
1819
+ def test_setdiff1d_char_array(self):
1820
+ # Test setdiff1d_charray
1821
+ a = np.array(['a', 'b', 'c'])
1822
+ b = np.array(['a', 'b', 's'])
1823
+ assert_array_equal(setdiff1d(a, b), np.array(['c']))
1824
+
1825
+
1826
+ class TestShapeBase:
1827
+
1828
+ def test_atleast_2d(self):
1829
+ # Test atleast_2d
1830
+ a = masked_array([0, 1, 2], mask=[0, 1, 0])
1831
+ b = atleast_2d(a)
1832
+ assert_equal(b.shape, (1, 3))
1833
+ assert_equal(b.mask.shape, b.data.shape)
1834
+ assert_equal(a.shape, (3,))
1835
+ assert_equal(a.mask.shape, a.data.shape)
1836
+ assert_equal(b.mask.shape, b.data.shape)
1837
+
1838
+ def test_shape_scalar(self):
1839
+ # the atleast and diagflat function should work with scalars
1840
+ # GitHub issue #3367
1841
+ # Additionally, the atleast functions should accept multiple scalars
1842
+ # correctly
1843
+ b = atleast_1d(1.0)
1844
+ assert_equal(b.shape, (1,))
1845
+ assert_equal(b.mask.shape, b.shape)
1846
+ assert_equal(b.data.shape, b.shape)
1847
+
1848
+ b = atleast_1d(1.0, 2.0)
1849
+ for a in b:
1850
+ assert_equal(a.shape, (1,))
1851
+ assert_equal(a.mask.shape, a.shape)
1852
+ assert_equal(a.data.shape, a.shape)
1853
+
1854
+ b = atleast_2d(1.0)
1855
+ assert_equal(b.shape, (1, 1))
1856
+ assert_equal(b.mask.shape, b.shape)
1857
+ assert_equal(b.data.shape, b.shape)
1858
+
1859
+ b = atleast_2d(1.0, 2.0)
1860
+ for a in b:
1861
+ assert_equal(a.shape, (1, 1))
1862
+ assert_equal(a.mask.shape, a.shape)
1863
+ assert_equal(a.data.shape, a.shape)
1864
+
1865
+ b = atleast_3d(1.0)
1866
+ assert_equal(b.shape, (1, 1, 1))
1867
+ assert_equal(b.mask.shape, b.shape)
1868
+ assert_equal(b.data.shape, b.shape)
1869
+
1870
+ b = atleast_3d(1.0, 2.0)
1871
+ for a in b:
1872
+ assert_equal(a.shape, (1, 1, 1))
1873
+ assert_equal(a.mask.shape, a.shape)
1874
+ assert_equal(a.data.shape, a.shape)
1875
+
1876
+ b = diagflat(1.0)
1877
+ assert_equal(b.shape, (1, 1))
1878
+ assert_equal(b.mask.shape, b.data.shape)
1879
+
1880
+
1881
+ class TestNDEnumerate:
1882
+
1883
+ def test_ndenumerate_nomasked(self):
1884
+ ordinary = np.arange(6.).reshape((1, 3, 2))
1885
+ empty_mask = np.zeros_like(ordinary, dtype=bool)
1886
+ with_mask = masked_array(ordinary, mask=empty_mask)
1887
+ assert_equal(list(np.ndenumerate(ordinary)),
1888
+ list(ndenumerate(ordinary)))
1889
+ assert_equal(list(ndenumerate(ordinary)),
1890
+ list(ndenumerate(with_mask)))
1891
+ assert_equal(list(ndenumerate(with_mask)),
1892
+ list(ndenumerate(with_mask, compressed=False)))
1893
+
1894
+ def test_ndenumerate_allmasked(self):
1895
+ a = masked_all(())
1896
+ b = masked_all((100,))
1897
+ c = masked_all((2, 3, 4))
1898
+ assert_equal(list(ndenumerate(a)), [])
1899
+ assert_equal(list(ndenumerate(b)), [])
1900
+ assert_equal(list(ndenumerate(b, compressed=False)),
1901
+ list(zip(np.ndindex((100,)), 100 * [masked])))
1902
+ assert_equal(list(ndenumerate(c)), [])
1903
+ assert_equal(list(ndenumerate(c, compressed=False)),
1904
+ list(zip(np.ndindex((2, 3, 4)), 2 * 3 * 4 * [masked])))
1905
+
1906
+ def test_ndenumerate_mixedmasked(self):
1907
+ a = masked_array(np.arange(12).reshape((3, 4)),
1908
+ mask=[[1, 1, 1, 1],
1909
+ [1, 1, 0, 1],
1910
+ [0, 0, 0, 0]])
1911
+ items = [((1, 2), 6),
1912
+ ((2, 0), 8), ((2, 1), 9), ((2, 2), 10), ((2, 3), 11)]
1913
+ assert_equal(list(ndenumerate(a)), items)
1914
+ assert_equal(len(list(ndenumerate(a, compressed=False))), a.size)
1915
+ for coordinate, value in ndenumerate(a, compressed=False):
1916
+ assert_equal(a[coordinate], value)
1917
+
1918
+
1919
+ class TestStack:
1920
+
1921
+ def test_stack_1d(self):
1922
+ a = masked_array([0, 1, 2], mask=[0, 1, 0])
1923
+ b = masked_array([9, 8, 7], mask=[1, 0, 0])
1924
+
1925
+ c = stack([a, b], axis=0)
1926
+ assert_equal(c.shape, (2, 3))
1927
+ assert_array_equal(a.mask, c[0].mask)
1928
+ assert_array_equal(b.mask, c[1].mask)
1929
+
1930
+ d = vstack([a, b])
1931
+ assert_array_equal(c.data, d.data)
1932
+ assert_array_equal(c.mask, d.mask)
1933
+
1934
+ c = stack([a, b], axis=1)
1935
+ assert_equal(c.shape, (3, 2))
1936
+ assert_array_equal(a.mask, c[:, 0].mask)
1937
+ assert_array_equal(b.mask, c[:, 1].mask)
1938
+
1939
+ def test_stack_masks(self):
1940
+ a = masked_array([0, 1, 2], mask=True)
1941
+ b = masked_array([9, 8, 7], mask=False)
1942
+
1943
+ c = stack([a, b], axis=0)
1944
+ assert_equal(c.shape, (2, 3))
1945
+ assert_array_equal(a.mask, c[0].mask)
1946
+ assert_array_equal(b.mask, c[1].mask)
1947
+
1948
+ d = vstack([a, b])
1949
+ assert_array_equal(c.data, d.data)
1950
+ assert_array_equal(c.mask, d.mask)
1951
+
1952
+ c = stack([a, b], axis=1)
1953
+ assert_equal(c.shape, (3, 2))
1954
+ assert_array_equal(a.mask, c[:, 0].mask)
1955
+ assert_array_equal(b.mask, c[:, 1].mask)
1956
+
1957
+ def test_stack_nd(self):
1958
+ # 2D
1959
+ shp = (3, 2)
1960
+ d1 = np.random.randint(0, 10, shp)
1961
+ d2 = np.random.randint(0, 10, shp)
1962
+ m1 = np.random.randint(0, 2, shp).astype(bool)
1963
+ m2 = np.random.randint(0, 2, shp).astype(bool)
1964
+ a1 = masked_array(d1, mask=m1)
1965
+ a2 = masked_array(d2, mask=m2)
1966
+
1967
+ c = stack([a1, a2], axis=0)
1968
+ c_shp = (2,) + shp
1969
+ assert_equal(c.shape, c_shp)
1970
+ assert_array_equal(a1.mask, c[0].mask)
1971
+ assert_array_equal(a2.mask, c[1].mask)
1972
+
1973
+ c = stack([a1, a2], axis=-1)
1974
+ c_shp = shp + (2,)
1975
+ assert_equal(c.shape, c_shp)
1976
+ assert_array_equal(a1.mask, c[..., 0].mask)
1977
+ assert_array_equal(a2.mask, c[..., 1].mask)
1978
+
1979
+ # 4D
1980
+ shp = (3, 2, 4, 5,)
1981
+ d1 = np.random.randint(0, 10, shp)
1982
+ d2 = np.random.randint(0, 10, shp)
1983
+ m1 = np.random.randint(0, 2, shp).astype(bool)
1984
+ m2 = np.random.randint(0, 2, shp).astype(bool)
1985
+ a1 = masked_array(d1, mask=m1)
1986
+ a2 = masked_array(d2, mask=m2)
1987
+
1988
+ c = stack([a1, a2], axis=0)
1989
+ c_shp = (2,) + shp
1990
+ assert_equal(c.shape, c_shp)
1991
+ assert_array_equal(a1.mask, c[0].mask)
1992
+ assert_array_equal(a2.mask, c[1].mask)
1993
+
1994
+ c = stack([a1, a2], axis=-1)
1995
+ c_shp = shp + (2,)
1996
+ assert_equal(c.shape, c_shp)
1997
+ assert_array_equal(a1.mask, c[..., 0].mask)
1998
+ assert_array_equal(a2.mask, c[..., 1].mask)