From 31c8abea59c4c66a240df5d28a1d80ccd10d7816 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Tue, 24 Oct 2023 22:54:55 -0400 Subject: [PATCH] Initial configuration commit --- coc-settings.json | 7 + ftplugin/' | 8 + ftplugin/cpp.vim | 1 + ftplugin/fortran.vim | 13 + ftplugin/html.vim | 12 + ftplugin/mail.viim | 1 + ftplugin/markdown.vim | 19 + ftplugin/python.vim | 2 + ftplugin/sh.vim | 7 + ftplugin/tex.vim | 19 + init.vim | 190 + lua/iron.lua | 45 + lua/telescope_settings.lua | 9 + lua/todo-config.lua | 55 + lua/treesitter-conf.lua | 40 + spell/en.utf-8.add | 48 + spell/en.utf-8.add.spl | Bin 0 -> 793 bytes spell/en_us | 370103 +++++++++++++++ spell/wordlist | 370103 +++++++++++++++ spell/wordlist.utf-8.spl | Bin 0 -> 1420101 bytes test.py | 10 + typings/matplotlib/__init__.pyi | 116 + typings/matplotlib/_afm.pyi | 154 + typings/matplotlib/_animation_data.pyi | 8 + typings/matplotlib/_api/__init__.pyi | 66 + typings/matplotlib/_api/deprecation.pyi | 82 + typings/matplotlib/_blocking_input.pyi | 26 + typings/matplotlib/_c_internal_utils.pyi | 7 + typings/matplotlib/_cm.pyi | 126 + typings/matplotlib/_cm_listed.pyi | 13 + typings/matplotlib/_color_data.pyi | 10 + typings/matplotlib/_constrained_layout.pyi | 233 + typings/matplotlib/_docstring.pyi | 44 + typings/matplotlib/_enums.pyi | 32 + typings/matplotlib/_fontconfig_pattern.pyi | 31 + typings/matplotlib/_image.pyi | 4 + typings/matplotlib/_internal_utils.pyi | 30 + typings/matplotlib/_layoutgrid.pyi | 212 + typings/matplotlib/_mathtext.pyi | 928 + typings/matplotlib/_mathtext_data.pyi | 13 + typings/matplotlib/_path.pyi | 17 + typings/matplotlib/_pylab_helpers.pyi | 52 + typings/matplotlib/_qhull.pyi | 4 + typings/matplotlib/_text_helpers.pyi | 33 + typings/matplotlib/_tight_bbox.pyi | 27 + typings/matplotlib/_tight_layout.pyi | 56 + typings/matplotlib/_tri.pyi | 54 + typings/matplotlib/_ttconv.pyi | 4 + typings/matplotlib/_type1font.pyi | 207 + typings/matplotlib/_version.pyi | 17 + typings/matplotlib/animation.pyi | 251 + typings/matplotlib/artist.pyi | 320 + typings/matplotlib/axes/__init__.pyi | 22 + typings/matplotlib/axes/_axes.pyi | 258 + typings/matplotlib/axes/_base.pyi | 570 + typings/matplotlib/axes/_secondary_axes.pyi | 36 + typings/matplotlib/axis.pyi | 433 + typings/matplotlib/backend_bases.pyi | 647 + typings/matplotlib/backend_managers.pyi | 95 + typings/matplotlib/backend_tools.pyi | 244 + typings/matplotlib/backends/__init__.pyi | 5 + typings/matplotlib/bezier.pyi | 81 + typings/matplotlib/category.pyi | 151 + typings/matplotlib/cbook.pyi | 236 + typings/matplotlib/cm.pyi | 94 + typings/matplotlib/collections.pyi | 362 + typings/matplotlib/colorbar.pyi | 138 + typings/matplotlib/colors.pyi | 411 + typings/matplotlib/container.pyi | 70 + typings/matplotlib/contour.pyi | 142 + typings/matplotlib/dates.pyi | 1019 + typings/matplotlib/dviread.pyi | 139 + typings/matplotlib/figure.pyi | 394 + typings/matplotlib/font_manager.pyi | 197 + typings/matplotlib/ft2font.pyi | 327 + typings/matplotlib/gridspec.pyi | 149 + typings/matplotlib/hatch.pyi | 115 + typings/matplotlib/image.pyi | 188 + typings/matplotlib/layout_engine.pyi | 63 + typings/matplotlib/legend.pyi | 139 + typings/matplotlib/legend_handler.pyi | 163 + typings/matplotlib/lines.pyi | 248 + typings/matplotlib/markers.pyi | 76 + typings/matplotlib/mathtext.pyi | 28 + typings/matplotlib/mlab.pyi | 73 + typings/matplotlib/offsetbox.pyi | 354 + typings/matplotlib/patches.pyi | 829 + typings/matplotlib/path.pyi | 167 + typings/matplotlib/patheffects.pyi | 104 + typings/matplotlib/projections/__init__.pyi | 33 + typings/matplotlib/projections/geo.pyi | 157 + typings/matplotlib/projections/polar.pyi | 242 + typings/matplotlib/pylab.pyi | 37 + typings/matplotlib/pyplot.pyi | 2052 + typings/matplotlib/quiver.pyi | 117 + typings/matplotlib/rcsetup.pyi | 149 + typings/matplotlib/sankey.pyi | 41 + typings/matplotlib/scale.pyi | 232 + typings/matplotlib/sphinxext/__init__.pyi | 4 + typings/matplotlib/spines.pyi | 119 + typings/matplotlib/stackplot.pyi | 14 + typings/matplotlib/streamplot.pyi | 107 + typings/matplotlib/style/__init__.pyi | 7 + typings/matplotlib/style/core.pyi | 23 + typings/matplotlib/table.pyi | 108 + typings/matplotlib/testing/__init__.pyi | 32 + typings/matplotlib/tests/__init__.pyi | 8 + typings/matplotlib/texmanager.pyi | 48 + typings/matplotlib/text.pyi | 257 + typings/matplotlib/textpath.pyi | 56 + typings/matplotlib/ticker.pyi | 464 + typings/matplotlib/transforms.pyi | 604 + typings/matplotlib/tri/__init__.pyi | 17 + typings/matplotlib/tri/_triangulation.pyi | 48 + typings/matplotlib/tri/_tricontour.pyi | 32 + typings/matplotlib/tri/_trifinder.pyi | 25 + typings/matplotlib/tri/_triinterpolate.pyi | 31 + typings/matplotlib/tri/_tripcolor.pyi | 27 + typings/matplotlib/tri/_triplot.pyi | 18 + typings/matplotlib/tri/_trirefine.pyi | 37 + typings/matplotlib/tri/_tritools.pyi | 23 + typings/matplotlib/typing.pyi | 38 + typings/matplotlib/units.pyi | 133 + typings/matplotlib/widgets.pyi | 563 + typings/numpy/__config__.pyi | 44 + typings/numpy/__init__.pyi | 4443 + typings/numpy/_distributor_init.pyi | 14 + typings/numpy/_globals.pyi | 82 + typings/numpy/_pyinstaller/__init__.pyi | 4 + typings/numpy/_pytesttester.pyi | 18 + typings/numpy/_typing/__init__.pyi | 104 + typings/numpy/_typing/_add_docstring.pyi | 22 + typings/numpy/_typing/_array_like.pyi | 56 + typings/numpy/_typing/_callable.pyi | 462 + typings/numpy/_typing/_char_codes.pyi | 45 + typings/numpy/_typing/_dtype_like.pyi | 50 + typings/numpy/_typing/_extended_precision.pyi | 25 + typings/numpy/_typing/_nbit.pyi | 17 + typings/numpy/_typing/_nested_sequence.pyi | 81 + typings/numpy/_typing/_scalars.pyi | 17 + typings/numpy/_typing/_shape.pyi | 9 + typings/numpy/_typing/_ufunc.pyi | 335 + typings/numpy/_utils/__init__.pyi | 28 + typings/numpy/_utils/_convertions.pyi | 15 + typings/numpy/_utils/_inspect.pyi | 123 + typings/numpy/array_api/__init__.pyi | 152 + typings/numpy/array_api/_array_object.pyi | 476 + typings/numpy/array_api/_constants.pyi | 8 + .../numpy/array_api/_creation_functions.pyi | 133 + .../numpy/array_api/_data_type_functions.pyi | 92 + typings/numpy/array_api/_dtypes.pyi | 30 + .../array_api/_elementwise_functions.pyi | 478 + .../numpy/array_api/_indexing_functions.pyi | 14 + .../array_api/_manipulation_functions.pyi | 71 + .../numpy/array_api/_searching_functions.pyi | 39 + typings/numpy/array_api/_set_functions.pyi | 54 + .../numpy/array_api/_sorting_functions.pyi | 22 + .../array_api/_statistical_functions.pyi | 31 + typings/numpy/array_api/_typing.pyi | 39 + .../numpy/array_api/_utility_functions.pyi | 23 + typings/numpy/array_api/linalg.pyi | 200 + typings/numpy/compat/__init__.pyi | 20 + typings/numpy/compat/py3k.pyi | 110 + typings/numpy/conftest.pyi | 56 + typings/numpy/core/__init__.pyi | 4 + typings/numpy/core/_asarray.pyi | 25 + typings/numpy/core/_internal.pyi | 44 + typings/numpy/core/_type_aliases.pyi | 18 + typings/numpy/core/_ufunc_config.pyi | 45 + typings/numpy/core/arrayprint.pyi | 73 + typings/numpy/core/defchararray.pyi | 375 + typings/numpy/core/einsumfunc.pyi | 65 + typings/numpy/core/fromnumeric.pyi | 489 + typings/numpy/core/function_base.pyi | 77 + typings/numpy/core/multiarray.pyi | 521 + typings/numpy/core/numeric.pyi | 359 + typings/numpy/core/numerictypes.pyi | 103 + typings/numpy/core/records.pyi | 85 + typings/numpy/core/shape_base.pyi | 96 + typings/numpy/core/umath.pyi | 14 + typings/numpy/ctypeslib.pyi | 265 + typings/numpy/doc/__init__.pyi | 9 + typings/numpy/dtypes.pyi | 39 + typings/numpy/exceptions.pyi | 43 + typings/numpy/f2py/__init__.pyi | 38 + typings/numpy/fft/__init__.pyi | 11 + typings/numpy/fft/_pocketfft.pyi | 53 + typings/numpy/fft/helper.pyi | 42 + typings/numpy/lib/__init__.pyi | 33 + typings/numpy/lib/_version.pyi | 36 + typings/numpy/lib/arraypad.pyi | 33 + typings/numpy/lib/arraysetops.pyi | 142 + typings/numpy/lib/arrayterator.pyi | 47 + typings/numpy/lib/format.pyi | 48 + typings/numpy/lib/function_base.pyi | 382 + typings/numpy/lib/histograms.pyi | 19 + typings/numpy/lib/index_tricks.pyi | 151 + typings/numpy/lib/mixins.pyi | 169 + typings/numpy/lib/nanfunctions.pyi | 19 + typings/numpy/lib/npyio.pyi | 170 + typings/numpy/lib/polynomial.pyi | 183 + typings/numpy/lib/scimath.pyi | 153 + typings/numpy/lib/shape_base.pyi | 177 + typings/numpy/lib/stride_tricks.pyi | 49 + typings/numpy/lib/twodim_base.pyi | 133 + typings/numpy/lib/type_check.pyi | 218 + typings/numpy/lib/ufunclike.pyi | 50 + typings/numpy/lib/utils.pyi | 65 + typings/numpy/linalg/__init__.pyi | 14 + typings/numpy/linalg/linalg.pyi | 233 + typings/numpy/ma/__init__.pyi | 12 + typings/numpy/ma/core.pyi | 853 + typings/numpy/ma/extras.pyi | 165 + typings/numpy/ma/mrecords.pyi | 68 + typings/numpy/matlib.pyi | 344 + typings/numpy/matrixlib/__init__.pyi | 11 + typings/numpy/matrixlib/defmatrix.pyi | 17 + typings/numpy/polynomial/__init__.pyi | 19 + typings/numpy/polynomial/_polybase.pyi | 174 + typings/numpy/polynomial/chebyshev.pyi | 108 + typings/numpy/polynomial/hermite.pyi | 96 + typings/numpy/polynomial/hermite_e.pyi | 96 + typings/numpy/polynomial/laguerre.pyi | 96 + typings/numpy/polynomial/legendre.pyi | 96 + typings/numpy/polynomial/polynomial.pyi | 84 + typings/numpy/polynomial/polyutils.pyi | 30 + typings/numpy/random/__init__.pyi | 16 + typings/numpy/random/_generator.pyi | 469 + typings/numpy/random/_mt19937.pyi | 38 + typings/numpy/random/_pcg64.pyi | 62 + typings/numpy/random/_philox.pyi | 45 + typings/numpy/random/_sfc64.pyi | 36 + typings/numpy/random/bit_generator.pyi | 131 + typings/numpy/random/mtrand.pyi | 513 + typings/numpy/testing/__init__.pyi | 11 + typings/numpy/testing/_private/utils.pyi | 241 + typings/numpy/tests/__init__.pyi | 4 + typings/numpy/typing/__init__.pyi | 166 + typings/numpy/version.pyi | 10 + typings/seaborn/__init__.pyi | 21 + typings/seaborn/_core.pyi | 275 + typings/seaborn/_decorators.pyi | 8 + typings/seaborn/_docstrings.pyi | 30 + typings/seaborn/_statistics.pyi | 132 + typings/seaborn/_testing.pyi | 16 + typings/seaborn/algorithms.pyi | 35 + typings/seaborn/axisgrid.pyi | 548 + typings/seaborn/categorical.pyi | 312 + typings/seaborn/cm.pyi | 11 + typings/seaborn/colors/__init__.pyi | 7 + typings/seaborn/colors/crayons.pyi | 5 + typings/seaborn/colors/xkcd_rgb.pyi | 5 + typings/seaborn/conftest.pyi | 98 + typings/seaborn/distributions.pyi | 209 + typings/seaborn/external/__init__.pyi | 4 + typings/seaborn/external/docscrape.pyi | 165 + typings/seaborn/external/husl.pyi | 104 + typings/seaborn/matrix.pyi | 557 + typings/seaborn/miscplot.pyi | 22 + typings/seaborn/palettes.pyi | 706 + typings/seaborn/rcmod.pyi | 265 + typings/seaborn/regression.pyi | 158 + typings/seaborn/relational.pyi | 59 + typings/seaborn/tests/__init__.pyi | 4 + typings/seaborn/utils.pyi | 344 + typings/seaborn/widgets.pyi | 165 + 266 files changed, 780274 insertions(+) create mode 100644 coc-settings.json create mode 100644 ftplugin/' create mode 100644 ftplugin/cpp.vim create mode 100644 ftplugin/fortran.vim create mode 100644 ftplugin/html.vim create mode 100644 ftplugin/mail.viim create mode 100644 ftplugin/markdown.vim create mode 100644 ftplugin/python.vim create mode 100644 ftplugin/sh.vim create mode 100644 ftplugin/tex.vim create mode 100644 init.vim create mode 100644 lua/iron.lua create mode 100644 lua/telescope_settings.lua create mode 100644 lua/todo-config.lua create mode 100644 lua/treesitter-conf.lua create mode 100644 spell/en.utf-8.add create mode 100644 spell/en.utf-8.add.spl create mode 100644 spell/en_us create mode 100644 spell/wordlist create mode 100644 spell/wordlist.utf-8.spl create mode 100644 test.py create mode 100644 typings/matplotlib/__init__.pyi create mode 100644 typings/matplotlib/_afm.pyi create mode 100644 typings/matplotlib/_animation_data.pyi create mode 100644 typings/matplotlib/_api/__init__.pyi create mode 100644 typings/matplotlib/_api/deprecation.pyi create mode 100644 typings/matplotlib/_blocking_input.pyi create mode 100644 typings/matplotlib/_c_internal_utils.pyi create mode 100644 typings/matplotlib/_cm.pyi create mode 100644 typings/matplotlib/_cm_listed.pyi create mode 100644 typings/matplotlib/_color_data.pyi create mode 100644 typings/matplotlib/_constrained_layout.pyi create mode 100644 typings/matplotlib/_docstring.pyi create mode 100644 typings/matplotlib/_enums.pyi create mode 100644 typings/matplotlib/_fontconfig_pattern.pyi create mode 100644 typings/matplotlib/_image.pyi create mode 100644 typings/matplotlib/_internal_utils.pyi create mode 100644 typings/matplotlib/_layoutgrid.pyi create mode 100644 typings/matplotlib/_mathtext.pyi create mode 100644 typings/matplotlib/_mathtext_data.pyi create mode 100644 typings/matplotlib/_path.pyi create mode 100644 typings/matplotlib/_pylab_helpers.pyi create mode 100644 typings/matplotlib/_qhull.pyi create mode 100644 typings/matplotlib/_text_helpers.pyi create mode 100644 typings/matplotlib/_tight_bbox.pyi create mode 100644 typings/matplotlib/_tight_layout.pyi create mode 100644 typings/matplotlib/_tri.pyi create mode 100644 typings/matplotlib/_ttconv.pyi create mode 100644 typings/matplotlib/_type1font.pyi create mode 100644 typings/matplotlib/_version.pyi create mode 100644 typings/matplotlib/animation.pyi create mode 100644 typings/matplotlib/artist.pyi create mode 100644 typings/matplotlib/axes/__init__.pyi create mode 100644 typings/matplotlib/axes/_axes.pyi create mode 100644 typings/matplotlib/axes/_base.pyi create mode 100644 typings/matplotlib/axes/_secondary_axes.pyi create mode 100644 typings/matplotlib/axis.pyi create mode 100644 typings/matplotlib/backend_bases.pyi create mode 100644 typings/matplotlib/backend_managers.pyi create mode 100644 typings/matplotlib/backend_tools.pyi create mode 100644 typings/matplotlib/backends/__init__.pyi create mode 100644 typings/matplotlib/bezier.pyi create mode 100644 typings/matplotlib/category.pyi create mode 100644 typings/matplotlib/cbook.pyi create mode 100644 typings/matplotlib/cm.pyi create mode 100644 typings/matplotlib/collections.pyi create mode 100644 typings/matplotlib/colorbar.pyi create mode 100644 typings/matplotlib/colors.pyi create mode 100644 typings/matplotlib/container.pyi create mode 100644 typings/matplotlib/contour.pyi create mode 100644 typings/matplotlib/dates.pyi create mode 100644 typings/matplotlib/dviread.pyi create mode 100644 typings/matplotlib/figure.pyi create mode 100644 typings/matplotlib/font_manager.pyi create mode 100644 typings/matplotlib/ft2font.pyi create mode 100644 typings/matplotlib/gridspec.pyi create mode 100644 typings/matplotlib/hatch.pyi create mode 100644 typings/matplotlib/image.pyi create mode 100644 typings/matplotlib/layout_engine.pyi create mode 100644 typings/matplotlib/legend.pyi create mode 100644 typings/matplotlib/legend_handler.pyi create mode 100644 typings/matplotlib/lines.pyi create mode 100644 typings/matplotlib/markers.pyi create mode 100644 typings/matplotlib/mathtext.pyi create mode 100644 typings/matplotlib/mlab.pyi create mode 100644 typings/matplotlib/offsetbox.pyi create mode 100644 typings/matplotlib/patches.pyi create mode 100644 typings/matplotlib/path.pyi create mode 100644 typings/matplotlib/patheffects.pyi create mode 100644 typings/matplotlib/projections/__init__.pyi create mode 100644 typings/matplotlib/projections/geo.pyi create mode 100644 typings/matplotlib/projections/polar.pyi create mode 100644 typings/matplotlib/pylab.pyi create mode 100644 typings/matplotlib/pyplot.pyi create mode 100644 typings/matplotlib/quiver.pyi create mode 100644 typings/matplotlib/rcsetup.pyi create mode 100644 typings/matplotlib/sankey.pyi create mode 100644 typings/matplotlib/scale.pyi create mode 100644 typings/matplotlib/sphinxext/__init__.pyi create mode 100644 typings/matplotlib/spines.pyi create mode 100644 typings/matplotlib/stackplot.pyi create mode 100644 typings/matplotlib/streamplot.pyi create mode 100644 typings/matplotlib/style/__init__.pyi create mode 100644 typings/matplotlib/style/core.pyi create mode 100644 typings/matplotlib/table.pyi create mode 100644 typings/matplotlib/testing/__init__.pyi create mode 100644 typings/matplotlib/tests/__init__.pyi create mode 100644 typings/matplotlib/texmanager.pyi create mode 100644 typings/matplotlib/text.pyi create mode 100644 typings/matplotlib/textpath.pyi create mode 100644 typings/matplotlib/ticker.pyi create mode 100644 typings/matplotlib/transforms.pyi create mode 100644 typings/matplotlib/tri/__init__.pyi create mode 100644 typings/matplotlib/tri/_triangulation.pyi create mode 100644 typings/matplotlib/tri/_tricontour.pyi create mode 100644 typings/matplotlib/tri/_trifinder.pyi create mode 100644 typings/matplotlib/tri/_triinterpolate.pyi create mode 100644 typings/matplotlib/tri/_tripcolor.pyi create mode 100644 typings/matplotlib/tri/_triplot.pyi create mode 100644 typings/matplotlib/tri/_trirefine.pyi create mode 100644 typings/matplotlib/tri/_tritools.pyi create mode 100644 typings/matplotlib/typing.pyi create mode 100644 typings/matplotlib/units.pyi create mode 100644 typings/matplotlib/widgets.pyi create mode 100644 typings/numpy/__config__.pyi create mode 100644 typings/numpy/__init__.pyi create mode 100644 typings/numpy/_distributor_init.pyi create mode 100644 typings/numpy/_globals.pyi create mode 100644 typings/numpy/_pyinstaller/__init__.pyi create mode 100644 typings/numpy/_pytesttester.pyi create mode 100644 typings/numpy/_typing/__init__.pyi create mode 100644 typings/numpy/_typing/_add_docstring.pyi create mode 100644 typings/numpy/_typing/_array_like.pyi create mode 100644 typings/numpy/_typing/_callable.pyi create mode 100644 typings/numpy/_typing/_char_codes.pyi create mode 100644 typings/numpy/_typing/_dtype_like.pyi create mode 100644 typings/numpy/_typing/_extended_precision.pyi create mode 100644 typings/numpy/_typing/_nbit.pyi create mode 100644 typings/numpy/_typing/_nested_sequence.pyi create mode 100644 typings/numpy/_typing/_scalars.pyi create mode 100644 typings/numpy/_typing/_shape.pyi create mode 100644 typings/numpy/_typing/_ufunc.pyi create mode 100644 typings/numpy/_utils/__init__.pyi create mode 100644 typings/numpy/_utils/_convertions.pyi create mode 100644 typings/numpy/_utils/_inspect.pyi create mode 100644 typings/numpy/array_api/__init__.pyi create mode 100644 typings/numpy/array_api/_array_object.pyi create mode 100644 typings/numpy/array_api/_constants.pyi create mode 100644 typings/numpy/array_api/_creation_functions.pyi create mode 100644 typings/numpy/array_api/_data_type_functions.pyi create mode 100644 typings/numpy/array_api/_dtypes.pyi create mode 100644 typings/numpy/array_api/_elementwise_functions.pyi create mode 100644 typings/numpy/array_api/_indexing_functions.pyi create mode 100644 typings/numpy/array_api/_manipulation_functions.pyi create mode 100644 typings/numpy/array_api/_searching_functions.pyi create mode 100644 typings/numpy/array_api/_set_functions.pyi create mode 100644 typings/numpy/array_api/_sorting_functions.pyi create mode 100644 typings/numpy/array_api/_statistical_functions.pyi create mode 100644 typings/numpy/array_api/_typing.pyi create mode 100644 typings/numpy/array_api/_utility_functions.pyi create mode 100644 typings/numpy/array_api/linalg.pyi create mode 100644 typings/numpy/compat/__init__.pyi create mode 100644 typings/numpy/compat/py3k.pyi create mode 100644 typings/numpy/conftest.pyi create mode 100644 typings/numpy/core/__init__.pyi create mode 100644 typings/numpy/core/_asarray.pyi create mode 100644 typings/numpy/core/_internal.pyi create mode 100644 typings/numpy/core/_type_aliases.pyi create mode 100644 typings/numpy/core/_ufunc_config.pyi create mode 100644 typings/numpy/core/arrayprint.pyi create mode 100644 typings/numpy/core/defchararray.pyi create mode 100644 typings/numpy/core/einsumfunc.pyi create mode 100644 typings/numpy/core/fromnumeric.pyi create mode 100644 typings/numpy/core/function_base.pyi create mode 100644 typings/numpy/core/multiarray.pyi create mode 100644 typings/numpy/core/numeric.pyi create mode 100644 typings/numpy/core/numerictypes.pyi create mode 100644 typings/numpy/core/records.pyi create mode 100644 typings/numpy/core/shape_base.pyi create mode 100644 typings/numpy/core/umath.pyi create mode 100644 typings/numpy/ctypeslib.pyi create mode 100644 typings/numpy/doc/__init__.pyi create mode 100644 typings/numpy/dtypes.pyi create mode 100644 typings/numpy/exceptions.pyi create mode 100644 typings/numpy/f2py/__init__.pyi create mode 100644 typings/numpy/fft/__init__.pyi create mode 100644 typings/numpy/fft/_pocketfft.pyi create mode 100644 typings/numpy/fft/helper.pyi create mode 100644 typings/numpy/lib/__init__.pyi create mode 100644 typings/numpy/lib/_version.pyi create mode 100644 typings/numpy/lib/arraypad.pyi create mode 100644 typings/numpy/lib/arraysetops.pyi create mode 100644 typings/numpy/lib/arrayterator.pyi create mode 100644 typings/numpy/lib/format.pyi create mode 100644 typings/numpy/lib/function_base.pyi create mode 100644 typings/numpy/lib/histograms.pyi create mode 100644 typings/numpy/lib/index_tricks.pyi create mode 100644 typings/numpy/lib/mixins.pyi create mode 100644 typings/numpy/lib/nanfunctions.pyi create mode 100644 typings/numpy/lib/npyio.pyi create mode 100644 typings/numpy/lib/polynomial.pyi create mode 100644 typings/numpy/lib/scimath.pyi create mode 100644 typings/numpy/lib/shape_base.pyi create mode 100644 typings/numpy/lib/stride_tricks.pyi create mode 100644 typings/numpy/lib/twodim_base.pyi create mode 100644 typings/numpy/lib/type_check.pyi create mode 100644 typings/numpy/lib/ufunclike.pyi create mode 100644 typings/numpy/lib/utils.pyi create mode 100644 typings/numpy/linalg/__init__.pyi create mode 100644 typings/numpy/linalg/linalg.pyi create mode 100644 typings/numpy/ma/__init__.pyi create mode 100644 typings/numpy/ma/core.pyi create mode 100644 typings/numpy/ma/extras.pyi create mode 100644 typings/numpy/ma/mrecords.pyi create mode 100644 typings/numpy/matlib.pyi create mode 100644 typings/numpy/matrixlib/__init__.pyi create mode 100644 typings/numpy/matrixlib/defmatrix.pyi create mode 100644 typings/numpy/polynomial/__init__.pyi create mode 100644 typings/numpy/polynomial/_polybase.pyi create mode 100644 typings/numpy/polynomial/chebyshev.pyi create mode 100644 typings/numpy/polynomial/hermite.pyi create mode 100644 typings/numpy/polynomial/hermite_e.pyi create mode 100644 typings/numpy/polynomial/laguerre.pyi create mode 100644 typings/numpy/polynomial/legendre.pyi create mode 100644 typings/numpy/polynomial/polynomial.pyi create mode 100644 typings/numpy/polynomial/polyutils.pyi create mode 100644 typings/numpy/random/__init__.pyi create mode 100644 typings/numpy/random/_generator.pyi create mode 100644 typings/numpy/random/_mt19937.pyi create mode 100644 typings/numpy/random/_pcg64.pyi create mode 100644 typings/numpy/random/_philox.pyi create mode 100644 typings/numpy/random/_sfc64.pyi create mode 100644 typings/numpy/random/bit_generator.pyi create mode 100644 typings/numpy/random/mtrand.pyi create mode 100644 typings/numpy/testing/__init__.pyi create mode 100644 typings/numpy/testing/_private/utils.pyi create mode 100644 typings/numpy/tests/__init__.pyi create mode 100644 typings/numpy/typing/__init__.pyi create mode 100644 typings/numpy/version.pyi create mode 100644 typings/seaborn/__init__.pyi create mode 100644 typings/seaborn/_core.pyi create mode 100644 typings/seaborn/_decorators.pyi create mode 100644 typings/seaborn/_docstrings.pyi create mode 100644 typings/seaborn/_statistics.pyi create mode 100644 typings/seaborn/_testing.pyi create mode 100644 typings/seaborn/algorithms.pyi create mode 100644 typings/seaborn/axisgrid.pyi create mode 100644 typings/seaborn/categorical.pyi create mode 100644 typings/seaborn/cm.pyi create mode 100644 typings/seaborn/colors/__init__.pyi create mode 100644 typings/seaborn/colors/crayons.pyi create mode 100644 typings/seaborn/colors/xkcd_rgb.pyi create mode 100644 typings/seaborn/conftest.pyi create mode 100644 typings/seaborn/distributions.pyi create mode 100644 typings/seaborn/external/__init__.pyi create mode 100644 typings/seaborn/external/docscrape.pyi create mode 100644 typings/seaborn/external/husl.pyi create mode 100644 typings/seaborn/matrix.pyi create mode 100644 typings/seaborn/miscplot.pyi create mode 100644 typings/seaborn/palettes.pyi create mode 100644 typings/seaborn/rcmod.pyi create mode 100644 typings/seaborn/regression.pyi create mode 100644 typings/seaborn/relational.pyi create mode 100644 typings/seaborn/tests/__init__.pyi create mode 100644 typings/seaborn/utils.pyi create mode 100644 typings/seaborn/widgets.pyi diff --git a/coc-settings.json b/coc-settings.json new file mode 100644 index 0000000..8da686e --- /dev/null +++ b/coc-settings.json @@ -0,0 +1,7 @@ +{ + "suggest.autoTrigger": "none", + "suggest.timeout": 500, + "pyright.disableDocumentation":false, + "hover.target": "preview" +} + diff --git a/ftplugin/' b/ftplugin/' new file mode 100644 index 0000000..b38119d --- /dev/null +++ b/ftplugin/' @@ -0,0 +1,8 @@ +set spell spelllang=en_us +map : w % ! md2pdf % +map : w % ! md2docx % +map : !zathura %:r.pdf & +inoremap ;i ** <++>5hi +inoremap ;b **** <++>6hi +inoremap ;I ![](<++>)6hi +inoremap ;c ``````Oi diff --git a/ftplugin/cpp.vim b/ftplugin/cpp.vim new file mode 100644 index 0000000..771a08c --- /dev/null +++ b/ftplugin/cpp.vim @@ -0,0 +1 @@ +map : w % ! make diff --git a/ftplugin/fortran.vim b/ftplugin/fortran.vim new file mode 100644 index 0000000..f58620c --- /dev/null +++ b/ftplugin/fortran.vim @@ -0,0 +1,13 @@ +map : w % ! make + +"Some code snippets for filling in +inoremap ;d doenddoO<++>kA +inoremap ;i if()thenendifO<++>kF(a +inoremap ;s selectcase(<++>)case(<++>)<++>4hicase(<++>)<++>4hiendselect5kFsi +inoremap ;ph print *, '------------------------------------------------------------'print *, ''print *, '------------------------------------------------------------'kci' +inoremap ;pr read(, *, iostat=iospara) <++>if(iospara>0) thenprint *, "Error: Invalid read of <++> with error code", iosparacall mpi_abort(mpi_comm_world, 1, ierr)end if4k0f(a +inoremap ;ptp print *, '[OK] - 'i +inoremap ;ptf print *, '[FAILED] - 'i + + +set colorcolumn=132 diff --git a/ftplugin/html.vim b/ftplugin/html.vim new file mode 100644 index 0000000..db5897d --- /dev/null +++ b/ftplugin/html.vim @@ -0,0 +1,12 @@ +if &ft=="markdown" + finish +endif +map : w % ! firefox % & +inoremap ;d
<++>
kkf"a +inoremap ;a <++>2F"a +inoremap ;p

O +inoremap ;b <++>2F>a +inoremap ;li
  • F>a +inoremap ;ll
    O +inoremap ;i <++>5F"i +inoremap ;s
    kO diff --git a/ftplugin/mail.viim b/ftplugin/mail.viim new file mode 100644 index 0000000..ebc6c9e --- /dev/null +++ b/ftplugin/mail.viim @@ -0,0 +1 @@ +set textwidth=0 diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim new file mode 100644 index 0000000..d3aa765 --- /dev/null +++ b/ftplugin/markdown.vim @@ -0,0 +1,19 @@ +set spell spellfile="~/.config/nvim/spell/wordlist" +let g:markdown_fenced_languages = ['html', 'python', 'bash=sh', 'fortran'] +"set conceallevel=2 +"let g:vim_markdown_math = 1 +"let g:tex_conceal = "abdmg" +hi clear Conceal +map : w % AsyncRun md2pdf "%" +map : w % AsyncRun md2beamer "%" +map : w % AsyncRun md2docx % +map : !zathura %:r.pdf & +inoremap ;i ** <++>5hi +inoremap ;b **** <++>6hi +inoremap ;l [](<++>)6hi +inoremap ;I ![](<++>)6hi +inoremap ;pc ``````O +inoremap ;cu - [ ] +inoremap ;cc - [x] + + diff --git a/ftplugin/python.vim b/ftplugin/python.vim new file mode 100644 index 0000000..2411984 --- /dev/null +++ b/ftplugin/python.vim @@ -0,0 +1,2 @@ +set colorcolumn=100 +nmap ;x [hv]h]hk$;sc diff --git a/ftplugin/sh.vim b/ftplugin/sh.vim new file mode 100644 index 0000000..3a952bb --- /dev/null +++ b/ftplugin/sh.vim @@ -0,0 +1,7 @@ +map : w % ! ./% + +inoremap ;ph #####Help####Help(){echo ""echoecho "Syntax: <++> [<++>] <++>"echo "options:"echo "<++>"}5k0f"a +inoremap ;pf function fail {printf '%s\n' "$1" >&2exit "${2-1}"} +inoremap ;i if [ ]; then<++>fi2k0f[a +inoremap ;pg args=()argnum=0while [ $# -gt 0 ]; dounset OPTINDunset OPTARG#Parse Flagswhile getopts 'h' options; do case $options inh)Helpbreak;;<++>)<++>;;esacdoneshift $((OPTIND-1))args+=("$1") (( argnum++ ))shiftdone13kf'la +inoremap ;pf #####Error####function fail {printf '%s\n' "$1" >&2exit "${2-1}"} diff --git a/ftplugin/tex.vim b/ftplugin/tex.vim new file mode 100644 index 0000000..8bcc162 --- /dev/null +++ b/ftplugin/tex.vim @@ -0,0 +1,19 @@ +set spell +set spelllang=en_us +map : w % make! +map : !make read & +inoremap ;f \begin{figure}\centering\includegraphics[]{<++>}\caption{<++>}\end{figure}2kf[a +inoremap ;2f \begin{figure}\centering\begin{subfigure}[t]{0.49\textwidth}\centering\includegraphics[width=\textwidth]{<++>}\caption{<++>}\end{subfigure}\begin{subfigure}[t]{0.49\textwidth}\centering\includegraphics[width=\textwidth]{<++>}\caption{<++>}\end{subfigure}\end{figure}8k/<++>"_c4l +inoremap ;3f \begin{figure}\centering\begin{subfigure}[t]{0.32\textwidth}\centering\includegraphics[width=\textwidth]{<++>}\caption{<++>}\end{subfigure}\begin{subfigure}[t]{0.32\textwidth}\centering\includegraphics[width=\textwidth]{<++>}\caption{<++>}\end{subfigure}\begin{subfigure}[t]{0.32\textwidth}\centering\includegraphics[width=\textwidth]{<++>}\caption{<++>}\end{subfigure}\end{figure}13k/<++>"_c4l +inoremap ;F \begin{frame}{<++>}\end{frame}O<++>-i +inoremap ;b \textbf{} <++>F{a +inoremap ;c \caption{}i +inoremap ;C \begin{columns}\column{0.49\textwidth}\column{0.49\textwidth}<++>\end{columns}2kO +inoremap ;ig \includegraphics[width=\textwidth]{<++>}16hi +inoremap ;li \begin{itemize}\item\end{itemize}kA +inoremap ;le \begin{enumerate}\item\end{enumerate}kA +inoremap ;ll \item +inoremap ;2t \begin{table}[h!]\begin{center}\begin{tabular}{c c} \toprule\textbf{} & \textbf{<++>} \\\midrule<++> & <++> \\\bottomrule\end{tabular}\end{center}\end{table}6kf{a +inoremap ;e \begin{equation}\label{<++>}\end{equation}kO +inoremap ;fw width=\textwidthF\i +inoremap ;fh height=\textheightF\i diff --git a/init.vim b/init.vim new file mode 100644 index 0000000..ff5516f --- /dev/null +++ b/init.vim @@ -0,0 +1,190 @@ +" Plugins will be downloaded under the specified directory. +call plug#begin('~/.vim/plugged') + +" Declare the list of plugins. +Plug 'kana/vim-textobj-user' +Plug 'godlygeek/tabular' +Plug 'Vigemus/iron.nvim' +Plug 'tpope/vim-markdown' +Plug 'vim-airline/vim-airline' +Plug 'vim-airline/vim-airline-themes' +Plug 'kien/ctrlp.vim' +Plug 'morhetz/gruvbox' +"Plug 'rhysd/vim-grammarous' +Plug 'skywind3000/asyncrun.vim' +Plug 'norcalli/nvim-colorizer.lua' +Plug 'nvim-lua/popup.nvim' +Plug 'nvim-lua/plenary.nvim' +Plug 'nvim-telescope/telescope.nvim' +Plug 'neoclide/coc.nvim', {'branch': 'release'} +Plug 'christoomey/vim-tmux-navigator' +Plug 'GCBallesteros/vim-textobj-hydrogen' + +" List ends here. Plugins become visible to Vim after this call. +call plug#end() + +" All system-wide defaults are set in $VIMRUNTIME/debian.vim and sourced by +" the call to :runtime you can find below. If you wish to change any of those +" settings, you should do it in this file (/etc/vim/vimrc), since debian.vim +" will be overwritten everytime an upgrade of the vim packages is performed. +" It is recommended to make changes after sourcing debian.vim since it alters +" the value of the 'compatible' option. + +" This line should not be removed as it ensures that various options are +" properly set to work with the Vim-related packages available in Debian. +runtime! debian.vim + +" Vim will load $VIMRUNTIME/defaults.vim if the user does not have a vimrc. +" This happens after /etc/vim/vimrc(.local) are loaded, so it will override +" any settings in these files. +" If you don't want that to happen, uncomment the below line to prevent +" defaults.vim from being loaded. +" let g:skip_defaults_vim = 1 + +" Uncomment the next line to make Vim more Vi-compatible +" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous +" options, so any other options should be set AFTER setting 'compatible'. +"set compatible + +" Vim5 and later versions support syntax highlighting. Uncommenting the next +" line enables syntax highlighting by default. +"if has("syntax") +" syntax on +"endif + +" If using a dark background within the editing area and syntax highlighting +" turn on this option as well +set background=dark + +" Uncomment the following to have Vim jump to the last position when +" reopening a file +"if has("autocmd") +" au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif +"endif + +" Uncomment the following to have Vim load indentation rules and plugins +" according to the detected filetype. +"if has("autocmd") +" filetype plugin indent on +"endif + +" The following are commented out as they cause vim to behave a lot +" differently from regular Vi. They are highly recommended though. +"set showcmd " Show (partial) command in status line. +"set showmatch " Show matching brackets. +"set ignorecase " Do case insensitive matching +"set smartcase " Do smart case matching +"set incsearch " Incremental search +"set autowrite " Automatically save before commands like :next and :make +"set hidden " Hide buffers when they are abandoned +"set mouse=a " Enable mouse usage (all modes) + +" Source a global configuration file if available +if filereadable("/etc/vim/vimrc.local") + source /etc/vim/vimrc.local +endif + +"Set the shell, required to make xclip work +set shell=/bin/sh + +syntax enable +set tabstop=4 +set softtabstop=4 +set shiftwidth=4 +set expandtab +set shiftwidth=0 +set number +set relativenumber +set cursorline +let g:airline_theme='gruvbox' +let g:airline_powerline_fonts = 1 +colorscheme gruvbox + +"Filetype support +filetype on +filetype plugin on +"Disable markdown cold folding +let g:vim_markdown_folding_disabled = 1 + +"Keybindings +inoremap /<++>"_c4l +"map :NERDTreeToggle +map :set spell spellfile=~/.config/nvim/spell/wordlist.utf-8.spl + +"Set up some Asyncrun commands +let g:asyncrun_open=6 +"Set terminal for ipython setup +let g:slime_target = "neovim" +set splitbelow +set splitright +command! -nargs=* T split| resize 20 | terminal + +"Use netrw instead of NerdTree +let g:netrw_banner = 0 +let g:netrw_liststyle = 3 +let g:netrw_browse_split = 2 +let g:netrw_altv = 1 +let g:netrw_winsize = 25 +let g:NetrwIsOpen=0 +function! ToggleNetrw() + if g:NetrwIsOpen + let i = bufnr("$") + while (i >= 1) + if (getbufvar(i, "&filetype") == "netrw") + silent exe "bwipeout " . i + endif + let i-=1 + endwhile + let g:NetrwIsOpen=0 + else + let g:NetrwIsOpen=1 + silent Lexplore + endif +endfunction +noremap :call ToggleNetrw() + +"Disable cold folding in markdown plugin, and other options +let g:vim_markdown_folding_disabled=1 + +"Set default fortran type +let fortran_free_source=1 + +"Add open command +nnoremap gX :silent :execute + \ "!xdg-open" expand('%:p:h') . "/" . expand("") " &" + + +map +inoremap + +"calcurse commands +autocmd BufRead,BufNewFile /tmp/calcurse* set filetype=markdown +autocmd BufRead,BufNewFile ~/.calcurse/notes/* set filetype=markdown +"hi Normal guibg=NONE ctermbg=NONE +"Some autocommands +"Clean up when Latex exits +autocmd VimLeave *.tex ! cleanLatex %:r + +"Setup lua colorizer +set termguicolors +lua require'colorizer'.setup() + +"Set up telescope +noremap Telescope live_grep +lua require('telescope_settings') + +"Neomutt settings +autocmd BufNewFile,BufRead /tmp/neomutt* set noautoindent filetype=mail wm=0 tw=0 nonumber nolist +autocmd BufNewFile,BufRead ~/tmp/neomutt* set noautoindent filetype=mail wm=0 tw=0 nonumber nolist + +set mouse= + +"Change from ctrl-w+key to ctrl-key +nnoremap +nnoremap +nnoremap +nnoremap + + +"iron.nvim +lua require('iron') diff --git a/lua/iron.lua b/lua/iron.lua new file mode 100644 index 0000000..73bad0c --- /dev/null +++ b/lua/iron.lua @@ -0,0 +1,45 @@ +local iron = require("iron.core") +local view = require("iron.view") + +iron.setup { + config = { + -- Whether a repl should be discarded or not + scratch_repl = true, + -- Your repl definitions come here + repl_definition = { + python = { + -- Can be a table or a function that + -- returns a table (see below) + command = "ipython --no-autoindent" + } + }, + -- How the repl window will be displayed + -- See below for more information + repl_open_cmd = require('iron.view').bottom(20), + }, + -- Iron doesn't set keymaps by default anymore. + -- You can set them here or manually add keymaps to the functions in iron.core + keymaps = { + visual_send = ";sc", + send_file = ";sf", + send_line = ";sl", + cr = ";s", + interrupt = ";s", + exit = ";sq", + clear = ";cl", + }, + -- If the highlight is on, you can change how it looks + -- For the available options, check nvim_set_hl + highlight = { + italic = true + }, + ignore_blank_lines = true, -- ignore blank lines when sending visual select lines +} + +-- iron also has a list of commands, see :h iron-commands for all available commands +vim.keymap.set('n', ';rs', 'IronRepl') +vim.keymap.set('n', ';rr', 'IronRestart') +vim.keymap.set('n', ';rf', 'IronFocus') +vim.keymap.set('n', ';rh', 'IronHide') + +repl_open_cmd = "horizontal bot 20 split" diff --git a/lua/telescope_settings.lua b/lua/telescope_settings.lua new file mode 100644 index 0000000..e7987d3 --- /dev/null +++ b/lua/telescope_settings.lua @@ -0,0 +1,9 @@ +local actions = require('telescope.actions')require('telescope').setup{ + defaults = { + mappings = { + n = { + ["q"] = actions.close + }, + }, + } +} diff --git a/lua/todo-config.lua b/lua/todo-config.lua new file mode 100644 index 0000000..c134fce --- /dev/null +++ b/lua/todo-config.lua @@ -0,0 +1,55 @@ +require("todo-comments").setup({ + signs = true, -- show icons in the signs column + sign_priority = 8, -- sign priority + -- keywords recognized as todo comments + keywords = { + FIX = { + icon = " ", -- icon used for the sign, and in search results + color = "error", -- can be a hex color, or a named color (see below) + alt = { "FIXME", "BUG", "FIXIT", "ISSUE" }, -- a set of other keywords that all map to this FIX keywords + -- signs = false, -- configure signs for some keywords individually + }, + TODO = { icon = " ", color = "info" }, + HACK = { icon = " ", color = "warning" }, + WARN = { icon = " ", color = "warning", alt = { "WARNING", "XXX" } }, + PERF = { icon = "󰾆 ", alt = { "OPTIM", "PERFORMANCE", "OPTIMIZE" } }, + NOTE = { icon = "󰎞 ", color = "hint", alt = { "INFO" } }, + }, + merge_keywords = true, -- when true, custom keywords will be merged with the defaults + -- highlighting of the line containing the todo comment + -- * before: highlights before the keyword (typically comment characters) + -- * keyword: highlights of the keyword + -- * after: highlights after the keyword (todo text) + highlight = { + before = "", -- "fg" or "bg" or empty + keyword = "wide", -- "fg", "bg", "wide" or empty. (wide is the same as bg, but will also highlight surrounding characters) + after = "fg", -- "fg" or "bg" or empty + pattern = [[.*<(KEYWORDS)\s*:]], -- pattern or table of patterns, used for highlightng (vim regex) + comments_only = true, -- uses treesitter to match keywords in comments only + max_line_len = 400, -- ignore lines longer than this + exclude = {}, -- list of file types to exclude highlighting + }, + -- list of named colors where we try to extract the guifg from the + -- list of hilight groups or use the hex color if hl not found as a fallback + colors = { + error = { "DiagnosticError", "ErrorMsg", "#DC2626" }, + warning = { "DiagnosticWarning", "WarningMsg", "#FBBF24" }, + info = { "DiagnosticInfo", "#2563EB" }, + hint = { "DiagnosticHint", "#10B981" }, + default = { "Identifier", "#7C3AED" }, + }, + search = { + command = "rg", + args = { + "--color=never", + "--no-heading", + "--with-filename", + "--line-number", + "--column", + }, + -- regex that will be used to match keywords. + -- don't replace the (KEYWORDS) placeholder + pattern = [[\b(KEYWORDS):]], -- ripgrep regex + -- pattern = [[\b(KEYWORDS)\b]], -- match without the extra colon. You'll likely get false positives + }, +}) diff --git a/lua/treesitter-conf.lua b/lua/treesitter-conf.lua new file mode 100644 index 0000000..9207b01 --- /dev/null +++ b/lua/treesitter-conf.lua @@ -0,0 +1,40 @@ +require'nvim-treesitter.configs'.setup{ + -- A list of parser names, or "all" (the five listed parsers should always be installed) + ensure_installed = 'all', + + -- Install parsers synchronously (only applied to `ensure_installed`) + sync_install = false, + + -- Automatically install missing parsers when entering buffer + -- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally + auto_install = true, + + -- List of parsers to ignore installing (or "all") + ignore_install = { "javascript" }, + + ---- If you need to change the installation directory of the parsers (see -> Advanced Setup) + -- parser_install_dir = "/some/path/to/store/parsers", -- Remember to run vim.opt.runtimepath:append("/some/path/to/store/parsers")! + + highlight = { + enable = true, + + -- NOTE: these are the names of the parsers and not the filetype. (for example if you want to + -- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is + -- the name of the parser) + -- list of language that will be disabled + -- Or use a function for more flexibility, e.g. to disable slow treesitter highlight for large files +-- disable = function(lang, buf) +-- local max_filesize = 100 * 1024 -- 100 KB +-- local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) +-- if ok and stats and stats.size > max_filesize then +-- return true +-- end +-- end, + + -- Setting this to true will run `:h syntax` and tree-sitter at the same time. + -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). + -- Using this option may slow down your editor, and you may see some duplicate highlights. + -- Instead of true it can also be a list of languages + additional_vim_regex_highlighting = false, + }, +} diff --git a/spell/en.utf-8.add b/spell/en.utf-8.add new file mode 100644 index 0000000..4a7795a --- /dev/null +++ b/spell/en.utf-8.add @@ -0,0 +1,48 @@ +interphase +nanolaminate +microstructures +multilayers +multiscale +microrotation +microcontinuum +microstructure +heterostructured +proven +diffusionless +martensitic +embrittlement +deliverables +minima +energetics +Predictiveness +atomistic +foundational +diffusivity +equilibrated +compositionally +compositional +nanometers +undeformed +interdiffusion +nanolaminates +interdiffused +monatomic +atomistics +interfacial +interatomic +Fortran +runtimes +spacings +unrelaxed +a +nm +centroids +microrotations +centroid +evolutions +recomendations +rhombohedron +inhibitive +parallelized +assumming +exhibitted diff --git a/spell/en.utf-8.add.spl b/spell/en.utf-8.add.spl new file mode 100644 index 0000000000000000000000000000000000000000..a710b76d9f0d581c0137d36523e700e123b86441 GIT binary patch literal 793 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≀_ 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 mRb;(2-0>52^VlKCY}}RapA4)V)?|ip^#Teu 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

      3c{=cy0s~b29YkMcf+%Skf4lW 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

      $kD87mic&GdV!TEL`3d>{J&e={3}No>gtH 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≶cUMf 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 literal 0 HcmV?d00001 diff --git a/test.py b/test.py new file mode 100644 index 0000000..b04a0fb --- /dev/null +++ b/test.py @@ -0,0 +1,10 @@ +import seaborn as sns +import pandas as pd + + + + + + +data=pd.read_csv('some_file') +sns.relplot( diff --git a/typings/matplotlib/__init__.pyi b/typings/matplotlib/__init__.pyi new file mode 100644 index 0000000..92f46fe --- /dev/null +++ b/typings/matplotlib/__init__.pyi @@ -0,0 +1,116 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import contextlib +from pathlib import Path +from collections.abc import Callable, Generator +from packaging.version import Version +from matplotlib._api import MatplotlibDeprecationWarning +from typing import Any, NamedTuple +from matplotlib.cm import _colormaps as colormaps +from matplotlib.colors import _color_sequences as color_sequences + +__all__ = ["__bibtex__", "__version__", "__version_info__", "set_loglevel", "ExecutableNotFoundError", "get_configdir", "get_cachedir", "get_data_path", "matplotlib_fname", "MatplotlibDeprecationWarning", "RcParams", "rc_params", "rc_params_from_file", "rcParamsDefault", "rcParams", "rcParamsOrig", "defaultParams", "rc", "rcdefaults", "rc_file_defaults", "rc_file", "rc_context", "use", "get_backend", "interactive", "is_interactive", "colormaps", "color_sequences"] +class _VersionInfo(NamedTuple): + major: int + minor: int + micro: int + releaselevel: str + serial: int + ... + + +__bibtex__: str +__version__: str +__version_info__: _VersionInfo +def set_loglevel(level: str) -> None: + ... + +class _ExecInfo(NamedTuple): + executable: str + raw_version: str + version: Version + ... + + +class ExecutableNotFoundError(FileNotFoundError): + ... + + +def get_configdir() -> str: + ... + +def get_cachedir() -> str: + ... + +def get_data_path() -> str: + ... + +def matplotlib_fname() -> str: + ... + +class RcParams(dict[str, Any]): + validate: dict[str, Callable] + def __init__(self, *args, **kwargs) -> None: + ... + + def __setitem__(self, key: str, val: Any) -> None: + ... + + def __getitem__(self, key: str) -> Any: + ... + + def __iter__(self) -> Generator[str, None, None]: + ... + + def __len__(self) -> int: + ... + + def find_all(self, pattern: str) -> RcParams: + ... + + def copy(self) -> RcParams: + ... + + + +def rc_params(fail_on_error: bool = ...) -> RcParams: + ... + +def rc_params_from_file(fname: str | Path | os.PathLike, fail_on_error: bool = ..., use_default_template: bool = ...) -> RcParams: + ... + +rcParamsDefault: RcParams +rcParams: RcParams +rcParamsOrig: RcParams +defaultParams: dict[str, Any] +def rc(group: str, **kwargs) -> None: + ... + +def rcdefaults() -> None: + ... + +def rc_file_defaults() -> None: + ... + +def rc_file(fname: str | Path | os.PathLike, *, use_default_template: bool = ...) -> None: + ... + +@contextlib.contextmanager +def rc_context(rc: dict[str, Any] | None = ..., fname: str | Path | os.PathLike | None = ...) -> Generator[None, None, None]: + ... + +def use(backend: str, *, force: bool = ...) -> None: + ... + +def get_backend() -> str: + ... + +def interactive(b: bool) -> None: + ... + +def is_interactive() -> bool: + ... + diff --git a/typings/matplotlib/_afm.pyi b/typings/matplotlib/_afm.pyi new file mode 100644 index 0000000..6f6bc85 --- /dev/null +++ b/typings/matplotlib/_afm.pyi @@ -0,0 +1,154 @@ +""" +This type stub file was generated by pyright. +""" + +""" +A python interface to Adobe Font Metrics Files. + +Although a number of other Python implementations exist, and may be more +complete than this, it was decided not to go with them because they were +either: + +1) copyrighted or used a non-BSD compatible license +2) had too many dependencies and a free standing lib was needed +3) did more than needed and it was easier to write afresh rather than + figure out how to get just what was needed. + +It is pretty easy to use, and has no external dependencies: + +>>> import matplotlib as mpl +>>> from pathlib import Path +>>> afm_path = Path(mpl.get_data_path(), 'fonts', 'afm', 'ptmr8a.afm') +>>> +>>> from matplotlib.afm import AFM +>>> with afm_path.open('rb') as fh: +... afm = AFM(fh) +>>> afm.string_width_height('What the heck?') +(6220.0, 694) +>>> afm.get_fontname() +'Times-Roman' +>>> afm.get_kern_dist('A', 'f') +0 +>>> afm.get_kern_dist('A', 'y') +-92.0 +>>> afm.get_bbox_char('!') +[130, -9, 238, 676] + +As in the Adobe Font Metrics File Format Specification, all dimensions +are given in units of 1/1000 of the scale factor (point size) of the font +being used. +""" +_log = ... +CharMetrics = ... +CompositePart = ... +class AFM: + def __init__(self, fh) -> None: + """Parse the AFM file in file object *fh*.""" + ... + + def get_bbox_char(self, c, isord=...): + ... + + def string_width_height(self, s): # -> tuple[Literal[0], Literal[0]] | tuple[Unknown | Literal[0], float]: + """ + Return the string width (including kerning) and string height + as a (*w*, *h*) tuple. + """ + ... + + def get_str_bbox_and_descent(self, s): # -> tuple[Literal[0], Literal[0], Literal[0], Literal[0], Literal[0]] | tuple[int, float, Unknown | Literal[0], float, float]: + """Return the string bounding box and the maximal descent.""" + ... + + def get_str_bbox(self, s): # -> tuple[Literal[0], Literal[0], Literal[0], Literal[0]] | tuple[int, float, Unknown | Literal[0], float]: + """Return the string bounding box.""" + ... + + def get_name_char(self, c, isord=...): + """Get the name of the character, i.e., ';' is 'semicolon'.""" + ... + + def get_width_char(self, c, isord=...): + """ + Get the width of the character from the character metric WX field. + """ + ... + + def get_width_from_char_name(self, name): + """Get the width of the character from a type1 character name.""" + ... + + def get_height_char(self, c, isord=...): + """Get the bounding box (ink) height of character *c* (space is 0).""" + ... + + def get_kern_dist(self, c1, c2): + """ + Return the kerning pair distance (possibly 0) for chars *c1* and *c2*. + """ + ... + + def get_kern_dist_from_name(self, name1, name2): + """ + Return the kerning pair distance (possibly 0) for chars + *name1* and *name2*. + """ + ... + + def get_fontname(self): + """Return the font name, e.g., 'Times-Roman'.""" + ... + + @property + def postscript_name(self): + ... + + def get_fullname(self): + """Return the font full name, e.g., 'Times-Roman'.""" + ... + + def get_familyname(self): # -> str: + """Return the font family name, e.g., 'Times'.""" + ... + + @property + def family_name(self): # -> str: + """The font family name, e.g., 'Times'.""" + ... + + def get_weight(self): + """Return the font weight, e.g., 'Bold' or 'Roman'.""" + ... + + def get_angle(self): + """Return the fontangle as float.""" + ... + + def get_capheight(self): + """Return the cap height as float.""" + ... + + def get_xheight(self): + """Return the xheight as float.""" + ... + + def get_underline_thickness(self): + """Return the underline thickness as float.""" + ... + + def get_horizontal_stem_width(self): + """ + Return the standard horizontal stem width as float, or *None* if + not specified in AFM file. + """ + ... + + def get_vertical_stem_width(self): + """ + Return the standard vertical stem width as float, or *None* if + not specified in AFM file. + """ + ... + + + diff --git a/typings/matplotlib/_animation_data.pyi b/typings/matplotlib/_animation_data.pyi new file mode 100644 index 0000000..6116fa9 --- /dev/null +++ b/typings/matplotlib/_animation_data.pyi @@ -0,0 +1,8 @@ +""" +This type stub file was generated by pyright. +""" + +JS_INCLUDE = ... +STYLE_INCLUDE = ... +DISPLAY_TEMPLATE = ... +INCLUDED_FRAMES = ... diff --git a/typings/matplotlib/_api/__init__.pyi b/typings/matplotlib/_api/__init__.pyi new file mode 100644 index 0000000..1bef213 --- /dev/null +++ b/typings/matplotlib/_api/__init__.pyi @@ -0,0 +1,66 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable, Generator, Mapping, Sequence +from typing import Any, Iterable, TypeVar, overload +from numpy.typing import NDArray +from .deprecation import MatplotlibDeprecationWarning as MatplotlibDeprecationWarning, delete_parameter as delete_parameter, deprecate_method_override as deprecate_method_override, deprecate_privatize_attribute as deprecate_privatize_attribute, deprecated as deprecated, make_keyword_only as make_keyword_only, rename_parameter as rename_parameter, suppress_matplotlib_deprecation_warning as suppress_matplotlib_deprecation_warning, warn_deprecated as warn_deprecated + +_T = TypeVar("_T") +class classproperty(Any): + def __init__(self, fget: Callable[[_T], Any], fset: None = ..., fdel: None = ..., doc: str | None = ...) -> None: + ... + + @overload + def __get__(self, instance: None, owner: None) -> classproperty: + ... + + @overload + def __get__(self, instance: object, owner: type[object]) -> Any: + ... + + @property + def fget(self) -> Callable[[_T], Any]: + ... + + + +def check_isinstance(types: type | tuple[type | None, ...], /, **kwargs: Any) -> None: + ... + +def check_in_list(values: Sequence[Any], /, *, _print_supported_values: bool = ..., **kwargs: Any) -> None: + ... + +def check_shape(shape: tuple[int | None, ...], /, **kwargs: NDArray) -> None: + ... + +def check_getitem(mapping: Mapping[Any, Any], /, **kwargs: Any) -> Any: + ... + +def caching_module_getattr(cls: type) -> Callable[[str], Any]: + ... + +@overload +def define_aliases(alias_d: dict[str, list[str]], cls: None = ...) -> Callable[[type[_T]], type[_T]]: + ... + +@overload +def define_aliases(alias_d: dict[str, list[str]], cls: type[_T]) -> type[_T]: + ... + +def select_matching_signature(funcs: list[Callable], *args: Any, **kwargs: Any) -> Any: + ... + +def nargs_error(name: str, takes: int | str, given: int) -> TypeError: + ... + +def kwarg_error(name: str, kw: str | Iterable[str]) -> TypeError: + ... + +def recursive_subclasses(cls: type) -> Generator[type, None, None]: + ... + +def warn_external(message: str | Warning, category: type[Warning] | None = ...) -> None: + ... + diff --git a/typings/matplotlib/_api/deprecation.pyi b/typings/matplotlib/_api/deprecation.pyi new file mode 100644 index 0000000..15463f0 --- /dev/null +++ b/typings/matplotlib/_api/deprecation.pyi @@ -0,0 +1,82 @@ +""" +This type stub file was generated by pyright. +""" + +import contextlib +from collections.abc import Callable +from typing import Any, TypeVar, TypedDict, overload +from typing_extensions import ParamSpec, Unpack + +_P = ParamSpec("_P") +_R = TypeVar("_R") +_T = TypeVar("_T") +class MatplotlibDeprecationWarning(DeprecationWarning): + ... + + +class DeprecationKwargs(TypedDict, total=False): + message: str + alternative: str + pending: bool + obj_type: str + addendum: str + removal: str + ... + + +class NamedDeprecationKwargs(DeprecationKwargs, total=False): + name: str + ... + + +def warn_deprecated(since: str, **kwargs: Unpack[NamedDeprecationKwargs]) -> None: + ... + +def deprecated(since: str, **kwargs: Unpack[NamedDeprecationKwargs]) -> Callable[[_T], _T]: + ... + +class deprecate_privatize_attribute(Any): + def __init__(self, since: str, **kwargs: Unpack[NamedDeprecationKwargs]) -> None: + ... + + def __set_name__(self, owner: type[object], name: str) -> None: + ... + + + +DECORATORS: dict[Callable, Callable] = ... +@overload +def rename_parameter(since: str, old: str, new: str, func: None = ...) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: + ... + +@overload +def rename_parameter(since: str, old: str, new: str, func: Callable[_P, _R]) -> Callable[_P, _R]: + ... + +class _deprecated_parameter_class: + ... + + +_deprecated_parameter: _deprecated_parameter_class +@overload +def delete_parameter(since: str, name: str, func: None = ..., **kwargs: Unpack[DeprecationKwargs]) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: + ... + +@overload +def delete_parameter(since: str, name: str, func: Callable[_P, _R], **kwargs: Unpack[DeprecationKwargs]) -> Callable[_P, _R]: + ... + +@overload +def make_keyword_only(since: str, name: str, func: None = ...) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: + ... + +@overload +def make_keyword_only(since: str, name: str, func: Callable[_P, _R]) -> Callable[_P, _R]: + ... + +def deprecate_method_override(method: Callable[_P, _R], obj: object | type, *, allow_empty: bool = ..., since: str, **kwargs: Unpack[NamedDeprecationKwargs]) -> Callable[_P, _R]: + ... + +def suppress_matplotlib_deprecation_warning() -> contextlib.AbstractContextManager[None]: + ... + diff --git a/typings/matplotlib/_blocking_input.pyi b/typings/matplotlib/_blocking_input.pyi new file mode 100644 index 0000000..25b7216 --- /dev/null +++ b/typings/matplotlib/_blocking_input.pyi @@ -0,0 +1,26 @@ +""" +This type stub file was generated by pyright. +""" + +def blocking_input_loop(figure, event_names, timeout, handler): # -> None: + """ + Run *figure*'s event loop while listening to interactive events. + + The events listed in *event_names* are passed to *handler*. + + This function is used to implement `.Figure.waitforbuttonpress`, + `.Figure.ginput`, and `.Axes.clabel`. + + Parameters + ---------- + figure : `~matplotlib.figure.Figure` + event_names : list of str + The names of the events passed to *handler*. + timeout : float + If positive, the event loop is stopped after *timeout* seconds. + handler : Callable[[Event], Any] + Function called for each event; it can force an early exit of the event + loop by calling ``canvas.stop_event_loop()``. + """ + ... + diff --git a/typings/matplotlib/_c_internal_utils.pyi b/typings/matplotlib/_c_internal_utils.pyi new file mode 100644 index 0000000..4fdcff1 --- /dev/null +++ b/typings/matplotlib/_c_internal_utils.pyi @@ -0,0 +1,7 @@ +""" +This type stub file was generated by pyright. +""" + +def display_is_valid() -> bool: + ... + diff --git a/typings/matplotlib/_cm.pyi b/typings/matplotlib/_cm.pyi new file mode 100644 index 0000000..5f1bdcd --- /dev/null +++ b/typings/matplotlib/_cm.pyi @@ -0,0 +1,126 @@ +""" +This type stub file was generated by pyright. +""" + +""" +Nothing here but dictionaries for generating LinearSegmentedColormaps, +and a dictionary of these dictionaries. + +Documentation for each is in pyplot.colormaps(). Please update this +with the purpose and type of your colormap if you add data for one here. +""" +_binary_data = ... +_autumn_data = ... +_bone_data = ... +_cool_data = ... +_copper_data = ... +_flag_data = ... +_prism_data = ... +def cubehelix(gamma=..., s=..., r=..., h=...): # -> dict[str, partial[Unknown]]: + """ + Return custom data dictionary of (r, g, b) conversion functions, which can + be used with :func:`register_cmap`, for the cubehelix color scheme. + + Unlike most other color schemes cubehelix was designed by D.A. Green to + be monotonically increasing in terms of perceived brightness. + Also, when printed on a black and white postscript printer, the scheme + results in a greyscale with monotonically increasing brightness. + This color scheme is named cubehelix because the (r, g, b) values produced + can be visualised as a squashed helix around the diagonal in the + (r, g, b) color cube. + + For a unit color cube (i.e. 3D coordinates for (r, g, b) each in the + range 0 to 1) the color scheme starts at (r, g, b) = (0, 0, 0), i.e. black, + and finishes at (r, g, b) = (1, 1, 1), i.e. white. For some fraction *x*, + between 0 and 1, the color is the corresponding grey value at that + fraction along the black to white diagonal (x, x, x) plus a color + element. This color element is calculated in a plane of constant + perceived intensity and controlled by the following parameters. + + Parameters + ---------- + gamma : float, default: 1 + Gamma factor emphasizing either low intensity values (gamma < 1), or + high intensity values (gamma > 1). + s : float, default: 0.5 (purple) + The starting color. + r : float, default: -1.5 + The number of r, g, b rotations in color that are made from the start + to the end of the color scheme. The default of -1.5 corresponds to -> + B -> G -> R -> B. + h : float, default: 1 + The hue, i.e. how saturated the colors are. If this parameter is zero + then the color scheme is purely a greyscale. + """ + ... + +_cubehelix_data = ... +_bwr_data = ... +_brg_data = ... +gfunc = ... +_gnuplot_data = ... +_gnuplot2_data = ... +_ocean_data = ... +_afmhot_data = ... +_rainbow_data = ... +_seismic_data = ... +_terrain_data = ... +_gray_data = ... +_hot_data = ... +_hsv_data = ... +_jet_data = ... +_pink_data = ... +_spring_data = ... +_summer_data = ... +_winter_data = ... +_nipy_spectral_data = ... +_Blues_data = ... +_BrBG_data = ... +_BuGn_data = ... +_BuPu_data = ... +_GnBu_data = ... +_Greens_data = ... +_Greys_data = ... +_Oranges_data = ... +_OrRd_data = ... +_PiYG_data = ... +_PRGn_data = ... +_PuBu_data = ... +_PuBuGn_data = ... +_PuOr_data = ... +_PuRd_data = ... +_Purples_data = ... +_RdBu_data = ... +_RdGy_data = ... +_RdPu_data = ... +_RdYlBu_data = ... +_RdYlGn_data = ... +_Reds_data = ... +_Spectral_data = ... +_YlGn_data = ... +_YlGnBu_data = ... +_YlOrBr_data = ... +_YlOrRd_data = ... +_Accent_data = ... +_Dark2_data = ... +_Paired_data = ... +_Pastel1_data = ... +_Pastel2_data = ... +_Set1_data = ... +_Set2_data = ... +_Set3_data = ... +_gist_earth_data = ... +_gist_gray_data = ... +_gist_heat_data = ... +_gist_ncar_data = ... +_gist_rainbow_data = ... +_gist_stern_data = ... +_gist_yarg_data = ... +_coolwarm_data = ... +_CMRmap_data = ... +_wistia_data = ... +_tab10_data = ... +_tab20_data = ... +_tab20b_data = ... +_tab20c_data = ... +datad = ... diff --git a/typings/matplotlib/_cm_listed.pyi b/typings/matplotlib/_cm_listed.pyi new file mode 100644 index 0000000..d5a3fe2 --- /dev/null +++ b/typings/matplotlib/_cm_listed.pyi @@ -0,0 +1,13 @@ +""" +This type stub file was generated by pyright. +""" + +_magma_data = ... +_inferno_data = ... +_plasma_data = ... +_viridis_data = ... +_cividis_data = ... +_twilight_data = ... +_twilight_shifted_data = ... +_turbo_data = ... +cmaps = ... diff --git a/typings/matplotlib/_color_data.pyi b/typings/matplotlib/_color_data.pyi new file mode 100644 index 0000000..51af11a --- /dev/null +++ b/typings/matplotlib/_color_data.pyi @@ -0,0 +1,10 @@ +""" +This type stub file was generated by pyright. +""" + +from .typing import ColorType + +BASE_COLORS: dict[str, ColorType] +TABLEAU_COLORS: dict[str, ColorType] +XKCD_COLORS: dict[str, ColorType] +CSS4_COLORS: dict[str, ColorType] diff --git a/typings/matplotlib/_constrained_layout.pyi b/typings/matplotlib/_constrained_layout.pyi new file mode 100644 index 0000000..aecbe8e --- /dev/null +++ b/typings/matplotlib/_constrained_layout.pyi @@ -0,0 +1,233 @@ +""" +This type stub file was generated by pyright. +""" + +""" +Adjust subplot layouts so that there are no overlapping axes or axes +decorations. All axes decorations are dealt with (labels, ticks, titles, +ticklabels) and some dependent artists are also dealt with (colorbar, +suptitle). + +Layout is done via `~matplotlib.gridspec`, with one constraint per gridspec, +so it is possible to have overlapping axes if the gridspecs overlap (i.e. +using `~matplotlib.gridspec.GridSpecFromSubplotSpec`). Axes placed using +``figure.subplots()`` or ``figure.add_subplots()`` will participate in the +layout. Axes manually placed via ``figure.add_axes()`` will not. + +See Tutorial: :ref:`constrainedlayout_guide` + +General idea: +------------- + +First, a figure has a gridspec that divides the figure into nrows and ncols, +with heights and widths set by ``height_ratios`` and ``width_ratios``, +often just set to 1 for an equal grid. + +Subplotspecs that are derived from this gridspec can contain either a +``SubPanel``, a ``GridSpecFromSubplotSpec``, or an ``Axes``. The ``SubPanel`` +and ``GridSpecFromSubplotSpec`` are dealt with recursively and each contain an +analogous layout. + +Each ``GridSpec`` has a ``_layoutgrid`` attached to it. The ``_layoutgrid`` +has the same logical layout as the ``GridSpec``. Each row of the grid spec +has a top and bottom "margin" and each column has a left and right "margin". +The "inner" height of each row is constrained to be the same (or as modified +by ``height_ratio``), and the "inner" width of each column is +constrained to be the same (as modified by ``width_ratio``), where "inner" +is the width or height of each column/row minus the size of the margins. + +Then the size of the margins for each row and column are determined as the +max width of the decorators on each axes that has decorators in that margin. +For instance, a normal axes would have a left margin that includes the +left ticklabels, and the ylabel if it exists. The right margin may include a +colorbar, the bottom margin the xaxis decorations, and the top margin the +title. + +With these constraints, the solver then finds appropriate bounds for the +columns and rows. It's possible that the margins take up the whole figure, +in which case the algorithm is not applied and a warning is raised. + +See the tutorial :ref:`constrainedlayout_guide` +for more discussion of the algorithm with examples. +""" +_log = ... +def do_constrained_layout(fig, h_pad, w_pad, hspace=..., wspace=..., rect=..., compress=...): # -> dict[Unknown, Unknown] | None: + """ + Do the constrained_layout. Called at draw time in + ``figure.constrained_layout()`` + + Parameters + ---------- + fig : `~matplotlib.figure.Figure` + `.Figure` instance to do the layout in. + + h_pad, w_pad : float + Padding around the axes elements in figure-normalized units. + + hspace, wspace : float + Fraction of the figure to dedicate to space between the + axes. These are evenly spread between the gaps between the axes. + A value of 0.2 for a three-column layout would have a space + of 0.1 of the figure width between each column. + If h/wspace < h/w_pad, then the pads are used instead. + + rect : tuple of 4 floats + Rectangle in figure coordinates to perform constrained layout in + [left, bottom, width, height], each from 0-1. + + compress : bool + Whether to shift Axes so that white space in between them is + removed. This is useful for simple grids of fixed-aspect Axes (e.g. + a grid of images). + + Returns + ------- + layoutgrid : private debugging structure + """ + ... + +def make_layoutgrids(fig, layoutgrids, rect=...): # -> dict[Unknown, Unknown]: + """ + Make the layoutgrid tree. + + (Sub)Figures get a layoutgrid so we can have figure margins. + + Gridspecs that are attached to axes get a layoutgrid so axes + can have margins. + """ + ... + +def make_layoutgrids_gs(layoutgrids, gs): + """ + Make the layoutgrid for a gridspec (and anything nested in the gridspec) + """ + ... + +def check_no_collapsed_axes(layoutgrids, fig): # -> bool: + """ + Check that no axes have collapsed to zero size. + """ + ... + +def compress_fixed_aspect(layoutgrids, fig): + ... + +def get_margin_from_padding(obj, *, w_pad=..., h_pad=..., hspace=..., wspace=...): # -> dict[str, int]: + ... + +def make_layout_margins(layoutgrids, fig, renderer, *, w_pad=..., h_pad=..., hspace=..., wspace=...): + """ + For each axes, make a margin between the *pos* layoutbox and the + *axes* layoutbox be a minimum size that can accommodate the + decorations on the axis. + + Then make room for colorbars. + + Parameters + ---------- + layoutgrids : dict + fig : `~matplotlib.figure.Figure` + `.Figure` instance to do the layout in. + renderer : `~matplotlib.backend_bases.RendererBase` subclass. + The renderer to use. + w_pad, h_pad : float, default: 0 + Width and height padding (in fraction of figure). + hspace, wspace : float, default: 0 + Width and height padding as fraction of figure size divided by + number of columns or rows. + """ + ... + +def make_margin_suptitles(layoutgrids, fig, renderer, *, w_pad=..., h_pad=...): # -> None: + ... + +def match_submerged_margins(layoutgrids, fig): # -> None: + """ + Make the margins that are submerged inside an Axes the same size. + + This allows axes that span two columns (or rows) that are offset + from one another to have the same size. + + This gives the proper layout for something like:: + fig = plt.figure(constrained_layout=True) + axs = fig.subplot_mosaic("AAAB\nCCDD") + + Without this routine, the axes D will be wider than C, because the + margin width between the two columns in C has no width by default, + whereas the margins between the two columns of D are set by the + width of the margin between A and B. However, obviously the user would + like C and D to be the same size, so we need to add constraints to these + "submerged" margins. + + This routine makes all the interior margins the same, and the spacing + between the three columns in A and the two column in C are all set to the + margins between the two columns of D. + + See test_constrained_layout::test_constrained_layout12 for an example. + """ + ... + +def get_cb_parent_spans(cbax): # -> tuple[range, range]: + """ + Figure out which subplotspecs this colorbar belongs to. + + Parameters + ---------- + cbax : `~matplotlib.axes.Axes` + Axes for the colorbar. + """ + ... + +def get_pos_and_bbox(ax, renderer): # -> tuple[Unknown, Unknown]: + """ + Get the position and the bbox for the axes. + + Parameters + ---------- + ax : `~matplotlib.axes.Axes` + renderer : `~matplotlib.backend_bases.RendererBase` subclass. + + Returns + ------- + pos : `~matplotlib.transforms.Bbox` + Position in figure coordinates. + bbox : `~matplotlib.transforms.Bbox` + Tight bounding box in figure coordinates. + """ + ... + +def reposition_axes(layoutgrids, fig, renderer, *, w_pad=..., h_pad=..., hspace=..., wspace=...): # -> None: + """ + Reposition all the axes based on the new inner bounding box. + """ + ... + +def reposition_colorbar(layoutgrids, cbax, renderer, *, offset=...): # -> None: + """ + Place the colorbar in its new place. + + Parameters + ---------- + layoutgrids : dict + cbax : `~matplotlib.axes.Axes` + Axes for the colorbar. + renderer : `~matplotlib.backend_bases.RendererBase` subclass. + The renderer to use. + offset : array-like + Offset the colorbar needs to be pushed to in order to + account for multiple colorbars. + """ + ... + +def reset_margins(layoutgrids, fig): # -> None: + """ + Reset the margins in the layoutboxes of *fig*. + + Margins are usually set as a minimum, so if the figure gets smaller + the minimum needs to be zero in order for it to grow again. + """ + ... + +def colorbar_get_pad(layoutgrids, cax): + ... + diff --git a/typings/matplotlib/_docstring.pyi b/typings/matplotlib/_docstring.pyi new file mode 100644 index 0000000..3cec5c8 --- /dev/null +++ b/typings/matplotlib/_docstring.pyi @@ -0,0 +1,44 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, Callable, TypeVar, overload + +_T = TypeVar('_T') +class Substitution: + @overload + def __init__(self, *args: str) -> None: + ... + + @overload + def __init__(self, **kwargs: str) -> None: + ... + + def __call__(self, func: _T) -> _T: + ... + + def update(self, *args, **kwargs): + ... + + + +class _ArtistKwdocLoader(dict[str, str]): + def __missing__(self, key: str) -> str: + ... + + + +class _ArtistPropertiesSubstitution(Substitution): + def __init__(self) -> None: + ... + + def __call__(self, obj: _T) -> _T: + ... + + + +def copy(source: Any) -> Callable[[_T], _T]: + ... + +dedent_interpd: _ArtistPropertiesSubstitution +interpd: _ArtistPropertiesSubstitution diff --git a/typings/matplotlib/_enums.pyi b/typings/matplotlib/_enums.pyi new file mode 100644 index 0000000..450b4be --- /dev/null +++ b/typings/matplotlib/_enums.pyi @@ -0,0 +1,32 @@ +""" +This type stub file was generated by pyright. +""" + +from enum import Enum + +class _AutoStringNameEnum(Enum): + def __hash__(self) -> int: + ... + + + +class JoinStyle(str, _AutoStringNameEnum): + miter: str + round: str + bevel: str + @staticmethod + def demo() -> None: + ... + + + +class CapStyle(str, _AutoStringNameEnum): + butt: str + projecting: str + round: str + @staticmethod + def demo() -> None: + ... + + + diff --git a/typings/matplotlib/_fontconfig_pattern.pyi b/typings/matplotlib/_fontconfig_pattern.pyi new file mode 100644 index 0000000..5b42335 --- /dev/null +++ b/typings/matplotlib/_fontconfig_pattern.pyi @@ -0,0 +1,31 @@ +""" +This type stub file was generated by pyright. +""" + +from functools import lru_cache + +""" +A module for parsing and generating `fontconfig patterns`_. + +.. _fontconfig patterns: + https://www.freedesktop.org/software/fontconfig/fontconfig-user.html +""" +_family_punc = ... +_family_unescape = ... +_family_escape = ... +_value_punc = ... +_value_unescape = ... +_value_escape = ... +_CONSTANTS = ... +@lru_cache +def parse_fontconfig_pattern(pattern): # -> dict[Unknown, Unknown]: + """ + Parse a fontconfig *pattern* into a dict that can initialize a + `.font_manager.FontProperties` object. + """ + ... + +def generate_fontconfig_pattern(d): # -> str: + """Convert a `.FontProperties` to a fontconfig pattern string.""" + ... + diff --git a/typings/matplotlib/_image.pyi b/typings/matplotlib/_image.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/matplotlib/_image.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/matplotlib/_internal_utils.pyi b/typings/matplotlib/_internal_utils.pyi new file mode 100644 index 0000000..de4d638 --- /dev/null +++ b/typings/matplotlib/_internal_utils.pyi @@ -0,0 +1,30 @@ +""" +This type stub file was generated by pyright. +""" + +""" +Internal debugging utilities, that are not expected to be used in the rest of +the codebase. + +WARNING: Code in this module may change without prior notice! +""" +def graphviz_dump_transform(transform, dest, *, highlight=...): # -> None: + """ + Generate a graphical representation of the transform tree for *transform* + using the :program:`dot` program (which this function depends on). The + output format (png, dot, etc.) is determined from the suffix of *dest*. + + Parameters + ---------- + transform : `~matplotlib.transform.Transform` + The represented transform. + dest : str + Output filename. The extension must be one of the formats supported + by :program:`dot`, e.g. png, svg, dot, ... + (see https://www.graphviz.org/doc/info/output.html). + highlight : list of `~matplotlib.transform.Transform` or None + The transforms in the tree to be drawn in bold. + If *None*, *transform* is highlighted. + """ + ... + diff --git a/typings/matplotlib/_layoutgrid.pyi b/typings/matplotlib/_layoutgrid.pyi new file mode 100644 index 0000000..8d33e0f --- /dev/null +++ b/typings/matplotlib/_layoutgrid.pyi @@ -0,0 +1,212 @@ +""" +This type stub file was generated by pyright. +""" + +""" +A layoutgrid is a nrows by ncols set of boxes, meant to be used by +`._constrained_layout`, each box is analogous to a subplotspec element of +a gridspec. + +Each box is defined by left[ncols], right[ncols], bottom[nrows] and top[nrows], +and by two editable margins for each side. The main margin gets its value +set by the size of ticklabels, titles, etc on each axes that is in the figure. +The outer margin is the padding around the axes, and space for any +colorbars. + +The "inner" widths and heights of these boxes are then constrained to be the +same (relative the values of `width_ratios[ncols]` and `height_ratios[nrows]`). + +The layoutgrid is then constrained to be contained within a parent layoutgrid, +its column(s) and row(s) specified when it is created. +""" +_log = ... +class LayoutGrid: + """ + Analogous to a gridspec, and contained in another LayoutGrid. + """ + def __init__(self, parent=..., parent_pos=..., parent_inner=..., name=..., ncols=..., nrows=..., h_pad=..., w_pad=..., width_ratios=..., height_ratios=...) -> None: + ... + + def __repr__(self): # -> str: + ... + + def reset_margins(self): # -> None: + """ + Reset all the margins to zero. Must do this after changing + figure size, for instance, because the relative size of the + axes labels etc changes. + """ + ... + + def add_constraints(self, parent): # -> None: + ... + + def hard_constraints(self): # -> None: + """ + These are the redundant constraints, plus ones that make the + rest of the code easier. + """ + ... + + def add_child(self, child, i=..., j=...): # -> None: + ... + + def parent_constraints(self, parent): # -> None: + ... + + def grid_constraints(self): # -> None: + ... + + def edit_margin(self, todo, size, cell): # -> None: + """ + Change the size of the margin for one cell. + + Parameters + ---------- + todo : string (one of 'left', 'right', 'bottom', 'top') + margin to alter. + + size : float + Size of the margin. If it is larger than the existing minimum it + updates the margin size. Fraction of figure size. + + cell : int + Cell column or row to edit. + """ + ... + + def edit_margin_min(self, todo, size, cell=...): # -> None: + """ + Change the minimum size of the margin for one cell. + + Parameters + ---------- + todo : string (one of 'left', 'right', 'bottom', 'top') + margin to alter. + + size : float + Minimum size of the margin . If it is larger than the + existing minimum it updates the margin size. Fraction of + figure size. + + cell : int + Cell column or row to edit. + """ + ... + + def edit_margins(self, todo, size): # -> None: + """ + Change the size of all the margin of all the cells in the layout grid. + + Parameters + ---------- + todo : string (one of 'left', 'right', 'bottom', 'top') + margin to alter. + + size : float + Size to set the margins. Fraction of figure size. + """ + ... + + def edit_all_margins_min(self, todo, size): # -> None: + """ + Change the minimum size of all the margin of all + the cells in the layout grid. + + Parameters + ---------- + todo : {'left', 'right', 'bottom', 'top'} + The margin to alter. + + size : float + Minimum size of the margin. If it is larger than the + existing minimum it updates the margin size. Fraction of + figure size. + """ + ... + + def edit_outer_margin_mins(self, margin, ss): # -> None: + """ + Edit all four margin minimums in one statement. + + Parameters + ---------- + margin : dict + size of margins in a dict with keys 'left', 'right', 'bottom', + 'top' + + ss : SubplotSpec + defines the subplotspec these margins should be applied to + """ + ... + + def get_margins(self, todo, col): + """Return the margin at this position""" + ... + + def get_outer_bbox(self, rows=..., cols=...): # -> Bbox: + """ + Return the outer bounding box of the subplot specs + given by rows and cols. rows and cols can be spans. + """ + ... + + def get_inner_bbox(self, rows=..., cols=...): # -> Bbox: + """ + Return the inner bounding box of the subplot specs + given by rows and cols. rows and cols can be spans. + """ + ... + + def get_bbox_for_cb(self, rows=..., cols=...): # -> Bbox: + """ + Return the bounding box that includes the + decorations but, *not* the colorbar... + """ + ... + + def get_left_margin_bbox(self, rows=..., cols=...): # -> Bbox: + """ + Return the left margin bounding box of the subplot specs + given by rows and cols. rows and cols can be spans. + """ + ... + + def get_bottom_margin_bbox(self, rows=..., cols=...): # -> Bbox: + """ + Return the left margin bounding box of the subplot specs + given by rows and cols. rows and cols can be spans. + """ + ... + + def get_right_margin_bbox(self, rows=..., cols=...): # -> Bbox: + """ + Return the left margin bounding box of the subplot specs + given by rows and cols. rows and cols can be spans. + """ + ... + + def get_top_margin_bbox(self, rows=..., cols=...): # -> Bbox: + """ + Return the left margin bounding box of the subplot specs + given by rows and cols. rows and cols can be spans. + """ + ... + + def update_variables(self): # -> None: + """ + Update the variables for the solver attached to this layoutgrid. + """ + ... + + + +_layoutboxobjnum = ... +def seq_id(): # -> str: + """Generate a short sequential id for layoutbox objects.""" + ... + +def plot_children(fig, lg=..., level=...): # -> None: + """Simple plotting to show where boxes are.""" + ... + diff --git a/typings/matplotlib/_mathtext.pyi b/typings/matplotlib/_mathtext.pyi new file mode 100644 index 0000000..5cfe61a --- /dev/null +++ b/typings/matplotlib/_mathtext.pyi @@ -0,0 +1,928 @@ +""" +This type stub file was generated by pyright. +""" + +import abc +import enum +import functools +import typing as T +from typing import NamedTuple +from pyparsing import Literal, ParseResults, ParserElement, __version__ as pyparsing_version +from .font_manager import FontProperties +from .ft2font import FT2Font, FT2Image, Glyph +from packaging.version import parse as parse_version + +""" +Implementation details for :mod:`.mathtext`. +""" +if parse_version(pyparsing_version).major < 3: + ... +else: + ... +if T.TYPE_CHECKING: + ... +_log = ... +def get_unicode_index(symbol: str) -> int: + r""" + Return the integer index (from the Unicode table) of *symbol*. + + Parameters + ---------- + symbol : str + A single (Unicode) character, a TeX command (e.g. r'\pi') or a Type1 + symbol name (e.g. 'phi'). + """ + ... + +class VectorParse(NamedTuple): + """ + The namedtuple type returned by ``MathTextParser("path").parse(...)``. + + Attributes + ---------- + width, height, depth : float + The global metrics. + glyphs : list + The glyphs including their positions. + rect : list + The list of rectangles. + """ + width: float + height: float + depth: float + glyphs: list[tuple[FT2Font, float, int, float, float]] + rects: list[tuple[float, float, float, float]] + ... + + +class RasterParse(NamedTuple): + """ + The namedtuple type returned by ``MathTextParser("agg").parse(...)``. + + Attributes + ---------- + ox, oy : float + The offsets are always zero. + width, height, depth : float + The global metrics. + image : FT2Image + A raster image. + """ + ox: float + oy: float + width: float + height: float + depth: float + image: FT2Image + ... + + +class Output: + r""" + Result of `ship`\ping a box: lists of positioned glyphs and rectangles. + + This class is not exposed to end users, but converted to a `VectorParse` or + a `RasterParse` by `.MathTextParser.parse`. + """ + def __init__(self, box: Box) -> None: + ... + + def to_vector(self) -> VectorParse: + ... + + def to_raster(self, *, antialiased: bool) -> RasterParse: + ... + + + +class FontMetrics(NamedTuple): + """ + Metrics of a font. + + Attributes + ---------- + advance : float + The advance distance (in points) of the glyph. + height : float + The height of the glyph in points. + width : float + The width of the glyph in points. + xmin, xmax, ymin, ymax : float + The ink rectangle of the glyph. + iceberg : float + The distance from the baseline to the top of the glyph. (This corresponds to + TeX's definition of "height".) + slanted : bool + Whether the glyph should be considered as "slanted" (currently used for kerning + sub/superscripts). + """ + advance: float + height: float + width: float + xmin: float + xmax: float + ymin: float + ymax: float + iceberg: float + slanted: bool + ... + + +class FontInfo(NamedTuple): + font: FT2Font + fontsize: float + postscript_name: str + metrics: FontMetrics + num: int + glyph: Glyph + offset: float + ... + + +class Fonts(abc.ABC): + """ + An abstract base class for a system of fonts to use for mathtext. + + The class must be able to take symbol keys and font file names and + return the character metrics. It also delegates to a backend class + to do the actual drawing. + """ + def __init__(self, default_font_prop: FontProperties, load_glyph_flags: int) -> None: + """ + Parameters + ---------- + default_font_prop : `~.font_manager.FontProperties` + The default non-math font, or the base font for Unicode (generic) + font rendering. + load_glyph_flags : int + Flags passed to the glyph loader (e.g. ``FT_Load_Glyph`` and + ``FT_Load_Char`` for FreeType-based fonts). + """ + ... + + def get_kern(self, font1: str, fontclass1: str, sym1: str, fontsize1: float, font2: str, fontclass2: str, sym2: str, fontsize2: float, dpi: float) -> float: + """ + Get the kerning distance for font between *sym1* and *sym2*. + + See `~.Fonts.get_metrics` for a detailed description of the parameters. + """ + ... + + def get_metrics(self, font: str, font_class: str, sym: str, fontsize: float, dpi: float) -> FontMetrics: + r""" + Parameters + ---------- + font : str + One of the TeX font names: "tt", "it", "rm", "cal", "sf", "bf", + "default", "regular", "bb", "frak", "scr". "default" and "regular" + are synonyms and use the non-math font. + font_class : str + One of the TeX font names (as for *font*), but **not** "bb", + "frak", or "scr". This is used to combine two font classes. The + only supported combination currently is ``get_metrics("frak", "bf", + ...)``. + sym : str + A symbol in raw TeX form, e.g., "1", "x", or "\sigma". + fontsize : float + Font size in points. + dpi : float + Rendering dots-per-inch. + + Returns + ------- + FontMetrics + """ + ... + + def render_glyph(self, output: Output, ox: float, oy: float, font: str, font_class: str, sym: str, fontsize: float, dpi: float) -> None: + """ + At position (*ox*, *oy*), draw the glyph specified by the remaining + parameters (see `get_metrics` for their detailed description). + """ + ... + + def render_rect_filled(self, output: Output, x1: float, y1: float, x2: float, y2: float) -> None: + """ + Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*). + """ + ... + + def get_xheight(self, font: str, fontsize: float, dpi: float) -> float: + """ + Get the xheight for the given *font* and *fontsize*. + """ + ... + + def get_underline_thickness(self, font: str, fontsize: float, dpi: float) -> float: + """ + Get the line thickness that matches the given font. Used as a + base unit for drawing lines such as in a fraction or radical. + """ + ... + + def get_sized_alternatives_for_symbol(self, fontname: str, sym: str) -> list[tuple[str, str]]: + """ + Override if your font provides multiple sizes of the same + symbol. Should return a list of symbols matching *sym* in + various sizes. The expression renderer will select the most + appropriate size for a given situation from this list. + """ + ... + + + +class TruetypeFonts(Fonts, metaclass=abc.ABCMeta): + """ + A generic base class for all font setups that use Truetype fonts + (through FT2Font). + """ + def __init__(self, default_font_prop: FontProperties, load_glyph_flags: int) -> None: + ... + + def get_xheight(self, fontname: str, fontsize: float, dpi: float) -> float: + ... + + def get_underline_thickness(self, font: str, fontsize: float, dpi: float) -> float: + ... + + def get_kern(self, font1: str, fontclass1: str, sym1: str, fontsize1: float, font2: str, fontclass2: str, sym2: str, fontsize2: float, dpi: float) -> float: + ... + + + +class BakomaFonts(TruetypeFonts): + """ + Use the Bakoma TrueType fonts for rendering. + + Symbols are strewn about a number of font files, each of which has + its own proprietary 8-bit encoding. + """ + _fontmap = ... + def __init__(self, default_font_prop: FontProperties, load_glyph_flags: int) -> None: + ... + + _slanted_symbols = ... + _size_alternatives = ... + def get_sized_alternatives_for_symbol(self, fontname: str, sym: str) -> list[tuple[str, str]]: + ... + + + +class UnicodeFonts(TruetypeFonts): + """ + An abstract base class for handling Unicode fonts. + + While some reasonably complete Unicode fonts (such as DejaVu) may + work in some situations, the only Unicode font I'm aware of with a + complete set of math symbols is STIX. + + This class will "fallback" on the Bakoma fonts when a required + symbol cannot be found in the font. + """ + _cmr10_substitutions = ... + def __init__(self, default_font_prop: FontProperties, load_glyph_flags: int) -> None: + ... + + _slanted_symbols = ... + def get_sized_alternatives_for_symbol(self, fontname: str, sym: str) -> list[tuple[str, str]]: + ... + + + +class DejaVuFonts(UnicodeFonts, metaclass=abc.ABCMeta): + _fontmap: dict[str | int, str] = ... + def __init__(self, default_font_prop: FontProperties, load_glyph_flags: int) -> None: + ... + + + +class DejaVuSerifFonts(DejaVuFonts): + """ + A font handling class for the DejaVu Serif fonts + + If a glyph is not found it will fallback to Stix Serif + """ + _fontmap = ... + + +class DejaVuSansFonts(DejaVuFonts): + """ + A font handling class for the DejaVu Sans fonts + + If a glyph is not found it will fallback to Stix Sans + """ + _fontmap = ... + + +class StixFonts(UnicodeFonts): + """ + A font handling class for the STIX fonts. + + In addition to what UnicodeFonts provides, this class: + + - supports "virtual fonts" which are complete alpha numeric + character sets with different font styles at special Unicode + code points, such as "Blackboard". + + - handles sized alternative characters for the STIXSizeX fonts. + """ + _fontmap: dict[str | int, str] = ... + _fallback_font = ... + _sans = ... + def __init__(self, default_font_prop: FontProperties, load_glyph_flags: int) -> None: + ... + + @functools.cache + def get_sized_alternatives_for_symbol(self, fontname: str, sym: str) -> list[tuple[str, str]] | list[tuple[int, str]]: + ... + + + +class StixSansFonts(StixFonts): + """ + A font handling class for the STIX fonts (that uses sans-serif + characters by default). + """ + _sans = ... + + +SHRINK_FACTOR = ... +NUM_SIZE_LEVELS = ... +class FontConstantsBase: + """ + A set of constants that controls how certain things, such as sub- + and superscripts are laid out. These are all metrics that can't + be reliably retrieved from the font metrics in the font itself. + """ + script_space: T.ClassVar[float] = ... + subdrop: T.ClassVar[float] = ... + sup1: T.ClassVar[float] = ... + sub1: T.ClassVar[float] = ... + sub2: T.ClassVar[float] = ... + delta: T.ClassVar[float] = ... + delta_slanted: T.ClassVar[float] = ... + delta_integral: T.ClassVar[float] = ... + + +class ComputerModernFontConstants(FontConstantsBase): + script_space = ... + subdrop = ... + sup1 = ... + sub1 = ... + sub2 = ... + delta = ... + delta_slanted = ... + delta_integral = ... + + +class STIXFontConstants(FontConstantsBase): + script_space = ... + sup1 = ... + sub2 = ... + delta = ... + delta_slanted = ... + delta_integral = ... + + +class STIXSansFontConstants(FontConstantsBase): + script_space = ... + sup1 = ... + delta_slanted = ... + delta_integral = ... + + +class DejaVuSerifFontConstants(FontConstantsBase): + ... + + +class DejaVuSansFontConstants(FontConstantsBase): + ... + + +_font_constant_mapping = ... +class Node: + """A node in the TeX box model.""" + def __init__(self) -> None: + ... + + def __repr__(self) -> str: + ... + + def get_kerning(self, next: Node | None) -> float: + ... + + def shrink(self) -> None: + """ + Shrinks one level smaller. There are only three levels of + sizes, after which things will no longer get smaller. + """ + ... + + def render(self, output: Output, x: float, y: float) -> None: + """Render this node.""" + ... + + + +class Box(Node): + """A node with a physical location.""" + def __init__(self, width: float, height: float, depth: float) -> None: + ... + + def shrink(self) -> None: + ... + + def render(self, output: Output, x1: float, y1: float, x2: float, y2: float) -> None: + ... + + + +class Vbox(Box): + """A box with only height (zero width).""" + def __init__(self, height: float, depth: float) -> None: + ... + + + +class Hbox(Box): + """A box with only width (zero height and depth).""" + def __init__(self, width: float) -> None: + ... + + + +class Char(Node): + """ + A single character. + + Unlike TeX, the font information and metrics are stored with each `Char` + to make it easier to lookup the font metrics when needed. Note that TeX + boxes have a width, height, and depth, unlike Type1 and TrueType which use + a full bounding box and an advance in the x-direction. The metrics must + be converted to the TeX model, and the advance (if different from width) + must be converted into a `Kern` node when the `Char` is added to its parent + `Hlist`. + """ + def __init__(self, c: str, state: ParserState) -> None: + ... + + def __repr__(self) -> str: + ... + + def is_slanted(self) -> bool: + ... + + def get_kerning(self, next: Node | None) -> float: + """ + Return the amount of kerning between this and the given character. + + This method is called when characters are strung together into `Hlist` + to create `Kern` nodes. + """ + ... + + def render(self, output: Output, x: float, y: float) -> None: + ... + + def shrink(self) -> None: + ... + + + +class Accent(Char): + """ + The font metrics need to be dealt with differently for accents, + since they are already offset correctly from the baseline in + TrueType fonts. + """ + def shrink(self) -> None: + ... + + def render(self, output: Output, x: float, y: float) -> None: + ... + + + +class List(Box): + """A list of nodes (either horizontal or vertical).""" + def __init__(self, elements: T.Sequence[Node]) -> None: + ... + + def __repr__(self) -> str: + ... + + def shrink(self) -> None: + ... + + + +class Hlist(List): + """A horizontal list of boxes.""" + def __init__(self, elements: T.Sequence[Node], w: float = ..., m: T.Literal['additional', 'exactly'] = ..., do_kern: bool = ...) -> None: + ... + + def kern(self) -> None: + """ + Insert `Kern` nodes between `Char` nodes to set kerning. + + The `Char` nodes themselves determine the amount of kerning they need + (in `~Char.get_kerning`), and this function just creates the correct + linked list. + """ + ... + + def hpack(self, w: float = ..., m: T.Literal['additional', 'exactly'] = ...) -> None: + r""" + Compute the dimensions of the resulting boxes, and adjust the glue if + one of those dimensions is pre-specified. The computed sizes normally + enclose all of the material inside the new box; but some items may + stick out if negative glue is used, if the box is overfull, or if a + ``\vbox`` includes other boxes that have been shifted left. + + Parameters + ---------- + w : float, default: 0 + A width. + m : {'exactly', 'additional'}, default: 'additional' + Whether to produce a box whose width is 'exactly' *w*; or a box + with the natural width of the contents, plus *w* ('additional'). + + Notes + ----- + The defaults produce a box with the natural width of the contents. + """ + ... + + + +class Vlist(List): + """A vertical list of boxes.""" + def __init__(self, elements: T.Sequence[Node], h: float = ..., m: T.Literal['additional', 'exactly'] = ...) -> None: + ... + + def vpack(self, h: float = ..., m: T.Literal['additional', 'exactly'] = ..., l: float = ...) -> None: + """ + Compute the dimensions of the resulting boxes, and to adjust the glue + if one of those dimensions is pre-specified. + + Parameters + ---------- + h : float, default: 0 + A height. + m : {'exactly', 'additional'}, default: 'additional' + Whether to produce a box whose height is 'exactly' *h*; or a box + with the natural height of the contents, plus *h* ('additional'). + l : float, default: np.inf + The maximum height. + + Notes + ----- + The defaults produce a box with the natural height of the contents. + """ + ... + + + +class Rule(Box): + """ + A solid black rectangle. + + It has *width*, *depth*, and *height* fields just as in an `Hlist`. + However, if any of these dimensions is inf, the actual value will be + determined by running the rule up to the boundary of the innermost + enclosing box. This is called a "running dimension". The width is never + running in an `Hlist`; the height and depth are never running in a `Vlist`. + """ + def __init__(self, width: float, height: float, depth: float, state: ParserState) -> None: + ... + + def render(self, output: Output, x: float, y: float, w: float, h: float) -> None: + ... + + + +class Hrule(Rule): + """Convenience class to create a horizontal rule.""" + def __init__(self, state: ParserState, thickness: float | None = ...) -> None: + ... + + + +class Vrule(Rule): + """Convenience class to create a vertical rule.""" + def __init__(self, state: ParserState) -> None: + ... + + + +class _GlueSpec(NamedTuple): + width: float + stretch: float + stretch_order: int + shrink: float + shrink_order: int + ... + + +class Glue(Node): + """ + Most of the information in this object is stored in the underlying + ``_GlueSpec`` class, which is shared between multiple glue objects. + (This is a memory optimization which probably doesn't matter anymore, but + it's easier to stick to what TeX does.) + """ + def __init__(self, glue_type: _GlueSpec | T.Literal["fil", "fill", "filll", "neg_fil", "neg_fill", "neg_filll", "empty", "ss"]) -> None: + ... + + def shrink(self) -> None: + ... + + + +class HCentered(Hlist): + """ + A convenience class to create an `Hlist` whose contents are + centered within its enclosing box. + """ + def __init__(self, elements: list[Node]) -> None: + ... + + + +class VCentered(Vlist): + """ + A convenience class to create a `Vlist` whose contents are + centered within its enclosing box. + """ + def __init__(self, elements: list[Node]) -> None: + ... + + + +class Kern(Node): + """ + A `Kern` node has a width field to specify a (normally + negative) amount of spacing. This spacing correction appears in + horizontal lists between letters like A and V when the font + designer said that it looks better to move them closer together or + further apart. A kern node can also appear in a vertical list, + when its *width* denotes additional spacing in the vertical + direction. + """ + height = ... + depth = ... + def __init__(self, width: float) -> None: + ... + + def __repr__(self) -> str: + ... + + def shrink(self) -> None: + ... + + + +class AutoHeightChar(Hlist): + """ + A character as close to the given height and depth as possible. + + When using a font with multiple height versions of some characters (such as + the BaKoMa fonts), the correct glyph will be selected, otherwise this will + always just return a scaled version of the glyph. + """ + def __init__(self, c: str, height: float, depth: float, state: ParserState, always: bool = ..., factor: float | None = ...) -> None: + ... + + + +class AutoWidthChar(Hlist): + """ + A character as close to the given width as possible. + + When using a font with multiple width versions of some characters (such as + the BaKoMa fonts), the correct glyph will be selected, otherwise this will + always just return a scaled version of the glyph. + """ + def __init__(self, c: str, width: float, state: ParserState, always: bool = ..., char_class: type[Char] = ...) -> None: + ... + + + +def ship(box: Box, xy: tuple[float, float] = ...) -> Output: + """ + Ship out *box* at offset *xy*, converting it to an `Output`. + + Since boxes can be inside of boxes inside of boxes, the main work of `ship` + is done by two mutually recursive routines, `hlist_out` and `vlist_out`, + which traverse the `Hlist` nodes and `Vlist` nodes inside of horizontal + and vertical boxes. The global variables used in TeX to store state as it + processes have become local variables here. + """ + ... + +def Error(msg: str) -> ParserElement: + """Helper class to raise parser errors.""" + ... + +class ParserState: + """ + Parser state. + + States are pushed and popped from a stack as necessary, and the "current" + state is always at the top of the stack. + + Upon entering and leaving a group { } or math/non-math, the stack is pushed + and popped accordingly. + """ + def __init__(self, fontset: Fonts, font: str, font_class: str, fontsize: float, dpi: float) -> None: + ... + + def copy(self) -> ParserState: + ... + + @property + def font(self) -> str: + ... + + @font.setter + def font(self, name: str) -> None: + ... + + def get_current_underline_thickness(self) -> float: + """Return the underline thickness for this state.""" + ... + + + +def cmd(expr: str, args: ParserElement) -> ParserElement: + r""" + Helper to define TeX commands. + + ``cmd("\cmd", args)`` is equivalent to + ``"\cmd" - (args | Error("Expected \cmd{arg}{...}"))`` where the names in + the error message are taken from element names in *args*. If *expr* + already includes arguments (e.g. "\cmd{arg}{...}"), then they are stripped + when constructing the parse element, but kept (and *expr* is used as is) in + the error message. + """ + ... + +class Parser: + """ + A pyparsing-based parser for strings containing math expressions. + + Raw text may also appear outside of pairs of ``$``. + + The grammar is based directly on that in TeX, though it cuts a few corners. + """ + class _MathStyle(enum.Enum): + DISPLAYSTYLE = ... + TEXTSTYLE = ... + SCRIPTSTYLE = ... + SCRIPTSCRIPTSTYLE = ... + + + _binary_operators = ... + _relation_symbols = ... + _arrow_symbols = ... + _spaced_symbols = ... + _punctuation_symbols = ... + _overunder_symbols = ... + _overunder_functions = ... + _dropsub_symbols = ... + _fontnames = ... + _function_names = ... + _ambi_delims = ... + _left_delims = ... + _right_delims = ... + _delims = ... + _small_greek = ... + _latin_alphabets = ... + def __init__(self) -> None: + ... + + def parse(self, s: str, fonts_object: Fonts, fontsize: float, dpi: float) -> Hlist: + """ + Parse expression *s* using the given *fonts_object* for + output, at the given *fontsize* and *dpi*. + + Returns the parse tree of `Node` instances. + """ + ... + + def get_state(self) -> ParserState: + """Get the current `State` of the parser.""" + ... + + def pop_state(self) -> None: + """Pop a `State` off of the stack.""" + ... + + def push_state(self) -> None: + """Push a new `State` onto the stack, copying the current state.""" + ... + + def main(self, toks: ParseResults) -> list[Hlist]: + ... + + def math_string(self, toks: ParseResults) -> ParseResults: + ... + + def math(self, toks: ParseResults) -> T.Any: + ... + + def non_math(self, toks: ParseResults) -> T.Any: + ... + + float_literal = ... + def text(self, toks: ParseResults) -> T.Any: + ... + + _space_widths = ... + def space(self, toks: ParseResults) -> T.Any: + ... + + def customspace(self, toks: ParseResults) -> T.Any: + ... + + def symbol(self, s: str, loc: int, toks: ParseResults | dict[str, str]) -> T.Any: + ... + + def unknown_symbol(self, s: str, loc: int, toks: ParseResults) -> T.Any: + ... + + _accent_map = ... + _wide_accents = ... + def accent(self, toks: ParseResults) -> T.Any: + ... + + def function(self, s: str, loc: int, toks: ParseResults) -> T.Any: + ... + + def operatorname(self, s: str, loc: int, toks: ParseResults) -> T.Any: + ... + + def start_group(self, toks: ParseResults) -> T.Any: + ... + + def group(self, toks: ParseResults) -> T.Any: + ... + + def required_group(self, toks: ParseResults) -> T.Any: + ... + + optional_group = ... + def end_group(self) -> T.Any: + ... + + def unclosed_group(self, s: str, loc: int, toks: ParseResults) -> T.Any: + ... + + def font(self, toks: ParseResults) -> T.Any: + ... + + def is_overunder(self, nucleus: Node) -> bool: + ... + + def is_dropsub(self, nucleus: Node) -> bool: + ... + + def is_slanted(self, nucleus: Node) -> bool: + ... + + def subsuper(self, s: str, loc: int, toks: ParseResults) -> T.Any: + ... + + def style_literal(self, toks: ParseResults) -> T.Any: + ... + + def genfrac(self, toks: ParseResults) -> T.Any: + ... + + def frac(self, toks: ParseResults) -> T.Any: + ... + + def dfrac(self, toks: ParseResults) -> T.Any: + ... + + def binom(self, toks: ParseResults) -> T.Any: + ... + + underset = ... + def sqrt(self, toks: ParseResults) -> T.Any: + ... + + def overline(self, toks: ParseResults) -> T.Any: + ... + + def auto_delim(self, toks: ParseResults) -> T.Any: + ... + + def boldsymbol(self, toks: ParseResults) -> T.Any: + ... + + def substack(self, toks: ParseResults) -> T.Any: + ... + + + diff --git a/typings/matplotlib/_mathtext_data.pyi b/typings/matplotlib/_mathtext_data.pyi new file mode 100644 index 0000000..0fb65d9 --- /dev/null +++ b/typings/matplotlib/_mathtext_data.pyi @@ -0,0 +1,13 @@ +""" +This type stub file was generated by pyright. +""" + +""" +font data tables for truetype and afm computer modern fonts +""" +latex_to_bakoma = ... +type12uni = ... +uni2type1 = ... +tex2uni = ... +stix_virtual_fonts: dict[str, dict[str, list[tuple[int, int, str, int]]] | list[tuple[int, int, str, int]]] = ... +stix_glyph_fixes = ... diff --git a/typings/matplotlib/_path.pyi b/typings/matplotlib/_path.pyi new file mode 100644 index 0000000..305de17 --- /dev/null +++ b/typings/matplotlib/_path.pyi @@ -0,0 +1,17 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from collections.abc import Sequence +from .transforms import BboxBase + +def affine_transform(points: np.ndarray, trans: np.ndarray) -> np.ndarray: + ... + +def count_bboxes_overlapping_bbox(bbox: BboxBase, bboxes: Sequence[BboxBase]) -> int: + ... + +def update_path_extents(path, trans, rect, minpos, ignore): + ... + diff --git a/typings/matplotlib/_pylab_helpers.pyi b/typings/matplotlib/_pylab_helpers.pyi new file mode 100644 index 0000000..8f06f6b --- /dev/null +++ b/typings/matplotlib/_pylab_helpers.pyi @@ -0,0 +1,52 @@ +""" +This type stub file was generated by pyright. +""" + +from collections import OrderedDict +from matplotlib.backend_bases import FigureManagerBase +from matplotlib.figure import Figure + +class Gcf: + figs: OrderedDict[int, FigureManagerBase] + @classmethod + def get_fig_manager(cls, num: int) -> FigureManagerBase | None: + ... + + @classmethod + def destroy(cls, num: int | FigureManagerBase) -> None: + ... + + @classmethod + def destroy_fig(cls, fig: Figure) -> None: + ... + + @classmethod + def destroy_all(cls) -> None: + ... + + @classmethod + def has_fignum(cls, num: int) -> bool: + ... + + @classmethod + def get_all_fig_managers(cls) -> list[FigureManagerBase]: + ... + + @classmethod + def get_num_fig_managers(cls) -> int: + ... + + @classmethod + def get_active(cls) -> FigureManagerBase | None: + ... + + @classmethod + def set_active(cls, manager: FigureManagerBase) -> None: + ... + + @classmethod + def draw_all(cls, force: bool = ...) -> None: + ... + + + diff --git a/typings/matplotlib/_qhull.pyi b/typings/matplotlib/_qhull.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/matplotlib/_qhull.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/matplotlib/_text_helpers.pyi b/typings/matplotlib/_text_helpers.pyi new file mode 100644 index 0000000..a34ed9f --- /dev/null +++ b/typings/matplotlib/_text_helpers.pyi @@ -0,0 +1,33 @@ +""" +This type stub file was generated by pyright. +""" + +""" +Low-level text helper utilities. +""" +LayoutItem = ... +def warn_on_missing_glyph(codepoint): # -> None: + ... + +def layout(string, font, *, kern_mode=...): # -> Generator[Any, Any, None]: + """ + Render *string* with *font*. For each character in *string*, yield a + (glyph-index, x-position) pair. When such a pair is yielded, the font's + glyph is set to the corresponding character. + + Parameters + ---------- + string : str + The string to be rendered. + font : FT2Font + The font. + kern_mode : int + A FreeType kerning mode. + + Yields + ------ + glyph_index : int + x_position : float + """ + ... + diff --git a/typings/matplotlib/_tight_bbox.pyi b/typings/matplotlib/_tight_bbox.pyi new file mode 100644 index 0000000..2459f51 --- /dev/null +++ b/typings/matplotlib/_tight_bbox.pyi @@ -0,0 +1,27 @@ +""" +This type stub file was generated by pyright. +""" + +""" +Helper module for the *bbox_inches* parameter in `.Figure.savefig`. +""" +def adjust_bbox(fig, bbox_inches, fixed_dpi=...): # -> () -> None: + """ + Temporarily adjust the figure so that only the specified area + (bbox_inches) is saved. + + It modifies fig.bbox, fig.bbox_inches, + fig.transFigure._boxout, and fig.patch. While the figure size + changes, the scale of the original figure is conserved. A + function which restores the original values are returned. + """ + ... + +def process_figure_for_rasterizing(fig, bbox_inches_restore, fixed_dpi=...): # -> tuple[Unknown, () -> None]: + """ + A function that needs to be called when figure dpi changes during the + drawing (e.g., rasterizing). It recovers the bbox and re-adjust it with + the new dpi. + """ + ... + diff --git a/typings/matplotlib/_tight_layout.pyi b/typings/matplotlib/_tight_layout.pyi new file mode 100644 index 0000000..c676910 --- /dev/null +++ b/typings/matplotlib/_tight_layout.pyi @@ -0,0 +1,56 @@ +""" +This type stub file was generated by pyright. +""" + +""" +Routines to adjust subplot params so that subplots are +nicely fit in the figure. In doing so, only axis labels, tick labels, axes +titles and offsetboxes that are anchored to axes are currently considered. + +Internally, this module assumes that the margins (left margin, etc.) which are +differences between ``Axes.get_tightbbox`` and ``Axes.bbox`` are independent of +Axes position. This may fail if ``Axes.adjustable`` is ``datalim`` as well as +such cases as when left or right margin are affected by xlabel. +""" +def get_subplotspec_list(axes_list, grid_spec=...): # -> list[Unknown]: + """ + Return a list of subplotspec from the given list of axes. + + For an instance of axes that does not support subplotspec, None is inserted + in the list. + + If grid_spec is given, None is inserted for those not from the given + grid_spec. + """ + ... + +def get_tight_layout_figure(fig, axes_list, subplotspec_list, renderer, pad=..., h_pad=..., w_pad=..., rect=...): # -> dict[Unknown, Unknown]: + """ + Return subplot parameters for tight-layouted-figure with specified padding. + + Parameters + ---------- + fig : Figure + axes_list : list of Axes + subplotspec_list : list of `.SubplotSpec` + The subplotspecs of each axes. + renderer : renderer + pad : float + Padding between the figure edge and the edges of subplots, as a + fraction of the font size. + h_pad, w_pad : float + Padding (height/width) between edges of adjacent subplots. Defaults to + *pad*. + rect : tuple (left, bottom, right, top), default: None. + rectangle in normalized figure coordinates + that the whole subplots area (including labels) will fit into. + Defaults to using the entire figure. + + Returns + ------- + subplotspec or None + subplotspec kwargs to be passed to `.Figure.subplots_adjust` or + None if tight_layout could not be accomplished. + """ + ... + diff --git a/typings/matplotlib/_tri.pyi b/typings/matplotlib/_tri.pyi new file mode 100644 index 0000000..2834139 --- /dev/null +++ b/typings/matplotlib/_tri.pyi @@ -0,0 +1,54 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any + +class TrapezoidMapTriFinder: + def __init__(self, *args, **kwargs) -> None: + ... + + def find_many(self, *args, **kwargs) -> Any: + ... + + def get_tree_stats(self, *args, **kwargs) -> Any: + ... + + def initialize(self, *args, **kwargs) -> Any: + ... + + def print_tree(self, *args, **kwargs) -> Any: + ... + + + +class TriContourGenerator: + def __init__(self, *args, **kwargs) -> None: + ... + + def create_contour(self, *args, **kwargs) -> Any: + ... + + def create_filled_contour(self, *args, **kwargs) -> Any: + ... + + + +class Triangulation: + def __init__(self, *args, **kwargs) -> None: + ... + + def calculate_plane_coefficients(self, *args, **kwargs) -> Any: + ... + + def get_edges(self, *args, **kwargs) -> Any: + ... + + def get_neighbors(self, *args, **kwargs) -> Any: + ... + + def set_mask(self, *args, **kwargs) -> Any: + ... + + + diff --git a/typings/matplotlib/_ttconv.pyi b/typings/matplotlib/_ttconv.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/matplotlib/_ttconv.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/matplotlib/_type1font.pyi b/typings/matplotlib/_type1font.pyi new file mode 100644 index 0000000..be39a3b --- /dev/null +++ b/typings/matplotlib/_type1font.pyi @@ -0,0 +1,207 @@ +""" +This type stub file was generated by pyright. +""" + +import functools + +""" +A class representing a Type 1 font. + +This version reads pfa and pfb files and splits them for embedding in +pdf files. It also supports SlantFont and ExtendFont transformations, +similarly to pdfTeX and friends. There is no support yet for subsetting. + +Usage:: + + font = Type1Font(filename) + clear_part, encrypted_part, finale = font.parts + slanted_font = font.transform({'slant': 0.167}) + extended_font = font.transform({'extend': 1.2}) + +Sources: + +* Adobe Technical Note #5040, Supporting Downloadable PostScript + Language Fonts. + +* Adobe Type 1 Font Format, Adobe Systems Incorporated, third printing, + v1.1, 1993. ISBN 0-201-57044-0. +""" +_log = ... +class _Token: + """ + A token in a PostScript stream. + + Attributes + ---------- + pos : int + Position, i.e. offset from the beginning of the data. + raw : str + Raw text of the token. + kind : str + Description of the token (for debugging or testing). + """ + __slots__ = ... + kind = ... + def __init__(self, pos, raw) -> None: + ... + + def __str__(self) -> str: + ... + + def endpos(self): + """Position one past the end of the token""" + ... + + def is_keyword(self, *names): # -> Literal[False]: + """Is this a name token with one of the names?""" + ... + + def is_slash_name(self): # -> Literal[False]: + """Is this a name token that starts with a slash?""" + ... + + def is_delim(self): # -> Literal[False]: + """Is this a delimiter token?""" + ... + + def is_number(self): # -> Literal[False]: + """Is this a number token?""" + ... + + def value(self): # -> Unknown: + ... + + + +class _NameToken(_Token): + kind = ... + def is_slash_name(self): + ... + + def value(self): + ... + + + +class _BooleanToken(_Token): + kind = ... + def value(self): + ... + + + +class _KeywordToken(_Token): + kind = ... + def is_keyword(self, *names): # -> bool: + ... + + + +class _DelimiterToken(_Token): + kind = ... + def is_delim(self): # -> Literal[True]: + ... + + def opposite(self): # -> str: + ... + + + +class _WhitespaceToken(_Token): + kind = ... + + +class _StringToken(_Token): + kind = ... + _escapes_re = ... + _replacements = ... + _ws_re = ... + @functools.lru_cache + def value(self): # -> str | bytes: + ... + + + +class _BinaryToken(_Token): + kind = ... + def value(self): + ... + + + +class _NumberToken(_Token): + kind = ... + def is_number(self): # -> Literal[True]: + ... + + def value(self): # -> int | float: + ... + + + +class _BalancedExpression(_Token): + ... + + +class Type1Font: + """ + A class representing a Type-1 font, for use by backends. + + Attributes + ---------- + parts : tuple + A 3-tuple of the cleartext part, the encrypted part, and the finale of + zeros. + + decrypted : bytes + The decrypted form of ``parts[1]``. + + prop : dict[str, Any] + A dictionary of font properties. Noteworthy keys include: + + - FontName: PostScript name of the font + - Encoding: dict from numeric codes to glyph names + - FontMatrix: bytes object encoding a matrix + - UniqueID: optional font identifier, dropped when modifying the font + - CharStrings: dict from glyph names to byte code + - Subrs: array of byte code subroutines + - OtherSubrs: bytes object encoding some PostScript code + """ + __slots__ = ... + def __init__(self, input) -> None: + """ + Initialize a Type-1 font. + + Parameters + ---------- + input : str or 3-tuple + Either a pfb file name, or a 3-tuple of already-decoded Type-1 + font `~.Type1Font.parts`. + """ + ... + + def transform(self, effects): # -> Type1Font: + """ + Return a new font that is slanted and/or extended. + + Parameters + ---------- + effects : dict + A dict with optional entries: + + - 'slant' : float, default: 0 + Tangent of the angle that the font is to be slanted to the + right. Negative values slant to the left. + - 'extend' : float, default: 1 + Scaling factor for the font width. Values less than 1 condense + the glyphs. + + Returns + ------- + `Type1Font` + """ + ... + + + +_StandardEncoding = ... diff --git a/typings/matplotlib/_version.pyi b/typings/matplotlib/_version.pyi new file mode 100644 index 0000000..be1231e --- /dev/null +++ b/typings/matplotlib/_version.pyi @@ -0,0 +1,17 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Tuple, Union + +TYPE_CHECKING = ... +if TYPE_CHECKING: + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + ... +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE +version = ... +version_tuple = ... diff --git a/typings/matplotlib/animation.pyi b/typings/matplotlib/animation.pyi new file mode 100644 index 0000000..b73309a --- /dev/null +++ b/typings/matplotlib/animation.pyi @@ -0,0 +1,251 @@ +""" +This type stub file was generated by pyright. +""" + +import abc +import contextlib +from collections.abc import Callable, Collection, Generator, Iterable, Sequence +from pathlib import Path +from matplotlib.artist import Artist +from matplotlib.backend_bases import TimerBase +from matplotlib.figure import Figure +from typing import Any + +subprocess_creation_flags: int +def adjusted_figsize(w: float, h: float, dpi: float, n: int) -> tuple[float, float]: + ... + +class MovieWriterRegistry: + def __init__(self) -> None: + ... + + def register(self, name: str) -> Callable[[type[AbstractMovieWriter]], type[AbstractMovieWriter]]: + ... + + def is_available(self, name: str) -> bool: + ... + + def __iter__(self) -> Generator[str, None, None]: + ... + + def list(self) -> list[str]: + ... + + def __getitem__(self, name: str) -> type[AbstractMovieWriter]: + ... + + + +writers: MovieWriterRegistry +class AbstractMovieWriter(abc.ABC, metaclass=abc.ABCMeta): + fps: int + metadata: dict[str, str] + codec: str + bitrate: int + def __init__(self, fps: int = ..., metadata: dict[str, str] | None = ..., codec: str | None = ..., bitrate: int | None = ...) -> None: + ... + + outfile: str | Path + fig: Figure + dpi: float + @abc.abstractmethod + def setup(self, fig: Figure, outfile: str | Path, dpi: float | None = ...) -> None: + ... + + @property + def frame_size(self) -> tuple[int, int]: + ... + + @abc.abstractmethod + def grab_frame(self, **savefig_kwargs) -> None: + ... + + @abc.abstractmethod + def finish(self) -> None: + ... + + @contextlib.contextmanager + def saving(self, fig: Figure, outfile: str | Path, dpi: float | None, *args, **kwargs) -> Generator[AbstractMovieWriter, None, None]: + ... + + + +class MovieWriter(AbstractMovieWriter): + supported_formats: list[str] + frame_format: str + extra_args: list[str] | None + def __init__(self, fps: int = ..., codec: str | None = ..., bitrate: int | None = ..., extra_args: list[str] | None = ..., metadata: dict[str, str] | None = ...) -> None: + ... + + def setup(self, fig: Figure, outfile: str | Path, dpi: float | None = ...) -> None: + ... + + def grab_frame(self, **savefig_kwargs) -> None: + ... + + def finish(self) -> None: + ... + + @classmethod + def bin_path(cls) -> str: + ... + + @classmethod + def isAvailable(cls) -> bool: + ... + + + +class FileMovieWriter(MovieWriter): + fig: Figure + outfile: str | Path + dpi: float + temp_prefix: str + fname_format_str: str + def setup(self, fig: Figure, outfile: str | Path, dpi: float | None = ..., frame_prefix: str | Path | None = ...) -> None: + ... + + def __del__(self) -> None: + ... + + @property + def frame_format(self) -> str: + ... + + @frame_format.setter + def frame_format(self, frame_format: str) -> None: + ... + + + +class PillowWriter(AbstractMovieWriter): + @classmethod + def isAvailable(cls) -> bool: + ... + + def setup(self, fig: Figure, outfile: str | Path, dpi: float | None = ...) -> None: + ... + + def grab_frame(self, **savefig_kwargs) -> None: + ... + + def finish(self) -> None: + ... + + + +class FFMpegBase: + codec: str + @property + def output_args(self) -> list[str]: + ... + + + +class FFMpegWriter(FFMpegBase, MovieWriter): + ... + + +class FFMpegFileWriter(FFMpegBase, FileMovieWriter): + supported_formats: list[str] + ... + + +class ImageMagickBase: + @classmethod + def bin_path(cls) -> str: + ... + + @classmethod + def isAvailable(cls) -> bool: + ... + + + +class ImageMagickWriter(ImageMagickBase, MovieWriter): + input_names: str + ... + + +class ImageMagickFileWriter(ImageMagickBase, FileMovieWriter): + supported_formats: list[str] + @property + def input_names(self) -> str: + ... + + + +class HTMLWriter(FileMovieWriter): + supported_formats: list[str] + @classmethod + def isAvailable(cls) -> bool: + ... + + embed_frames: bool + default_mode: str + def __init__(self, fps: int = ..., codec: str | None = ..., bitrate: int | None = ..., extra_args: list[str] | None = ..., metadata: dict[str, str] | None = ..., embed_frames: bool = ..., default_mode: str = ..., embed_limit: float | None = ...) -> None: + ... + + def setup(self, fig: Figure, outfile: str | Path, dpi: float | None = ..., frame_dir: str | Path | None = ...) -> None: + ... + + def grab_frame(self, **savefig_kwargs): + ... + + def finish(self) -> None: + ... + + + +class Animation: + frame_seq: Iterable[Artist] + event_source: Any + def __init__(self, fig: Figure, event_source: Any | None = ..., blit: bool = ...) -> None: + ... + + def __del__(self) -> None: + ... + + def save(self, filename: str | Path, writer: AbstractMovieWriter | str | None = ..., fps: int | None = ..., dpi: float | None = ..., codec: str | None = ..., bitrate: int | None = ..., extra_args: list[str] | None = ..., metadata: dict[str, str] | None = ..., extra_anim: list[Animation] | None = ..., savefig_kwargs: dict[str, Any] | None = ..., *, progress_callback: Callable[[int, int], Any] | None = ...) -> None: + ... + + def new_frame_seq(self) -> Iterable[Artist]: + ... + + def new_saved_frame_seq(self) -> Iterable[Artist]: + ... + + def to_html5_video(self, embed_limit: float | None = ...) -> str: + ... + + def to_jshtml(self, fps: int | None = ..., embed_frames: bool = ..., default_mode: str | None = ...) -> str: + ... + + def pause(self) -> None: + ... + + def resume(self) -> None: + ... + + + +class TimedAnimation(Animation): + repeat: bool + def __init__(self, fig: Figure, interval: int = ..., repeat_delay: int = ..., repeat: bool = ..., event_source: TimerBase | None = ..., *args, **kwargs) -> None: + ... + + + +class ArtistAnimation(TimedAnimation): + def __init__(self, fig: Figure, artists: Sequence[Collection[Artist]], *args, **kwargs) -> None: + ... + + + +class FuncAnimation(TimedAnimation): + save_count: int + def __init__(self, fig: Figure, func: Callable[..., Iterable[Artist]], frames: Iterable[Artist] | int | Callable[[], Generator] | None = ..., init_func: Callable[[], Iterable[Artist]] | None = ..., fargs: tuple[Any, ...] | None = ..., save_count: int | None = ..., *, cache_frame_data: bool = ..., **kwargs) -> None: + ... + + + diff --git a/typings/matplotlib/artist.pyi b/typings/matplotlib/artist.pyi new file mode 100644 index 0000000..114d5e4 --- /dev/null +++ b/typings/matplotlib/artist.pyi @@ -0,0 +1,320 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from .axes._base import _AxesBase +from .backend_bases import MouseEvent, RendererBase +from .figure import Figure, SubFigure +from .path import Path +from .patches import Patch +from .patheffects import AbstractPathEffect +from .transforms import Bbox, BboxBase, Transform, TransformedPatchPath, TransformedPath +from collections.abc import Callable, Iterable +from typing import Any, NamedTuple, TextIO, overload +from numpy.typing import ArrayLike + +def allow_rasterization(draw): + ... + +class _XYPair(NamedTuple): + x: ArrayLike + y: ArrayLike + ... + + +class _Unset: + ... + + +class Artist: + zorder: float + stale_callback: Callable[[Artist, bool], None] | None + figure: Figure | SubFigure | None + clipbox: BboxBase | None + def __init__(self) -> None: + ... + + def remove(self) -> None: + ... + + def have_units(self) -> bool: + ... + + def convert_xunits(self, x): + ... + + def convert_yunits(self, y): + ... + + @property + def axes(self) -> _AxesBase | None: + ... + + @axes.setter + def axes(self, new_axes: _AxesBase | None) -> None: + ... + + @property + def stale(self) -> bool: + ... + + @stale.setter + def stale(self, val: bool) -> None: + ... + + def get_window_extent(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + def get_tightbbox(self, renderer: RendererBase | None = ...) -> Bbox | None: + ... + + def add_callback(self, func: Callable[[Artist], Any]) -> int: + ... + + def remove_callback(self, oid: int) -> None: + ... + + def pchanged(self) -> None: + ... + + def is_transform_set(self) -> bool: + ... + + def set_transform(self, t: Transform | None) -> None: + ... + + def get_transform(self) -> Transform: + ... + + def get_children(self) -> list[Artist]: + ... + + def contains(self, mouseevent: MouseEvent) -> tuple[bool, dict[Any, Any]]: + ... + + def pickable(self) -> bool: + ... + + def pick(self, mouseevent: MouseEvent) -> None: + ... + + def set_picker(self, picker: None | bool | float | Callable[[Artist, MouseEvent], tuple[bool, dict[Any, Any]]]) -> None: + ... + + def get_picker(self) -> None | bool | float | Callable[[Artist, MouseEvent], tuple[bool, dict[Any, Any]]]: + ... + + def get_url(self) -> str | None: + ... + + def set_url(self, url: str | None) -> None: + ... + + def get_gid(self) -> str | None: + ... + + def set_gid(self, gid: str | None) -> None: + ... + + def get_snap(self) -> bool | None: + ... + + def set_snap(self, snap: bool | None) -> None: + ... + + def get_sketch_params(self) -> tuple[float, float, float] | None: + ... + + def set_sketch_params(self, scale: float | None = ..., length: float | None = ..., randomness: float | None = ...) -> None: + ... + + def set_path_effects(self, path_effects: list[AbstractPathEffect]) -> None: + ... + + def get_path_effects(self) -> list[AbstractPathEffect]: + ... + + def get_figure(self) -> Figure | None: + ... + + def set_figure(self, fig: Figure) -> None: + ... + + def set_clip_box(self, clipbox: BboxBase | None) -> None: + ... + + def set_clip_path(self, path: Patch | Path | TransformedPath | TransformedPatchPath | None, transform: Transform | None = ...) -> None: + ... + + def get_alpha(self) -> float | None: + ... + + def get_visible(self) -> bool: + ... + + def get_animated(self) -> bool: + ... + + def get_in_layout(self) -> bool: + ... + + def get_clip_on(self) -> bool: + ... + + def get_clip_box(self) -> Bbox | None: + ... + + def get_clip_path(self) -> Patch | Path | TransformedPath | TransformedPatchPath | None: + ... + + def get_transformed_clip_path_and_affine(self) -> tuple[None, None] | tuple[Path, Transform]: + ... + + def set_clip_on(self, b: bool) -> None: + ... + + def get_rasterized(self) -> bool: + ... + + def set_rasterized(self, rasterized: bool) -> None: + ... + + def get_agg_filter(self) -> Callable[[ArrayLike, float], tuple[np.ndarray, float, float]] | None: + ... + + def set_agg_filter(self, filter_func: Callable[[ArrayLike, float], tuple[np.ndarray, float, float]] | None) -> None: + ... + + def draw(self, renderer: RendererBase) -> None: + ... + + def set_alpha(self, alpha: float | None) -> None: + ... + + def set_visible(self, b: bool) -> None: + ... + + def set_animated(self, b: bool) -> None: + ... + + def set_in_layout(self, in_layout: bool) -> None: + ... + + def get_label(self) -> object: + ... + + def set_label(self, s: object) -> None: + ... + + def get_zorder(self) -> float: + ... + + def set_zorder(self, level: float) -> None: + ... + + @property + def sticky_edges(self) -> _XYPair: + ... + + def update_from(self, other: Artist) -> None: + ... + + def properties(self) -> dict[str, Any]: + ... + + def update(self, props: dict[str, Any]) -> list[Any]: + ... + + def set(self, **kwargs: Any) -> list[Any]: + ... + + def findobj(self, match: None | Callable[[Artist], bool] | type[Artist] = ..., include_self: bool = ...) -> list[Artist]: + ... + + def get_cursor_data(self, event: MouseEvent) -> Any: + ... + + def format_cursor_data(self, data: Any) -> str: + ... + + def get_mouseover(self) -> bool: + ... + + def set_mouseover(self, mouseover: bool) -> None: + ... + + @property + def mouseover(self) -> bool: + ... + + @mouseover.setter + def mouseover(self, mouseover: bool) -> None: + ... + + + +class ArtistInspector: + oorig: Artist | type[Artist] + o: type[Artist] + aliasd: dict[str, set[str]] + def __init__(self, o: Artist | type[Artist] | Iterable[Artist | type[Artist]]) -> None: + ... + + def get_aliases(self) -> dict[str, set[str]]: + ... + + def get_valid_values(self, attr: str) -> str | None: + ... + + def get_setters(self) -> list[str]: + ... + + @staticmethod + def number_of_parameters(func: Callable) -> int: + ... + + @staticmethod + def is_alias(method: Callable) -> bool: + ... + + def aliased_name(self, s: str) -> str: + ... + + def aliased_name_rest(self, s: str, target: str) -> str: + ... + + @overload + def pprint_setters(self, prop: None = ..., leadingspace: int = ...) -> list[str]: + ... + + @overload + def pprint_setters(self, prop: str, leadingspace: int = ...) -> str: + ... + + @overload + def pprint_setters_rest(self, prop: None = ..., leadingspace: int = ...) -> list[str]: + ... + + @overload + def pprint_setters_rest(self, prop: str, leadingspace: int = ...) -> str: + ... + + def properties(self) -> dict[str, Any]: + ... + + def pprint_getters(self) -> list[str]: + ... + + + +def getp(obj: Artist, property: str | None = ...) -> Any: + ... + +get = ... +def setp(obj: Artist, *args, file: TextIO | None = ..., **kwargs) -> list[Any] | None: + ... + +def kwdoc(artist: Artist | type[Artist] | Iterable[Artist | type[Artist]]) -> str: + ... + diff --git a/typings/matplotlib/axes/__init__.pyi b/typings/matplotlib/axes/__init__.pyi new file mode 100644 index 0000000..51bf2c6 --- /dev/null +++ b/typings/matplotlib/axes/__init__.pyi @@ -0,0 +1,22 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import TypeVar +from ._axes import * +from ._axes import Axes as Subplot + +_T = TypeVar("_T") +class _SubplotBaseMeta(type): + def __instancecheck__(self, obj) -> bool: + ... + + + +class SubplotBase(metaclass=_SubplotBaseMeta): + ... + + +def subplot_class_factory(cls: type[_T]) -> type[_T]: + ... + diff --git a/typings/matplotlib/axes/_axes.pyi b/typings/matplotlib/axes/_axes.pyi new file mode 100644 index 0000000..17c4bff --- /dev/null +++ b/typings/matplotlib/axes/_axes.pyi @@ -0,0 +1,258 @@ +""" +This type stub file was generated by pyright. +""" + +import datetime +import PIL.Image +import numpy as np +from matplotlib.axes._base import _AxesBase +from matplotlib.axes._secondary_axes import SecondaryAxis +from matplotlib.artist import Artist +from matplotlib.backend_bases import RendererBase +from matplotlib.collections import BrokenBarHCollection, Collection, EventCollection, LineCollection, PathCollection, PolyCollection, QuadMesh +from matplotlib.colors import Colormap, Normalize +from matplotlib.container import BarContainer, ErrorbarContainer, StemContainer +from matplotlib.contour import ContourSet, QuadContourSet +from matplotlib.image import AxesImage, PcolorImage +from matplotlib.legend import Legend +from matplotlib.legend_handler import HandlerBase +from matplotlib.lines import Line2D +from matplotlib.mlab import GaussianKDE +from matplotlib.patches import FancyArrow, Polygon, Rectangle, StepPatch, Wedge +from matplotlib.quiver import Barbs, Quiver, QuiverKey +from matplotlib.text import Annotation, Text +from matplotlib.transforms import Bbox, Transform +from collections.abc import Callable, Sequence +from typing import Any, Literal, overload +from numpy.typing import ArrayLike +from matplotlib.typing import ColorType, LineStyleType, MarkerType + +class Axes(_AxesBase): + def get_title(self, loc: Literal["left", "center", "right"] = ...) -> str: + ... + + def set_title(self, label: str, fontdict: dict[str, Any] | None = ..., loc: Literal["left", "center", "right"] | None = ..., pad: float | None = ..., *, y: float | None = ..., **kwargs) -> Text: + ... + + def get_legend_handles_labels(self, legend_handler_map: dict[type, HandlerBase] | None = ...) -> tuple[list[Artist], list[Any]]: + ... + + legend_: Legend | None + @overload + def legend(self) -> Legend: + ... + + @overload + def legend(self, handles: Sequence[Artist | tuple[Artist, ...]], labels: Sequence[str], **kwargs) -> Legend: + ... + + @overload + def legend(self, *, handles: Sequence[Artist | tuple[Artist, ...]], **kwargs) -> Legend: + ... + + @overload + def legend(self, labels: Sequence[str], **kwargs) -> Legend: + ... + + @overload + def legend(self, **kwargs) -> Legend: + ... + + def inset_axes(self, bounds: tuple[float, float, float, float], *, transform: Transform | None = ..., zorder: float = ..., **kwargs) -> Axes: + ... + + def indicate_inset(self, bounds: tuple[float, float, float, float], inset_ax: Axes | None = ..., *, transform: Transform | None = ..., facecolor: ColorType = ..., edgecolor: ColorType = ..., alpha: float = ..., zorder: float = ..., **kwargs) -> Rectangle: + ... + + def indicate_inset_zoom(self, inset_ax: Axes, **kwargs) -> Rectangle: + ... + + def secondary_xaxis(self, location: Literal["top", "bottom"] | float, *, functions: tuple[Callable[[ArrayLike], ArrayLike], Callable[[ArrayLike], ArrayLike]] | Transform | None = ..., **kwargs) -> SecondaryAxis: + ... + + def secondary_yaxis(self, location: Literal["left", "right"] | float, *, functions: tuple[Callable[[ArrayLike], ArrayLike], Callable[[ArrayLike], ArrayLike]] | Transform | None = ..., **kwargs) -> SecondaryAxis: + ... + + def text(self, x: float, y: float, s: str, fontdict: dict[str, Any] | None = ..., **kwargs) -> Text: + ... + + def annotate(self, text: str, xy: tuple[float, float], xytext: tuple[float, float] | None = ..., xycoords: str | Artist | Transform | Callable[[RendererBase], Bbox | Transform] | tuple[float, float] = ..., textcoords: str | Artist | Transform | Callable[[RendererBase], Bbox | Transform] | tuple[float, float] | None = ..., arrowprops: dict[str, Any] | None = ..., annotation_clip: bool | None = ..., **kwargs) -> Annotation: + ... + + def axhline(self, y: float = ..., xmin: float = ..., xmax: float = ..., **kwargs) -> Line2D: + ... + + def axvline(self, x: float = ..., ymin: float = ..., ymax: float = ..., **kwargs) -> Line2D: + ... + + def axline(self, xy1: tuple[float, float], xy2: tuple[float, float] | None = ..., *, slope: float | None = ..., **kwargs) -> Line2D: + ... + + def axhspan(self, ymin: float, ymax: float, xmin: float = ..., xmax: float = ..., **kwargs) -> Polygon: + ... + + def axvspan(self, xmin: float, xmax: float, ymin: float = ..., ymax: float = ..., **kwargs) -> Polygon: + ... + + def hlines(self, y: float | ArrayLike, xmin: float | ArrayLike, xmax: float | ArrayLike, colors: ColorType | Sequence[ColorType] | None = ..., linestyles: LineStyleType = ..., label: str = ..., *, data=..., **kwargs) -> LineCollection: + ... + + def vlines(self, x: float | ArrayLike, ymin: float | ArrayLike, ymax: float | ArrayLike, colors: ColorType | Sequence[ColorType] | None = ..., linestyles: LineStyleType = ..., label: str = ..., *, data=..., **kwargs) -> LineCollection: + ... + + def eventplot(self, positions: ArrayLike | Sequence[ArrayLike], orientation: Literal["horizontal", "vertical"] = ..., lineoffsets: float | Sequence[float] = ..., linelengths: float | Sequence[float] = ..., linewidths: float | Sequence[float] | None = ..., colors: ColorType | Sequence[ColorType] | None = ..., alpha: float | Sequence[float] | None = ..., linestyles: LineStyleType | Sequence[LineStyleType] = ..., *, data=..., **kwargs) -> EventCollection: + ... + + def plot(self, *args: float | ArrayLike | str, scalex: bool = ..., scaley: bool = ..., data=..., **kwargs) -> list[Line2D]: + ... + + def plot_date(self, x: ArrayLike, y: ArrayLike, fmt: str = ..., tz: str | datetime.tzinfo | None = ..., xdate: bool = ..., ydate: bool = ..., *, data=..., **kwargs) -> list[Line2D]: + ... + + def loglog(self, *args, **kwargs) -> list[Line2D]: + ... + + def semilogx(self, *args, **kwargs) -> list[Line2D]: + ... + + def semilogy(self, *args, **kwargs) -> list[Line2D]: + ... + + def acorr(self, x: ArrayLike, *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, LineCollection | Line2D, Line2D | None]: + ... + + def xcorr(self, x: ArrayLike, y: ArrayLike, normed: bool = ..., detrend: Callable[[ArrayLike], ArrayLike] = ..., usevlines: bool = ..., maxlags: int = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, LineCollection | Line2D, Line2D | None]: + ... + + def step(self, x: ArrayLike, y: ArrayLike, *args, where: Literal["pre", "post", "mid"] = ..., data=..., **kwargs) -> list[Line2D]: + ... + + def bar(self, x: float | ArrayLike, height: float | ArrayLike, width: float | ArrayLike = ..., bottom: float | ArrayLike | None = ..., *, align: Literal["center", "edge"] = ..., data=..., **kwargs) -> BarContainer: + ... + + def barh(self, y: float | ArrayLike, width: float | ArrayLike, height: float | ArrayLike = ..., left: float | ArrayLike | None = ..., *, align: Literal["center", "edge"] = ..., data=..., **kwargs) -> BarContainer: + ... + + def bar_label(self, container: BarContainer, labels: ArrayLike | None = ..., *, fmt: str | Callable[[float], str] = ..., label_type: Literal["center", "edge"] = ..., padding: float = ..., **kwargs) -> list[Annotation]: + ... + + def broken_barh(self, xranges: Sequence[tuple[float, float]], yrange: tuple[float, float], *, data=..., **kwargs) -> BrokenBarHCollection: + ... + + def stem(self, *args: ArrayLike | str, linefmt: str | None = ..., markerfmt: str | None = ..., basefmt: str | None = ..., bottom: float = ..., label: str | None = ..., orientation: Literal["vertical", "horizontal"] = ..., data=...) -> StemContainer: + ... + + def pie(self, x: ArrayLike, explode: ArrayLike | None = ..., labels: Sequence[str] | None = ..., colors: ColorType | Sequence[ColorType] | None = ..., autopct: str | Callable[[float], str] | None = ..., pctdistance: float = ..., shadow: bool = ..., labeldistance: float | None = ..., startangle: float = ..., radius: float = ..., counterclock: bool = ..., wedgeprops: dict[str, Any] | None = ..., textprops: dict[str, Any] | None = ..., center: tuple[float, float] = ..., frame: bool = ..., rotatelabels: bool = ..., *, normalize: bool = ..., hatch: str | Sequence[str] | None = ..., data=...) -> tuple[list[Wedge], list[Text]] | tuple[list[Wedge], list[Text], list[Text]]: + ... + + def errorbar(self, x: float | ArrayLike, y: float | ArrayLike, yerr: float | ArrayLike | None = ..., xerr: float | ArrayLike | None = ..., fmt: str = ..., ecolor: ColorType | None = ..., elinewidth: float | None = ..., capsize: float | None = ..., barsabove: bool = ..., lolims: bool | ArrayLike = ..., uplims: bool | ArrayLike = ..., xlolims: bool | ArrayLike = ..., xuplims: bool | ArrayLike = ..., errorevery: int | tuple[int, int] = ..., capthick: float | None = ..., *, data=..., **kwargs) -> ErrorbarContainer: + ... + + def boxplot(self, x: ArrayLike | Sequence[ArrayLike], notch: bool | None = ..., sym: str | None = ..., vert: bool | None = ..., whis: float | tuple[float, float] | None = ..., positions: ArrayLike | None = ..., widths: float | ArrayLike | None = ..., patch_artist: bool | None = ..., bootstrap: int | None = ..., usermedians: ArrayLike | None = ..., conf_intervals: ArrayLike | None = ..., meanline: bool | None = ..., showmeans: bool | None = ..., showcaps: bool | None = ..., showbox: bool | None = ..., showfliers: bool | None = ..., boxprops: dict[str, Any] | None = ..., labels: Sequence[str] | None = ..., flierprops: dict[str, Any] | None = ..., medianprops: dict[str, Any] | None = ..., meanprops: dict[str, Any] | None = ..., capprops: dict[str, Any] | None = ..., whiskerprops: dict[str, Any] | None = ..., manage_ticks: bool = ..., autorange: bool = ..., zorder: float | None = ..., capwidths: float | ArrayLike | None = ..., *, data=...) -> dict[str, Any]: + ... + + def bxp(self, bxpstats: Sequence[dict[str, Any]], positions: ArrayLike | None = ..., widths: float | ArrayLike | None = ..., vert: bool = ..., patch_artist: bool = ..., shownotches: bool = ..., showmeans: bool = ..., showcaps: bool = ..., showbox: bool = ..., showfliers: bool = ..., boxprops: dict[str, Any] | None = ..., whiskerprops: dict[str, Any] | None = ..., flierprops: dict[str, Any] | None = ..., medianprops: dict[str, Any] | None = ..., capprops: dict[str, Any] | None = ..., meanprops: dict[str, Any] | None = ..., meanline: bool = ..., manage_ticks: bool = ..., zorder: float | None = ..., capwidths: float | ArrayLike | None = ...) -> dict[str, Any]: + ... + + def scatter(self, x: float | ArrayLike, y: float | ArrayLike, s: float | ArrayLike | None = ..., c: Sequence[ColorType] | ColorType | None = ..., marker: MarkerType | None = ..., cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., vmin: float | None = ..., vmax: float | None = ..., alpha: float | None = ..., linewidths: float | Sequence[float] | None = ..., *, edgecolors: Literal["face", "none"] | ColorType | Sequence[ColorType] | None = ..., plotnonfinite: bool = ..., data=..., **kwargs) -> PathCollection: + ... + + def hexbin(self, x: ArrayLike, y: ArrayLike, C: ArrayLike | None = ..., gridsize: int | tuple[int, int] = ..., bins: Literal["log"] | int | Sequence[float] | None = ..., xscale: Literal["linear", "log"] = ..., yscale: Literal["linear", "log"] = ..., extent: tuple[float, float, float, float] | None = ..., cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., vmin: float | None = ..., vmax: float | None = ..., alpha: float | None = ..., linewidths: float | None = ..., edgecolors: Literal["face", "none"] | ColorType = ..., reduce_C_function: Callable[[np.ndarray | list[float]], float] = ..., mincnt: int | None = ..., marginals: bool = ..., *, data=..., **kwargs) -> PolyCollection: + ... + + def arrow(self, x: float, y: float, dx: float, dy: float, **kwargs) -> FancyArrow: + ... + + def quiverkey(self, Q: Quiver, X: float, Y: float, U: float, label: str, **kwargs) -> QuiverKey: + ... + + def quiver(self, *args, data=..., **kwargs) -> Quiver: + ... + + def barbs(self, *args, data=..., **kwargs) -> Barbs: + ... + + def fill(self, *args, data=..., **kwargs) -> list[Polygon]: + ... + + def fill_between(self, x: ArrayLike, y1: ArrayLike | float, y2: ArrayLike | float = ..., where: Sequence[bool] | None = ..., interpolate: bool = ..., step: Literal["pre", "post", "mid"] | None = ..., *, data=..., **kwargs) -> PolyCollection: + ... + + def fill_betweenx(self, y: ArrayLike, x1: ArrayLike | float, x2: ArrayLike | float = ..., where: Sequence[bool] | None = ..., step: Literal["pre", "post", "mid"] | None = ..., interpolate: bool = ..., *, data=..., **kwargs) -> PolyCollection: + ... + + def imshow(self, X: ArrayLike | PIL.Image.Image, cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., *, aspect: Literal["equal", "auto"] | float | None = ..., interpolation: str | None = ..., alpha: float | ArrayLike | None = ..., vmin: float | None = ..., vmax: float | None = ..., origin: Literal["upper", "lower"] | None = ..., extent: tuple[float, float, float, float] | None = ..., interpolation_stage: Literal["data", "rgba"] | None = ..., filternorm: bool = ..., filterrad: float = ..., resample: bool | None = ..., url: str | None = ..., data=..., **kwargs) -> AxesImage: + ... + + def pcolor(self, *args: ArrayLike, shading: Literal["flat", "nearest", "auto"] | None = ..., alpha: float | None = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., data=..., **kwargs) -> Collection: + ... + + def pcolormesh(self, *args: ArrayLike, alpha: float | None = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., shading: Literal["flat", "nearest", "gouraud", "auto"] | None = ..., antialiased: bool = ..., data=..., **kwargs) -> QuadMesh: + ... + + def pcolorfast(self, *args: ArrayLike | tuple[float, float], alpha: float | None = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., data=..., **kwargs) -> AxesImage | PcolorImage | QuadMesh: + ... + + def contour(self, *args, data=..., **kwargs) -> QuadContourSet: + ... + + def contourf(self, *args, data=..., **kwargs) -> QuadContourSet: + ... + + def clabel(self, CS: ContourSet, levels: ArrayLike | None = ..., **kwargs) -> list[Text]: + ... + + def hist(self, x: ArrayLike | Sequence[ArrayLike], bins: int | Sequence[float] | str | None = ..., range: tuple[float, float] | None = ..., density: bool = ..., weights: ArrayLike | None = ..., cumulative: bool | float = ..., bottom: ArrayLike | float | None = ..., histtype: Literal["bar", "barstacked", "step", "stepfilled"] = ..., align: Literal["left", "mid", "right"] = ..., orientation: Literal["vertical", "horizontal"] = ..., rwidth: float | None = ..., log: bool = ..., color: ColorType | Sequence[ColorType] | None = ..., label: str | Sequence[str] | None = ..., stacked: bool = ..., *, data=..., **kwargs) -> tuple[np.ndarray | list[np.ndarray], np.ndarray, BarContainer | Polygon | list[BarContainer | Polygon],]: + ... + + def stairs(self, values: ArrayLike, edges: ArrayLike | None = ..., *, orientation: Literal["vertical", "horizontal"] = ..., baseline: float | ArrayLike | None = ..., fill: bool = ..., data=..., **kwargs) -> StepPatch: + ... + + def hist2d(self, x: ArrayLike, y: ArrayLike, bins: None | int | tuple[int, int] | ArrayLike | tuple[ArrayLike, ArrayLike] = ..., range: ArrayLike | None = ..., density: bool = ..., weights: ArrayLike | None = ..., cmin: float | None = ..., cmax: float | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, np.ndarray, QuadMesh]: + ... + + def ecdf(self, x: ArrayLike, weights: ArrayLike | None = ..., *, complementary: bool = ..., orientation: Literal["vertical", "horizonatal"] = ..., compress: bool = ..., data=..., **kwargs) -> Line2D: + ... + + def psd(self, x: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., Fc: int | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ..., return_line: bool | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray] | tuple[np.ndarray, np.ndarray, Line2D]: + ... + + def csd(self, x: ArrayLike, y: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., Fc: int | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ..., return_line: bool | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray] | tuple[np.ndarray, np.ndarray, Line2D]: + ... + + def magnitude_spectrum(self, x: ArrayLike, Fs: float | None = ..., Fc: int | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale: Literal["default", "linear", "dB"] | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, Line2D]: + ... + + def angle_spectrum(self, x: ArrayLike, Fs: float | None = ..., Fc: int | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, Line2D]: + ... + + def phase_spectrum(self, x: ArrayLike, Fs: float | None = ..., Fc: int | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, Line2D]: + ... + + def cohere(self, x: ArrayLike, y: ArrayLike, NFFT: int = ..., Fs: float = ..., Fc: int = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike = ..., noverlap: int = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] = ..., scale_by_freq: bool | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray]: + ... + + def specgram(self, x: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., Fc: int | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., cmap: str | Colormap | None = ..., xextent: tuple[float, float] | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ..., mode: Literal["default", "psd", "magnitude", "angle", "phase"] | None = ..., scale: Literal["default", "linear", "dB"] | None = ..., vmin: float | None = ..., vmax: float | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, np.ndarray, AxesImage]: + ... + + def spy(self, Z: ArrayLike, precision: float | Literal["present"] = ..., marker: str | None = ..., markersize: float | None = ..., aspect: Literal["equal", "auto"] | float | None = ..., origin: Literal["upper", "lower"] = ..., **kwargs) -> AxesImage: + ... + + def matshow(self, Z: ArrayLike, **kwargs) -> AxesImage: + ... + + def violinplot(self, dataset: ArrayLike | Sequence[ArrayLike], positions: ArrayLike | None = ..., vert: bool = ..., widths: float | ArrayLike = ..., showmeans: bool = ..., showextrema: bool = ..., showmedians: bool = ..., quantiles: Sequence[float | Sequence[float]] | None = ..., points: int = ..., bw_method: Literal["scott", "silverman"] | float | Callable[[GaussianKDE], float] | None = ..., *, data=...) -> dict[str, Collection]: + ... + + def violin(self, vpstats: Sequence[dict[str, Any]], positions: ArrayLike | None = ..., vert: bool = ..., widths: float | ArrayLike = ..., showmeans: bool = ..., showextrema: bool = ..., showmedians: bool = ...) -> dict[str, Collection]: + ... + + table = ... + stackplot = ... + streamplot = ... + tricontour = ... + tricontourf = ... + tripcolor = ... + triplot = ... + + diff --git a/typings/matplotlib/axes/_base.pyi b/typings/matplotlib/axes/_base.pyi new file mode 100644 index 0000000..a03c8b1 --- /dev/null +++ b/typings/matplotlib/axes/_base.pyi @@ -0,0 +1,570 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib.artist as martist +import datetime +import numpy as np +from collections.abc import Callable, Iterable, Iterator, Sequence +from matplotlib import cbook +from matplotlib.artist import Artist +from matplotlib.axis import Tick, XAxis, YAxis +from matplotlib.backend_bases import MouseButton, MouseEvent, RendererBase +from matplotlib.container import Container +from matplotlib.collections import Collection +from matplotlib.legend import Legend +from matplotlib.lines import Line2D +from matplotlib.gridspec import GridSpec, SubplotSpec +from matplotlib.figure import Figure +from matplotlib.image import AxesImage +from matplotlib.patches import Patch +from matplotlib.scale import ScaleBase +from matplotlib.spines import Spines +from matplotlib.table import Table +from matplotlib.text import Text +from matplotlib.transforms import Bbox, Transform +from cycler import Cycler +from numpy.typing import ArrayLike +from typing import Any, Literal, overload +from matplotlib.typing import ColorType + +class _axis_method_wrapper: + attr_name: str + method_name: str + __doc__: str + def __init__(self, attr_name: str, method_name: str, *, doc_sub: dict[str, str] | None = ...) -> None: + ... + + def __set_name__(self, owner: Any, name: str) -> None: + ... + + + +class _AxesBase(martist.Artist): + name: str + patch: Patch + spines: Spines + fmt_xdata: Callable[[float], str] | None + fmt_ydata: Callable[[float], str] | None + xaxis: XAxis + yaxis: YAxis + bbox: Bbox + dataLim: Bbox + transAxes: Transform + transScale: Transform + transLimits: Transform + transData: Transform + ignore_existing_data_limits: bool + axison: bool + _projection_init: Any + def __init__(self, fig: Figure, *args: tuple[float, float, float, float] | Bbox | int, facecolor: ColorType | None = ..., frameon: bool = ..., sharex: _AxesBase | None = ..., sharey: _AxesBase | None = ..., label: Any = ..., xscale: str | ScaleBase | None = ..., yscale: str | ScaleBase | None = ..., box_aspect: float | None = ..., **kwargs) -> None: + ... + + def get_subplotspec(self) -> SubplotSpec | None: + ... + + def set_subplotspec(self, subplotspec: SubplotSpec) -> None: + ... + + def get_gridspec(self) -> GridSpec | None: + ... + + def set_figure(self, fig: Figure) -> None: + ... + + @property + def viewLim(self) -> Bbox: + ... + + def get_xaxis_transform(self, which: Literal["grid", "tick1", "tick2"] = ...) -> Transform: + ... + + def get_xaxis_text1_transform(self, pad_points: float) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_xaxis_text2_transform(self, pad_points) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_yaxis_transform(self, which: Literal["grid", "tick1", "tick2"] = ...) -> Transform: + ... + + def get_yaxis_text1_transform(self, pad_points) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_yaxis_text2_transform(self, pad_points) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_position(self, original: bool = ...) -> Bbox: + ... + + def set_position(self, pos: Bbox | tuple[float, float, float, float], which: Literal["both", "active", "original"] = ...) -> None: + ... + + def reset_position(self) -> None: + ... + + def set_axes_locator(self, locator: Callable[[_AxesBase, RendererBase], Bbox]) -> None: + ... + + def get_axes_locator(self) -> Callable[[_AxesBase, RendererBase], Bbox]: + ... + + def sharex(self, other: _AxesBase) -> None: + ... + + def sharey(self, other: _AxesBase) -> None: + ... + + def clear(self) -> None: + ... + + def cla(self) -> None: + ... + + class ArtistList(Sequence[Artist]): + def __init__(self, axes: _AxesBase, prop_name: str, valid_types: type | Iterable[type] | None = ..., invalid_types: type | Iterable[type] | None = ...) -> None: + ... + + def __len__(self) -> int: + ... + + def __iter__(self) -> Iterator[Artist]: + ... + + @overload + def __getitem__(self, key: int) -> Artist: + ... + + @overload + def __getitem__(self, key: slice) -> list[Artist]: + ... + + @overload + def __add__(self, other: _AxesBase.ArtistList) -> list[Artist]: + ... + + @overload + def __add__(self, other: list[Any]) -> list[Any]: + ... + + @overload + def __add__(self, other: tuple[Any]) -> tuple[Any]: + ... + + @overload + def __radd__(self, other: _AxesBase.ArtistList) -> list[Artist]: + ... + + @overload + def __radd__(self, other: list[Any]) -> list[Any]: + ... + + @overload + def __radd__(self, other: tuple[Any]) -> tuple[Any]: + ... + + + + @property + def artists(self) -> _AxesBase.ArtistList: + ... + + @property + def collections(self) -> _AxesBase.ArtistList: + ... + + @property + def images(self) -> _AxesBase.ArtistList: + ... + + @property + def lines(self) -> _AxesBase.ArtistList: + ... + + @property + def patches(self) -> _AxesBase.ArtistList: + ... + + @property + def tables(self) -> _AxesBase.ArtistList: + ... + + @property + def texts(self) -> _AxesBase.ArtistList: + ... + + def get_facecolor(self) -> ColorType: + ... + + def set_facecolor(self, color: ColorType | None) -> None: + ... + + @overload + def set_prop_cycle(self, cycler: Cycler) -> None: + ... + + @overload + def set_prop_cycle(self, label: str, values: Iterable[Any]) -> None: + ... + + @overload + def set_prop_cycle(self, **kwargs: Iterable[Any]) -> None: + ... + + def get_aspect(self) -> float | Literal["auto"]: + ... + + def set_aspect(self, aspect: float | Literal["auto", "equal"], adjustable: Literal["box", "datalim"] | None = ..., anchor: str | tuple[float, float] | None = ..., share: bool = ...) -> None: + ... + + def get_adjustable(self) -> Literal["box", "datalim"]: + ... + + def set_adjustable(self, adjustable: Literal["box", "datalim"], share: bool = ...) -> None: + ... + + def get_box_aspect(self) -> float | None: + ... + + def set_box_aspect(self, aspect: float | None = ...) -> None: + ... + + def get_anchor(self) -> str | tuple[float, float]: + ... + + def set_anchor(self, anchor: str | tuple[float, float], share: bool = ...) -> None: + ... + + def get_data_ratio(self) -> float: + ... + + def apply_aspect(self, position: Bbox | None = ...) -> None: + ... + + @overload + def axis(self, arg: tuple[float, float, float, float] | bool | str | None = ..., /, *, emit: bool = ...) -> tuple[float, float, float, float]: + ... + + @overload + def axis(self, *, emit: bool = ..., xmin: float | None = ..., xmax: float | None = ..., ymin: float | None = ..., ymax: float | None = ...) -> tuple[float, float, float, float]: + ... + + def get_legend(self) -> Legend: + ... + + def get_images(self) -> list[AxesImage]: + ... + + def get_lines(self) -> list[Line2D]: + ... + + def get_xaxis(self) -> XAxis: + ... + + def get_yaxis(self) -> YAxis: + ... + + def has_data(self) -> bool: + ... + + def add_artist(self, a: Artist) -> Artist: + ... + + def add_child_axes(self, ax: _AxesBase) -> _AxesBase: + ... + + def add_collection(self, collection: Collection, autolim: bool = ...) -> Collection: + ... + + def add_image(self, image: AxesImage) -> AxesImage: + ... + + def add_line(self, line: Line2D) -> Line2D: + ... + + def add_patch(self, p: Patch) -> Patch: + ... + + def add_table(self, tab: Table) -> Table: + ... + + def add_container(self, container: Container) -> Container: + ... + + def relim(self, visible_only: bool = ...) -> None: + ... + + def update_datalim(self, xys: ArrayLike, updatex: bool = ..., updatey: bool = ...) -> None: + ... + + def in_axes(self, mouseevent: MouseEvent) -> bool: + ... + + def get_autoscale_on(self) -> bool: + ... + + def set_autoscale_on(self, b: bool) -> None: + ... + + @property + def use_sticky_edges(self) -> bool: + ... + + @use_sticky_edges.setter + def use_sticky_edges(self, b: bool) -> None: + ... + + def set_xmargin(self, m: float) -> None: + ... + + def set_ymargin(self, m: float) -> None: + ... + + def margins(self, *margins: float, x: float | None = ..., y: float | None = ..., tight: bool | None = ...) -> tuple[float, float] | None: + ... + + def set_rasterization_zorder(self, z: float | None) -> None: + ... + + def get_rasterization_zorder(self) -> float | None: + ... + + def autoscale(self, enable: bool = ..., axis: Literal["both", "x", "y"] = ..., tight: bool | None = ...) -> None: + ... + + def autoscale_view(self, tight: bool | None = ..., scalex: bool = ..., scaley: bool = ...) -> None: + ... + + def draw_artist(self, a: Artist) -> None: + ... + + def redraw_in_frame(self) -> None: + ... + + def get_frame_on(self) -> bool: + ... + + def set_frame_on(self, b: bool) -> None: + ... + + def get_axisbelow(self) -> bool | Literal["line"]: + ... + + def set_axisbelow(self, b: bool | Literal["line"]) -> None: + ... + + def grid(self, visible: bool | None = ..., which: Literal["major", "minor", "both"] = ..., axis: Literal["both", "x", "y"] = ..., **kwargs) -> None: + ... + + def ticklabel_format(self, *, axis: Literal["both", "x", "y"] = ..., style: Literal["", "sci", "scientific", "plain"] = ..., scilimits: tuple[int, int] | None = ..., useOffset: bool | float | None = ..., useLocale: bool | None = ..., useMathText: bool | None = ...) -> None: + ... + + def locator_params(self, axis: Literal["both", "x", "y"] = ..., tight: bool | None = ..., **kwargs) -> None: + ... + + def tick_params(self, axis: Literal["both", "x", "y"] = ..., **kwargs) -> None: + ... + + def set_axis_off(self) -> None: + ... + + def set_axis_on(self) -> None: + ... + + def get_xlabel(self) -> str: + ... + + def set_xlabel(self, xlabel: str, fontdict: dict[str, Any] | None = ..., labelpad: float | None = ..., *, loc: Literal["left", "center", "right"] | None = ..., **kwargs) -> Text: + ... + + def invert_xaxis(self) -> None: + ... + + def get_xbound(self) -> tuple[float, float]: + ... + + def set_xbound(self, lower: float | None = ..., upper: float | None = ...) -> None: + ... + + def get_xlim(self) -> tuple[float, float]: + ... + + def set_xlim(self, left: float | tuple[float, float] | None = ..., right: float | None = ..., *, emit: bool = ..., auto: bool | None = ..., xmin: float | None = ..., xmax: float | None = ...) -> tuple[float, float]: + ... + + def get_ylabel(self) -> str: + ... + + def set_ylabel(self, ylabel: str, fontdict: dict[str, Any] | None = ..., labelpad: float | None = ..., *, loc: Literal["bottom", "center", "top"] | None = ..., **kwargs) -> Text: + ... + + def invert_yaxis(self) -> None: + ... + + def get_ybound(self) -> tuple[float, float]: + ... + + def set_ybound(self, lower: float | None = ..., upper: float | None = ...) -> None: + ... + + def get_ylim(self) -> tuple[float, float]: + ... + + def set_ylim(self, bottom: float | tuple[float, float] | None = ..., top: float | None = ..., *, emit: bool = ..., auto: bool | None = ..., ymin: float | None = ..., ymax: float | None = ...) -> tuple[float, float]: + ... + + def format_xdata(self, x: float) -> str: + ... + + def format_ydata(self, y: float) -> str: + ... + + def format_coord(self, x: float, y: float) -> str: + ... + + def minorticks_on(self) -> None: + ... + + def minorticks_off(self) -> None: + ... + + def can_zoom(self) -> bool: + ... + + def can_pan(self) -> bool: + ... + + def get_navigate(self) -> bool: + ... + + def set_navigate(self, b: bool) -> None: + ... + + def get_navigate_mode(self) -> Literal["PAN", "ZOOM"] | None: + ... + + def set_navigate_mode(self, b: Literal["PAN", "ZOOM"] | None) -> None: + ... + + def start_pan(self, x: float, y: float, button: MouseButton) -> None: + ... + + def end_pan(self) -> None: + ... + + def drag_pan(self, button: MouseButton, key: str | None, x: float, y: float) -> None: + ... + + def get_children(self) -> list[Artist]: + ... + + def contains_point(self, point: tuple[int, int]) -> bool: + ... + + def get_default_bbox_extra_artists(self) -> list[Artist]: + ... + + def get_tightbbox(self, renderer: RendererBase | None = ..., *, call_axes_locator: bool = ..., bbox_extra_artists: Sequence[Artist] | None = ..., for_layout_only: bool = ...) -> Bbox | None: + ... + + def twinx(self) -> _AxesBase: + ... + + def twiny(self) -> _AxesBase: + ... + + def get_shared_x_axes(self) -> cbook.GrouperView: + ... + + def get_shared_y_axes(self) -> cbook.GrouperView: + ... + + def label_outer(self, remove_inner_ticks: bool = ...) -> None: + ... + + def get_xgridlines(self) -> list[Line2D]: + ... + + def get_xticklines(self, minor: bool = ...) -> list[Line2D]: + ... + + def get_ygridlines(self) -> list[Line2D]: + ... + + def get_yticklines(self, minor: bool = ...) -> list[Line2D]: + ... + + def get_autoscalex_on(self) -> bool: + ... + + def get_autoscaley_on(self) -> bool: + ... + + def set_autoscalex_on(self, b: bool) -> None: + ... + + def set_autoscaley_on(self, b: bool) -> None: + ... + + def xaxis_inverted(self) -> bool: + ... + + def get_xscale(self) -> str: + ... + + def set_xscale(self, value: str | ScaleBase, **kwargs) -> None: + ... + + def get_xticks(self, *, minor: bool = ...) -> np.ndarray: + ... + + def set_xticks(self, ticks: ArrayLike, labels: Iterable[str] | None = ..., *, minor: bool = ..., **kwargs) -> list[Tick]: + ... + + def get_xmajorticklabels(self) -> list[Text]: + ... + + def get_xminorticklabels(self) -> list[Text]: + ... + + def get_xticklabels(self, minor: bool = ..., which: Literal["major", "minor", "both"] | None = ...) -> list[Text]: + ... + + def set_xticklabels(self, labels: Iterable[str | Text], *, minor: bool = ..., fontdict: dict[str, Any] | None = ..., **kwargs) -> list[Text]: + ... + + def yaxis_inverted(self) -> bool: + ... + + def get_yscale(self) -> str: + ... + + def set_yscale(self, value: str | ScaleBase, **kwargs) -> None: + ... + + def get_yticks(self, *, minor: bool = ...) -> np.ndarray: + ... + + def set_yticks(self, ticks: ArrayLike, labels: Iterable[str] | None = ..., *, minor: bool = ..., **kwargs) -> list[Tick]: + ... + + def get_ymajorticklabels(self) -> list[Text]: + ... + + def get_yminorticklabels(self) -> list[Text]: + ... + + def get_yticklabels(self, minor: bool = ..., which: Literal["major", "minor", "both"] | None = ...) -> list[Text]: + ... + + def set_yticklabels(self, labels: Iterable[str | Text], *, minor: bool = ..., fontdict: dict[str, Any] | None = ..., **kwargs) -> list[Text]: + ... + + def xaxis_date(self, tz: str | datetime.tzinfo | None = ...) -> None: + ... + + def yaxis_date(self, tz: str | datetime.tzinfo | None = ...) -> None: + ... + + + diff --git a/typings/matplotlib/axes/_secondary_axes.pyi b/typings/matplotlib/axes/_secondary_axes.pyi new file mode 100644 index 0000000..9aa8d85 --- /dev/null +++ b/typings/matplotlib/axes/_secondary_axes.pyi @@ -0,0 +1,36 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.axes._base import _AxesBase +from matplotlib.axis import Tick +from matplotlib.transforms import Transform +from collections.abc import Callable, Iterable +from typing import Literal +from numpy.typing import ArrayLike +from matplotlib.typing import ColorType + +class SecondaryAxis(_AxesBase): + def __init__(self, parent: _AxesBase, orientation: Literal["x", "y"], location: Literal["top", "bottom", "right", "left"] | float, functions: tuple[Callable[[ArrayLike], ArrayLike], Callable[[ArrayLike], ArrayLike]] | Transform, **kwargs) -> None: + ... + + def set_alignment(self, align: Literal["top", "bottom", "right", "left"]) -> None: + ... + + def set_location(self, location: Literal["top", "bottom", "right", "left"] | float) -> None: + ... + + def set_ticks(self, ticks: ArrayLike, labels: Iterable[str] | None = ..., *, minor: bool = ..., **kwargs) -> list[Tick]: + ... + + def set_functions(self, functions: tuple[Callable[[ArrayLike], ArrayLike], Callable[[ArrayLike], ArrayLike]] | Transform) -> None: + ... + + def set_aspect(self, *args, **kwargs) -> None: + ... + + def set_color(self, color: ColorType) -> None: + ... + + + diff --git a/typings/matplotlib/axis.pyi b/typings/matplotlib/axis.pyi new file mode 100644 index 0000000..26d9b89 --- /dev/null +++ b/typings/matplotlib/axis.pyi @@ -0,0 +1,433 @@ +""" +This type stub file was generated by pyright. +""" + +import datetime +import numpy as np +import matplotlib.artist as martist +from collections.abc import Callable, Iterable, Sequence +from typing import Any, Literal, overload +from numpy.typing import ArrayLike +from matplotlib import cbook +from matplotlib.axes import Axes +from matplotlib.backend_bases import RendererBase +from matplotlib.lines import Line2D +from matplotlib.text import Text +from matplotlib.ticker import Formatter, Locator +from matplotlib.transforms import Bbox, Transform +from matplotlib.typing import ColorType + +GRIDLINE_INTERPOLATION_STEPS: int +class Tick(martist.Artist): + axes: Axes + tick1line: Line2D + tick2line: Line2D + gridline: Line2D + label1: Text + label2: Text + def __init__(self, axes: Axes, loc: float, *, size: float | None = ..., width: float | None = ..., color: ColorType | None = ..., tickdir: Literal["in", "inout", "out"] | None = ..., pad: float | None = ..., labelsize: float | None = ..., labelcolor: ColorType | None = ..., labelfontfamily: str | Sequence[str] | None = ..., zorder: float | None = ..., gridOn: bool | None = ..., tick1On: bool = ..., tick2On: bool = ..., label1On: bool = ..., label2On: bool = ..., major: bool = ..., labelrotation: float = ..., grid_color: ColorType | None = ..., grid_linestyle: str | None = ..., grid_linewidth: float | None = ..., grid_alpha: float | None = ..., **kwargs) -> None: + ... + + def get_tickdir(self) -> Literal["in", "inout", "out"]: + ... + + def get_tick_padding(self) -> float: + ... + + def get_children(self) -> list[martist.Artist]: + ... + + stale: bool + def set_pad(self, val: float) -> None: + ... + + def get_pad(self) -> None: + ... + + def get_loc(self) -> float: + ... + + def set_label1(self, s: object) -> None: + ... + + def set_label(self, s: object) -> None: + ... + + def set_label2(self, s: object) -> None: + ... + + def set_url(self, url: str | None) -> None: + ... + + def get_view_interval(self) -> ArrayLike: + ... + + def update_position(self, loc: float) -> None: + ... + + + +class XTick(Tick): + __name__: str + def __init__(self, *args, **kwargs) -> None: + ... + + stale: bool + def update_position(self, loc: float) -> None: + ... + + def get_view_interval(self) -> np.ndarray: + ... + + + +class YTick(Tick): + __name__: str + def __init__(self, *args, **kwargs) -> None: + ... + + stale: bool + def update_position(self, loc: float) -> None: + ... + + def get_view_interval(self) -> np.ndarray: + ... + + + +class Ticker: + def __init__(self) -> None: + ... + + @property + def locator(self) -> Locator | None: + ... + + @locator.setter + def locator(self, locator: Locator) -> None: + ... + + @property + def formatter(self) -> Formatter | None: + ... + + @formatter.setter + def formatter(self, formatter: Formatter) -> None: + ... + + + +class _LazyTickList: + def __init__(self, major: bool) -> None: + ... + + @overload + def __get__(self, instance: None, owner: None) -> _LazyTickList: + ... + + @overload + def __get__(self, instance: Axis, owner: type[Axis]) -> list[Tick]: + ... + + + +class Axis(martist.Artist): + OFFSETTEXTPAD: int + isDefault_label: bool + axes: Axes + major: Ticker + minor: Ticker + callbacks: cbook.CallbackRegistry + label: Text + offsetText: Text + labelpad: float + pickradius: float + def __init__(self, axes, *, pickradius: float = ..., clear: bool = ...) -> None: + ... + + @property + def isDefault_majloc(self) -> bool: + ... + + @isDefault_majloc.setter + def isDefault_majloc(self, value: bool) -> None: + ... + + @property + def isDefault_majfmt(self) -> bool: + ... + + @isDefault_majfmt.setter + def isDefault_majfmt(self, value: bool) -> None: + ... + + @property + def isDefault_minloc(self) -> bool: + ... + + @isDefault_minloc.setter + def isDefault_minloc(self, value: bool) -> None: + ... + + @property + def isDefault_minfmt(self) -> bool: + ... + + @isDefault_minfmt.setter + def isDefault_minfmt(self, value: bool) -> None: + ... + + majorTicks: _LazyTickList + minorTicks: _LazyTickList + def get_remove_overlapping_locs(self) -> bool: + ... + + def set_remove_overlapping_locs(self, val: bool) -> None: + ... + + @property + def remove_overlapping_locs(self) -> bool: + ... + + @remove_overlapping_locs.setter + def remove_overlapping_locs(self, val: bool) -> None: + ... + + stale: bool + def set_label_coords(self, x: float, y: float, transform: Transform | None = ...) -> None: + ... + + def get_transform(self) -> Transform: + ... + + def get_scale(self) -> str: + ... + + def limit_range_for_scale(self, vmin: float, vmax: float) -> tuple[float, float]: + ... + + def get_children(self) -> list[martist.Artist]: + ... + + converter: Any + units: Any + def clear(self) -> None: + ... + + def reset_ticks(self) -> None: + ... + + def set_tick_params(self, which: Literal["major", "minor", "both"] = ..., reset: bool = ..., **kwargs) -> None: + ... + + def get_tick_params(self, which: Literal["major", "minor"] = ...) -> dict[str, Any]: + ... + + def get_view_interval(self) -> tuple[float, float]: + ... + + def set_view_interval(self, vmin: float, vmax: float, ignore: bool = ...) -> None: + ... + + def get_data_interval(self) -> tuple[float, float]: + ... + + def set_data_interval(self, vmin: float, vmax: float, ignore: bool = ...) -> None: + ... + + def get_inverted(self) -> bool: + ... + + def set_inverted(self, inverted: bool) -> None: + ... + + def set_default_intervals(self) -> None: + ... + + def get_tightbbox(self, renderer: RendererBase | None = ..., *, for_layout_only: bool = ...) -> Bbox | None: + ... + + def get_tick_padding(self) -> float: + ... + + def get_gridlines(self) -> list[Line2D]: + ... + + def get_label(self) -> Text: + ... + + def get_offset_text(self) -> Text: + ... + + def get_pickradius(self) -> float: + ... + + def get_majorticklabels(self) -> list[Text]: + ... + + def get_minorticklabels(self) -> list[Text]: + ... + + def get_ticklabels(self, minor: bool = ..., which: Literal["major", "minor", "both"] | None = ...) -> list[Text]: + ... + + def get_majorticklines(self) -> list[Line2D]: + ... + + def get_minorticklines(self) -> list[Line2D]: + ... + + def get_ticklines(self, minor: bool = ...) -> list[Line2D]: + ... + + def get_majorticklocs(self) -> np.ndarray: + ... + + def get_minorticklocs(self) -> np.ndarray: + ... + + def get_ticklocs(self, *, minor: bool = ...) -> np.ndarray: + ... + + def get_ticks_direction(self, minor: bool = ...) -> np.ndarray: + ... + + def get_label_text(self) -> str: + ... + + def get_major_locator(self) -> Locator: + ... + + def get_minor_locator(self) -> Locator: + ... + + def get_major_formatter(self) -> Formatter: + ... + + def get_minor_formatter(self) -> Formatter: + ... + + def get_major_ticks(self, numticks: int | None = ...) -> list[Tick]: + ... + + def get_minor_ticks(self, numticks: int | None = ...) -> list[Tick]: + ... + + def grid(self, visible: bool | None = ..., which: Literal["major", "minor", "both"] = ..., **kwargs) -> None: + ... + + def update_units(self, data): + ... + + def have_units(self) -> bool: + ... + + def convert_units(self, x): + ... + + def set_units(self, u) -> None: + ... + + def get_units(self): + ... + + def set_label_text(self, label: str, fontdict: dict[str, Any] | None = ..., **kwargs) -> Text: + ... + + def set_major_formatter(self, formatter: Formatter | str | Callable[[float, float], str]) -> None: + ... + + def set_minor_formatter(self, formatter: Formatter | str | Callable[[float, float], str]) -> None: + ... + + def set_major_locator(self, locator: Locator) -> None: + ... + + def set_minor_locator(self, locator: Locator) -> None: + ... + + def set_pickradius(self, pickradius: float) -> None: + ... + + def set_ticklabels(self, labels: Iterable[str | Text], *, minor: bool = ..., fontdict: dict[str, Any] | None = ..., **kwargs) -> list[Text]: + ... + + def set_ticks(self, ticks: ArrayLike, labels: Iterable[str] | None = ..., *, minor: bool = ..., **kwargs) -> list[Tick]: + ... + + def axis_date(self, tz: str | datetime.tzinfo | None = ...) -> None: + ... + + def get_tick_space(self) -> int: + ... + + def get_label_position(self) -> Literal["top", "bottom"]: + ... + + def set_label_position(self, position: Literal["top", "bottom", "left", "right"]) -> None: + ... + + def get_minpos(self) -> float: + ... + + + +class XAxis(Axis): + __name__: str + axis_name: str + def __init__(self, *args, **kwargs) -> None: + ... + + label_position: Literal["bottom", "top"] + stale: bool + def set_label_position(self, position: Literal["bottom", "top"]) -> None: + ... + + def set_ticks_position(self, position: Literal["top", "bottom", "both", "default", "none"]) -> None: + ... + + def tick_top(self) -> None: + ... + + def tick_bottom(self) -> None: + ... + + def get_ticks_position(self) -> Literal["top", "bottom", "default", "unknown"]: + ... + + def get_tick_space(self) -> int: + ... + + + +class YAxis(Axis): + __name__: str + axis_name: str + def __init__(self, *args, **kwargs) -> None: + ... + + label_position: Literal["left", "right"] + stale: bool + def set_label_position(self, position: Literal["left", "right"]) -> None: + ... + + def set_offset_position(self, position: Literal["left", "right"]) -> None: + ... + + def set_ticks_position(self, position: Literal["left", "right", "both", "default", "none"]) -> None: + ... + + def tick_right(self) -> None: + ... + + def tick_left(self) -> None: + ... + + def get_ticks_position(self) -> Literal["left", "right", "default", "unknown"]: + ... + + def get_tick_space(self) -> int: + ... + + + diff --git a/typings/matplotlib/backend_bases.pyi b/typings/matplotlib/backend_bases.pyi new file mode 100644 index 0000000..9bca6fc --- /dev/null +++ b/typings/matplotlib/backend_bases.pyi @@ -0,0 +1,647 @@ +""" +This type stub file was generated by pyright. +""" + +import os +from enum import Enum, IntEnum +from matplotlib import _api, cbook, transforms, widgets +from matplotlib.artist import Artist +from matplotlib.axes import Axes +from matplotlib.backend_managers import ToolManager +from matplotlib.backend_tools import Cursors, ToolBase +from matplotlib.colorbar import Colorbar +from matplotlib.figure import Figure +from matplotlib.font_manager import FontProperties +from matplotlib.path import Path +from matplotlib.texmanager import TexManager +from matplotlib.text import Text +from matplotlib.transforms import Bbox, BboxBase, Transform, TransformedPath +from collections.abc import Callable, Iterable, Sequence +from typing import Any, IO, Literal, NamedTuple, TypeVar +from numpy.typing import ArrayLike +from .typing import CapStyleType, ColorType, JoinStyleType, LineStyleType + +def register_backend(format: str, backend: str | type[FigureCanvasBase], description: str | None = ...) -> None: + ... + +def get_registered_canvas_class(format: str) -> type[FigureCanvasBase]: + ... + +class RendererBase: + def __init__(self) -> None: + ... + + def open_group(self, s: str, gid: str | None = ...) -> None: + ... + + def close_group(self, s: str) -> None: + ... + + def draw_path(self, gc: GraphicsContextBase, path: Path, transform: Transform, rgbFace: ColorType | None = ...) -> None: + ... + + def draw_markers(self, gc: GraphicsContextBase, marker_path: Path, marker_trans: Transform, path: Path, trans: Transform, rgbFace: ColorType | None = ...) -> None: + ... + + def draw_path_collection(self, gc: GraphicsContextBase, master_transform: Transform, paths: Sequence[Path], all_transforms: Sequence[ArrayLike], offsets: ArrayLike | Sequence[ArrayLike], offset_trans: Transform, facecolors: ColorType | Sequence[ColorType], edgecolors: ColorType | Sequence[ColorType], linewidths: float | Sequence[float], linestyles: LineStyleType | Sequence[LineStyleType], antialiaseds: bool | Sequence[bool], urls: str | Sequence[str], offset_position: Any) -> None: + ... + + def draw_quad_mesh(self, gc: GraphicsContextBase, master_transform: Transform, meshWidth, meshHeight, coordinates: ArrayLike, offsets: ArrayLike | Sequence[ArrayLike], offsetTrans: Transform, facecolors: Sequence[ColorType], antialiased: bool, edgecolors: Sequence[ColorType] | ColorType | None) -> None: + ... + + def draw_gouraud_triangle(self, gc: GraphicsContextBase, points: ArrayLike, colors: ArrayLike, transform: Transform) -> None: + ... + + def draw_gouraud_triangles(self, gc: GraphicsContextBase, triangles_array: ArrayLike, colors_array: ArrayLike, transform: Transform) -> None: + ... + + def get_image_magnification(self) -> float: + ... + + def draw_image(self, gc: GraphicsContextBase, x: float, y: float, im: ArrayLike, transform: transforms.Affine2DBase | None = ...) -> None: + ... + + def option_image_nocomposite(self) -> bool: + ... + + def option_scale_image(self) -> bool: + ... + + def draw_tex(self, gc: GraphicsContextBase, x: float, y: float, s: str, prop: FontProperties, angle: float, *, mtext: Text | None = ...) -> None: + ... + + def draw_text(self, gc: GraphicsContextBase, x: float, y: float, s: str, prop: FontProperties, angle: float, ismath: bool | Literal["TeX"] = ..., mtext: Text | None = ...) -> None: + ... + + def get_text_width_height_descent(self, s: str, prop: FontProperties, ismath: bool | Literal["TeX"]) -> tuple[float, float, float]: + ... + + def flipy(self) -> bool: + ... + + def get_canvas_width_height(self) -> tuple[float, float]: + ... + + def get_texmanager(self) -> TexManager: + ... + + def new_gc(self) -> GraphicsContextBase: + ... + + def points_to_pixels(self, points: ArrayLike) -> ArrayLike: + ... + + def start_rasterizing(self) -> None: + ... + + def stop_rasterizing(self) -> None: + ... + + def start_filter(self) -> None: + ... + + def stop_filter(self, filter_func) -> None: + ... + + + +class GraphicsContextBase: + def __init__(self) -> None: + ... + + def copy_properties(self, gc: GraphicsContextBase) -> None: + ... + + def restore(self) -> None: + ... + + def get_alpha(self) -> float: + ... + + def get_antialiased(self) -> int: + ... + + def get_capstyle(self) -> Literal["butt", "projecting", "round"]: + ... + + def get_clip_rectangle(self) -> Bbox | None: + ... + + def get_clip_path(self) -> tuple[TransformedPath, Transform] | tuple[None, None]: + ... + + def get_dashes(self) -> tuple[float, ArrayLike | None]: + ... + + def get_forced_alpha(self) -> bool: + ... + + def get_joinstyle(self) -> Literal["miter", "round", "bevel"]: + ... + + def get_linewidth(self) -> float: + ... + + def get_rgb(self) -> tuple[float, float, float, float]: + ... + + def get_url(self) -> str | None: + ... + + def get_gid(self) -> int | None: + ... + + def get_snap(self) -> bool | None: + ... + + def set_alpha(self, alpha: float) -> None: + ... + + def set_antialiased(self, b: bool) -> None: + ... + + def set_capstyle(self, cs: CapStyleType) -> None: + ... + + def set_clip_rectangle(self, rectangle: Bbox | None) -> None: + ... + + def set_clip_path(self, path: TransformedPath | None) -> None: + ... + + def set_dashes(self, dash_offset: float, dash_list: ArrayLike | None) -> None: + ... + + def set_foreground(self, fg: ColorType, isRGBA: bool = ...) -> None: + ... + + def set_joinstyle(self, js: JoinStyleType) -> None: + ... + + def set_linewidth(self, w: float) -> None: + ... + + def set_url(self, url: str | None) -> None: + ... + + def set_gid(self, id: int | None) -> None: + ... + + def set_snap(self, snap: bool | None) -> None: + ... + + def set_hatch(self, hatch: str | None) -> None: + ... + + def get_hatch(self) -> str | None: + ... + + def get_hatch_path(self, density: float = ...) -> Path: + ... + + def get_hatch_color(self) -> ColorType: + ... + + def set_hatch_color(self, hatch_color: ColorType) -> None: + ... + + def get_hatch_linewidth(self) -> float: + ... + + def get_sketch_params(self) -> tuple[float, float, float] | None: + ... + + def set_sketch_params(self, scale: float | None = ..., length: float | None = ..., randomness: float | None = ...) -> None: + ... + + + +class TimerBase: + callbacks: list[tuple[Callable, tuple, dict[str, Any]]] + def __init__(self, interval: int | None = ..., callbacks: list[tuple[Callable, tuple, dict[str, Any]]] | None = ...) -> None: + ... + + def __del__(self) -> None: + ... + + def start(self, interval: int | None = ...) -> None: + ... + + def stop(self) -> None: + ... + + @property + def interval(self) -> int: + ... + + @interval.setter + def interval(self, interval: int) -> None: + ... + + @property + def single_shot(self) -> bool: + ... + + @single_shot.setter + def single_shot(self, ss: bool) -> None: + ... + + def add_callback(self, func: Callable, *args, **kwargs) -> Callable: + ... + + def remove_callback(self, func: Callable, *args, **kwargs) -> None: + ... + + + +class Event: + name: str + canvas: FigureCanvasBase + def __init__(self, name: str, canvas: FigureCanvasBase, guiEvent: Any | None = ...) -> None: + ... + + @property + def guiEvent(self) -> Any: + ... + + + +class DrawEvent(Event): + renderer: RendererBase + def __init__(self, name: str, canvas: FigureCanvasBase, renderer: RendererBase) -> None: + ... + + + +class ResizeEvent(Event): + width: int + height: int + def __init__(self, name: str, canvas: FigureCanvasBase) -> None: + ... + + + +class CloseEvent(Event): + ... + + +class LocationEvent(Event): + lastevent: Event | None + x: int + y: int + inaxes: Axes | None + xdata: float | None + ydata: float | None + def __init__(self, name: str, canvas: FigureCanvasBase, x: int, y: int, guiEvent: Any | None = ..., *, modifiers: Iterable[str] | None = ...) -> None: + ... + + + +class MouseButton(IntEnum): + LEFT: int + MIDDLE: int + RIGHT: int + BACK: int + FORWARD: int + ... + + +class MouseEvent(LocationEvent): + button: MouseButton | Literal["up", "down"] | None + key: str | None + step: float + dblclick: bool + def __init__(self, name: str, canvas: FigureCanvasBase, x: int, y: int, button: MouseButton | Literal["up", "down"] | None = ..., key: str | None = ..., step: float = ..., dblclick: bool = ..., guiEvent: Any | None = ..., *, modifiers: Iterable[str] | None = ...) -> None: + ... + + + +class PickEvent(Event): + mouseevent: MouseEvent + artist: Artist + def __init__(self, name: str, canvas: FigureCanvasBase, mouseevent: MouseEvent, artist: Artist, guiEvent: Any | None = ..., **kwargs) -> None: + ... + + + +class KeyEvent(LocationEvent): + key: str | None + def __init__(self, name: str, canvas: FigureCanvasBase, key: str | None, x: int = ..., y: int = ..., guiEvent: Any | None = ...) -> None: + ... + + + +class FigureCanvasBase: + required_interactive_framework: str | None + @_api.classproperty + def manager_class(cls) -> type[FigureManagerBase]: + ... + + events: list[str] + fixed_dpi: None | float + filetypes: dict[str, str] + @_api.classproperty + def supports_blit(cls) -> bool: + ... + + figure: Figure + manager: None | FigureManagerBase + widgetlock: widgets.LockDraw + mouse_grabber: None | Axes + toolbar: None | NavigationToolbar2 + def __init__(self, figure: Figure | None = ...) -> None: + ... + + @property + def callbacks(self) -> cbook.CallbackRegistry: + ... + + @property + def button_pick_id(self) -> int: + ... + + @property + def scroll_pick_id(self) -> int: + ... + + @classmethod + def new_manager(cls, figure: Figure, num: int | str) -> FigureManagerBase: + ... + + def is_saving(self) -> bool: + ... + + def blit(self, bbox: BboxBase | None = ...) -> None: + ... + + def inaxes(self, xy: tuple[float, float]) -> Axes | None: + ... + + def grab_mouse(self, ax: Axes) -> None: + ... + + def release_mouse(self, ax: Axes) -> None: + ... + + def set_cursor(self, cursor: Cursors) -> None: + ... + + def draw(self, *args, **kwargs) -> None: + ... + + def draw_idle(self, *args, **kwargs) -> None: + ... + + @property + def device_pixel_ratio(self) -> float: + ... + + def get_width_height(self, *, physical: bool = ...) -> tuple[int, int]: + ... + + @classmethod + def get_supported_filetypes(cls) -> dict[str, str]: + ... + + @classmethod + def get_supported_filetypes_grouped(cls) -> dict[str, list[str]]: + ... + + def print_figure(self, filename: str | os.PathLike | IO, dpi: float | None = ..., facecolor: ColorType | Literal["auto"] | None = ..., edgecolor: ColorType | Literal["auto"] | None = ..., orientation: str = ..., format: str | None = ..., *, bbox_inches: Literal["tight"] | Bbox | None = ..., pad_inches: float | None = ..., bbox_extra_artists: list[Artist] | None = ..., backend: str | None = ..., **kwargs) -> Any: + ... + + @classmethod + def get_default_filetype(cls) -> str: + ... + + def get_default_filename(self) -> str: + ... + + _T = TypeVar("_T", bound=FigureCanvasBase) + def switch_backends(self, FigureCanvasClass: type[_T]) -> _T: + ... + + def mpl_connect(self, s: str, func: Callable[[Event], Any]) -> int: + ... + + def mpl_disconnect(self, cid: int) -> None: + ... + + def new_timer(self, interval: int | None = ..., callbacks: list[tuple[Callable, tuple, dict[str, Any]]] | None = ...) -> TimerBase: + ... + + def flush_events(self) -> None: + ... + + def start_event_loop(self, timeout: float = ...) -> None: + ... + + def stop_event_loop(self) -> None: + ... + + + +def key_press_handler(event: KeyEvent, canvas: FigureCanvasBase | None = ..., toolbar: NavigationToolbar2 | None = ...) -> None: + ... + +def button_press_handler(event: MouseEvent, canvas: FigureCanvasBase | None = ..., toolbar: NavigationToolbar2 | None = ...) -> None: + ... + +class NonGuiException(Exception): + ... + + +class FigureManagerBase: + canvas: FigureCanvasBase + num: int | str + key_press_handler_id: int | None + button_press_handler_id: int | None + toolmanager: ToolManager | None + toolbar: NavigationToolbar2 | ToolContainerBase | None + def __init__(self, canvas: FigureCanvasBase, num: int | str) -> None: + ... + + @classmethod + def create_with_canvas(cls, canvas_class: type[FigureCanvasBase], figure: Figure, num: int | str) -> FigureManagerBase: + ... + + @classmethod + def start_main_loop(cls) -> None: + ... + + @classmethod + def pyplot_show(cls, *, block: bool | None = ...) -> None: + ... + + def show(self) -> None: + ... + + def destroy(self) -> None: + ... + + def full_screen_toggle(self) -> None: + ... + + def resize(self, w: int, h: int) -> None: + ... + + def get_window_title(self) -> str: + ... + + def set_window_title(self, title: str) -> None: + ... + + + +cursors = Cursors +class _Mode(str, Enum): + NONE: str + PAN: str + ZOOM: str + ... + + +class NavigationToolbar2: + toolitems: tuple[tuple[str, ...] | tuple[None, ...], ...] + canvas: FigureCanvasBase + mode: _Mode + def __init__(self, canvas: FigureCanvasBase) -> None: + ... + + def set_message(self, s: str) -> None: + ... + + def draw_rubberband(self, event: Event, x0: float, y0: float, x1: float, y1: float) -> None: + ... + + def remove_rubberband(self) -> None: + ... + + def home(self, *args) -> None: + ... + + def back(self, *args) -> None: + ... + + def forward(self, *args) -> None: + ... + + def mouse_move(self, event: MouseEvent) -> None: + ... + + def pan(self, *args) -> None: + ... + + class _PanInfo(NamedTuple): + button: MouseButton + axes: list[Axes] + cid: int + ... + + + def press_pan(self, event: Event) -> None: + ... + + def drag_pan(self, event: Event) -> None: + ... + + def release_pan(self, event: Event) -> None: + ... + + def zoom(self, *args) -> None: + ... + + class _ZoomInfo(NamedTuple): + direction: Literal["in", "out"] + start_xy: tuple[float, float] + axes: list[Axes] + cid: int + cbar: Colorbar + ... + + + def press_zoom(self, event: Event) -> None: + ... + + def drag_zoom(self, event: Event) -> None: + ... + + def release_zoom(self, event: Event) -> None: + ... + + def push_current(self) -> None: + ... + + subplot_tool: widgets.SubplotTool + def configure_subplots(self, *args): + ... + + def save_figure(self, *args) -> None: + ... + + def update(self) -> None: + ... + + def set_history_buttons(self) -> None: + ... + + + +class ToolContainerBase: + toolmanager: ToolManager + def __init__(self, toolmanager: ToolManager) -> None: + ... + + def add_tool(self, tool: ToolBase, group: str, position: int = ...) -> None: + ... + + def trigger_tool(self, name: str) -> None: + ... + + def add_toolitem(self, name: str, group: str, position: int, image: str, description: str, toggle: bool) -> None: + ... + + def toggle_toolitem(self, name: str, toggled: bool) -> None: + ... + + def remove_toolitem(self, name: str) -> None: + ... + + def set_message(self, s: str) -> None: + ... + + + +class _Backend: + backend_version: str + FigureCanvas: type[FigureCanvasBase] | None + FigureManager: type[FigureManagerBase] + mainloop: None | Callable[[], Any] + @classmethod + def new_figure_manager(cls, num: int | str, *args, **kwargs) -> FigureManagerBase: + ... + + @classmethod + def new_figure_manager_given_figure(cls, num: int | str, figure: Figure) -> FigureManagerBase: + ... + + @classmethod + def draw_if_interactive(cls) -> None: + ... + + @classmethod + def show(cls, *, block: bool | None = ...) -> None: + ... + + @staticmethod + def export(cls) -> type[_Backend]: + ... + + + +class ShowBase(_Backend): + def __call__(self, block: bool | None = ...) -> None: + ... + + + diff --git a/typings/matplotlib/backend_managers.pyi b/typings/matplotlib/backend_managers.pyi new file mode 100644 index 0000000..f45d64d --- /dev/null +++ b/typings/matplotlib/backend_managers.pyi @@ -0,0 +1,95 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib import backend_tools, widgets +from matplotlib.backend_bases import FigureCanvasBase +from matplotlib.figure import Figure +from collections.abc import Callable, Iterable +from typing import Any, TypeVar + +class ToolEvent: + name: str + sender: Any + tool: backend_tools.ToolBase + data: Any + def __init__(self, name, sender, tool, data: Any | None = ...) -> None: + ... + + + +class ToolTriggerEvent(ToolEvent): + canvasevent: ToolEvent + def __init__(self, name, sender, tool, canvasevent: ToolEvent | None = ..., data: Any | None = ...) -> None: + ... + + + +class ToolManagerMessageEvent: + name: str + sender: Any + message: str + def __init__(self, name: str, sender: Any, message: str) -> None: + ... + + + +class ToolManager: + keypresslock: widgets.LockDraw + messagelock: widgets.LockDraw + def __init__(self, figure: Figure | None = ...) -> None: + ... + + @property + def canvas(self) -> FigureCanvasBase | None: + ... + + @property + def figure(self) -> Figure | None: + ... + + @figure.setter + def figure(self, figure: Figure) -> None: + ... + + def set_figure(self, figure: Figure, update_tools: bool = ...) -> None: + ... + + def toolmanager_connect(self, s: str, func: Callable[[ToolEvent], Any]) -> int: + ... + + def toolmanager_disconnect(self, cid: int) -> None: + ... + + def message_event(self, message: str, sender: Any | None = ...) -> None: + ... + + @property + def active_toggle(self) -> dict[str | None, list[str] | str]: + ... + + def get_tool_keymap(self, name: str) -> list[str]: + ... + + def update_keymap(self, name: str, key: str | Iterable[str]) -> None: + ... + + def remove_tool(self, name: str) -> None: + ... + + _T = TypeVar("_T", bound=backend_tools.ToolBase) + def add_tool(self, name: str, tool: type[_T], *args, **kwargs) -> _T: + ... + + def trigger_tool(self, name: str | backend_tools.ToolBase, sender: Any | None = ..., canvasevent: ToolEvent | None = ..., data: Any | None = ...) -> None: + ... + + @property + def tools(self) -> dict[str, backend_tools.ToolBase]: + ... + + def get_tool(self, name: str | backend_tools.ToolBase, warn: bool = ...) -> backend_tools.ToolBase | None: + ... + + + diff --git a/typings/matplotlib/backend_tools.pyi b/typings/matplotlib/backend_tools.pyi new file mode 100644 index 0000000..88bdb68 --- /dev/null +++ b/typings/matplotlib/backend_tools.pyi @@ -0,0 +1,244 @@ +""" +This type stub file was generated by pyright. +""" + +import enum +from matplotlib import cbook +from matplotlib.axes import Axes +from matplotlib.backend_bases import FigureCanvasBase, ToolContainerBase +from matplotlib.backend_managers import ToolEvent, ToolManager +from matplotlib.figure import Figure +from matplotlib.scale import ScaleBase +from typing import Any + +class Cursors(enum.IntEnum): + POINTER: int + HAND: int + SELECT_REGION: int + MOVE: int + WAIT: int + RESIZE_HORIZONTAL: int + RESIZE_VERTICAL: int + ... + + +cursors = Cursors +class ToolBase: + @property + def default_keymap(self) -> list[str] | None: + ... + + description: str | None + image: str | None + def __init__(self, toolmanager: ToolManager, name: str) -> None: + ... + + @property + def name(self) -> str: + ... + + @property + def toolmanager(self) -> ToolManager: + ... + + @property + def canvas(self) -> FigureCanvasBase | None: + ... + + @property + def figure(self) -> Figure | None: + ... + + @figure.setter + def figure(self, figure: Figure | None) -> None: + ... + + def set_figure(self, figure: Figure | None) -> None: + ... + + def trigger(self, sender: Any, event: ToolEvent, data: Any = ...) -> None: + ... + + + +class ToolToggleBase(ToolBase): + radio_group: str | None + cursor: Cursors | None + default_toggled: bool + def __init__(self, *args, **kwargs) -> None: + ... + + def enable(self, event: ToolEvent | None = ...) -> None: + ... + + def disable(self, event: ToolEvent | None = ...) -> None: + ... + + @property + def toggled(self) -> bool: + ... + + def set_figure(self, figure: Figure | None) -> None: + ... + + + +class ToolSetCursor(ToolBase): + ... + + +class ToolCursorPosition(ToolBase): + def send_message(self, event: ToolEvent) -> None: + ... + + + +class RubberbandBase(ToolBase): + def draw_rubberband(self, *data) -> None: + ... + + def remove_rubberband(self) -> None: + ... + + + +class ToolQuit(ToolBase): + ... + + +class ToolQuitAll(ToolBase): + ... + + +class ToolGrid(ToolBase): + ... + + +class ToolMinorGrid(ToolBase): + ... + + +class ToolFullScreen(ToolBase): + ... + + +class AxisScaleBase(ToolToggleBase): + def enable(self, event: ToolEvent | None = ...) -> None: + ... + + def disable(self, event: ToolEvent | None = ...) -> None: + ... + + + +class ToolYScale(AxisScaleBase): + def set_scale(self, ax: Axes, scale: str | ScaleBase) -> None: + ... + + + +class ToolXScale(AxisScaleBase): + def set_scale(self, ax, scale: str | ScaleBase) -> None: + ... + + + +class ToolViewsPositions(ToolBase): + views: dict[Figure | Axes, cbook.Stack] + positions: dict[Figure | Axes, cbook.Stack] + home_views: dict[Figure, dict[Axes, tuple[float, float, float, float]]] + def add_figure(self, figure: Figure) -> None: + ... + + def clear(self, figure: Figure) -> None: + ... + + def update_view(self) -> None: + ... + + def push_current(self, figure: Figure | None = ...) -> None: + ... + + def update_home_views(self, figure: Figure | None = ...) -> None: + ... + + def home(self) -> None: + ... + + def back(self) -> None: + ... + + def forward(self) -> None: + ... + + + +class ViewsPositionsBase(ToolBase): + ... + + +class ToolHome(ViewsPositionsBase): + ... + + +class ToolBack(ViewsPositionsBase): + ... + + +class ToolForward(ViewsPositionsBase): + ... + + +class ConfigureSubplotsBase(ToolBase): + ... + + +class SaveFigureBase(ToolBase): + ... + + +class ZoomPanBase(ToolToggleBase): + base_scale: float + scrollthresh: float + lastscroll: float + def __init__(self, *args) -> None: + ... + + def enable(self, event: ToolEvent | None = ...) -> None: + ... + + def disable(self, event: ToolEvent | None = ...) -> None: + ... + + def scroll_zoom(self, event: ToolEvent) -> None: + ... + + + +class ToolZoom(ZoomPanBase): + ... + + +class ToolPan(ZoomPanBase): + ... + + +class ToolHelpBase(ToolBase): + @staticmethod + def format_shortcut(key_sequence: str) -> str: + ... + + + +class ToolCopyToClipboardBase(ToolBase): + ... + + +default_tools: dict[str, ToolBase] +default_toolbar_tools: list[list[str | list[str]]] +def add_tools_to_manager(toolmanager: ToolManager, tools: dict[str, type[ToolBase]] = ...) -> None: + ... + +def add_tools_to_container(container: ToolContainerBase, tools: list[Any] = ...) -> None: + ... + diff --git a/typings/matplotlib/backends/__init__.pyi b/typings/matplotlib/backends/__init__.pyi new file mode 100644 index 0000000..a9acd6a --- /dev/null +++ b/typings/matplotlib/backends/__init__.pyi @@ -0,0 +1,5 @@ +""" +This type stub file was generated by pyright. +""" + +_QT_FORCE_QT5_BINDING = ... diff --git a/typings/matplotlib/bezier.pyi b/typings/matplotlib/bezier.pyi new file mode 100644 index 0000000..44ee0ee --- /dev/null +++ b/typings/matplotlib/bezier.pyi @@ -0,0 +1,81 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from collections.abc import Callable +from typing import Literal +from numpy.typing import ArrayLike +from .path import Path + +class NonIntersectingPathException(ValueError): + ... + + +def get_intersection(cx1: float, cy1: float, cos_t1: float, sin_t1: float, cx2: float, cy2: float, cos_t2: float, sin_t2: float) -> tuple[float, float]: + ... + +def get_normal_points(cx: float, cy: float, cos_t: float, sin_t: float, length: float) -> tuple[float, float, float, float]: + ... + +def split_de_casteljau(beta: ArrayLike, t: float) -> tuple[np.ndarray, np.ndarray]: + ... + +def find_bezier_t_intersecting_with_closedpath(bezier_point_at_t: Callable[[float], tuple[float, float]], inside_closedpath: Callable[[tuple[float, float]], bool], t0: float = ..., t1: float = ..., tolerance: float = ...) -> tuple[float, float]: + ... + +class BezierSegment: + def __init__(self, control_points: ArrayLike) -> None: + ... + + def __call__(self, t: ArrayLike) -> np.ndarray: + ... + + def point_at_t(self, t: float) -> tuple[float, ...]: + ... + + @property + def control_points(self) -> np.ndarray: + ... + + @property + def dimension(self) -> int: + ... + + @property + def degree(self) -> int: + ... + + @property + def polynomial_coefficients(self) -> np.ndarray: + ... + + def axis_aligned_extrema(self) -> tuple[np.ndarray, np.ndarray]: + ... + + + +def split_bezier_intersecting_with_closedpath(bezier: ArrayLike, inside_closedpath: Callable[[tuple[float, float]], bool], tolerance: float = ...) -> tuple[np.ndarray, np.ndarray]: + ... + +def split_path_inout(path: Path, inside: Callable[[tuple[float, float]], bool], tolerance: float = ..., reorder_inout: bool = ...) -> tuple[Path, Path]: + ... + +def inside_circle(cx: float, cy: float, r: float) -> Callable[[tuple[float, float]], bool]: + ... + +def get_cos_sin(x0: float, y0: float, x1: float, y1: float) -> tuple[float, float]: + ... + +def check_if_parallel(dx1: float, dy1: float, dx2: float, dy2: float, tolerance: float = ...) -> Literal[-1, False, 1]: + ... + +def get_parallels(bezier2: ArrayLike, width: float) -> tuple[list[tuple[float, float]], list[tuple[float, float]]]: + ... + +def find_control_points(c1x: float, c1y: float, mmx: float, mmy: float, c2x: float, c2y: float) -> list[tuple[float, float]]: + ... + +def make_wedged_bezier2(bezier2: ArrayLike, width: float, w1: float = ..., wm: float = ..., w2: float = ...) -> tuple[list[tuple[float, float]], list[tuple[float, float]]]: + ... + diff --git a/typings/matplotlib/category.pyi b/typings/matplotlib/category.pyi new file mode 100644 index 0000000..55c78a6 --- /dev/null +++ b/typings/matplotlib/category.pyi @@ -0,0 +1,151 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib import ticker, units + +""" +Plotting of string "category" data: ``plot(['d', 'f', 'a'], [1, 2, 3])`` will +plot three points with x-axis values of 'd', 'f', 'a'. + +See :doc:`/gallery/lines_bars_and_markers/categorical_variables` for an +example. + +The module uses Matplotlib's `matplotlib.units` mechanism to convert from +strings to integers and provides a tick locator, a tick formatter, and the +`.UnitData` class that creates and stores the string-to-integer mapping. +""" +_log = ... +class StrCategoryConverter(units.ConversionInterface): + @staticmethod + def convert(value, unit, axis): # -> Any: + """ + Convert strings in *value* to floats using mapping information stored + in the *unit* object. + + Parameters + ---------- + value : str or iterable + Value or list of values to be converted. + unit : `.UnitData` + An object mapping strings to integers. + axis : `~matplotlib.axis.Axis` + The axis on which the converted value is plotted. + + .. note:: *axis* is unused. + + Returns + ------- + float or `~numpy.ndarray` of float + """ + ... + + @staticmethod + def axisinfo(unit, axis): # -> AxisInfo: + """ + Set the default axis ticks and labels. + + Parameters + ---------- + unit : `.UnitData` + object string unit information for value + axis : `~matplotlib.axis.Axis` + axis for which information is being set + + .. note:: *axis* is not used + + Returns + ------- + `~matplotlib.units.AxisInfo` + Information to support default tick labeling + + """ + ... + + @staticmethod + def default_units(data, axis): + """ + Set and update the `~matplotlib.axis.Axis` units. + + Parameters + ---------- + data : str or iterable of str + axis : `~matplotlib.axis.Axis` + axis on which the data is plotted + + Returns + ------- + `.UnitData` + object storing string to integer mapping + """ + ... + + + +class StrCategoryLocator(ticker.Locator): + """Tick at every integer mapping of the string data.""" + def __init__(self, units_mapping) -> None: + """ + Parameters + ---------- + units_mapping : dict + Mapping of category names (str) to indices (int). + """ + ... + + def __call__(self): # -> list[Unknown]: + ... + + def tick_values(self, vmin, vmax): # -> list[Unknown]: + ... + + + +class StrCategoryFormatter(ticker.Formatter): + """String representation of the data at every tick.""" + def __init__(self, units_mapping) -> None: + """ + Parameters + ---------- + units_mapping : dict + Mapping of category names (str) to indices (int). + """ + ... + + def __call__(self, x, pos=...): # -> str: + ... + + def format_ticks(self, values): # -> list[str]: + ... + + + +class UnitData: + def __init__(self, data=...) -> None: + """ + Create mapping between unique categorical values and integer ids. + + Parameters + ---------- + data : iterable + sequence of string values + """ + ... + + def update(self, data): # -> None: + """ + Map new values to integer identifiers. + + Parameters + ---------- + data : iterable of str or bytes + + Raises + ------ + TypeError + If elements in *data* are neither str nor bytes. + """ + ... + + + diff --git a/typings/matplotlib/cbook.pyi b/typings/matplotlib/cbook.pyi new file mode 100644 index 0000000..5140241 --- /dev/null +++ b/typings/matplotlib/cbook.pyi @@ -0,0 +1,236 @@ +""" +This type stub file was generated by pyright. +""" + +import collections.abc +import contextlib +import os +import numpy as np +from collections.abc import Callable, Collection, Generator, Iterable, Iterator +from matplotlib.artist import Artist +from numpy.typing import ArrayLike +from typing import Any, Generic, IO, Literal, TypeVar, overload + +_T = TypeVar("_T") +class CallbackRegistry: + exception_handler: Callable[[Exception], Any] + callbacks: dict[Any, dict[int, Any]] + def __init__(self, exception_handler: Callable[[Exception], Any] | None = ..., *, signals: Iterable[Any] | None = ...) -> None: + ... + + def connect(self, signal: Any, func: Callable) -> int: + ... + + def disconnect(self, cid: int) -> None: + ... + + def process(self, s: Any, *args, **kwargs) -> None: + ... + + def blocked(self, *, signal: Any | None = ...) -> contextlib.AbstractContextManager[None]: + ... + + + +class silent_list(list[_T]): + type: str | None + def __init__(self, type: str | None, seq: Iterable[_T] | None = ...) -> None: + ... + + + +def strip_math(s: str) -> str: + ... + +def is_writable_file_like(obj: Any) -> bool: + ... + +def file_requires_unicode(x: Any) -> bool: + ... + +@overload +def to_filehandle(fname: str | os.PathLike | IO, flag: str = ..., return_opened: Literal[False] = ..., encoding: str | None = ...) -> IO: + ... + +@overload +def to_filehandle(fname: str | os.PathLike | IO, flag: str, return_opened: Literal[True], encoding: str | None = ...) -> tuple[IO, bool]: + ... + +@overload +def to_filehandle(fname: str | os.PathLike | IO, *, return_opened: Literal[True], encoding: str | None = ...) -> tuple[IO, bool]: + ... + +def open_file_cm(path_or_file: str | os.PathLike | IO, mode: str = ..., encoding: str | None = ...) -> contextlib.AbstractContextManager[IO]: + ... + +def is_scalar_or_string(val: Any) -> bool: + ... + +@overload +def get_sample_data(fname: str | os.PathLike, asfileobj: Literal[True] = ..., *, np_load: Literal[True]) -> np.ndarray: + ... + +@overload +def get_sample_data(fname: str | os.PathLike, asfileobj: Literal[True] = ..., *, np_load: Literal[False] = ...) -> IO: + ... + +@overload +def get_sample_data(fname: str | os.PathLike, asfileobj: Literal[False], *, np_load: bool = ...) -> str: + ... + +def flatten(seq: Iterable[Any], scalarp: Callable[[Any], bool] = ...) -> Generator[Any, None, None]: + ... + +class Stack(Generic[_T]): + def __init__(self, default: _T | None = ...) -> None: + ... + + def __call__(self) -> _T: + ... + + def __len__(self) -> int: + ... + + def __getitem__(self, ind: int) -> _T: + ... + + def forward(self) -> _T: + ... + + def back(self) -> _T: + ... + + def push(self, o: _T) -> _T: + ... + + def home(self) -> _T: + ... + + def empty(self) -> bool: + ... + + def clear(self) -> None: + ... + + def bubble(self, o: _T) -> _T: + ... + + def remove(self, o: _T) -> None: + ... + + + +def safe_masked_invalid(x: ArrayLike, copy: bool = ...) -> np.ndarray: + ... + +def print_cycles(objects: Iterable[Any], outstream: IO = ..., show_progress: bool = ...) -> None: + ... + +class Grouper(Generic[_T]): + def __init__(self, init: Iterable[_T] = ...) -> None: + ... + + def __contains__(self, item: _T) -> bool: + ... + + def clean(self) -> None: + ... + + def join(self, a: _T, *args: _T) -> None: + ... + + def joined(self, a: _T, b: _T) -> bool: + ... + + def remove(self, a: _T) -> None: + ... + + def __iter__(self) -> Iterator[list[_T]]: + ... + + def get_siblings(self, a: _T) -> list[_T]: + ... + + + +class GrouperView(Generic[_T]): + def __init__(self, grouper: Grouper[_T]) -> None: + ... + + def __contains__(self, item: _T) -> bool: + ... + + def __iter__(self) -> Iterator[list[_T]]: + ... + + def joined(self, a: _T, b: _T) -> bool: + ... + + def get_siblings(self, a: _T) -> list[_T]: + ... + + + +def simple_linear_interpolation(a: ArrayLike, steps: int) -> np.ndarray: + ... + +def delete_masked_points(*args): + ... + +def boxplot_stats(X: ArrayLike, whis: float | tuple[float, float] = ..., bootstrap: int | None = ..., labels: ArrayLike | None = ..., autorange: bool = ...) -> list[dict[str, Any]]: + ... + +ls_mapper: dict[str, str] +ls_mapper_r: dict[str, str] +def contiguous_regions(mask: ArrayLike) -> list[np.ndarray]: + ... + +def is_math_text(s: str) -> bool: + ... + +def violin_stats(X: ArrayLike, method: Callable, points: int = ..., quantiles: ArrayLike | None = ...) -> list[dict[str, Any]]: + ... + +def pts_to_prestep(x: ArrayLike, *args: ArrayLike) -> np.ndarray: + ... + +def pts_to_poststep(x: ArrayLike, *args: ArrayLike) -> np.ndarray: + ... + +def pts_to_midstep(x: np.ndarray, *args: np.ndarray) -> np.ndarray: + ... + +STEP_LOOKUP_MAP: dict[str, Callable] +def index_of(y: float | ArrayLike) -> tuple[np.ndarray, np.ndarray]: + ... + +def safe_first_element(obj: Collection[_T]) -> _T: + ... + +def sanitize_sequence(data): + ... + +def normalize_kwargs(kw: dict[str, Any], alias_mapping: dict[str, list[str]] | type[Artist] | Artist | None = ...) -> dict[str, Any]: + ... + +class _OrderedSet(collections.abc.MutableSet): + def __init__(self) -> None: + ... + + def __contains__(self, key) -> bool: + ... + + def __iter__(self): + ... + + def __len__(self) -> int: + ... + + def add(self, key) -> None: + ... + + def discard(self, key) -> None: + ... + + + diff --git a/typings/matplotlib/cm.pyi b/typings/matplotlib/cm.pyi new file mode 100644 index 0000000..92de619 --- /dev/null +++ b/typings/matplotlib/cm.pyi @@ -0,0 +1,94 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from collections.abc import Iterator, Mapping +from matplotlib import cbook, colors +from matplotlib.colorbar import Colorbar +from numpy.typing import ArrayLike + +class ColormapRegistry(Mapping[str, colors.Colormap]): + def __init__(self, cmaps: Mapping[str, colors.Colormap]) -> None: + ... + + def __getitem__(self, item: str) -> colors.Colormap: + ... + + def __iter__(self) -> Iterator[str]: + ... + + def __len__(self) -> int: + ... + + def __call__(self) -> list[str]: + ... + + def register(self, cmap: colors.Colormap, *, name: str | None = ..., force: bool = ...) -> None: + ... + + def unregister(self, name: str) -> None: + ... + + def get_cmap(self, cmap: str | colors.Colormap) -> colors.Colormap: + ... + + + +_colormaps: ColormapRegistry = ... +def get_cmap(name: str | colors.Colormap | None = ..., lut: int | None = ...) -> colors.Colormap: + ... + +class ScalarMappable: + cmap: colors.Colormap | None + colorbar: Colorbar | None + callbacks: cbook.CallbackRegistry + def __init__(self, norm: colors.Normalize | None = ..., cmap: str | colors.Colormap | None = ...) -> None: + ... + + def to_rgba(self, x: np.ndarray, alpha: float | ArrayLike | None = ..., bytes: bool = ..., norm: bool = ...) -> np.ndarray: + ... + + def set_array(self, A: ArrayLike | None) -> None: + ... + + def get_array(self) -> np.ndarray | None: + ... + + def get_cmap(self) -> colors.Colormap: + ... + + def get_clim(self) -> tuple[float, float]: + ... + + def set_clim(self, vmin: float | tuple[float, float] | None = ..., vmax: float | None = ...) -> None: + ... + + def get_alpha(self) -> float | None: + ... + + def set_cmap(self, cmap: str | colors.Colormap) -> None: + ... + + @property + def norm(self) -> colors.Normalize: + ... + + @norm.setter + def norm(self, norm: colors.Normalize | str | None) -> None: + ... + + def set_norm(self, norm: colors.Normalize | str | None) -> None: + ... + + def autoscale(self) -> None: + ... + + def autoscale_None(self) -> None: + ... + + def changed(self) -> None: + ... + + + diff --git a/typings/matplotlib/collections.pyi b/typings/matplotlib/collections.pyi new file mode 100644 index 0000000..15fd65b --- /dev/null +++ b/typings/matplotlib/collections.pyi @@ -0,0 +1,362 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from collections.abc import Callable, Iterable, Sequence +from typing import Literal +from numpy.typing import ArrayLike, NDArray +from . import artist, cm, transforms +from .backend_bases import MouseEvent +from .artist import Artist +from .colors import Colormap, Normalize +from .lines import Line2D +from .path import Path +from .patches import Patch +from .ticker import Formatter, Locator +from .tri import Triangulation +from .typing import CapStyleType, ColorType, JoinStyleType, LineStyleType + +class Collection(artist.Artist, cm.ScalarMappable): + def __init__(self, *, edgecolors: ColorType | Sequence[ColorType] | None = ..., facecolors: ColorType | Sequence[ColorType] | None = ..., linewidths: float | Sequence[float] | None = ..., linestyles: LineStyleType | Sequence[LineStyleType] = ..., capstyle: CapStyleType | None = ..., joinstyle: JoinStyleType | None = ..., antialiaseds: bool | Sequence[bool] | None = ..., offsets: tuple[float, float] | Sequence[tuple[float, float]] | None = ..., offset_transform: transforms.Transform | None = ..., norm: Normalize | None = ..., cmap: Colormap | None = ..., pickradius: float = ..., hatch: str | None = ..., urls: Sequence[str] | None = ..., zorder: float = ..., **kwargs) -> None: + ... + + def get_paths(self) -> Sequence[Path]: + ... + + def set_paths(self, paths: Sequence[Path]) -> None: + ... + + def get_transforms(self) -> Sequence[transforms.Transform]: + ... + + def get_offset_transform(self) -> transforms.Transform: + ... + + def set_offset_transform(self, offset_transform: transforms.Transform) -> None: + ... + + def get_datalim(self, transData: transforms.Transform) -> transforms.Bbox: + ... + + def set_pickradius(self, pickradius: float) -> None: + ... + + def get_pickradius(self) -> float: + ... + + def set_urls(self, urls: Sequence[str | None]) -> None: + ... + + def get_urls(self) -> Sequence[str | None]: + ... + + def set_hatch(self, hatch: str) -> None: + ... + + def get_hatch(self) -> str: + ... + + def set_offsets(self, offsets: ArrayLike) -> None: + ... + + def get_offsets(self) -> ArrayLike: + ... + + def set_linewidth(self, lw: float | Sequence[float]) -> None: + ... + + def set_linestyle(self, ls: LineStyleType | Sequence[LineStyleType]) -> None: + ... + + def set_capstyle(self, cs: CapStyleType) -> None: + ... + + def get_capstyle(self) -> Literal["butt", "projecting", "round"] | None: + ... + + def set_joinstyle(self, js: JoinStyleType) -> None: + ... + + def get_joinstyle(self) -> Literal["miter", "round", "bevel"] | None: + ... + + def set_antialiased(self, aa: bool | Sequence[bool]) -> None: + ... + + def get_antialiased(self) -> NDArray[np.bool_]: + ... + + def set_color(self, c: ColorType | Sequence[ColorType]) -> None: + ... + + def set_facecolor(self, c: ColorType | Sequence[ColorType]) -> None: + ... + + def get_facecolor(self) -> ColorType | Sequence[ColorType]: + ... + + def get_edgecolor(self) -> ColorType | Sequence[ColorType]: + ... + + def set_edgecolor(self, c: ColorType | Sequence[ColorType]) -> None: + ... + + def set_alpha(self, alpha: float | Sequence[float] | None) -> None: + ... + + def get_linewidth(self) -> float | Sequence[float]: + ... + + def get_linestyle(self) -> LineStyleType | Sequence[LineStyleType]: + ... + + def update_scalarmappable(self) -> None: + ... + + def get_fill(self) -> bool: + ... + + def update_from(self, other: Artist) -> None: + ... + + + +class _CollectionWithSizes(Collection): + def get_sizes(self) -> np.ndarray: + ... + + def set_sizes(self, sizes: ArrayLike | None, dpi: float = ...) -> None: + ... + + + +class PathCollection(_CollectionWithSizes): + def __init__(self, paths: Sequence[Path], sizes: ArrayLike | None = ..., **kwargs) -> None: + ... + + def set_paths(self, paths: Sequence[Path]) -> None: + ... + + def get_paths(self) -> Sequence[Path]: + ... + + def legend_elements(self, prop: Literal["colors", "sizes"] = ..., num: int | Literal["auto"] | ArrayLike | Locator = ..., fmt: str | Formatter | None = ..., func: Callable[[ArrayLike], ArrayLike] = ..., **kwargs) -> tuple[list[Line2D], list[str]]: + ... + + + +class PolyCollection(_CollectionWithSizes): + def __init__(self, verts: Sequence[ArrayLike], sizes: ArrayLike | None = ..., *, closed: bool = ..., **kwargs) -> None: + ... + + def set_verts(self, verts: Sequence[ArrayLike | Path], closed: bool = ...) -> None: + ... + + def set_paths(self, verts: Sequence[Path], closed: bool = ...) -> None: + ... + + def set_verts_and_codes(self, verts: Sequence[ArrayLike | Path], codes: Sequence[int]) -> None: + ... + + + +class BrokenBarHCollection(PolyCollection): + def __init__(self, xranges: Iterable[tuple[float, float]], yrange: tuple[float, float], **kwargs) -> None: + ... + + @classmethod + def span_where(cls, x: ArrayLike, ymin: float, ymax: float, where: ArrayLike, **kwargs) -> BrokenBarHCollection: + ... + + + +class RegularPolyCollection(_CollectionWithSizes): + def __init__(self, numsides: int, *, rotation: float = ..., sizes: ArrayLike = ..., **kwargs) -> None: + ... + + def get_numsides(self) -> int: + ... + + def get_rotation(self) -> float: + ... + + + +class StarPolygonCollection(RegularPolyCollection): + ... + + +class AsteriskPolygonCollection(RegularPolyCollection): + ... + + +class LineCollection(Collection): + def __init__(self, segments: Sequence[ArrayLike], *, zorder: float = ..., **kwargs) -> None: + ... + + def set_segments(self, segments: Sequence[ArrayLike] | None) -> None: + ... + + def set_verts(self, segments: Sequence[ArrayLike] | None) -> None: + ... + + def set_paths(self, segments: Sequence[ArrayLike] | None) -> None: + ... + + def get_segments(self) -> list[np.ndarray]: + ... + + def set_color(self, c: ColorType | Sequence[ColorType]) -> None: + ... + + def set_colors(self, c: ColorType | Sequence[ColorType]) -> None: + ... + + def set_gapcolor(self, gapcolor: ColorType | Sequence[ColorType] | None) -> None: + ... + + def get_color(self) -> ColorType | Sequence[ColorType]: + ... + + def get_colors(self) -> ColorType | Sequence[ColorType]: + ... + + def get_gapcolor(self) -> ColorType | Sequence[ColorType] | None: + ... + + + +class EventCollection(LineCollection): + def __init__(self, positions: ArrayLike, orientation: Literal["horizontal", "vertical"] = ..., *, lineoffset: float = ..., linelength: float = ..., linewidth: float | Sequence[float] | None = ..., color: ColorType | Sequence[ColorType] | None = ..., linestyle: LineStyleType | Sequence[LineStyleType] = ..., antialiased: bool | Sequence[bool] | None = ..., **kwargs) -> None: + ... + + def get_positions(self) -> list[float]: + ... + + def set_positions(self, positions: Sequence[float] | None) -> None: + ... + + def add_positions(self, position: Sequence[float] | None) -> None: + ... + + def extend_positions(self, position: Sequence[float] | None) -> None: + ... + + def append_positions(self, position: Sequence[float] | None) -> None: + ... + + def is_horizontal(self) -> bool: + ... + + def get_orientation(self) -> Literal["horizontal", "vertical"]: + ... + + def switch_orientation(self) -> None: + ... + + def set_orientation(self, orientation: Literal["horizontal", "vertical"]) -> None: + ... + + def get_linelength(self) -> float | Sequence[float]: + ... + + def set_linelength(self, linelength: float | Sequence[float]) -> None: + ... + + def get_lineoffset(self) -> float: + ... + + def set_lineoffset(self, lineoffset: float) -> None: + ... + + def get_linewidth(self) -> float: + ... + + def get_linewidths(self) -> Sequence[float]: + ... + + def get_color(self) -> ColorType: + ... + + + +class CircleCollection(_CollectionWithSizes): + def __init__(self, sizes: float | ArrayLike, **kwargs) -> None: + ... + + + +class EllipseCollection(Collection): + def __init__(self, widths: ArrayLike, heights: ArrayLike, angles: ArrayLike, *, units: Literal["points", "inches", "dots", "width", "height", "x", "y", "xy"] = ..., **kwargs) -> None: + ... + + + +class PatchCollection(Collection): + def __init__(self, patches: Iterable[Patch], *, match_original: bool = ..., **kwargs) -> None: + ... + + def set_paths(self, patches: Iterable[Patch]) -> None: + ... + + + +class TriMesh(Collection): + def __init__(self, triangulation: Triangulation, **kwargs) -> None: + ... + + def get_paths(self) -> list[Path]: + ... + + def set_paths(self) -> None: + ... + + @staticmethod + def convert_mesh_to_paths(tri: Triangulation) -> list[Path]: + ... + + + +class _MeshData: + def __init__(self, coordinates: ArrayLike, *, shading: Literal["flat", "gouraud"] = ...) -> None: + ... + + def set_array(self, A: ArrayLike | None) -> None: + ... + + def get_coordinates(self) -> ArrayLike: + ... + + def get_facecolor(self) -> ColorType | Sequence[ColorType]: + ... + + def get_edgecolor(self) -> ColorType | Sequence[ColorType]: + ... + + + +class QuadMesh(_MeshData, Collection): + def __init__(self, coordinates: ArrayLike, *, antialiased: bool = ..., shading: Literal["flat", "gouraud"] = ..., **kwargs) -> None: + ... + + def get_paths(self) -> list[Path]: + ... + + def set_paths(self) -> None: + ... + + def get_datalim(self, transData: transforms.Transform) -> transforms.Bbox: + ... + + def get_cursor_data(self, event: MouseEvent) -> float: + ... + + + +class PolyQuadMesh(_MeshData, PolyCollection): + def __init__(self, coordinates: ArrayLike, **kwargs) -> None: + ... + + + diff --git a/typings/matplotlib/colorbar.pyi b/typings/matplotlib/colorbar.pyi new file mode 100644 index 0000000..b85de94 --- /dev/null +++ b/typings/matplotlib/colorbar.pyi @@ -0,0 +1,138 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib.spines as mspines +import numpy as np +from matplotlib import cm, collections, colors, contour +from matplotlib.axes import Axes +from matplotlib.backend_bases import RendererBase +from matplotlib.patches import Patch +from matplotlib.ticker import Formatter, Locator +from matplotlib.transforms import Bbox +from numpy.typing import ArrayLike +from collections.abc import Sequence +from typing import Any, Literal, overload +from .typing import ColorType + +class _ColorbarSpine(mspines.Spines): + def __init__(self, axes: Axes) -> None: + ... + + def get_window_extent(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + def set_xy(self, xy: ArrayLike) -> None: + ... + + def draw(self, renderer: RendererBase | None) -> None: + ... + + + +class Colorbar: + n_rasterize: int + mappable: cm.ScalarMappable + ax: Axes + alpha: float | None + cmap: colors.Colormap + norm: colors.Normalize + values: Sequence[float] | None + boundaries: Sequence[float] | None + extend: Literal["neither", "both", "min", "max"] + spacing: Literal["uniform", "proportional"] + orientation: Literal["vertical", "horizontal"] + drawedges: bool + extendfrac: Literal["auto"] | float | Sequence[float] | None + extendrect: bool + solids: None | collections.QuadMesh + solids_patches: list[Patch] + lines: list[collections.LineCollection] + outline: _ColorbarSpine + dividers: collections.LineCollection + ticklocation: Literal["left", "right", "top", "bottom"] + def __init__(self, ax: Axes, mappable: cm.ScalarMappable | None = ..., *, cmap: str | colors.Colormap | None = ..., norm: colors.Normalize | None = ..., alpha: float | None = ..., values: Sequence[float] | None = ..., boundaries: Sequence[float] | None = ..., orientation: Literal["vertical", "horizontal"] | None = ..., ticklocation: Literal["auto", "left", "right", "top", "bottom"] = ..., extend: Literal["neither", "both", "min", "max"] | None = ..., spacing: Literal["uniform", "proportional"] = ..., ticks: Sequence[float] | Locator | None = ..., format: str | Formatter | None = ..., drawedges: bool = ..., extendfrac: Literal["auto"] | float | Sequence[float] | None = ..., extendrect: bool = ..., label: str = ..., location: Literal["left", "right", "top", "bottom"] | None = ...) -> None: + ... + + @property + def locator(self) -> Locator: + ... + + @locator.setter + def locator(self, loc: Locator) -> None: + ... + + @property + def minorlocator(self) -> Locator: + ... + + @minorlocator.setter + def minorlocator(self, loc: Locator) -> None: + ... + + @property + def formatter(self) -> Formatter: + ... + + @formatter.setter + def formatter(self, fmt: Formatter) -> None: + ... + + @property + def minorformatter(self) -> Formatter: + ... + + @minorformatter.setter + def minorformatter(self, fmt: Formatter) -> None: + ... + + def update_normal(self, mappable: cm.ScalarMappable) -> None: + ... + + @overload + def add_lines(self, CS: contour.ContourSet, erase: bool = ...) -> None: + ... + + @overload + def add_lines(self, levels: ArrayLike, colors: ColorType | Sequence[ColorType], linewidths: float | ArrayLike, erase: bool = ...) -> None: + ... + + def update_ticks(self) -> None: + ... + + def set_ticks(self, ticks: Sequence[float] | Locator, *, labels: Sequence[str] | None = ..., minor: bool = ..., **kwargs) -> None: + ... + + def get_ticks(self, minor: bool = ...) -> np.ndarray: + ... + + def set_ticklabels(self, ticklabels: Sequence[str], *, minor: bool = ..., **kwargs) -> None: + ... + + def minorticks_on(self) -> None: + ... + + def minorticks_off(self) -> None: + ... + + def set_label(self, label: str, *, loc: str | None = ..., **kwargs) -> None: + ... + + def set_alpha(self, alpha: float | np.ndarray) -> None: + ... + + def remove(self) -> None: + ... + + def drag_pan(self, button: Any, key: Any, x: float, y: float) -> None: + ... + + + +ColorbarBase = Colorbar +def make_axes(parents: Axes | list[Axes] | np.ndarray, location: Literal["left", "right", "top", "bottom"] | None = ..., orientation: Literal["vertical", "horizontal"] | None = ..., fraction: float = ..., shrink: float = ..., aspect: float = ..., **kwargs) -> tuple[Axes, dict[str, Any]]: + ... + +def make_axes_gridspec(parent: Axes, *, location: Literal["left", "right", "top", "bottom"] | None = ..., orientation: Literal["vertical", "horizontal"] | None = ..., fraction: float = ..., shrink: float = ..., aspect: float = ..., **kwargs) -> tuple[Axes, dict[str, Any]]: + ... + diff --git a/typings/matplotlib/colors.pyi b/typings/matplotlib/colors.pyi new file mode 100644 index 0000000..8eae2eb --- /dev/null +++ b/typings/matplotlib/colors.pyi @@ -0,0 +1,411 @@ +""" +This type stub file was generated by pyright. +""" + +import re +import numpy as np +from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence +from matplotlib import cbook, scale +from typing import Any, Literal, overload +from .typing import ColorType +from numpy.typing import ArrayLike + +BASE_COLORS: dict[str, ColorType] +CSS4_COLORS: dict[str, ColorType] +TABLEAU_COLORS: dict[str, ColorType] +XKCD_COLORS: dict[str, ColorType] +class _ColorMapping(dict[str, ColorType]): + cache: dict[tuple[ColorType, float | None], tuple[float, float, float, float]] + def __init__(self, mapping) -> None: + ... + + def __setitem__(self, key, value) -> None: + ... + + def __delitem__(self, key) -> None: + ... + + + +def get_named_colors_mapping() -> _ColorMapping: + ... + +class ColorSequenceRegistry(Mapping): + def __init__(self) -> None: + ... + + def __getitem__(self, item: str) -> list[ColorType]: + ... + + def __iter__(self) -> Iterator[str]: + ... + + def __len__(self) -> int: + ... + + def register(self, name: str, color_list: Iterable[ColorType]) -> None: + ... + + def unregister(self, name: str) -> None: + ... + + + +_color_sequences: ColorSequenceRegistry = ... +def is_color_like(c: Any) -> bool: + ... + +def same_color(c1: ColorType, c2: ColorType) -> bool: + ... + +def to_rgba(c: ColorType, alpha: float | None = ...) -> tuple[float, float, float, float]: + ... + +def to_rgba_array(c: ColorType | ArrayLike, alpha: float | ArrayLike | None = ...) -> np.ndarray: + ... + +def to_rgb(c: ColorType) -> tuple[float, float, float]: + ... + +def to_hex(c: ColorType, keep_alpha: bool = ...) -> str: + ... + +cnames: dict[str, ColorType] +hexColorPattern: re.Pattern +rgb2hex = ... +hex2color = ... +class ColorConverter: + colors: _ColorMapping + cache: dict[tuple[ColorType, float | None], tuple[float, float, float, float]] + @staticmethod + def to_rgb(c: ColorType) -> tuple[float, float, float]: + ... + + @staticmethod + def to_rgba(c: ColorType, alpha: float | None = ...) -> tuple[float, float, float, float]: + ... + + @staticmethod + def to_rgba_array(c: ColorType | ArrayLike, alpha: float | ArrayLike | None = ...) -> np.ndarray: + ... + + + +colorConverter: ColorConverter +class Colormap: + name: str + N: int + colorbar_extend: bool + def __init__(self, name: str, N: int = ...) -> None: + ... + + @overload + def __call__(self, X: Sequence[float] | np.ndarray, alpha: ArrayLike | None = ..., bytes: bool = ...) -> np.ndarray: + ... + + @overload + def __call__(self, X: float, alpha: float | None = ..., bytes: bool = ...) -> tuple[float, float, float, float]: + ... + + @overload + def __call__(self, X: ArrayLike, alpha: ArrayLike | None = ..., bytes: bool = ...) -> tuple[float, float, float, float] | np.ndarray: + ... + + def __copy__(self) -> Colormap: + ... + + def __eq__(self, other: object) -> bool: + ... + + def get_bad(self) -> np.ndarray: + ... + + def set_bad(self, color: ColorType = ..., alpha: float | None = ...) -> None: + ... + + def get_under(self) -> np.ndarray: + ... + + def set_under(self, color: ColorType = ..., alpha: float | None = ...) -> None: + ... + + def get_over(self) -> np.ndarray: + ... + + def set_over(self, color: ColorType = ..., alpha: float | None = ...) -> None: + ... + + def set_extremes(self, *, bad: ColorType | None = ..., under: ColorType | None = ..., over: ColorType | None = ...) -> None: + ... + + def with_extremes(self, *, bad: ColorType | None = ..., under: ColorType | None = ..., over: ColorType | None = ...) -> Colormap: + ... + + def is_gray(self) -> bool: + ... + + def resampled(self, lutsize: int) -> Colormap: + ... + + def reversed(self, name: str | None = ...) -> Colormap: + ... + + def copy(self) -> Colormap: + ... + + + +class LinearSegmentedColormap(Colormap): + monochrome: bool + def __init__(self, name: str, segmentdata: dict[Literal["red", "green", "blue", "alpha"], Sequence[tuple[float, ...]]], N: int = ..., gamma: float = ...) -> None: + ... + + def set_gamma(self, gamma: float) -> None: + ... + + @staticmethod + def from_list(name: str, colors: ArrayLike, N: int = ..., gamma: float = ...) -> LinearSegmentedColormap: + ... + + def resampled(self, lutsize: int) -> LinearSegmentedColormap: + ... + + def reversed(self, name: str | None = ...) -> LinearSegmentedColormap: + ... + + + +class ListedColormap(Colormap): + monochrome: bool + colors: ArrayLike | ColorType + def __init__(self, colors: ArrayLike | ColorType, name: str = ..., N: int | None = ...) -> None: + ... + + def resampled(self, lutsize: int) -> ListedColormap: + ... + + def reversed(self, name: str | None = ...) -> ListedColormap: + ... + + + +class Normalize: + callbacks: cbook.CallbackRegistry + def __init__(self, vmin: float | None = ..., vmax: float | None = ..., clip: bool = ...) -> None: + ... + + @property + def vmin(self) -> float | None: + ... + + @vmin.setter + def vmin(self, value: float | None) -> None: + ... + + @property + def vmax(self) -> float | None: + ... + + @vmax.setter + def vmax(self, value: float | None) -> None: + ... + + @property + def clip(self) -> bool: + ... + + @clip.setter + def clip(self, value: bool) -> None: + ... + + @staticmethod + def process_value(value: ArrayLike) -> tuple[np.ma.MaskedArray, bool]: + ... + + @overload + def __call__(self, value: float, clip: bool | None = ...) -> float: + ... + + @overload + def __call__(self, value: np.ndarray, clip: bool | None = ...) -> np.ma.MaskedArray: + ... + + @overload + def __call__(self, value: ArrayLike, clip: bool | None = ...) -> ArrayLike: + ... + + @overload + def inverse(self, value: float) -> float: + ... + + @overload + def inverse(self, value: np.ndarray) -> np.ma.MaskedArray: + ... + + @overload + def inverse(self, value: ArrayLike) -> ArrayLike: + ... + + def autoscale(self, A: ArrayLike) -> None: + ... + + def autoscale_None(self, A: ArrayLike) -> None: + ... + + def scaled(self) -> bool: + ... + + + +class TwoSlopeNorm(Normalize): + def __init__(self, vcenter: float, vmin: float | None = ..., vmax: float | None = ...) -> None: + ... + + @property + def vcenter(self) -> float: + ... + + @vcenter.setter + def vcenter(self, value: float) -> None: + ... + + def autoscale_None(self, A: ArrayLike) -> None: + ... + + + +class CenteredNorm(Normalize): + def __init__(self, vcenter: float = ..., halfrange: float | None = ..., clip: bool = ...) -> None: + ... + + @property + def vcenter(self) -> float: + ... + + @vcenter.setter + def vcenter(self, vcenter: float) -> None: + ... + + @property + def halfrange(self) -> float: + ... + + @halfrange.setter + def halfrange(self, halfrange: float) -> None: + ... + + + +@overload +def make_norm_from_scale(scale_cls: type[scale.ScaleBase], base_norm_cls: type[Normalize], *, init: Callable | None = ...) -> type[Normalize]: + ... + +@overload +def make_norm_from_scale(scale_cls: type[scale.ScaleBase], base_norm_cls: None = ..., *, init: Callable | None = ...) -> Callable[[type[Normalize]], type[Normalize]]: + ... + +class FuncNorm(Normalize): + def __init__(self, functions: tuple[Callable, Callable], vmin: float | None = ..., vmax: float | None = ..., clip: bool = ...) -> None: + ... + + + +class LogNorm(Normalize): + ... + + +class SymLogNorm(Normalize): + def __init__(self, linthresh: float, linscale: float = ..., vmin: float | None = ..., vmax: float | None = ..., clip: bool = ..., *, base: float = ...) -> None: + ... + + @property + def linthresh(self) -> float: + ... + + @linthresh.setter + def linthresh(self, value: float) -> None: + ... + + + +class AsinhNorm(Normalize): + def __init__(self, linear_width: float = ..., vmin: float | None = ..., vmax: float | None = ..., clip: bool = ...) -> None: + ... + + @property + def linear_width(self) -> float: + ... + + @linear_width.setter + def linear_width(self, value: float) -> None: + ... + + + +class PowerNorm(Normalize): + gamma: float + def __init__(self, gamma: float, vmin: float | None = ..., vmax: float | None = ..., clip: bool = ...) -> None: + ... + + + +class BoundaryNorm(Normalize): + boundaries: np.ndarray + N: int + Ncmap: int + extend: Literal["neither", "both", "min", "max"] + def __init__(self, boundaries: ArrayLike, ncolors: int, clip: bool = ..., *, extend: Literal["neither", "both", "min", "max"] = ...) -> None: + ... + + + +class NoNorm(Normalize): + ... + + +def rgb_to_hsv(arr: ArrayLike) -> np.ndarray: + ... + +def hsv_to_rgb(hsv: ArrayLike) -> np.ndarray: + ... + +class LightSource: + azdeg: float + altdeg: float + hsv_min_val: float + hsv_max_val: float + hsv_min_sat: float + hsv_max_sat: float + def __init__(self, azdeg: float = ..., altdeg: float = ..., hsv_min_val: float = ..., hsv_max_val: float = ..., hsv_min_sat: float = ..., hsv_max_sat: float = ...) -> None: + ... + + @property + def direction(self) -> np.ndarray: + ... + + def hillshade(self, elevation: ArrayLike, vert_exag: float = ..., dx: float = ..., dy: float = ..., fraction: float = ...) -> np.ndarray: + ... + + def shade_normals(self, normals: np.ndarray, fraction: float = ...) -> np.ndarray: + ... + + def shade(self, data: ArrayLike, cmap: Colormap, norm: Normalize | None = ..., blend_mode: Literal["hsv", "overlay", "soft"] | Callable = ..., vmin: float | None = ..., vmax: float | None = ..., vert_exag: float = ..., dx: float = ..., dy: float = ..., fraction: float = ..., **kwargs) -> np.ndarray: + ... + + def shade_rgb(self, rgb: ArrayLike, elevation: ArrayLike, fraction: float = ..., blend_mode: Literal["hsv", "overlay", "soft"] | Callable = ..., vert_exag: float = ..., dx: float = ..., dy: float = ..., **kwargs) -> np.ndarray: + ... + + def blend_hsv(self, rgb: ArrayLike, intensity: ArrayLike, hsv_max_sat: float | None = ..., hsv_max_val: float | None = ..., hsv_min_val: float | None = ..., hsv_min_sat: float | None = ...) -> ArrayLike: + ... + + def blend_soft_light(self, rgb: np.ndarray, intensity: np.ndarray) -> np.ndarray: + ... + + def blend_overlay(self, rgb: np.ndarray, intensity: np.ndarray) -> np.ndarray: + ... + + + +def from_levels_and_colors(levels: Sequence[float], colors: Sequence[ColorType], extend: Literal["neither", "min", "max", "both"] = ...) -> tuple[ListedColormap, BoundaryNorm]: + ... + diff --git a/typings/matplotlib/container.pyi b/typings/matplotlib/container.pyi new file mode 100644 index 0000000..22f0998 --- /dev/null +++ b/typings/matplotlib/container.pyi @@ -0,0 +1,70 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.artist import Artist +from matplotlib.lines import Line2D +from matplotlib.collections import LineCollection +from matplotlib.patches import Rectangle +from collections.abc import Callable +from typing import Any, Literal +from numpy.typing import ArrayLike + +class Container(tuple): + def __new__(cls, *args, **kwargs): + ... + + def __init__(self, kl, label: Any | None = ...) -> None: + ... + + def remove(self) -> None: + ... + + def get_children(self) -> list[Artist]: + ... + + def get_label(self) -> str | None: + ... + + def set_label(self, s: Any) -> None: + ... + + def add_callback(self, func: Callable[[Artist], Any]) -> int: + ... + + def remove_callback(self, oid: int) -> None: + ... + + def pchanged(self) -> None: + ... + + + +class BarContainer(Container): + patches: list[Rectangle] + errorbar: None | ErrorbarContainer + datavalues: None | ArrayLike + orientation: None | Literal["vertical", "horizontal"] + def __init__(self, patches: list[Rectangle], errorbar: ErrorbarContainer | None = ..., *, datavalues: ArrayLike | None = ..., orientation: Literal["vertical", "horizontal"] | None = ..., **kwargs) -> None: + ... + + + +class ErrorbarContainer(Container): + lines: tuple[Line2D, Line2D, LineCollection] + has_xerr: bool + has_yerr: bool + def __init__(self, lines: tuple[Line2D, Line2D, LineCollection], has_xerr: bool = ..., has_yerr: bool = ..., **kwargs) -> None: + ... + + + +class StemContainer(Container): + markerline: Line2D + stemlines: LineCollection + baseline: Line2D + def __init__(self, markerline_stemlines_baseline: tuple[Line2D, LineCollection, Line2D], **kwargs) -> None: + ... + + + diff --git a/typings/matplotlib/contour.pyi b/typings/matplotlib/contour.pyi new file mode 100644 index 0000000..7bb98d3 --- /dev/null +++ b/typings/matplotlib/contour.pyi @@ -0,0 +1,142 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib.cm as cm +import numpy as np +from matplotlib.artist import Artist +from matplotlib.axes import Axes +from matplotlib.collections import Collection, PathCollection +from matplotlib.colors import Colormap, Normalize +from matplotlib.font_manager import FontProperties +from matplotlib.path import Path +from matplotlib.patches import Patch +from matplotlib.text import Text +from matplotlib.transforms import Transform, TransformedPatchPath, TransformedPath +from matplotlib.ticker import Formatter, Locator +from numpy.typing import ArrayLike +from collections.abc import Callable, Iterable, Sequence +from typing import Literal +from .typing import ColorType + +class ClabelText(Text): + ... + + +class ContourLabeler: + labelFmt: str | Formatter | Callable[[float], str] | dict[float, str] + labelManual: bool | Iterable[tuple[float, float]] + rightside_up: bool + labelLevelList: list[float] + labelIndiceList: list[int] + labelMappable: cm.ScalarMappable + labelCValueList: list[ColorType] + labelXYs: list[tuple[float, float]] + def clabel(self, levels: ArrayLike | None = ..., *, fontsize: str | float | None = ..., inline: bool = ..., inline_spacing: float = ..., fmt: str | Formatter | Callable[[float], str] | dict[float, str] | None = ..., colors: ColorType | Sequence[ColorType] | None = ..., use_clabeltext: bool = ..., manual: bool | Iterable[tuple[float, float]] = ..., rightside_up: bool = ..., zorder: float | None = ...) -> list[Text]: + ... + + @property + def labelFontProps(self) -> FontProperties: + ... + + @property + def labelFontSizeList(self) -> list[float]: + ... + + @property + def labelTextsList(self) -> list[Text]: + ... + + def print_label(self, linecontour: ArrayLike, labelwidth: float) -> bool: + ... + + def too_close(self, x: float, y: float, lw: float) -> bool: + ... + + def set_label_props(self, label: Text, text: str, color: ColorType) -> None: + ... + + def get_text(self, lev: float, fmt: str | Formatter | Callable[[float], str] | dict[float, str]) -> str: + ... + + def locate_label(self, linecontour: ArrayLike, labelwidth: float) -> tuple[float, float, float]: + ... + + def calc_label_rot_and_inline(self, slc: ArrayLike, ind: int, lw: float, lc: ArrayLike | None = ..., spacing: int = ...) -> tuple[float, list[ArrayLike]]: + ... + + def add_label(self, x: float, y: float, rotation: float, lev: float, cvalue: ColorType) -> None: + ... + + def add_label_clabeltext(self, x: float, y: float, rotation: float, lev: float, cvalue: ColorType) -> None: + ... + + def add_label_near(self, x: float, y: float, inline: bool = ..., inline_spacing: int = ..., transform: Transform | Literal[False] | None = ...) -> None: + ... + + def pop_label(self, index: int = ...) -> None: + ... + + def labels(self, inline: bool, inline_spacing: int) -> None: + ... + + def remove(self) -> None: + ... + + + +class ContourSet(ContourLabeler, Collection): + axes: Axes + levels: Iterable[float] + filled: bool + linewidths: float | ArrayLike | None + hatches: Iterable[str | None] + origin: Literal["upper", "lower", "image"] | None + extent: tuple[float, float, float, float] | None + colors: ColorType | Sequence[ColorType] + extend: Literal["neither", "both", "min", "max"] + nchunk: int + locator: Locator | None + logscale: bool + negative_linestyles: None | Literal["solid", "dashed", "dashdot", "dotted"] | Iterable[Literal["solid", "dashed", "dashdot", "dotted"]] + clip_path: Patch | Path | TransformedPath | TransformedPatchPath | None + labelTexts: list[Text] + labelCValues: list[ColorType] + allkinds: list[np.ndarray] + tcolors: list[tuple[float, float, float, float]] + tlinewidths: list[tuple[float]] + @property + def alpha(self) -> float | None: + ... + + @property + def antialiased(self) -> bool: + ... + + @antialiased.setter + def antialiased(self, aa: bool | Sequence[bool]) -> None: + ... + + @property + def collections(self) -> list[PathCollection]: + ... + + @property + def linestyles(self) -> (None | Literal["solid", "dashed", "dashdot", "dotted"] | Iterable[Literal["solid", "dashed", "dashdot", "dotted"]]): + ... + + def __init__(self, ax: Axes, *args, levels: Iterable[float] | None = ..., filled: bool = ..., linewidths: float | ArrayLike | None = ..., linestyles: Literal["solid", "dashed", "dashdot", "dotted"] | Iterable[Literal["solid", "dashed", "dashdot", "dotted"]] | None = ..., hatches: Iterable[str | None] = ..., alpha: float | None = ..., origin: Literal["upper", "lower", "image"] | None = ..., extent: tuple[float, float, float, float] | None = ..., cmap: str | Colormap | None = ..., colors: ColorType | Sequence[ColorType] | None = ..., norm: str | Normalize | None = ..., vmin: float | None = ..., vmax: float | None = ..., extend: Literal["neither", "both", "min", "max"] = ..., antialiased: bool | None = ..., nchunk: int = ..., locator: Locator | None = ..., transform: Transform | None = ..., negative_linestyles: Literal["solid", "dashed", "dashdot", "dotted"] | Iterable[Literal["solid", "dashed", "dashdot", "dotted"]] | None = ..., clip_path: Patch | Path | TransformedPath | TransformedPatchPath | None = ..., **kwargs) -> None: + ... + + def legend_elements(self, variable_name: str = ..., str_format: Callable[[float], str] = ...) -> tuple[list[Artist], list[str]]: + ... + + def find_nearest_contour(self, x: float, y: float, indices: Iterable[int] | None = ..., pixel: bool = ...) -> tuple[Collection, int, int, float, float, float]: + ... + + + +class QuadContourSet(ContourSet): + ... + + diff --git a/typings/matplotlib/dates.pyi b/typings/matplotlib/dates.pyi new file mode 100644 index 0000000..efc837f --- /dev/null +++ b/typings/matplotlib/dates.pyi @@ -0,0 +1,1019 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib import _api, ticker, units + +""" +Matplotlib provides sophisticated date plotting capabilities, standing on the +shoulders of python :mod:`datetime` and the add-on module dateutil_. + +By default, Matplotlib uses the units machinery described in +`~matplotlib.units` to convert `datetime.datetime`, and `numpy.datetime64` +objects when plotted on an x- or y-axis. The user does not +need to do anything for dates to be formatted, but dates often have strict +formatting needs, so this module provides many tick locators and formatters. +A basic example using `numpy.datetime64` is:: + + import numpy as np + + times = np.arange(np.datetime64('2001-01-02'), + np.datetime64('2002-02-03'), np.timedelta64(75, 'm')) + y = np.random.randn(len(times)) + + fig, ax = plt.subplots() + ax.plot(times, y) + +.. seealso:: + + - :doc:`/gallery/text_labels_and_annotations/date` + - :doc:`/gallery/ticks/date_concise_formatter` + - :doc:`/gallery/ticks/date_demo_convert` + +.. _date-format: + +Matplotlib date format +---------------------- + +Matplotlib represents dates using floating point numbers specifying the number +of days since a default epoch of 1970-01-01 UTC; for example, +1970-01-01, 06:00 is the floating point number 0.25. The formatters and +locators require the use of `datetime.datetime` objects, so only dates between +year 0001 and 9999 can be represented. Microsecond precision +is achievable for (approximately) 70 years on either side of the epoch, and +20 microseconds for the rest of the allowable range of dates (year 0001 to +9999). The epoch can be changed at import time via `.dates.set_epoch` or +:rc:`dates.epoch` to other dates if necessary; see +:doc:`/gallery/ticks/date_precision_and_epochs` for a discussion. + +.. note:: + + Before Matplotlib 3.3, the epoch was 0000-12-31 which lost modern + microsecond precision and also made the default axis limit of 0 an invalid + datetime. In 3.3 the epoch was changed as above. To convert old + ordinal floats to the new epoch, users can do:: + + new_ordinal = old_ordinal + mdates.date2num(np.datetime64('0000-12-31')) + + +There are a number of helper functions to convert between :mod:`datetime` +objects and Matplotlib dates: + +.. currentmodule:: matplotlib.dates + +.. autosummary:: + :nosignatures: + + datestr2num + date2num + num2date + num2timedelta + drange + set_epoch + get_epoch + +.. note:: + + Like Python's `datetime.datetime`, Matplotlib uses the Gregorian calendar + for all conversions between dates and floating point numbers. This practice + is not universal, and calendar differences can cause confusing + differences between what Python and Matplotlib give as the number of days + since 0001-01-01 and what other software and databases yield. For + example, the US Naval Observatory uses a calendar that switches + from Julian to Gregorian in October, 1582. Hence, using their + calculator, the number of days between 0001-01-01 and 2006-04-01 is + 732403, whereas using the Gregorian calendar via the datetime + module we find:: + + In [1]: date(2006, 4, 1).toordinal() - date(1, 1, 1).toordinal() + Out[1]: 732401 + +All the Matplotlib date converters, locators and formatters are timezone aware. +If no explicit timezone is provided, :rc:`timezone` is assumed, provided as a +string. If you want to use a different timezone, pass the *tz* keyword +argument of `num2date` to any date tick locators or formatters you create. This +can be either a `datetime.tzinfo` instance or a string with the timezone name +that can be parsed by `~dateutil.tz.gettz`. + +A wide range of specific and general purpose date tick locators and +formatters are provided in this module. See +:mod:`matplotlib.ticker` for general information on tick locators +and formatters. These are described below. + +The dateutil_ module provides additional code to handle date ticking, making it +easy to place ticks on any kinds of dates. See examples below. + +.. _dateutil: https://dateutil.readthedocs.io + +.. _date-locators: + +Date tick locators +------------------ + +Most of the date tick locators can locate single or multiple ticks. For example:: + + # import constants for the days of the week + from matplotlib.dates import MO, TU, WE, TH, FR, SA, SU + + # tick on Mondays every week + loc = WeekdayLocator(byweekday=MO, tz=tz) + + # tick on Mondays and Saturdays + loc = WeekdayLocator(byweekday=(MO, SA)) + +In addition, most of the constructors take an interval argument:: + + # tick on Mondays every second week + loc = WeekdayLocator(byweekday=MO, interval=2) + +The rrule locator allows completely general date ticking:: + + # tick every 5th easter + rule = rrulewrapper(YEARLY, byeaster=1, interval=5) + loc = RRuleLocator(rule) + +The available date tick locators are: + +* `MicrosecondLocator`: Locate microseconds. + +* `SecondLocator`: Locate seconds. + +* `MinuteLocator`: Locate minutes. + +* `HourLocator`: Locate hours. + +* `DayLocator`: Locate specified days of the month. + +* `WeekdayLocator`: Locate days of the week, e.g., MO, TU. + +* `MonthLocator`: Locate months, e.g., 7 for July. + +* `YearLocator`: Locate years that are multiples of base. + +* `RRuleLocator`: Locate using a `rrulewrapper`. + `rrulewrapper` is a simple wrapper around dateutil_'s `dateutil.rrule` + which allow almost arbitrary date tick specifications. + See :doc:`rrule example `. + +* `AutoDateLocator`: On autoscale, this class picks the best `DateLocator` + (e.g., `RRuleLocator`) to set the view limits and the tick locations. If + called with ``interval_multiples=True`` it will make ticks line up with + sensible multiples of the tick intervals. For example, if the interval is + 4 hours, it will pick hours 0, 4, 8, etc. as ticks. This behaviour is not + guaranteed by default. + +.. _date-formatters: + +Date formatters +--------------- + +The available date formatters are: + +* `AutoDateFormatter`: attempts to figure out the best format to use. This is + most useful when used with the `AutoDateLocator`. + +* `ConciseDateFormatter`: also attempts to figure out the best format to use, + and to make the format as compact as possible while still having complete + date information. This is most useful when used with the `AutoDateLocator`. + +* `DateFormatter`: use `~datetime.datetime.strftime` format strings. +""" +__all__ = ('datestr2num', 'date2num', 'num2date', 'num2timedelta', 'drange', 'set_epoch', 'get_epoch', 'DateFormatter', 'ConciseDateFormatter', 'AutoDateFormatter', 'DateLocator', 'RRuleLocator', 'AutoDateLocator', 'YearLocator', 'MonthLocator', 'WeekdayLocator', 'DayLocator', 'HourLocator', 'MinuteLocator', 'SecondLocator', 'MicrosecondLocator', 'rrule', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU', 'YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY', 'MICROSECONDLY', 'relativedelta', 'DateConverter', 'ConciseDateConverter', 'rrulewrapper') +_log = ... +UTC = ... +@_api.caching_module_getattr +class __getattr__: + JULIAN_OFFSET = ... + + +EPOCH_OFFSET = ... +MICROSECONDLY = ... +HOURS_PER_DAY = ... +MIN_PER_HOUR = ... +SEC_PER_MIN = ... +MONTHS_PER_YEAR = ... +DAYS_PER_WEEK = ... +DAYS_PER_MONTH = ... +DAYS_PER_YEAR = ... +MINUTES_PER_DAY = ... +SEC_PER_HOUR = ... +SEC_PER_DAY = ... +SEC_PER_WEEK = ... +MUSECONDS_PER_DAY = ... +WEEKDAYS = ... +_epoch = ... +def set_epoch(epoch): # -> None: + """ + Set the epoch (origin for dates) for datetime calculations. + + The default epoch is :rc:`dates.epoch` (by default 1970-01-01T00:00). + + If microsecond accuracy is desired, the date being plotted needs to be + within approximately 70 years of the epoch. Matplotlib internally + represents dates as days since the epoch, so floating point dynamic + range needs to be within a factor of 2^52. + + `~.dates.set_epoch` must be called before any dates are converted + (i.e. near the import section) or a RuntimeError will be raised. + + See also :doc:`/gallery/ticks/date_precision_and_epochs`. + + Parameters + ---------- + epoch : str + valid UTC date parsable by `numpy.datetime64` (do not include + timezone). + + """ + ... + +def get_epoch(): + """ + Get the epoch used by `.dates`. + + Returns + ------- + epoch : str + String for the epoch (parsable by `numpy.datetime64`). + """ + ... + +_from_ordinalf_np_vectorized = ... +_dateutil_parser_parse_np_vectorized = ... +def datestr2num(d, default=...): # -> NDArray[Any] | NDArray[floating[Any]] | Any | NDArray[Unknown]: + """ + Convert a date string to a datenum using `dateutil.parser.parse`. + + Parameters + ---------- + d : str or sequence of str + The dates to convert. + + default : datetime.datetime, optional + The default date to use when fields are missing in *d*. + """ + ... + +def date2num(d): # -> NDArray[Any] | NDArray[floating[Any]] | Any: + """ + Convert datetime objects to Matplotlib dates. + + Parameters + ---------- + d : `datetime.datetime` or `numpy.datetime64` or sequences of these + + Returns + ------- + float or sequence of floats + Number of days since the epoch. See `.get_epoch` for the + epoch, which can be changed by :rc:`date.epoch` or `.set_epoch`. If + the epoch is "1970-01-01T00:00:00" (default) then noon Jan 1 1970 + ("1970-01-01T12:00:00") returns 0.5. + + Notes + ----- + The Gregorian calendar is assumed; this is not universal practice. + For details see the module docstring. + """ + ... + +@_api.deprecated("3.7") +def julian2num(j): # -> Any: + """ + Convert a Julian date (or sequence) to a Matplotlib date (or sequence). + + Parameters + ---------- + j : float or sequence of floats + Julian dates (days relative to 4713 BC Jan 1, 12:00:00 Julian + calendar or 4714 BC Nov 24, 12:00:00, proleptic Gregorian calendar). + + Returns + ------- + float or sequence of floats + Matplotlib dates (days relative to `.get_epoch`). + """ + ... + +@_api.deprecated("3.7") +def num2julian(n): # -> Any: + """ + Convert a Matplotlib date (or sequence) to a Julian date (or sequence). + + Parameters + ---------- + n : float or sequence of floats + Matplotlib dates (days relative to `.get_epoch`). + + Returns + ------- + float or sequence of floats + Julian dates (days relative to 4713 BC Jan 1, 12:00:00). + """ + ... + +def num2date(x, tz=...): # -> Any: + """ + Convert Matplotlib dates to `~datetime.datetime` objects. + + Parameters + ---------- + x : float or sequence of floats + Number of days (fraction part represents hours, minutes, seconds) + since the epoch. See `.get_epoch` for the + epoch, which can be changed by :rc:`date.epoch` or `.set_epoch`. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Timezone of *x*. If a string, *tz* is passed to `dateutil.tz`. + + Returns + ------- + `~datetime.datetime` or sequence of `~datetime.datetime` + Dates are returned in timezone *tz*. + + If *x* is a sequence, a sequence of `~datetime.datetime` objects will + be returned. + + Notes + ----- + The Gregorian calendar is assumed; this is not universal practice. + For details, see the module docstring. + """ + ... + +_ordinalf_to_timedelta_np_vectorized = ... +def num2timedelta(x): # -> Any: + """ + Convert number of days to a `~datetime.timedelta` object. + + If *x* is a sequence, a sequence of `~datetime.timedelta` objects will + be returned. + + Parameters + ---------- + x : float, sequence of floats + Number of days. The fraction part represents hours, minutes, seconds. + + Returns + ------- + `datetime.timedelta` or list[`datetime.timedelta`] + """ + ... + +def drange(dstart, dend, delta): # -> NDArray[floating[Any]]: + """ + Return a sequence of equally spaced Matplotlib dates. + + The dates start at *dstart* and reach up to, but not including *dend*. + They are spaced by *delta*. + + Parameters + ---------- + dstart, dend : `~datetime.datetime` + The date limits. + delta : `datetime.timedelta` + Spacing of the dates. + + Returns + ------- + `numpy.array` + A list floats representing Matplotlib dates. + + """ + ... + +class DateFormatter(ticker.Formatter): + """ + Format a tick (in days since the epoch) with a + `~datetime.datetime.strftime` format string. + """ + def __init__(self, fmt, tz=..., *, usetex=...) -> None: + """ + Parameters + ---------- + fmt : str + `~datetime.datetime.strftime` format string + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + usetex : bool, default: :rc:`text.usetex` + To enable/disable the use of TeX's math mode for rendering the + results of the formatter. + """ + ... + + def __call__(self, x, pos=...): # -> str | Any: + ... + + def set_tzinfo(self, tz): # -> None: + ... + + + +class ConciseDateFormatter(ticker.Formatter): + """ + A `.Formatter` which attempts to figure out the best format to use for the + date, and to make it as compact as possible, but still be complete. This is + most useful when used with the `AutoDateLocator`:: + + >>> locator = AutoDateLocator() + >>> formatter = ConciseDateFormatter(locator) + + Parameters + ---------- + locator : `.ticker.Locator` + Locator that this axis is using. + + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone, passed to `.dates.num2date`. + + formats : list of 6 strings, optional + Format strings for 6 levels of tick labelling: mostly years, + months, days, hours, minutes, and seconds. Strings use + the same format codes as `~datetime.datetime.strftime`. Default is + ``['%Y', '%b', '%d', '%H:%M', '%H:%M', '%S.%f']`` + + zero_formats : list of 6 strings, optional + Format strings for tick labels that are "zeros" for a given tick + level. For instance, if most ticks are months, ticks around 1 Jan 2005 + will be labeled "Dec", "2005", "Feb". The default is + ``['', '%Y', '%b', '%b-%d', '%H:%M', '%H:%M']`` + + offset_formats : list of 6 strings, optional + Format strings for the 6 levels that is applied to the "offset" + string found on the right side of an x-axis, or top of a y-axis. + Combined with the tick labels this should completely specify the + date. The default is:: + + ['', '%Y', '%Y-%b', '%Y-%b-%d', '%Y-%b-%d', '%Y-%b-%d %H:%M'] + + show_offset : bool, default: True + Whether to show the offset or not. + + usetex : bool, default: :rc:`text.usetex` + To enable/disable the use of TeX's math mode for rendering the results + of the formatter. + + Examples + -------- + See :doc:`/gallery/ticks/date_concise_formatter` + + .. plot:: + + import datetime + import matplotlib.dates as mdates + + base = datetime.datetime(2005, 2, 1) + dates = np.array([base + datetime.timedelta(hours=(2 * i)) + for i in range(732)]) + N = len(dates) + np.random.seed(19680801) + y = np.cumsum(np.random.randn(N)) + + fig, ax = plt.subplots(constrained_layout=True) + locator = mdates.AutoDateLocator() + formatter = mdates.ConciseDateFormatter(locator) + ax.xaxis.set_major_locator(locator) + ax.xaxis.set_major_formatter(formatter) + + ax.plot(dates, y) + ax.set_title('Concise Date Formatter') + + """ + def __init__(self, locator, tz=..., formats=..., offset_formats=..., zero_formats=..., show_offset=..., *, usetex=...) -> None: + """ + Autoformat the date labels. The default format is used to form an + initial string, and then redundant elements are removed. + """ + ... + + def __call__(self, x, pos=...): # -> str | Any: + ... + + def format_ticks(self, values): # -> list[str]: + ... + + def get_offset(self): # -> str | Any: + ... + + def format_data_short(self, value): # -> Any: + ... + + + +class AutoDateFormatter(ticker.Formatter): + """ + A `.Formatter` which attempts to figure out the best format to use. This + is most useful when used with the `AutoDateLocator`. + + `.AutoDateFormatter` has a ``.scale`` dictionary that maps tick scales (the + interval in days between one major tick) to format strings; this dictionary + defaults to :: + + self.scaled = { + DAYS_PER_YEAR: rcParams['date.autoformatter.year'], + DAYS_PER_MONTH: rcParams['date.autoformatter.month'], + 1: rcParams['date.autoformatter.day'], + 1 / HOURS_PER_DAY: rcParams['date.autoformatter.hour'], + 1 / MINUTES_PER_DAY: rcParams['date.autoformatter.minute'], + 1 / SEC_PER_DAY: rcParams['date.autoformatter.second'], + 1 / MUSECONDS_PER_DAY: rcParams['date.autoformatter.microsecond'], + } + + The formatter uses the format string corresponding to the lowest key in + the dictionary that is greater or equal to the current scale. Dictionary + entries can be customized:: + + locator = AutoDateLocator() + formatter = AutoDateFormatter(locator) + formatter.scaled[1/(24*60)] = '%M:%S' # only show min and sec + + Custom callables can also be used instead of format strings. The following + example shows how to use a custom format function to strip trailing zeros + from decimal seconds and adds the date to the first ticklabel:: + + def my_format_function(x, pos=None): + x = matplotlib.dates.num2date(x) + if pos == 0: + fmt = '%D %H:%M:%S.%f' + else: + fmt = '%H:%M:%S.%f' + label = x.strftime(fmt) + label = label.rstrip("0") + label = label.rstrip(".") + return label + + formatter.scaled[1/(24*60)] = my_format_function + """ + def __init__(self, locator, tz=..., defaultfmt=..., *, usetex=...) -> None: + """ + Autoformat the date labels. + + Parameters + ---------- + locator : `.ticker.Locator` + Locator that this axis is using. + + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + + defaultfmt : str + The default format to use if none of the values in ``self.scaled`` + are greater than the unit returned by ``locator._get_unit()``. + + usetex : bool, default: :rc:`text.usetex` + To enable/disable the use of TeX's math mode for rendering the + results of the formatter. If any entries in ``self.scaled`` are set + as functions, then it is up to the customized function to enable or + disable TeX's math mode itself. + """ + ... + + def __call__(self, x, pos=...): # -> str | Any: + ... + + + +class rrulewrapper: + """ + A simple wrapper around a `dateutil.rrule` allowing flexible + date tick specifications. + """ + def __init__(self, freq, tzinfo=..., **kwargs) -> None: + """ + Parameters + ---------- + freq : {YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY} + Tick frequency. These constants are defined in `dateutil.rrule`, + but they are accessible from `matplotlib.dates` as well. + tzinfo : `datetime.tzinfo`, optional + Time zone information. The default is None. + **kwargs + Additional keyword arguments are passed to the `dateutil.rrule`. + """ + ... + + def set(self, **kwargs): # -> None: + """Set parameters for an existing wrapper.""" + ... + + def __getattr__(self, name): # -> Any | _Wrapped[..., Unknown, (*args: Unknown, **kwargs: Unknown), Unknown]: + ... + + def __setstate__(self, state): # -> None: + ... + + + +class DateLocator(ticker.Locator): + """ + Determines the tick locations when plotting dates. + + This class is subclassed by other Locators and + is not meant to be used on its own. + """ + hms0d = ... + def __init__(self, tz=...) -> None: + """ + Parameters + ---------- + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + def set_tzinfo(self, tz): # -> None: + """ + Set timezone info. + + Parameters + ---------- + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + def datalim_to_dt(self): # -> tuple[Any, Any]: + """Convert axis data interval to datetime objects.""" + ... + + def viewlim_to_dt(self): # -> tuple[Any, Any]: + """Convert the view interval to datetime objects.""" + ... + + def nonsingular(self, vmin, vmax): # -> tuple[NDArray[Any] | Unknown | NDArray[floating[Any]] | Any, NDArray[Any] | Unknown | NDArray[floating[Any]] | Any] | tuple[Unknown, Unknown]: + """ + Given the proposed upper and lower extent, adjust the range + if it is too close to being singular (i.e. a range of ~0). + """ + ... + + + +class RRuleLocator(DateLocator): + def __init__(self, o, tz=...) -> None: + ... + + def __call__(self): # -> list[Unknown] | NDArray[Any] | NDArray[floating[Any]] | Any | Sequence[float]: + ... + + def tick_values(self, vmin, vmax): # -> NDArray[Any] | NDArray[floating[Any]] | Any | Sequence[float]: + ... + + @staticmethod + def get_unit_generic(freq): # -> float | Literal[-1]: + ... + + + +class AutoDateLocator(DateLocator): + """ + On autoscale, this class picks the best `DateLocator` to set the view + limits and the tick locations. + + Attributes + ---------- + intervald : dict + + Mapping of tick frequencies to multiples allowed for that ticking. + The default is :: + + self.intervald = { + YEARLY : [1, 2, 4, 5, 10, 20, 40, 50, 100, 200, 400, 500, + 1000, 2000, 4000, 5000, 10000], + MONTHLY : [1, 2, 3, 4, 6], + DAILY : [1, 2, 3, 7, 14, 21], + HOURLY : [1, 2, 3, 4, 6, 12], + MINUTELY: [1, 5, 10, 15, 30], + SECONDLY: [1, 5, 10, 15, 30], + MICROSECONDLY: [1, 2, 5, 10, 20, 50, 100, 200, 500, + 1000, 2000, 5000, 10000, 20000, 50000, + 100000, 200000, 500000, 1000000], + } + + where the keys are defined in `dateutil.rrule`. + + The interval is used to specify multiples that are appropriate for + the frequency of ticking. For instance, every 7 days is sensible + for daily ticks, but for minutes/seconds, 15 or 30 make sense. + + When customizing, you should only modify the values for the existing + keys. You should not add or delete entries. + + Example for forcing ticks every 3 hours:: + + locator = AutoDateLocator() + locator.intervald[HOURLY] = [3] # only show every 3 hours + """ + def __init__(self, tz=..., minticks=..., maxticks=..., interval_multiples=...) -> None: + """ + Parameters + ---------- + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + minticks : int + The minimum number of ticks desired; controls whether ticks occur + yearly, monthly, etc. + maxticks : int + The maximum number of ticks desired; controls the interval between + ticks (ticking every other, every 3, etc.). For fine-grained + control, this can be a dictionary mapping individual rrule + frequency constants (YEARLY, MONTHLY, etc.) to their own maximum + number of ticks. This can be used to keep the number of ticks + appropriate to the format chosen in `AutoDateFormatter`. Any + frequency not specified in this dictionary is given a default + value. + interval_multiples : bool, default: True + Whether ticks should be chosen to be multiple of the interval, + locking them to 'nicer' locations. For example, this will force + the ticks to be at hours 0, 6, 12, 18 when hourly ticking is done + at 6 hour intervals. + """ + ... + + def __call__(self): # -> list[Unknown] | NDArray[Any] | NDArray[floating[Any]] | Any | Sequence[float]: + ... + + def tick_values(self, vmin, vmax): # -> NDArray[Any] | NDArray[floating[Any]] | Any | Sequence[float]: + ... + + def nonsingular(self, vmin, vmax): # -> tuple[NDArray[Any] | Unknown | NDArray[floating[Any]] | Any, NDArray[Any] | Unknown | NDArray[floating[Any]] | Any] | tuple[Unknown, Unknown]: + ... + + def get_locator(self, dmin, dmax): # -> YearLocator | RRuleLocator | MicrosecondLocator: + """Pick the best locator based on a distance.""" + ... + + + +class YearLocator(RRuleLocator): + """ + Make ticks on a given day of each year that is a multiple of base. + + Examples:: + + # Tick every year on Jan 1st + locator = YearLocator() + + # Tick every 5 years on July 4th + locator = YearLocator(5, month=7, day=4) + """ + def __init__(self, base=..., month=..., day=..., tz=...) -> None: + """ + Parameters + ---------- + base : int, default: 1 + Mark ticks every *base* years. + month : int, default: 1 + The month on which to place the ticks, starting from 1. Default is + January. + day : int, default: 1 + The day on which to place the ticks. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + + +class MonthLocator(RRuleLocator): + """ + Make ticks on occurrences of each month, e.g., 1, 3, 12. + """ + def __init__(self, bymonth=..., bymonthday=..., interval=..., tz=...) -> None: + """ + Parameters + ---------- + bymonth : int or list of int, default: all months + Ticks will be placed on every month in *bymonth*. Default is + ``range(1, 13)``, i.e. every month. + bymonthday : int, default: 1 + The day on which to place the ticks. + interval : int, default: 1 + The interval between each iteration. For example, if + ``interval=2``, mark every second occurrence. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + + +class WeekdayLocator(RRuleLocator): + """ + Make ticks on occurrences of each weekday. + """ + def __init__(self, byweekday=..., interval=..., tz=...) -> None: + """ + Parameters + ---------- + byweekday : int or list of int, default: all days + Ticks will be placed on every weekday in *byweekday*. Default is + every day. + + Elements of *byweekday* must be one of MO, TU, WE, TH, FR, SA, + SU, the constants from :mod:`dateutil.rrule`, which have been + imported into the :mod:`matplotlib.dates` namespace. + interval : int, default: 1 + The interval between each iteration. For example, if + ``interval=2``, mark every second occurrence. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + + +class DayLocator(RRuleLocator): + """ + Make ticks on occurrences of each day of the month. For example, + 1, 15, 30. + """ + def __init__(self, bymonthday=..., interval=..., tz=...) -> None: + """ + Parameters + ---------- + bymonthday : int or list of int, default: all days + Ticks will be placed on every day in *bymonthday*. Default is + ``bymonthday=range(1, 32)``, i.e., every day of the month. + interval : int, default: 1 + The interval between each iteration. For example, if + ``interval=2``, mark every second occurrence. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + + +class HourLocator(RRuleLocator): + """ + Make ticks on occurrences of each hour. + """ + def __init__(self, byhour=..., interval=..., tz=...) -> None: + """ + Parameters + ---------- + byhour : int or list of int, default: all hours + Ticks will be placed on every hour in *byhour*. Default is + ``byhour=range(24)``, i.e., every hour. + interval : int, default: 1 + The interval between each iteration. For example, if + ``interval=2``, mark every second occurrence. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + + +class MinuteLocator(RRuleLocator): + """ + Make ticks on occurrences of each minute. + """ + def __init__(self, byminute=..., interval=..., tz=...) -> None: + """ + Parameters + ---------- + byminute : int or list of int, default: all minutes + Ticks will be placed on every minute in *byminute*. Default is + ``byminute=range(60)``, i.e., every minute. + interval : int, default: 1 + The interval between each iteration. For example, if + ``interval=2``, mark every second occurrence. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + + +class SecondLocator(RRuleLocator): + """ + Make ticks on occurrences of each second. + """ + def __init__(self, bysecond=..., interval=..., tz=...) -> None: + """ + Parameters + ---------- + bysecond : int or list of int, default: all seconds + Ticks will be placed on every second in *bysecond*. Default is + ``bysecond = range(60)``, i.e., every second. + interval : int, default: 1 + The interval between each iteration. For example, if + ``interval=2``, mark every second occurrence. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + + +class MicrosecondLocator(DateLocator): + """ + Make ticks on regular intervals of one or more microsecond(s). + + .. note:: + + By default, Matplotlib uses a floating point representation of time in + days since the epoch, so plotting data with + microsecond time resolution does not work well for + dates that are far (about 70 years) from the epoch (check with + `~.dates.get_epoch`). + + If you want sub-microsecond resolution time plots, it is strongly + recommended to use floating point seconds, not datetime-like + time representation. + + If you really must use datetime.datetime() or similar and still + need microsecond precision, change the time origin via + `.dates.set_epoch` to something closer to the dates being plotted. + See :doc:`/gallery/ticks/date_precision_and_epochs`. + + """ + def __init__(self, interval=..., tz=...) -> None: + """ + Parameters + ---------- + interval : int, default: 1 + The interval between each iteration. For example, if + ``interval=2``, mark every second occurrence. + tz : str or `~datetime.tzinfo`, default: :rc:`timezone` + Ticks timezone. If a string, *tz* is passed to `dateutil.tz`. + """ + ... + + def set_axis(self, axis): # -> None: + ... + + def __call__(self): # -> list[Unknown]: + ... + + def tick_values(self, vmin, vmax): + ... + + + +class DateConverter(units.ConversionInterface): + """ + Converter for `datetime.date` and `datetime.datetime` data, or for + date/time data represented as it would be converted by `date2num`. + + The 'unit' tag for such data is None or a `~datetime.tzinfo` instance. + """ + def __init__(self, *, interval_multiples=...) -> None: + ... + + def axisinfo(self, unit, axis): # -> AxisInfo: + """ + Return the `~matplotlib.units.AxisInfo` for *unit*. + + *unit* is a `~datetime.tzinfo` instance or None. + The *axis* argument is required but not used. + """ + ... + + @staticmethod + def convert(value, unit, axis): # -> NDArray[Any] | NDArray[floating[Any]] | Any: + """ + If *value* is not already a number or sequence of numbers, convert it + with `date2num`. + + The *unit* and *axis* arguments are not used. + """ + ... + + @staticmethod + def default_units(x, axis): # -> None: + """ + Return the `~datetime.tzinfo` instance of *x* or of its first element, + or None + """ + ... + + + +class ConciseDateConverter(DateConverter): + def __init__(self, formats=..., zero_formats=..., offset_formats=..., show_offset=..., *, interval_multiples=...) -> None: + ... + + def axisinfo(self, unit, axis): # -> AxisInfo: + ... + + + +class _SwitchableDateConverter: + """ + Helper converter-like object that generates and dispatches to + temporary ConciseDateConverter or DateConverter instances based on + :rc:`date.converter` and :rc:`date.interval_multiples`. + """ + def axisinfo(self, *args, **kwargs): + ... + + def default_units(self, *args, **kwargs): + ... + + def convert(self, *args, **kwargs): + ... + + + diff --git a/typings/matplotlib/dviread.pyi b/typings/matplotlib/dviread.pyi new file mode 100644 index 0000000..314f612 --- /dev/null +++ b/typings/matplotlib/dviread.pyi @@ -0,0 +1,139 @@ +""" +This type stub file was generated by pyright. +""" + +import io +import os +from pathlib import Path +from enum import Enum +from collections.abc import Generator +from typing import NamedTuple + +class _dvistate(Enum): + pre: int + outer: int + inpage: int + post_post: int + finale: int + ... + + +class Page(NamedTuple): + text: list[Text] + boxes: list[Box] + height: int + width: int + descent: int + ... + + +class Box(NamedTuple): + x: int + y: int + height: int + width: int + ... + + +class Text(NamedTuple): + x: int + y: int + font: DviFont + glyph: int + width: int + @property + def font_path(self) -> Path: + ... + + @property + def font_size(self) -> float: + ... + + @property + def font_effects(self) -> dict[str, float]: + ... + + @property + def glyph_name_or_index(self) -> int | str: + ... + + + +class Dvi: + file: io.BufferedReader + dpi: float | None + fonts: dict[int, DviFont] + state: _dvistate + def __init__(self, filename: str | os.PathLike, dpi: float | None) -> None: + ... + + def __enter__(self) -> Dvi: + ... + + def __exit__(self, etype, evalue, etrace) -> None: + ... + + def __iter__(self) -> Generator[Page, None, None]: + ... + + def close(self) -> None: + ... + + + +class DviFont: + texname: bytes + size: float + widths: list[int] + def __init__(self, scale: float, tfm: Tfm, texname: bytes, vf: Vf | None) -> None: + ... + + def __eq__(self, other: object) -> bool: + ... + + def __ne__(self, other: object) -> bool: + ... + + + +class Vf(Dvi): + def __init__(self, filename: str | os.PathLike) -> None: + ... + + def __getitem__(self, code: int) -> Page: + ... + + + +class Tfm: + checksum: int + design_size: int + width: dict[int, int] + height: dict[int, int] + depth: dict[int, int] + def __init__(self, filename: str | os.PathLike) -> None: + ... + + + +class PsFont(NamedTuple): + texname: bytes + psname: bytes + effects: dict[str, float] + encoding: None | bytes + filename: str + ... + + +class PsfontsMap: + def __new__(cls, filename: str | os.PathLike) -> PsfontsMap: + ... + + def __getitem__(self, texname: bytes) -> PsFont: + ... + + + +def find_tex_file(filename: str | os.PathLike) -> str: + ... + diff --git a/typings/matplotlib/figure.pyi b/typings/matplotlib/figure.pyi new file mode 100644 index 0000000..fc74795 --- /dev/null +++ b/typings/matplotlib/figure.pyi @@ -0,0 +1,394 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import numpy as np +from collections.abc import Callable, Hashable, Iterable +from typing import Any, IO, Literal, TypeVar, overload +from numpy.typing import ArrayLike +from matplotlib.artist import Artist +from matplotlib.axes import Axes, SubplotBase +from matplotlib.backend_bases import FigureCanvasBase, MouseButton, MouseEvent, RendererBase +from matplotlib.colors import Colormap, Normalize +from matplotlib.colorbar import Colorbar +from matplotlib.cm import ScalarMappable +from matplotlib.gridspec import GridSpec, SubplotSpec +from matplotlib.image import FigureImage, _ImageBase +from matplotlib.layout_engine import LayoutEngine +from matplotlib.legend import Legend +from matplotlib.lines import Line2D +from matplotlib.patches import Patch, Rectangle +from matplotlib.text import Text +from matplotlib.transforms import Affine2D, Bbox, BboxBase, Transform +from .typing import ColorType, HashableList + +_T = TypeVar("_T") +class SubplotParams: + def __init__(self, left: float | None = ..., bottom: float | None = ..., right: float | None = ..., top: float | None = ..., wspace: float | None = ..., hspace: float | None = ...) -> None: + ... + + left: float + right: float + bottom: float + top: float + wspace: float + hspace: float + def update(self, left: float | None = ..., bottom: float | None = ..., right: float | None = ..., top: float | None = ..., wspace: float | None = ..., hspace: float | None = ...) -> None: + ... + + + +class FigureBase(Artist): + artists: list[Artist] + lines: list[Line2D] + patches: list[Patch] + texts: list[Text] + images: list[_ImageBase] + legends: list[Legend] + subfigs: list[SubFigure] + stale: bool + suppressComposite: bool | None + def __init__(self, **kwargs) -> None: + ... + + def autofmt_xdate(self, bottom: float = ..., rotation: int = ..., ha: Literal["left", "center", "right"] = ..., which: Literal["major", "minor", "both"] = ...) -> None: + ... + + def get_children(self) -> list[Artist]: + ... + + def contains(self, mouseevent: MouseEvent) -> tuple[bool, dict[Any, Any]]: + ... + + def suptitle(self, t: str, **kwargs) -> Text: + ... + + def get_suptitle(self) -> str: + ... + + def supxlabel(self, t: str, **kwargs) -> Text: + ... + + def get_supxlabel(self) -> str: + ... + + def supylabel(self, t: str, **kwargs) -> Text: + ... + + def get_supylabel(self) -> str: + ... + + def get_edgecolor(self) -> ColorType: + ... + + def get_facecolor(self) -> ColorType: + ... + + def get_frameon(self) -> bool: + ... + + def set_linewidth(self, linewidth: float) -> None: + ... + + def get_linewidth(self) -> float: + ... + + def set_edgecolor(self, color: ColorType) -> None: + ... + + def set_facecolor(self, color: ColorType) -> None: + ... + + def set_frameon(self, b: bool) -> None: + ... + + @property + def frameon(self) -> bool: + ... + + @frameon.setter + def frameon(self, b: bool) -> None: + ... + + def add_artist(self, artist: Artist, clip: bool = ...) -> Artist: + ... + + @overload + def add_axes(self, ax: Axes) -> Axes: + ... + + @overload + def add_axes(self, rect: tuple[float, float, float, float], projection: None | str = ..., polar: bool = ..., **kwargs) -> Axes: + ... + + @overload + def add_subplot(self, nrows: int, ncols: int, index: int | tuple[int, int], **kwargs) -> Axes: + ... + + @overload + def add_subplot(self, pos: int, **kwargs) -> Axes: + ... + + @overload + def add_subplot(self, ax: Axes, **kwargs) -> Axes: + ... + + @overload + def add_subplot(self, ax: SubplotSpec, **kwargs) -> Axes: + ... + + @overload + def add_subplot(self, **kwargs) -> Axes: + ... + + @overload + def subplots(self, nrows: int = ..., ncols: int = ..., *, sharex: bool | Literal["none", "all", "row", "col"] = ..., sharey: bool | Literal["none", "all", "row", "col"] = ..., squeeze: Literal[False], width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., subplot_kw: dict[str, Any] | None = ..., gridspec_kw: dict[str, Any] | None = ...) -> np.ndarray: + ... + + @overload + def subplots(self, nrows: int = ..., ncols: int = ..., *, sharex: bool | Literal["none", "all", "row", "col"] = ..., sharey: bool | Literal["none", "all", "row", "col"] = ..., squeeze: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., subplot_kw: dict[str, Any] | None = ..., gridspec_kw: dict[str, Any] | None = ...) -> np.ndarray | SubplotBase | Axes: + ... + + def delaxes(self, ax: Axes) -> None: + ... + + def clear(self, keep_observers: bool = ...) -> None: + ... + + def clf(self, keep_observers: bool = ...) -> None: + ... + + @overload + def legend(self) -> Legend: + ... + + @overload + def legend(self, handles: Iterable[Artist], labels: Iterable[str], **kwargs) -> Legend: + ... + + @overload + def legend(self, *, handles: Iterable[Artist], **kwargs) -> Legend: + ... + + @overload + def legend(self, labels: Iterable[str], **kwargs) -> Legend: + ... + + @overload + def legend(self, **kwargs) -> Legend: + ... + + def text(self, x: float, y: float, s: str, fontdict: dict[str, Any] | None = ..., **kwargs) -> Text: + ... + + def colorbar(self, mappable: ScalarMappable, cax: Axes | None = ..., ax: Axes | Iterable[Axes] | None = ..., use_gridspec: bool = ..., **kwargs) -> Colorbar: + ... + + def subplots_adjust(self, left: float | None = ..., bottom: float | None = ..., right: float | None = ..., top: float | None = ..., wspace: float | None = ..., hspace: float | None = ...) -> None: + ... + + def align_xlabels(self, axs: Iterable[Axes] | None = ...) -> None: + ... + + def align_ylabels(self, axs: Iterable[Axes] | None = ...) -> None: + ... + + def align_labels(self, axs: Iterable[Axes] | None = ...) -> None: + ... + + def add_gridspec(self, nrows: int = ..., ncols: int = ..., **kwargs) -> GridSpec: + ... + + @overload + def subfigures(self, nrows: int = ..., ncols: int = ..., squeeze: Literal[False] = ..., wspace: float | None = ..., hspace: float | None = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., **kwargs) -> np.ndarray: + ... + + @overload + def subfigures(self, nrows: int = ..., ncols: int = ..., squeeze: Literal[True] = ..., wspace: float | None = ..., hspace: float | None = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., **kwargs) -> np.ndarray | SubFigure: + ... + + def add_subfigure(self, subplotspec: SubplotSpec, **kwargs) -> SubFigure: + ... + + def sca(self, a: Axes) -> Axes: + ... + + def gca(self) -> Axes: + ... + + def get_default_bbox_extra_artists(self) -> list[Artist]: + ... + + def get_tightbbox(self, renderer: RendererBase | None = ..., *, bbox_extra_artists: Iterable[Artist] | None = ...) -> Bbox: + ... + + @overload + def subplot_mosaic(self, mosaic: str, *, sharex: bool = ..., sharey: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., empty_sentinel: str = ..., subplot_kw: dict[str, Any] | None = ..., per_subplot_kw: dict[str | tuple[str, ...], dict[str, Any]] | None = ..., gridspec_kw: dict[str, Any] | None = ...) -> dict[str, Axes]: + ... + + @overload + def subplot_mosaic(self, mosaic: list[HashableList[_T]], *, sharex: bool = ..., sharey: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., empty_sentinel: _T = ..., subplot_kw: dict[str, Any] | None = ..., per_subplot_kw: dict[_T | tuple[_T, ...], dict[str, Any]] | None = ..., gridspec_kw: dict[str, Any] | None = ...) -> dict[_T, Axes]: + ... + + @overload + def subplot_mosaic(self, mosaic: list[HashableList[Hashable]], *, sharex: bool = ..., sharey: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., empty_sentinel: Any = ..., subplot_kw: dict[str, Any] | None = ..., per_subplot_kw: dict[Hashable | tuple[Hashable, ...], dict[str, Any]] | None = ..., gridspec_kw: dict[str, Any] | None = ...) -> dict[Hashable, Axes]: + ... + + + +class SubFigure(FigureBase): + figure: Figure + subplotpars: SubplotParams + dpi_scale_trans: Affine2D + canvas: FigureCanvasBase + transFigure: Transform + bbox_relative: Bbox + figbbox: BboxBase + bbox: BboxBase + transSubfigure: Transform + patch: Rectangle + def __init__(self, parent: Figure | SubFigure, subplotspec: SubplotSpec, *, facecolor: ColorType | None = ..., edgecolor: ColorType | None = ..., linewidth: float = ..., frameon: bool | None = ..., **kwargs) -> None: + ... + + @property + def dpi(self) -> float: + ... + + @dpi.setter + def dpi(self, value: float) -> None: + ... + + def get_dpi(self) -> float: + ... + + def set_dpi(self, val) -> None: + ... + + def get_constrained_layout(self) -> bool: + ... + + def get_constrained_layout_pads(self, relative: bool = ...) -> tuple[float, float, float, float]: + ... + + def get_layout_engine(self) -> LayoutEngine: + ... + + @property + def axes(self) -> list[Axes]: + ... + + def get_axes(self) -> list[Axes]: + ... + + + +class Figure(FigureBase): + figure: Figure + bbox_inches: Bbox + dpi_scale_trans: Affine2D + bbox: BboxBase + figbbox: BboxBase + transFigure: Transform + transSubfigure: Transform + patch: Rectangle + subplotpars: SubplotParams + def __init__(self, figsize: tuple[float, float] | None = ..., dpi: float | None = ..., *, facecolor: ColorType | None = ..., edgecolor: ColorType | None = ..., linewidth: float = ..., frameon: bool | None = ..., subplotpars: SubplotParams | None = ..., tight_layout: bool | dict[str, Any] | None = ..., constrained_layout: bool | dict[str, Any] | None = ..., layout: Literal["constrained", "compressed", "tight"] | LayoutEngine | None = ..., **kwargs) -> None: + ... + + def pick(self, mouseevent: MouseEvent) -> None: + ... + + def set_layout_engine(self, layout: Literal["constrained", "compressed", "tight", "none"] | LayoutEngine | None = ..., **kwargs) -> None: + ... + + def get_layout_engine(self) -> LayoutEngine | None: + ... + + def show(self, warn: bool = ...) -> None: + ... + + @property + def axes(self) -> list[Axes]: + ... + + def get_axes(self) -> list[Axes]: + ... + + @property + def dpi(self) -> float: + ... + + @dpi.setter + def dpi(self, dpi: float) -> None: + ... + + def get_tight_layout(self) -> bool: + ... + + def get_constrained_layout_pads(self, relative: bool = ...) -> tuple[float, float, float, float]: + ... + + def get_constrained_layout(self) -> bool: + ... + + canvas: FigureCanvasBase + def set_canvas(self, canvas: FigureCanvasBase) -> None: + ... + + def figimage(self, X: ArrayLike, xo: int = ..., yo: int = ..., alpha: float | None = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., origin: Literal["upper", "lower"] | None = ..., resize: bool = ..., **kwargs) -> FigureImage: + ... + + def set_size_inches(self, w: float | tuple[float, float], h: float | None = ..., forward: bool = ...) -> None: + ... + + def get_size_inches(self) -> np.ndarray: + ... + + def get_figwidth(self) -> float: + ... + + def get_figheight(self) -> float: + ... + + def get_dpi(self) -> float: + ... + + def set_dpi(self, val: float) -> None: + ... + + def set_figwidth(self, val: float, forward: bool = ...) -> None: + ... + + def set_figheight(self, val: float, forward: bool = ...) -> None: + ... + + def clear(self, keep_observers: bool = ...) -> None: + ... + + def draw_without_rendering(self) -> None: + ... + + def draw_artist(self, a: Artist) -> None: + ... + + def add_axobserver(self, func: Callable[[Figure], Any]) -> None: + ... + + def savefig(self, fname: str | os.PathLike | IO, *, transparent: bool | None = ..., **kwargs) -> None: + ... + + def ginput(self, n: int = ..., timeout: float = ..., show_clicks: bool = ..., mouse_add: MouseButton = ..., mouse_pop: MouseButton = ..., mouse_stop: MouseButton = ...) -> list[tuple[int, int]]: + ... + + def waitforbuttonpress(self, timeout: float = ...) -> None | bool: + ... + + def tight_layout(self, *, pad: float = ..., h_pad: float | None = ..., w_pad: float | None = ..., rect: tuple[float, float, float, float] | None = ...) -> None: + ... + + + +def figaspect(arg: float | ArrayLike) -> tuple[float, float]: + ... + diff --git a/typings/matplotlib/font_manager.pyi b/typings/matplotlib/font_manager.pyi new file mode 100644 index 0000000..cf992d1 --- /dev/null +++ b/typings/matplotlib/font_manager.pyi @@ -0,0 +1,197 @@ +""" +This type stub file was generated by pyright. +""" + +import os +from dataclasses import dataclass +from matplotlib._afm import AFM +from matplotlib import ft2font +from pathlib import Path +from collections.abc import Iterable +from typing import Any, Literal + +font_scalings: dict[str | None, float] +stretch_dict: dict[str, int] +weight_dict: dict[str, int] +font_family_aliases: set[str] +MSFolders: str +MSFontDirectories: list[str] +MSUserFontDirectories: list[str] +X11FontDirectories: list[str] +OSXFontDirectories: list[str] +def get_fontext_synonyms(fontext: str) -> list[str]: + ... + +def list_fonts(directory: str, extensions: Iterable[str]) -> list[str]: + ... + +def win32FontDirectory() -> str: + ... + +def findSystemFonts(fontpaths: Iterable[str | os.PathLike | Path] | None = ..., fontext: str = ...) -> list[str]: + ... + +@dataclass +class FontEntry: + fname: str = ... + name: str = ... + style: str = ... + variant: str = ... + weight: str | int = ... + stretch: str = ... + size: str = ... + + +def ttfFontProperty(font: ft2font.FT2Font) -> FontEntry: + ... + +def afmFontProperty(fontpath: str, font: AFM) -> FontEntry: + ... + +class FontProperties: + def __init__(self, family: str | Iterable[str] | None = ..., style: Literal["normal", "italic", "oblique"] | None = ..., variant: Literal["normal", "small-caps"] | None = ..., weight: int | str | None = ..., stretch: int | str | None = ..., size: float | str | None = ..., fname: str | os.PathLike | Path | None = ..., math_fontfamily: str | None = ...) -> None: + ... + + def __hash__(self) -> int: + ... + + def __eq__(self, other: object) -> bool: + ... + + def get_family(self) -> list[str]: + ... + + def get_name(self) -> str: + ... + + def get_style(self) -> Literal["normal", "italic", "oblique"]: + ... + + def get_variant(self) -> Literal["normal", "small-caps"]: + ... + + def get_weight(self) -> int | str: + ... + + def get_stretch(self) -> int | str: + ... + + def get_size(self) -> float: + ... + + def get_file(self) -> str | bytes | None: + ... + + def get_fontconfig_pattern(self) -> dict[str, list[Any]]: + ... + + def set_family(self, family: str | Iterable[str] | None) -> None: + ... + + def set_style(self, style: Literal["normal", "italic", "oblique"] | None) -> None: + ... + + def set_variant(self, variant: Literal["normal", "small-caps"] | None) -> None: + ... + + def set_weight(self, weight: int | str | None) -> None: + ... + + def set_stretch(self, stretch: int | str | None) -> None: + ... + + def set_size(self, size: float | str | None) -> None: + ... + + def set_file(self, file: str | os.PathLike | Path | None) -> None: + ... + + def set_fontconfig_pattern(self, pattern: str) -> None: + ... + + def get_math_fontfamily(self) -> str: + ... + + def set_math_fontfamily(self, fontfamily: str | None) -> None: + ... + + def copy(self) -> FontProperties: + ... + + set_name = ... + get_slant = ... + set_slant = ... + get_size_in_points = ... + + +def json_dump(data: FontManager, filename: str | Path | os.PathLike) -> None: + ... + +def json_load(filename: str | Path | os.PathLike) -> FontManager: + ... + +class FontManager: + __version__: int + default_size: float | None + defaultFamily: dict[str, str] + afmlist: list[FontEntry] + ttflist: list[FontEntry] + def __init__(self, size: float | None = ..., weight: str = ...) -> None: + ... + + def addfont(self, path: str | Path | os.PathLike) -> None: + ... + + @property + def defaultFont(self) -> dict[str, str]: + ... + + def get_default_weight(self) -> str: + ... + + @staticmethod + def get_default_size() -> float: + ... + + def set_default_weight(self, weight: str) -> None: + ... + + def score_family(self, families: str | list[str] | tuple[str], family2: str) -> float: + ... + + def score_style(self, style1: str, style2: str) -> float: + ... + + def score_variant(self, variant1: str, variant2: str) -> float: + ... + + def score_stretch(self, stretch1: str | int, stretch2: str | int) -> float: + ... + + def score_weight(self, weight1: str | float, weight2: str | float) -> float: + ... + + def score_size(self, size1: str | float, size2: str | float) -> float: + ... + + def findfont(self, prop: str | FontProperties, fontext: Literal["ttf", "afm"] = ..., directory: str | None = ..., fallback_to_default: bool = ..., rebuild_if_missing: bool = ...) -> str: + ... + + def get_font_names(self) -> list[str]: + ... + + + +def is_opentype_cff_font(filename: str) -> bool: + ... + +def get_font(font_filepaths: Iterable[str | Path | bytes] | str | Path | bytes, hinting_factor: int | None = ...) -> ft2font.FT2Font: + ... + +fontManager: FontManager +def findfont(prop: str | FontProperties, fontext: Literal["ttf", "afm"] = ..., directory: str | None = ..., fallback_to_default: bool = ..., rebuild_if_missing: bool = ...) -> str: + ... + +def get_font_names() -> list[str]: + ... + diff --git a/typings/matplotlib/ft2font.pyi b/typings/matplotlib/ft2font.pyi new file mode 100644 index 0000000..beb4185 --- /dev/null +++ b/typings/matplotlib/ft2font.pyi @@ -0,0 +1,327 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from typing import BinaryIO, Literal, TypedDict, overload +from numpy.typing import NDArray + +__freetype_build_type__: str +__freetype_version__: str +BOLD: int +EXTERNAL_STREAM: int +FAST_GLYPHS: int +FIXED_SIZES: int +FIXED_WIDTH: int +GLYPH_NAMES: int +HORIZONTAL: int +ITALIC: int +KERNING: int +KERNING_DEFAULT: int +KERNING_UNFITTED: int +KERNING_UNSCALED: int +LOAD_CROP_BITMAP: int +LOAD_DEFAULT: int +LOAD_FORCE_AUTOHINT: int +LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH: int +LOAD_IGNORE_TRANSFORM: int +LOAD_LINEAR_DESIGN: int +LOAD_MONOCHROME: int +LOAD_NO_AUTOHINT: int +LOAD_NO_BITMAP: int +LOAD_NO_HINTING: int +LOAD_NO_RECURSE: int +LOAD_NO_SCALE: int +LOAD_PEDANTIC: int +LOAD_RENDER: int +LOAD_TARGET_LCD: int +LOAD_TARGET_LCD_V: int +LOAD_TARGET_LIGHT: int +LOAD_TARGET_MONO: int +LOAD_TARGET_NORMAL: int +LOAD_VERTICAL_LAYOUT: int +MULTIPLE_MASTERS: int +SCALABLE: int +SFNT: int +VERTICAL: int +class _SfntHeadDict(TypedDict): + version: tuple[int, int] + fontRevision: tuple[int, int] + checkSumAdjustment: int + magicNumber: int + flags: int + unitsPerEm: int + created: tuple[int, int] + modified: tuple[int, int] + xMin: int + yMin: int + xMax: int + yMax: int + macStyle: int + lowestRecPPEM: int + fontDirectionHint: int + indexToLocFormat: int + glyphDataFormat: int + ... + + +class _SfntMaxpDict(TypedDict): + version: tuple[int, int] + numGlyphs: int + maxPoints: int + maxContours: int + maxComponentPoints: int + maxComponentContours: int + maxZones: int + maxTwilightPoints: int + maxStorage: int + maxFunctionDefs: int + maxInstructionDefs: int + maxStackElements: int + maxSizeOfInstructions: int + maxComponentElements: int + maxComponentDepth: int + ... + + +class _SfntOs2Dict(TypedDict): + version: int + xAvgCharWidth: int + usWeightClass: int + usWidthClass: int + fsType: int + ySubscriptXSize: int + ySubscriptYSize: int + ySubscriptXOffset: int + ySubscriptYOffset: int + ySuperscriptXSize: int + ySuperscriptYSize: int + ySuperscriptXOffset: int + ySuperscriptYOffset: int + yStrikeoutSize: int + yStrikeoutPosition: int + sFamilyClass: int + panose: bytes + ulCharRange: tuple[int, int, int, int] + achVendID: bytes + fsSelection: int + fsFirstCharIndex: int + fsLastCharIndex: int + ... + + +class _SfntHheaDict(TypedDict): + version: tuple[int, int] + ascent: int + descent: int + lineGap: int + advanceWidthMax: int + minLeftBearing: int + minRightBearing: int + xMaxExtent: int + caretSlopeRise: int + caretSlopeRun: int + caretOffset: int + metricDataFormat: int + numOfLongHorMetrics: int + ... + + +class _SfntVheaDict(TypedDict): + version: tuple[int, int] + vertTypoAscender: int + vertTypoDescender: int + vertTypoLineGap: int + advanceHeightMax: int + minTopSideBearing: int + minBottomSizeBearing: int + yMaxExtent: int + caretSlopeRise: int + caretSlopeRun: int + caretOffset: int + metricDataFormat: int + numOfLongVerMetrics: int + ... + + +class _SfntPostDict(TypedDict): + format: tuple[int, int] + italicAngle: tuple[int, int] + underlinePosition: int + underlineThickness: int + isFixedPitch: int + minMemType42: int + maxMemType42: int + minMemType1: int + maxMemType1: int + ... + + +class _SfntPcltDict(TypedDict): + version: tuple[int, int] + fontNumber: int + pitch: int + xHeight: int + style: int + typeFamily: int + capHeight: int + symbolSet: int + typeFace: bytes + characterComplement: bytes + strokeWeight: int + widthType: int + serifStyle: int + ... + + +class FT2Font: + ascender: int + bbox: tuple[int, int, int, int] + descender: int + face_flags: int + family_name: str + fname: str + height: int + max_advance_height: int + max_advance_width: int + num_charmaps: int + num_faces: int + num_fixed_sizes: int + num_glyphs: int + postscript_name: str + scalable: bool + style_flags: int + style_name: str + underline_position: int + underline_thickness: int + units_per_EM: int + def __init__(self, filename: str | BinaryIO, hinting_factor: int = ..., *, _fallback_list: list[FT2Font] | None = ..., _kerning_factor: int = ...) -> None: + ... + + def clear(self) -> None: + ... + + def draw_glyph_to_bitmap(self, image: FT2Image, x: float, y: float, glyph: Glyph, antialiased: bool = ...) -> None: + ... + + def draw_glyphs_to_bitmap(self, antialiased: bool = ...) -> None: + ... + + def get_bitmap_offset(self) -> tuple[int, int]: + ... + + def get_char_index(self, codepoint: int) -> int: + ... + + def get_charmap(self) -> dict[int, int]: + ... + + def get_descent(self) -> int: + ... + + def get_glyph_name(self, index: int) -> str: + ... + + def get_image(self) -> NDArray[np.uint8]: + ... + + def get_kerning(self, left: int, right: int, mode: int) -> int: + ... + + def get_name_index(self, name: str) -> int: + ... + + def get_num_glyphs(self) -> int: + ... + + def get_path(self) -> tuple[NDArray[np.float64], NDArray[np.int8]]: + ... + + def get_ps_font_info(self) -> tuple[str, str, str, str, str, int, int, int, int]: + ... + + def get_sfnt(self) -> dict[tuple[int, int, int, int], bytes]: + ... + + @overload + def get_sfnt_table(self, name: Literal["head"]) -> _SfntHeadDict | None: + ... + + @overload + def get_sfnt_table(self, name: Literal["maxp"]) -> _SfntMaxpDict | None: + ... + + @overload + def get_sfnt_table(self, name: Literal["OS/2"]) -> _SfntOs2Dict | None: + ... + + @overload + def get_sfnt_table(self, name: Literal["hhea"]) -> _SfntHheaDict | None: + ... + + @overload + def get_sfnt_table(self, name: Literal["vhea"]) -> _SfntVheaDict | None: + ... + + @overload + def get_sfnt_table(self, name: Literal["post"]) -> _SfntPostDict | None: + ... + + @overload + def get_sfnt_table(self, name: Literal["pclt"]) -> _SfntPcltDict | None: + ... + + def get_width_height(self) -> tuple[int, int]: + ... + + def get_xys(self, antialiased: bool = ...) -> NDArray[np.float64]: + ... + + def load_char(self, charcode: int, flags: int = ...) -> Glyph: + ... + + def load_glyph(self, glyphindex: int, flags: int = ...) -> Glyph: + ... + + def select_charmap(self, i: int) -> None: + ... + + def set_charmap(self, i: int) -> None: + ... + + def set_size(self, ptsize: float, dpi: float) -> None: + ... + + def set_text(self, string: str, angle: float = ..., flags: int = ...) -> NDArray[np.float64]: + ... + + + +class FT2Image: + def __init__(self, width: float, height: float) -> None: + ... + + def draw_rect(self, x0: float, y0: float, x1: float, y1: float) -> None: + ... + + def draw_rect_filled(self, x0: float, y0: float, x1: float, y1: float) -> None: + ... + + + +class Glyph: + width: int + height: int + horiBearingX: int + horiBearingY: int + horiAdvance: int + linearHoriAdvance: int + vertBearingX: int + vertBearingY: int + vertAdvance: int + @property + def bbox(self) -> tuple[int, int, int, int]: + ... + + + diff --git a/typings/matplotlib/gridspec.pyi b/typings/matplotlib/gridspec.pyi new file mode 100644 index 0000000..523601e --- /dev/null +++ b/typings/matplotlib/gridspec.pyi @@ -0,0 +1,149 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from typing import Any, Literal, overload +from numpy.typing import ArrayLike +from matplotlib.axes import Axes, SubplotBase +from matplotlib.backend_bases import RendererBase +from matplotlib.figure import Figure, SubplotParams +from matplotlib.transforms import Bbox + +class GridSpecBase: + def __init__(self, nrows: int, ncols: int, height_ratios: ArrayLike | None = ..., width_ratios: ArrayLike | None = ...) -> None: + ... + + @property + def nrows(self) -> int: + ... + + @property + def ncols(self) -> int: + ... + + def get_geometry(self) -> tuple[int, int]: + ... + + def get_subplot_params(self, figure: Figure | None = ...) -> SubplotParams: + ... + + def new_subplotspec(self, loc: tuple[int, int], rowspan: int = ..., colspan: int = ...) -> SubplotSpec: + ... + + def set_width_ratios(self, width_ratios: ArrayLike | None) -> None: + ... + + def get_width_ratios(self) -> ArrayLike: + ... + + def set_height_ratios(self, height_ratios: ArrayLike | None) -> None: + ... + + def get_height_ratios(self) -> ArrayLike: + ... + + def get_grid_positions(self, fig: Figure, raw: bool = ...) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: + ... + + def __getitem__(self, key: tuple[int | slice, int | slice] | slice | int) -> SubplotSpec: + ... + + @overload + def subplots(self, *, sharex: bool | Literal["all", "row", "col", "none"] = ..., sharey: bool | Literal["all", "row", "col", "none"] = ..., squeeze: Literal[False], subplot_kw: dict[str, Any] | None = ...) -> np.ndarray: + ... + + @overload + def subplots(self, *, sharex: bool | Literal["all", "row", "col", "none"] = ..., sharey: bool | Literal["all", "row", "col", "none"] = ..., squeeze: Literal[True] = ..., subplot_kw: dict[str, Any] | None = ...) -> np.ndarray | SubplotBase | Axes: + ... + + + +class GridSpec(GridSpecBase): + left: float | None + bottom: float | None + right: float | None + top: float | None + wspace: float | None + hspace: float | None + figure: Figure | None + def __init__(self, nrows: int, ncols: int, figure: Figure | None = ..., left: float | None = ..., bottom: float | None = ..., right: float | None = ..., top: float | None = ..., wspace: float | None = ..., hspace: float | None = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ...) -> None: + ... + + def update(self, **kwargs: float | None) -> None: + ... + + def locally_modified_subplot_params(self) -> list[str]: + ... + + def tight_layout(self, figure: Figure, renderer: RendererBase | None = ..., pad: float = ..., h_pad: float | None = ..., w_pad: float | None = ..., rect: tuple[float, float, float, float] | None = ...) -> None: + ... + + + +class GridSpecFromSubplotSpec(GridSpecBase): + figure: Figure | None + def __init__(self, nrows: int, ncols: int, subplot_spec: SubplotSpec, wspace: float | None = ..., hspace: float | None = ..., height_ratios: ArrayLike | None = ..., width_ratios: ArrayLike | None = ...) -> None: + ... + + def get_topmost_subplotspec(self) -> SubplotSpec: + ... + + + +class SubplotSpec: + num1: int + def __init__(self, gridspec: GridSpecBase, num1: int, num2: int | None = ...) -> None: + ... + + @property + def num2(self) -> int: + ... + + @num2.setter + def num2(self, value: int) -> None: + ... + + def get_gridspec(self) -> GridSpec: + ... + + def get_geometry(self) -> tuple[int, int, int, int]: + ... + + @property + def rowspan(self) -> range: + ... + + @property + def colspan(self) -> range: + ... + + def is_first_row(self) -> bool: + ... + + def is_last_row(self) -> bool: + ... + + def is_first_col(self) -> bool: + ... + + def is_last_col(self) -> bool: + ... + + def get_position(self, figure: Figure) -> Bbox: + ... + + def get_topmost_subplotspec(self) -> SubplotSpec: + ... + + def __eq__(self, other: object) -> bool: + ... + + def __hash__(self) -> int: + ... + + def subgridspec(self, nrows: int, ncols: int, **kwargs) -> GridSpecFromSubplotSpec: + ... + + + diff --git a/typings/matplotlib/hatch.pyi b/typings/matplotlib/hatch.pyi new file mode 100644 index 0000000..710c8cd --- /dev/null +++ b/typings/matplotlib/hatch.pyi @@ -0,0 +1,115 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from matplotlib.path import Path +from numpy.typing import ArrayLike + +class HatchPatternBase: + ... + + +class HorizontalHatch(HatchPatternBase): + num_lines: int + num_vertices: int + def __init__(self, hatch: str, density: int) -> None: + ... + + def set_vertices_and_codes(self, vertices: ArrayLike, codes: ArrayLike) -> None: + ... + + + +class VerticalHatch(HatchPatternBase): + num_lines: int + num_vertices: int + def __init__(self, hatch: str, density: int) -> None: + ... + + def set_vertices_and_codes(self, vertices: ArrayLike, codes: ArrayLike) -> None: + ... + + + +class NorthEastHatch(HatchPatternBase): + num_lines: int + num_vertices: int + def __init__(self, hatch: str, density: int) -> None: + ... + + def set_vertices_and_codes(self, vertices: ArrayLike, codes: ArrayLike) -> None: + ... + + + +class SouthEastHatch(HatchPatternBase): + num_lines: int + num_vertices: int + def __init__(self, hatch: str, density: int) -> None: + ... + + def set_vertices_and_codes(self, vertices: ArrayLike, codes: ArrayLike) -> None: + ... + + + +class Shapes(HatchPatternBase): + filled: bool + num_shapes: int + num_vertices: int + def __init__(self, hatch: str, density: int) -> None: + ... + + def set_vertices_and_codes(self, vertices: ArrayLike, codes: ArrayLike) -> None: + ... + + + +class Circles(Shapes): + shape_vertices: np.ndarray + shape_codes: np.ndarray + def __init__(self, hatch: str, density: int) -> None: + ... + + + +class SmallCircles(Circles): + size: float + num_rows: int + def __init__(self, hatch: str, density: int) -> None: + ... + + + +class LargeCircles(Circles): + size: float + num_rows: int + def __init__(self, hatch: str, density: int) -> None: + ... + + + +class SmallFilledCircles(Circles): + size: float + filled: bool + num_rows: int + def __init__(self, hatch: str, density: int) -> None: + ... + + + +class Stars(Shapes): + size: float + filled: bool + num_rows: int + shape_vertices: np.ndarray + shape_codes: np.ndarray + def __init__(self, hatch: str, density: int) -> None: + ... + + + +def get_path(hatchpattern: str, density: int = ...) -> Path: + ... + diff --git a/typings/matplotlib/image.pyi b/typings/matplotlib/image.pyi new file mode 100644 index 0000000..a51ddb8 --- /dev/null +++ b/typings/matplotlib/image.pyi @@ -0,0 +1,188 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import pathlib +import numpy as np +import PIL.Image +import matplotlib.artist as martist +from collections.abc import Callable, Sequence +from typing import Any, BinaryIO, Literal +from numpy.typing import ArrayLike, NDArray +from matplotlib.axes import Axes +from matplotlib import cm +from matplotlib.backend_bases import MouseEvent, RendererBase +from matplotlib.colors import Colormap, Normalize +from matplotlib.figure import Figure +from matplotlib.transforms import Affine2D, Bbox, BboxBase, Transform + +BESSEL: int +BICUBIC: int +BILINEAR: int +BLACKMAN: int +CATROM: int +GAUSSIAN: int +HAMMING: int +HANNING: int +HERMITE: int +KAISER: int +LANCZOS: int +MITCHELL: int +NEAREST: int +QUADRIC: int +SINC: int +SPLINE16: int +SPLINE36: int +def resample(input_array: NDArray[np.float32] | NDArray[np.float64] | NDArray[np.int8], output_array: NDArray[np.float32] | NDArray[np.float64] | NDArray[np.int8], transform: Transform, interpolation: int = ..., resample: bool = ..., alpha: float = ..., norm: bool = ..., radius: float = ...) -> None: + ... + +interpolations_names: set[str] +def composite_images(images: Sequence[_ImageBase], renderer: RendererBase, magnification: float = ...) -> tuple[np.ndarray, float, float]: + ... + +class _ImageBase(martist.Artist, cm.ScalarMappable): + zorder: float + origin: Literal["upper", "lower"] + axes: Axes + def __init__(self, ax: Axes, cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., interpolation: str | None = ..., origin: Literal["upper", "lower"] | None = ..., filternorm: bool = ..., filterrad: float = ..., resample: bool | None = ..., *, interpolation_stage: Literal["data", "rgba"] | None = ..., **kwargs) -> None: + ... + + def get_size(self) -> tuple[int, int]: + ... + + def set_alpha(self, alpha: float | ArrayLike | None) -> None: + ... + + def changed(self) -> None: + ... + + def make_image(self, renderer: RendererBase, magnification: float = ..., unsampled: bool = ...) -> tuple[np.ndarray, float, float, Affine2D]: + ... + + def draw(self, renderer: RendererBase, *args, **kwargs) -> None: + ... + + def write_png(self, fname: str | pathlib.Path | BinaryIO) -> None: + ... + + def set_data(self, A: ArrayLike | None) -> None: + ... + + def set_array(self, A: ArrayLike | None) -> None: + ... + + def get_shape(self) -> tuple[int, int, int]: + ... + + def get_interpolation(self) -> str: + ... + + def set_interpolation(self, s: str | None) -> None: + ... + + def set_interpolation_stage(self, s: Literal["data", "rgba"]) -> None: + ... + + def can_composite(self) -> bool: + ... + + def set_resample(self, v: bool | None) -> None: + ... + + def get_resample(self) -> bool: + ... + + def set_filternorm(self, filternorm: bool) -> None: + ... + + def get_filternorm(self) -> bool: + ... + + def set_filterrad(self, filterrad: float) -> None: + ... + + def get_filterrad(self) -> float: + ... + + + +class AxesImage(_ImageBase): + def __init__(self, ax: Axes, *, cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., interpolation: str | None = ..., origin: Literal["upper", "lower"] | None = ..., extent: tuple[float, float, float, float] | None = ..., filternorm: bool = ..., filterrad: float = ..., resample: bool = ..., interpolation_stage: Literal["data", "rgba"] | None = ..., **kwargs) -> None: + ... + + def get_window_extent(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + def make_image(self, renderer: RendererBase, magnification: float = ..., unsampled: bool = ...) -> tuple[np.ndarray, float, float, Affine2D]: + ... + + def set_extent(self, extent: tuple[float, float, float, float], **kwargs) -> None: + ... + + def get_extent(self) -> tuple[float, float, float, float]: + ... + + def get_cursor_data(self, event: MouseEvent) -> None | float: + ... + + + +class NonUniformImage(AxesImage): + mouseover: bool + def __init__(self, ax: Axes, *, interpolation: Literal["nearest", "bilinear"] = ..., **kwargs) -> None: + ... + + def set_data(self, x: ArrayLike, y: ArrayLike, A: ArrayLike) -> None: + ... + + def set_interpolation(self, s: Literal["nearest", "bilinear"]) -> None: + ... + + + +class PcolorImage(AxesImage): + def __init__(self, ax: Axes, x: ArrayLike | None = ..., y: ArrayLike | None = ..., A: ArrayLike | None = ..., *, cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., **kwargs) -> None: + ... + + def set_data(self, x: ArrayLike, y: ArrayLike, A: ArrayLike) -> None: + ... + + + +class FigureImage(_ImageBase): + zorder: float + figure: Figure + ox: float + oy: float + magnification: float + def __init__(self, fig: Figure, *, cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., offsetx: int = ..., offsety: int = ..., origin: Literal["upper", "lower"] | None = ..., **kwargs) -> None: + ... + + def get_extent(self) -> tuple[float, float, float, float]: + ... + + + +class BboxImage(_ImageBase): + bbox: BboxBase + def __init__(self, bbox: BboxBase | Callable[[RendererBase | None], Bbox], *, cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., interpolation: str | None = ..., origin: Literal["upper", "lower"] | None = ..., filternorm: bool = ..., filterrad: float = ..., resample: bool = ..., **kwargs) -> None: + ... + + def get_window_extent(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + + +def imread(fname: str | pathlib.Path | BinaryIO, format: str | None = ...) -> np.ndarray: + ... + +def imsave(fname: str | os.PathLike | BinaryIO, arr: ArrayLike, vmin: float | None = ..., vmax: float | None = ..., cmap: str | Colormap | None = ..., format: str | None = ..., origin: Literal["upper", "lower"] | None = ..., dpi: float = ..., *, metadata: dict[str, str] | None = ..., pil_kwargs: dict[str, Any] | None = ...) -> None: + ... + +def pil_to_array(pilImage: PIL.Image.Image) -> np.ndarray: + ... + +def thumbnail(infile: str | BinaryIO, thumbfile: str | BinaryIO, scale: float = ..., interpolation: str = ..., preview: bool = ...) -> Figure: + ... + diff --git a/typings/matplotlib/layout_engine.pyi b/typings/matplotlib/layout_engine.pyi new file mode 100644 index 0000000..ae1977c --- /dev/null +++ b/typings/matplotlib/layout_engine.pyi @@ -0,0 +1,63 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.figure import Figure +from typing import Any + +class LayoutEngine: + def __init__(self, **kwargs: Any) -> None: + ... + + def set(self) -> None: + ... + + @property + def colorbar_gridspec(self) -> bool: + ... + + @property + def adjust_compatible(self) -> bool: + ... + + def get(self) -> dict[str, Any]: + ... + + def execute(self, fig: Figure) -> None: + ... + + + +class PlaceHolderLayoutEngine(LayoutEngine): + def __init__(self, adjust_compatible: bool, colorbar_gridspec: bool, **kwargs: Any) -> None: + ... + + def execute(self, fig: Figure) -> None: + ... + + + +class TightLayoutEngine(LayoutEngine): + def __init__(self, *, pad: float = ..., h_pad: float | None = ..., w_pad: float | None = ..., rect: tuple[float, float, float, float] = ..., **kwargs: Any) -> None: + ... + + def execute(self, fig: Figure) -> None: + ... + + def set(self, *, pad: float | None = ..., w_pad: float | None = ..., h_pad: float | None = ..., rect: tuple[float, float, float, float] | None = ...) -> None: + ... + + + +class ConstrainedLayoutEngine(LayoutEngine): + def __init__(self, *, h_pad: float | None = ..., w_pad: float | None = ..., hspace: float | None = ..., wspace: float | None = ..., rect: tuple[float, float, float, float] = ..., compress: bool = ..., **kwargs: Any) -> None: + ... + + def execute(self, fig: Figure) -> Any: + ... + + def set(self, *, h_pad: float | None = ..., w_pad: float | None = ..., hspace: float | None = ..., wspace: float | None = ..., rect: tuple[float, float, float, float] | None = ...) -> None: + ... + + + diff --git a/typings/matplotlib/legend.pyi b/typings/matplotlib/legend.pyi new file mode 100644 index 0000000..6e81a69 --- /dev/null +++ b/typings/matplotlib/legend.pyi @@ -0,0 +1,139 @@ +""" +This type stub file was generated by pyright. +""" + +import pathlib +from matplotlib.axes import Axes +from matplotlib.artist import Artist +from matplotlib.backend_bases import MouseEvent +from matplotlib.figure import Figure +from matplotlib.font_manager import FontProperties +from matplotlib.legend_handler import HandlerBase +from matplotlib.lines import Line2D +from matplotlib.offsetbox import DraggableOffsetBox +from matplotlib.patches import FancyBboxPatch, Patch, Rectangle +from matplotlib.text import Text +from matplotlib.transforms import BboxBase, Transform +from collections.abc import Iterable +from typing import Any, Literal, overload +from .typing import ColorType + +class DraggableLegend(DraggableOffsetBox): + legend: Legend + def __init__(self, legend: Legend, use_blit: bool = ..., update: Literal["loc", "bbox"] = ...) -> None: + ... + + def finalize_offset(self) -> None: + ... + + + +class Legend(Artist): + codes: dict[str, int] + zorder: float + prop: FontProperties + texts: list[Text] + legend_handles: list[Artist | None] + numpoints: int + markerscale: float + scatterpoints: int + borderpad: float + labelspacing: float + handlelength: float + handleheight: float + handletextpad: float + borderaxespad: float + columnspacing: float + shadow: bool + isaxes: bool + axes: Axes + parent: Axes | Figure + legendPatch: FancyBboxPatch + def __init__(self, parent: Axes | Figure, handles: Iterable[Artist | tuple[Artist, ...]], labels: Iterable[str], *, loc: str | tuple[float, float] | int | None = ..., numpoints: int | None = ..., markerscale: float | None = ..., markerfirst: bool = ..., reverse: bool = ..., scatterpoints: int | None = ..., scatteryoffsets: Iterable[float] | None = ..., prop: FontProperties | dict[str, Any] | None = ..., fontsize: float | str | None = ..., labelcolor: ColorType | Iterable[ColorType] | Literal["linecolor", "markerfacecolor", "mfc", "markeredgecolor", "mec"] | None = ..., borderpad: float | None = ..., labelspacing: float | None = ..., handlelength: float | None = ..., handleheight: float | None = ..., handletextpad: float | None = ..., borderaxespad: float | None = ..., columnspacing: float | None = ..., ncols: int = ..., mode: Literal["expand"] | None = ..., fancybox: bool | None = ..., shadow: bool | dict[str, Any] | None = ..., title: str | None = ..., title_fontsize: float | None = ..., framealpha: float | None = ..., edgecolor: Literal["inherit"] | ColorType | None = ..., facecolor: Literal["inherit"] | ColorType | None = ..., bbox_to_anchor: BboxBase | tuple[float, float] | tuple[float, float, float, float] | None = ..., bbox_transform: Transform | None = ..., frameon: bool | None = ..., handler_map: dict[Artist | type, HandlerBase] | None = ..., title_fontproperties: FontProperties | dict[str, Any] | None = ..., alignment: Literal["center", "left", "right"] = ..., ncol: int = ..., draggable: bool = ...) -> None: + ... + + def contains(self, mouseevent: MouseEvent) -> tuple[bool, dict[Any, Any]]: + ... + + def set_ncols(self, ncols: int) -> None: + ... + + @classmethod + def get_default_handler_map(cls) -> dict[type, HandlerBase]: + ... + + @classmethod + def set_default_handler_map(cls, handler_map: dict[type, HandlerBase]) -> None: + ... + + @classmethod + def update_default_handler_map(cls, handler_map: dict[type, HandlerBase]) -> None: + ... + + def get_legend_handler_map(self) -> dict[type, HandlerBase]: + ... + + @staticmethod + def get_legend_handler(legend_handler_map: dict[type, HandlerBase], orig_handle: Any) -> HandlerBase | None: + ... + + def get_children(self) -> list[Artist]: + ... + + def get_frame(self) -> Rectangle: + ... + + def get_lines(self) -> list[Line2D]: + ... + + def get_patches(self) -> list[Patch]: + ... + + def get_texts(self) -> list[Text]: + ... + + def set_alignment(self, alignment: Literal["center", "left", "right"]) -> None: + ... + + def get_alignment(self) -> Literal["center", "left", "right"]: + ... + + def set_loc(self, loc: str | tuple[float, float] | int | None = ...) -> None: + ... + + def set_title(self, title: str, prop: FontProperties | str | pathlib.Path | None = ...) -> None: + ... + + def get_title(self) -> Text: + ... + + def get_frame_on(self) -> bool: + ... + + def set_frame_on(self, b: bool) -> None: + ... + + draw_frame = ... + def get_bbox_to_anchor(self) -> BboxBase: + ... + + def set_bbox_to_anchor(self, bbox: BboxBase | tuple[float, float] | tuple[float, float, float, float] | None, transform: Transform | None = ...) -> None: + ... + + @overload + def set_draggable(self, state: Literal[True], use_blit: bool = ..., update: Literal["loc", "bbox"] = ...) -> DraggableLegend: + ... + + @overload + def set_draggable(self, state: Literal[False], use_blit: bool = ..., update: Literal["loc", "bbox"] = ...) -> None: + ... + + def get_draggable(self) -> bool: + ... + + @property + def legendHandles(self) -> list[Artist | None]: + ... + + + diff --git a/typings/matplotlib/legend_handler.pyi b/typings/matplotlib/legend_handler.pyi new file mode 100644 index 0000000..e8261c8 --- /dev/null +++ b/typings/matplotlib/legend_handler.pyi @@ -0,0 +1,163 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable, Sequence +from matplotlib.artist import Artist +from matplotlib.legend import Legend +from matplotlib.offsetbox import OffsetBox +from matplotlib.transforms import Transform +from typing import TypeVar +from numpy.typing import ArrayLike + +def update_from_first_child(tgt: Artist, src: Artist) -> None: + ... + +class HandlerBase: + def __init__(self, xpad: float = ..., ypad: float = ..., update_func: Callable[[Artist, Artist], None] | None = ...) -> None: + ... + + def update_prop(self, legend_handle: Artist, orig_handle: Artist, legend: Legend) -> None: + ... + + def adjust_drawing_area(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float) -> tuple[float, float, float, float]: + ... + + def legend_artist(self, legend: Legend, orig_handle: Artist, fontsize: float, handlebox: OffsetBox) -> Artist: + ... + + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerNpoints(HandlerBase): + def __init__(self, marker_pad: float = ..., numpoints: int | None = ..., **kwargs) -> None: + ... + + def get_numpoints(self, legend: Legend) -> int | None: + ... + + def get_xdata(self, legend: Legend, xdescent: float, ydescent: float, width: float, height: float, fontsize: float) -> tuple[ArrayLike, ArrayLike]: + ... + + + +class HandlerNpointsYoffsets(HandlerNpoints): + def __init__(self, numpoints: int | None = ..., yoffsets: Sequence[float] | None = ..., **kwargs) -> None: + ... + + def get_ydata(self, legend: Legend, xdescent: float, ydescent: float, width: float, height: float, fontsize: float) -> ArrayLike: + ... + + + +class HandlerLine2DCompound(HandlerNpoints): + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerLine2D(HandlerNpoints): + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerPatch(HandlerBase): + def __init__(self, patch_func: Callable | None = ..., **kwargs) -> None: + ... + + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerStepPatch(HandlerBase): + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerLineCollection(HandlerLine2D): + def get_numpoints(self, legend: Legend) -> int: + ... + + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +_T = TypeVar("_T", bound=Artist) +class HandlerRegularPolyCollection(HandlerNpointsYoffsets): + def __init__(self, yoffsets: Sequence[float] | None = ..., sizes: Sequence[float] | None = ..., **kwargs) -> None: + ... + + def get_numpoints(self, legend: Legend) -> int: + ... + + def get_sizes(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float) -> Sequence[float]: + ... + + def update_prop(self, legend_handle, orig_handle: Artist, legend: Legend) -> None: + ... + + def create_collection(self, orig_handle: _T, sizes: Sequence[float] | None, offsets: Sequence[float] | None, offset_transform: Transform) -> _T: + ... + + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerPathCollection(HandlerRegularPolyCollection): + def create_collection(self, orig_handle: _T, sizes: Sequence[float] | None, offsets: Sequence[float] | None, offset_transform: Transform) -> _T: + ... + + + +class HandlerCircleCollection(HandlerRegularPolyCollection): + def create_collection(self, orig_handle: _T, sizes: Sequence[float] | None, offsets: Sequence[float] | None, offset_transform: Transform) -> _T: + ... + + + +class HandlerErrorbar(HandlerLine2D): + def __init__(self, xerr_size: float = ..., yerr_size: float | None = ..., marker_pad: float = ..., numpoints: int | None = ..., **kwargs) -> None: + ... + + def get_err_size(self, legend: Legend, xdescent: float, ydescent: float, width: float, height: float, fontsize: float) -> tuple[float, float]: + ... + + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerStem(HandlerNpointsYoffsets): + def __init__(self, marker_pad: float = ..., numpoints: int | None = ..., bottom: float | None = ..., yoffsets: Sequence[float] | None = ..., **kwargs) -> None: + ... + + def get_ydata(self, legend: Legend, xdescent: float, ydescent: float, width: float, height: float, fontsize: float) -> ArrayLike: + ... + + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerTuple(HandlerBase): + def __init__(self, ndivide: int | None = ..., pad: float | None = ..., **kwargs) -> None: + ... + + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + +class HandlerPolyCollection(HandlerBase): + def create_artists(self, legend: Legend, orig_handle: Artist, xdescent: float, ydescent: float, width: float, height: float, fontsize: float, trans: Transform) -> Sequence[Artist]: + ... + + + diff --git a/typings/matplotlib/lines.pyi b/typings/matplotlib/lines.pyi new file mode 100644 index 0000000..db18f40 --- /dev/null +++ b/typings/matplotlib/lines.pyi @@ -0,0 +1,248 @@ +""" +This type stub file was generated by pyright. +""" + +from .artist import Artist +from .axes import Axes +from .backend_bases import FigureCanvasBase, MouseEvent +from .path import Path +from .transforms import Bbox +from collections.abc import Callable, Sequence +from typing import Any, Literal, overload +from .typing import CapStyleType, ColorType, DrawStyleType, FillStyleType, JoinStyleType, LineStyleType, MarkEveryType, MarkerType +from numpy.typing import ArrayLike + +def segment_hits(cx: ArrayLike, cy: ArrayLike, x: ArrayLike, y: ArrayLike, radius: ArrayLike) -> ArrayLike: + ... + +class Line2D(Artist): + lineStyles: dict[str, str] + drawStyles: dict[str, str] + drawStyleKeys: list[str] + markers: dict[str | int, str] + filled_markers: tuple[str, ...] + fillStyles: tuple[str, ...] + zorder: float + ind_offset: float + def __init__(self, xdata: ArrayLike, ydata: ArrayLike, *, linewidth: float | None = ..., linestyle: LineStyleType | None = ..., color: ColorType | None = ..., gapcolor: ColorType | None = ..., marker: MarkerType | None = ..., markersize: float | None = ..., markeredgewidth: float | None = ..., markeredgecolor: ColorType | None = ..., markerfacecolor: ColorType | None = ..., markerfacecoloralt: ColorType = ..., fillstyle: FillStyleType | None = ..., antialiased: bool | None = ..., dash_capstyle: CapStyleType | None = ..., solid_capstyle: CapStyleType | None = ..., dash_joinstyle: JoinStyleType | None = ..., solid_joinstyle: JoinStyleType | None = ..., pickradius: float = ..., drawstyle: DrawStyleType | None = ..., markevery: MarkEveryType | None = ..., **kwargs) -> None: + ... + + def contains(self, mouseevent: MouseEvent) -> tuple[bool, dict]: + ... + + def get_pickradius(self) -> float: + ... + + def set_pickradius(self, pickradius: float) -> None: + ... + + pickradius: float + def get_fillstyle(self) -> FillStyleType: + ... + + stale: bool + def set_fillstyle(self, fs: FillStyleType) -> None: + ... + + def set_markevery(self, every: MarkEveryType) -> None: + ... + + def get_markevery(self) -> MarkEveryType: + ... + + def set_picker(self, p: None | bool | float | Callable[[Artist, MouseEvent], tuple[bool, dict]]) -> None: + ... + + def get_bbox(self) -> Bbox: + ... + + @overload + def set_data(self, args: ArrayLike) -> None: + ... + + @overload + def set_data(self, x: ArrayLike, y: ArrayLike) -> None: + ... + + def recache_always(self) -> None: + ... + + def recache(self, always: bool = ...) -> None: + ... + + def get_antialiased(self) -> bool: + ... + + def get_color(self) -> ColorType: + ... + + def get_drawstyle(self) -> DrawStyleType: + ... + + def get_gapcolor(self) -> ColorType: + ... + + def get_linestyle(self) -> LineStyleType: + ... + + def get_linewidth(self) -> float: + ... + + def get_marker(self) -> MarkerType: + ... + + def get_markeredgecolor(self) -> ColorType: + ... + + def get_markeredgewidth(self) -> float: + ... + + def get_markerfacecolor(self) -> ColorType: + ... + + def get_markerfacecoloralt(self) -> ColorType: + ... + + def get_markersize(self) -> float: + ... + + def get_data(self, orig: bool = ...) -> tuple[ArrayLike, ArrayLike]: + ... + + def get_xdata(self, orig: bool = ...) -> ArrayLike: + ... + + def get_ydata(self, orig: bool = ...) -> ArrayLike: + ... + + def get_path(self) -> Path: + ... + + def get_xydata(self) -> ArrayLike: + ... + + def set_antialiased(self, b: bool) -> None: + ... + + def set_color(self, color: ColorType) -> None: + ... + + def set_drawstyle(self, drawstyle: DrawStyleType | None) -> None: + ... + + def set_gapcolor(self, gapcolor: ColorType | None) -> None: + ... + + def set_linewidth(self, w: float) -> None: + ... + + def set_linestyle(self, ls: LineStyleType) -> None: + ... + + def set_marker(self, marker: MarkerType) -> None: + ... + + def set_markeredgecolor(self, ec: ColorType | None) -> None: + ... + + def set_markerfacecolor(self, fc: ColorType | None) -> None: + ... + + def set_markerfacecoloralt(self, fc: ColorType | None) -> None: + ... + + def set_markeredgewidth(self, ew: float | None) -> None: + ... + + def set_markersize(self, sz: float) -> None: + ... + + def set_xdata(self, x: ArrayLike) -> None: + ... + + def set_ydata(self, y: ArrayLike) -> None: + ... + + def set_dashes(self, seq: Sequence[float] | tuple[None, None]) -> None: + ... + + def update_from(self, other: Artist) -> None: + ... + + def set_dash_joinstyle(self, s: JoinStyleType) -> None: + ... + + def set_solid_joinstyle(self, s: JoinStyleType) -> None: + ... + + def get_dash_joinstyle(self) -> Literal["miter", "round", "bevel"]: + ... + + def get_solid_joinstyle(self) -> Literal["miter", "round", "bevel"]: + ... + + def set_dash_capstyle(self, s: CapStyleType) -> None: + ... + + def set_solid_capstyle(self, s: CapStyleType) -> None: + ... + + def get_dash_capstyle(self) -> Literal["butt", "projecting", "round"]: + ... + + def get_solid_capstyle(self) -> Literal["butt", "projecting", "round"]: + ... + + def is_dashed(self) -> bool: + ... + + + +class AxLine(Line2D): + def __init__(self, xy1: tuple[float, float], xy2: tuple[float, float] | None, slope: float | None, **kwargs) -> None: + ... + + def get_xy1(self) -> tuple[float, float] | None: + ... + + def get_xy2(self) -> tuple[float, float] | None: + ... + + def get_slope(self) -> float: + ... + + def set_xy1(self, x: float, y: float) -> None: + ... + + def set_xy2(self, x: float, y: float) -> None: + ... + + def set_slope(self, slope: float) -> None: + ... + + + +class VertexSelector: + axes: Axes + line: Line2D + cid: int + ind: set[int] + def __init__(self, line: Line2D) -> None: + ... + + @property + def canvas(self) -> FigureCanvasBase: + ... + + def process_selected(self, ind: Sequence[int], xs: ArrayLike, ys: ArrayLike) -> None: + ... + + def onpick(self, event: Any) -> None: + ... + + + +lineStyles: dict[str, str] +lineMarkers: dict[str | int, str] +drawStyles: dict[str, str] +fillStyles: tuple[FillStyleType, ...] diff --git a/typings/matplotlib/markers.pyi b/typings/matplotlib/markers.pyi new file mode 100644 index 0000000..8a094e7 --- /dev/null +++ b/typings/matplotlib/markers.pyi @@ -0,0 +1,76 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Literal +from .path import Path +from .transforms import Affine2D, Transform +from numpy.typing import ArrayLike +from .typing import CapStyleType, FillStyleType, JoinStyleType + +TICKLEFT: int +TICKRIGHT: int +TICKUP: int +TICKDOWN: int +CARETLEFT: int +CARETRIGHT: int +CARETUP: int +CARETDOWN: int +CARETLEFTBASE: int +CARETRIGHTBASE: int +CARETUPBASE: int +CARETDOWNBASE: int +class MarkerStyle: + markers: dict[str | int, str] + filled_markers: tuple[str, ...] + fillstyles: tuple[FillStyleType, ...] + def __init__(self, marker: str | ArrayLike | Path | MarkerStyle | None, fillstyle: FillStyleType | None = ..., transform: Transform | None = ..., capstyle: CapStyleType | None = ..., joinstyle: JoinStyleType | None = ...) -> None: + ... + + def __bool__(self) -> bool: + ... + + def is_filled(self) -> bool: + ... + + def get_fillstyle(self) -> FillStyleType: + ... + + def get_joinstyle(self) -> Literal["miter", "round", "bevel"]: + ... + + def get_capstyle(self) -> Literal["butt", "projecting", "round"]: + ... + + def get_marker(self) -> str | ArrayLike | Path | None: + ... + + def get_path(self) -> Path: + ... + + def get_transform(self) -> Transform: + ... + + def get_alt_path(self) -> Path | None: + ... + + def get_alt_transform(self) -> Transform: + ... + + def get_snap_threshold(self) -> float | None: + ... + + def get_user_transform(self) -> Transform | None: + ... + + def transformed(self, transform: Affine2D) -> MarkerStyle: + ... + + def rotated(self, *, deg: float | None = ..., rad: float | None = ...) -> MarkerStyle: + ... + + def scaled(self, sx: float, sy: float | None = ...) -> MarkerStyle: + ... + + + diff --git a/typings/matplotlib/mathtext.pyi b/typings/matplotlib/mathtext.pyi new file mode 100644 index 0000000..a712cab --- /dev/null +++ b/typings/matplotlib/mathtext.pyi @@ -0,0 +1,28 @@ +""" +This type stub file was generated by pyright. +""" + +import os +from typing import Generic, IO, Literal, TypeVar, overload +from matplotlib.font_manager import FontProperties +from matplotlib.typing import ColorType +from ._mathtext import RasterParse as RasterParse, VectorParse as VectorParse + +_ParseType = TypeVar("_ParseType", RasterParse, VectorParse) +class MathTextParser(Generic[_ParseType]): + @overload + def __init__(self: MathTextParser[VectorParse], output: Literal["path"]) -> None: + ... + + @overload + def __init__(self: MathTextParser[RasterParse], output: Literal["agg", "raster", "macosx"]) -> None: + ... + + def parse(self, s: str, dpi: float = ..., prop: FontProperties | None = ..., *, antialiased: bool | None = ...) -> _ParseType: + ... + + + +def math_to_image(s: str, filename_or_obj: str | os.PathLike | IO, prop: FontProperties | None = ..., dpi: float | None = ..., format: str | None = ..., *, color: ColorType | None = ...) -> float: + ... + diff --git a/typings/matplotlib/mlab.pyi b/typings/matplotlib/mlab.pyi new file mode 100644 index 0000000..95929bc --- /dev/null +++ b/typings/matplotlib/mlab.pyi @@ -0,0 +1,73 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from collections.abc import Callable +from typing import Literal +from numpy.typing import ArrayLike + +def window_hanning(x: ArrayLike) -> ArrayLike: + ... + +def window_none(x: ArrayLike) -> ArrayLike: + ... + +def detrend(x: ArrayLike, key: Literal["default", "constant", "mean", "linear", "none"] | Callable[[ArrayLike, int | None], ArrayLike] | None = ..., axis: int | None = ...) -> ArrayLike: + ... + +def detrend_mean(x: ArrayLike, axis: int | None = ...) -> ArrayLike: + ... + +def detrend_none(x: ArrayLike, axis: int | None = ...) -> ArrayLike: + ... + +def detrend_linear(y: ArrayLike) -> ArrayLike: + ... + +def psd(x: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike, int | None], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ...) -> tuple[ArrayLike, ArrayLike]: + ... + +def csd(x: ArrayLike, y: ArrayLike | None, NFFT: int | None = ..., Fs: float | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike, int | None], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ...) -> tuple[ArrayLike, ArrayLike]: + ... + +complex_spectrum = ... +magnitude_spectrum = ... +angle_spectrum = ... +phase_spectrum = ... +def specgram(x: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike, int | None], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ..., mode: Literal["psd", "complex", "magnitude", "angle", "phase"] | None = ...) -> tuple[ArrayLike, ArrayLike, ArrayLike]: + ... + +def cohere(x: ArrayLike, y: ArrayLike, NFFT: int = ..., Fs: float = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike, int | None], ArrayLike] = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike = ..., noverlap: int = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] = ..., scale_by_freq: bool | None = ...) -> tuple[ArrayLike, ArrayLike]: + ... + +class GaussianKDE: + dataset: ArrayLike + dim: int + num_dp: int + factor: float + data_covariance: ArrayLike + data_inv_cov: ArrayLike + covariance: ArrayLike + inv_cov: ArrayLike + norm_factor: float + def __init__(self, dataset: ArrayLike, bw_method: Literal["scott", "silverman"] | float | Callable[[GaussianKDE], float] | None = ...) -> None: + ... + + def scotts_factor(self) -> float: + ... + + def silverman_factor(self) -> float: + ... + + def covariance_factor(self) -> float: + ... + + def evaluate(self, points: ArrayLike) -> np.ndarray: + ... + + def __call__(self, points: ArrayLike) -> np.ndarray: + ... + + + diff --git a/typings/matplotlib/offsetbox.pyi b/typings/matplotlib/offsetbox.pyi new file mode 100644 index 0000000..42ac52e --- /dev/null +++ b/typings/matplotlib/offsetbox.pyi @@ -0,0 +1,354 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib.artist as martist +import matplotlib.text as mtext +from matplotlib.backend_bases import Event, FigureCanvasBase, RendererBase +from matplotlib.colors import Colormap, Normalize +from matplotlib.figure import Figure +from matplotlib.font_manager import FontProperties +from matplotlib.image import BboxImage +from matplotlib.patches import FancyArrowPatch, FancyBboxPatch +from matplotlib.transforms import Bbox, BboxBase, Transform +from numpy.typing import ArrayLike +from collections.abc import Callable +from typing import Any, Literal, overload + +DEBUG: bool +def bbox_artist(*args, **kwargs) -> None: + ... + +class OffsetBox(martist.Artist): + width: float | None + height: float | None + def __init__(self, *args, **kwargs) -> None: + ... + + def set_figure(self, fig: Figure) -> None: + ... + + def set_offset(self, xy: tuple[float, float] | Callable[[float, float, float, float, RendererBase], tuple[float, float]]) -> None: + ... + + @overload + def get_offset(self, bbox: Bbox, renderer: RendererBase) -> tuple[float, float]: + ... + + @overload + def get_offset(self, width: float, height: float, xdescent: float, ydescent: float, renderer: RendererBase) -> tuple[float, float]: + ... + + def set_width(self, width: float) -> None: + ... + + def set_height(self, height: float) -> None: + ... + + def get_visible_children(self) -> list[martist.Artist]: + ... + + def get_children(self) -> list[martist.Artist]: + ... + + def get_bbox(self, renderer: RendererBase) -> Bbox: + ... + + def get_extent_offsets(self, renderer: RendererBase) -> tuple[float, float, float, float, list[tuple[float, float]]]: + ... + + def get_extent(self, renderer: RendererBase) -> tuple[float, float, float, float]: + ... + + def get_window_extent(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + + +class PackerBase(OffsetBox): + height: float | None + width: float | None + sep: float | None + pad: float | None + mode: Literal["fixed", "expand", "equal"] + align: Literal["top", "bottom", "left", "right", "center", "baseline"] + def __init__(self, pad: float | None = ..., sep: float | None = ..., width: float | None = ..., height: float | None = ..., align: Literal["top", "bottom", "left", "right", "center", "baseline"] = ..., mode: Literal["fixed", "expand", "equal"] = ..., children: list[martist.Artist] | None = ...) -> None: + ... + + + +class VPacker(PackerBase): + ... + + +class HPacker(PackerBase): + ... + + +class PaddedBox(OffsetBox): + pad: float | None + patch: FancyBboxPatch + def __init__(self, child: martist.Artist, pad: float | None = ..., *, draw_frame: bool = ..., patch_attrs: dict[str, Any] | None = ...) -> None: + ... + + def update_frame(self, bbox: Bbox, fontsize: float | None = ...) -> None: + ... + + def draw_frame(self, renderer: RendererBase) -> None: + ... + + + +class DrawingArea(OffsetBox): + width: float + height: float + xdescent: float + ydescent: float + offset_transform: Transform + dpi_transform: Transform + def __init__(self, width: float, height: float, xdescent: float = ..., ydescent: float = ..., clip: bool = ...) -> None: + ... + + @property + def clip_children(self) -> bool: + ... + + @clip_children.setter + def clip_children(self, val: bool) -> None: + ... + + def get_transform(self) -> Transform: + ... + + def set_offset(self, xy: tuple[float, float]) -> None: + ... + + def get_offset(self) -> tuple[float, float]: + ... + + def add_artist(self, a: martist.Artist) -> None: + ... + + + +class TextArea(OffsetBox): + offset_transform: Transform + def __init__(self, s: str, *, textprops: dict[str, Any] | None = ..., multilinebaseline: bool = ...) -> None: + ... + + def set_text(self, s: str) -> None: + ... + + def get_text(self) -> str: + ... + + def set_multilinebaseline(self, t: bool) -> None: + ... + + def get_multilinebaseline(self) -> bool: + ... + + def set_offset(self, xy: tuple[float, float]) -> None: + ... + + def get_offset(self) -> tuple[float, float]: + ... + + + +class AuxTransformBox(OffsetBox): + aux_transform: Transform + offset_transform: Transform + ref_offset_transform: Transform + def __init__(self, aux_transform: Transform) -> None: + ... + + def add_artist(self, a: martist.Artist) -> None: + ... + + def get_transform(self) -> Transform: + ... + + def set_offset(self, xy: tuple[float, float]) -> None: + ... + + def get_offset(self) -> tuple[float, float]: + ... + + + +class AnchoredOffsetbox(OffsetBox): + zorder: float + codes: dict[str, int] + loc: int + borderpad: float + pad: float + prop: FontProperties + patch: FancyBboxPatch + def __init__(self, loc: str, *, pad: float = ..., borderpad: float = ..., child: OffsetBox | None = ..., prop: FontProperties | None = ..., frameon: bool = ..., bbox_to_anchor: BboxBase | tuple[float, float] | tuple[float, float, float, float] | None = ..., bbox_transform: Transform | None = ..., **kwargs) -> None: + ... + + def set_child(self, child: OffsetBox | None) -> None: + ... + + def get_child(self) -> OffsetBox | None: + ... + + def get_children(self) -> list[martist.Artist]: + ... + + def get_bbox_to_anchor(self) -> Bbox: + ... + + def set_bbox_to_anchor(self, bbox: BboxBase, transform: Transform | None = ...) -> None: + ... + + def update_frame(self, bbox: Bbox, fontsize: float | None = ...) -> None: + ... + + + +class AnchoredText(AnchoredOffsetbox): + txt: TextArea + def __init__(self, s: str, loc: str, *, pad: float = ..., borderpad: float = ..., prop: dict[str, Any] | None = ..., **kwargs) -> None: + ... + + + +class OffsetImage(OffsetBox): + image: BboxImage + def __init__(self, arr: ArrayLike, *, zoom: float = ..., cmap: Colormap | str | None = ..., norm: Normalize | str | None = ..., interpolation: str | None = ..., origin: Literal["upper", "lower"] | None = ..., filternorm: bool = ..., filterrad: float = ..., resample: bool = ..., dpi_cor: bool = ..., **kwargs) -> None: + ... + + stale: bool + def set_data(self, arr: ArrayLike | None) -> None: + ... + + def get_data(self) -> ArrayLike | None: + ... + + def set_zoom(self, zoom: float) -> None: + ... + + def get_zoom(self) -> float: + ... + + def get_children(self) -> list[martist.Artist]: + ... + + def get_offset(self) -> tuple[float, float]: + ... + + + +class AnnotationBbox(martist.Artist, mtext._AnnotationBase): + zorder: float + offsetbox: OffsetBox + arrowprops: dict[str, Any] | None + xybox: tuple[float, float] + boxcoords: str | tuple[str, str] | martist.Artist | Transform | Callable[[RendererBase], Bbox | Transform] + arrow_patch: FancyArrowPatch | None + patch: FancyBboxPatch + prop: FontProperties + def __init__(self, offsetbox: OffsetBox, xy: tuple[float, float], xybox: tuple[float, float] | None = ..., xycoords: str | tuple[str, str] | martist.Artist | Transform | Callable[[RendererBase], Bbox | Transform] = ..., boxcoords: str | tuple[str, str] | martist.Artist | Transform | Callable[[RendererBase], Bbox | Transform] | None = ..., *, frameon: bool = ..., pad: float = ..., annotation_clip: bool | None = ..., box_alignment: tuple[float, float] = ..., bboxprops: dict[str, Any] | None = ..., arrowprops: dict[str, Any] | None = ..., fontsize: float | str | None = ..., **kwargs) -> None: + ... + + @property + def xyann(self) -> tuple[float, float]: + ... + + @xyann.setter + def xyann(self, xyann: tuple[float, float]) -> None: + ... + + @property + def anncoords(self) -> str | tuple[str, str] | martist.Artist | Transform | Callable[[RendererBase], Bbox | Transform]: + ... + + @anncoords.setter + def anncoords(self, coords: str | tuple[str, str] | martist.Artist | Transform | Callable[[RendererBase], Bbox | Transform]) -> None: + ... + + def get_children(self) -> list[martist.Artist]: + ... + + def set_figure(self, fig: Figure) -> None: + ... + + def set_fontsize(self, s: str | float | None = ...) -> None: + ... + + def get_fontsize(self) -> float: + ... + + def get_tightbbox(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + def update_positions(self, renderer: RendererBase) -> None: + ... + + + +class DraggableBase: + ref_artist: martist.Artist + got_artist: bool + canvas: FigureCanvasBase + cids: list[int] + mouse_x: int + mouse_y: int + background: Any + def __init__(self, ref_artist: martist.Artist, use_blit: bool = ...) -> None: + ... + + def on_motion(self, evt: Event) -> None: + ... + + def on_pick(self, evt: Event) -> None: + ... + + def on_release(self, event: Event) -> None: + ... + + def disconnect(self) -> None: + ... + + def save_offset(self) -> None: + ... + + def update_offset(self, dx: float, dy: float) -> None: + ... + + def finalize_offset(self) -> None: + ... + + + +class DraggableOffsetBox(DraggableBase): + offsetbox: OffsetBox + def __init__(self, ref_artist: martist.Artist, offsetbox: OffsetBox, use_blit: bool = ...) -> None: + ... + + def save_offset(self) -> None: + ... + + def update_offset(self, dx: float, dy: float) -> None: + ... + + def get_loc_in_canvas(self) -> tuple[float, float]: + ... + + + +class DraggableAnnotation(DraggableBase): + annotation: mtext.Annotation + def __init__(self, annotation: mtext.Annotation, use_blit: bool = ...) -> None: + ... + + def save_offset(self) -> None: + ... + + def update_offset(self, dx: float, dy: float) -> None: + ... + + + diff --git a/typings/matplotlib/patches.pyi b/typings/matplotlib/patches.pyi new file mode 100644 index 0000000..3fefb3b --- /dev/null +++ b/typings/matplotlib/patches.pyi @@ -0,0 +1,829 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from . import artist +from .axes import Axes +from .backend_bases import MouseEvent, RendererBase +from .path import Path +from .transforms import Bbox, Transform +from typing import Any, Literal, overload +from numpy.typing import ArrayLike +from .typing import CapStyleType, ColorType, JoinStyleType, LineStyleType + +class Patch(artist.Artist): + zorder: float + def __init__(self, *, edgecolor: ColorType | None = ..., facecolor: ColorType | None = ..., color: ColorType | None = ..., linewidth: float | None = ..., linestyle: LineStyleType | None = ..., antialiased: bool | None = ..., hatch: str | None = ..., fill: bool = ..., capstyle: CapStyleType | None = ..., joinstyle: JoinStyleType | None = ..., **kwargs) -> None: + ... + + def get_verts(self) -> ArrayLike: + ... + + def contains(self, mouseevent: MouseEvent, radius: float | None = ...) -> tuple[bool, dict[Any, Any]]: + ... + + def contains_point(self, point: tuple[float, float], radius: float | None = ...) -> bool: + ... + + def contains_points(self, points: ArrayLike, radius: float | None = ...) -> np.ndarray: + ... + + def get_extents(self) -> Bbox: + ... + + def get_transform(self) -> Transform: + ... + + def get_data_transform(self) -> Transform: + ... + + def get_patch_transform(self) -> Transform: + ... + + def get_antialiased(self) -> bool: + ... + + def get_edgecolor(self) -> ColorType: + ... + + def get_facecolor(self) -> ColorType: + ... + + def get_linewidth(self) -> float: + ... + + def get_linestyle(self) -> LineStyleType: + ... + + def set_antialiased(self, aa: bool | None) -> None: + ... + + def set_edgecolor(self, color: ColorType | None) -> None: + ... + + def set_facecolor(self, color: ColorType | None) -> None: + ... + + def set_color(self, c: ColorType | None) -> None: + ... + + def set_alpha(self, alpha: float | None) -> None: + ... + + def set_linewidth(self, w: float | None) -> None: + ... + + def set_linestyle(self, ls: LineStyleType | None) -> None: + ... + + def set_fill(self, b: bool) -> None: + ... + + def get_fill(self) -> bool: + ... + + fill = ... + def set_capstyle(self, s: CapStyleType) -> None: + ... + + def get_capstyle(self) -> Literal["butt", "projecting", "round"]: + ... + + def set_joinstyle(self, s: JoinStyleType) -> None: + ... + + def get_joinstyle(self) -> Literal["miter", "round", "bevel"]: + ... + + def set_hatch(self, hatch: str) -> None: + ... + + def get_hatch(self) -> str: + ... + + def get_path(self) -> Path: + ... + + + +class Shadow(Patch): + patch: Patch + def __init__(self, patch: Patch, ox: float, oy: float, *, shade: float = ..., **kwargs) -> None: + ... + + + +class Rectangle(Patch): + angle: float + def __init__(self, xy: tuple[float, float], width: float, height: float, *, angle: float = ..., rotation_point: Literal["xy", "center"] | tuple[float, float] = ..., **kwargs) -> None: + ... + + @property + def rotation_point(self) -> Literal["xy", "center"] | tuple[float, float]: + ... + + @rotation_point.setter + def rotation_point(self, value: Literal["xy", "center"] | tuple[float, float]) -> None: + ... + + def get_x(self) -> float: + ... + + def get_y(self) -> float: + ... + + def get_xy(self) -> tuple[float, float]: + ... + + def get_corners(self) -> np.ndarray: + ... + + def get_center(self) -> np.ndarray: + ... + + def get_width(self) -> float: + ... + + def get_height(self) -> float: + ... + + def get_angle(self) -> float: + ... + + def set_x(self, x: float) -> None: + ... + + def set_y(self, y: float) -> None: + ... + + def set_angle(self, angle: float) -> None: + ... + + def set_xy(self, xy: tuple[float, float]) -> None: + ... + + def set_width(self, w: float) -> None: + ... + + def set_height(self, h: float) -> None: + ... + + @overload + def set_bounds(self, args: tuple[float, float, float, float], /) -> None: + ... + + @overload + def set_bounds(self, left: float, bottom: float, width: float, height: float, /) -> None: + ... + + def get_bbox(self) -> Bbox: + ... + + xy = ... + + +class RegularPolygon(Patch): + xy: tuple[float, float] + numvertices: int + orientation: float + radius: float + def __init__(self, xy: tuple[float, float], numVertices: int, *, radius: float = ..., orientation: float = ..., **kwargs) -> None: + ... + + + +class PathPatch(Patch): + def __init__(self, path: Path, **kwargs) -> None: + ... + + def set_path(self, path: Path) -> None: + ... + + + +class StepPatch(PathPatch): + orientation: Literal["vertical", "horizontal"] + def __init__(self, values: ArrayLike, edges: ArrayLike, *, orientation: Literal["vertical", "horizontal"] = ..., baseline: float = ..., **kwargs) -> None: + ... + + def get_data(self) -> tuple[np.ndarray, np.ndarray, float]: + ... + + def set_data(self, values: ArrayLike | None = ..., edges: ArrayLike | None = ..., baseline: float | None = ...) -> None: + ... + + + +class Polygon(Patch): + def __init__(self, xy: ArrayLike, *, closed: bool = ..., **kwargs) -> None: + ... + + def get_closed(self) -> bool: + ... + + def set_closed(self, closed: bool) -> None: + ... + + def get_xy(self) -> np.ndarray: + ... + + def set_xy(self, xy: ArrayLike) -> None: + ... + + xy = ... + + +class Wedge(Patch): + center: tuple[float, float] + r: float + theta1: float + theta2: float + width: float | None + def __init__(self, center: tuple[float, float], r: float, theta1: float, theta2: float, *, width: float | None = ..., **kwargs) -> None: + ... + + def set_center(self, center: tuple[float, float]) -> None: + ... + + def set_radius(self, radius: float) -> None: + ... + + def set_theta1(self, theta1: float) -> None: + ... + + def set_theta2(self, theta2: float) -> None: + ... + + def set_width(self, width: float | None) -> None: + ... + + + +class Arrow(Patch): + def __init__(self, x: float, y: float, dx: float, dy: float, *, width: float = ..., **kwargs) -> None: + ... + + + +class FancyArrow(Polygon): + def __init__(self, x: float, y: float, dx: float, dy: float, *, width: float = ..., length_includes_head: bool = ..., head_width: float | None = ..., head_length: float | None = ..., shape: Literal["full", "left", "right"] = ..., overhang: float = ..., head_starts_at_zero: bool = ..., **kwargs) -> None: + ... + + def set_data(self, *, x: float | None = ..., y: float | None = ..., dx: float | None = ..., dy: float | None = ..., width: float | None = ..., head_width: float | None = ..., head_length: float | None = ...) -> None: + ... + + + +class CirclePolygon(RegularPolygon): + def __init__(self, xy: tuple[float, float], radius: float = ..., *, resolution: int = ..., **kwargs) -> None: + ... + + + +class Ellipse(Patch): + def __init__(self, xy: tuple[float, float], width: float, height: float, *, angle: float = ..., **kwargs) -> None: + ... + + def set_center(self, xy: tuple[float, float]) -> None: + ... + + def get_center(self) -> float: + ... + + center = ... + def set_width(self, width: float) -> None: + ... + + def get_width(self) -> float: + ... + + width = ... + def set_height(self, height: float) -> None: + ... + + def get_height(self) -> float: + ... + + height = ... + def set_angle(self, angle: float) -> None: + ... + + def get_angle(self) -> float: + ... + + angle = ... + def get_corners(self) -> np.ndarray: + ... + + def get_vertices(self) -> list[tuple[float, float]]: + ... + + def get_co_vertices(self) -> list[tuple[float, float]]: + ... + + + +class Annulus(Patch): + a: float + b: float + def __init__(self, xy: tuple[float, float], r: float | tuple[float, float], width: float, angle: float = ..., **kwargs) -> None: + ... + + def set_center(self, xy: tuple[float, float]) -> None: + ... + + def get_center(self) -> tuple[float, float]: + ... + + center = ... + def set_width(self, width: float) -> None: + ... + + def get_width(self) -> float: + ... + + width = ... + def set_angle(self, angle: float) -> None: + ... + + def get_angle(self) -> float: + ... + + angle = ... + def set_semimajor(self, a: float) -> None: + ... + + def set_semiminor(self, b: float) -> None: + ... + + def set_radii(self, r: float | tuple[float, float]) -> None: + ... + + def get_radii(self) -> tuple[float, float]: + ... + + radii = ... + + +class Circle(Ellipse): + def __init__(self, xy: tuple[float, float], radius: float = ..., **kwargs) -> None: + ... + + def set_radius(self, radius: float) -> None: + ... + + def get_radius(self) -> float: + ... + + radius = ... + + +class Arc(Ellipse): + theta1: float + theta2: float + def __init__(self, xy: tuple[float, float], width: float, height: float, *, angle: float = ..., theta1: float = ..., theta2: float = ..., **kwargs) -> None: + ... + + + +def bbox_artist(artist: artist.Artist, renderer: RendererBase, props: dict[str, Any] | None = ..., fill: bool = ...) -> None: + ... + +def draw_bbox(bbox: Bbox, renderer: RendererBase, color: ColorType = ..., trans: Transform | None = ...) -> None: + ... + +class _Style: + def __new__(cls, stylename, **kwargs): + ... + + @classmethod + def get_styles(cls) -> dict[str, type]: + ... + + @classmethod + def pprint_styles(cls) -> str: + ... + + @classmethod + def register(cls, name: str, style: type) -> None: + ... + + + +class BoxStyle(_Style): + class Square(BoxStyle): + pad: float + def __init__(self, pad: float = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class Circle(BoxStyle): + pad: float + def __init__(self, pad: float = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class Ellipse(BoxStyle): + pad: float + def __init__(self, pad: float = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class LArrow(BoxStyle): + pad: float + def __init__(self, pad: float = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class RArrow(LArrow): + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class DArrow(BoxStyle): + pad: float + def __init__(self, pad: float = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class Round(BoxStyle): + pad: float + rounding_size: float | None + def __init__(self, pad: float = ..., rounding_size: float | None = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class Round4(BoxStyle): + pad: float + rounding_size: float | None + def __init__(self, pad: float = ..., rounding_size: float | None = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class Sawtooth(BoxStyle): + pad: float + tooth_size: float | None + def __init__(self, pad: float = ..., tooth_size: float | None = ...) -> None: + ... + + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + class Roundtooth(Sawtooth): + def __call__(self, x0: float, y0: float, width: float, height: float, mutation_size: float) -> Path: + ... + + + + + +class ConnectionStyle(_Style): + class _Base(ConnectionStyle): + class SimpleEvent: + def __init__(self, xy: tuple[float, float]) -> None: + ... + + + + def __call__(self, posA: tuple[float, float], posB: tuple[float, float], shrinkA: float = ..., shrinkB: float = ..., patchA: Patch | None = ..., patchB: Patch | None = ...) -> Path: + ... + + + + class Arc3(_Base): + rad: float + def __init__(self, rad: float = ...) -> None: + ... + + def connect(self, posA: tuple[float, float], posB: tuple[float, float]) -> Path: + ... + + + + class Angle3(_Base): + angleA: float + angleB: float + def __init__(self, angleA: float = ..., angleB: float = ...) -> None: + ... + + def connect(self, posA: tuple[float, float], posB: tuple[float, float]) -> Path: + ... + + + + class Angle(_Base): + angleA: float + angleB: float + rad: float + def __init__(self, angleA: float = ..., angleB: float = ..., rad: float = ...) -> None: + ... + + def connect(self, posA: tuple[float, float], posB: tuple[float, float]) -> Path: + ... + + + + class Arc(_Base): + angleA: float + angleB: float + armA: float | None + armB: float | None + rad: float + def __init__(self, angleA: float = ..., angleB: float = ..., armA: float | None = ..., armB: float | None = ..., rad: float = ...) -> None: + ... + + def connect(self, posA: tuple[float, float], posB: tuple[float, float]) -> Path: + ... + + + + class Bar(_Base): + armA: float + armB: float + fraction: float + angle: float | None + def __init__(self, armA: float = ..., armB: float = ..., fraction: float = ..., angle: float | None = ...) -> None: + ... + + def connect(self, posA: tuple[float, float], posB: tuple[float, float]) -> Path: + ... + + + + + +class ArrowStyle(_Style): + class _Base(ArrowStyle): + @staticmethod + def ensure_quadratic_bezier(path: Path) -> list[float]: + ... + + def transmute(self, path: Path, mutation_size: float, linewidth: float) -> tuple[Path, bool]: + ... + + def __call__(self, path: Path, mutation_size: float, linewidth: float, aspect_ratio: float = ...) -> tuple[Path, bool]: + ... + + + + class _Curve(_Base): + arrow: str + fillbegin: bool + fillend: bool + def __init__(self, head_length: float = ..., head_width: float = ..., widthA: float = ..., widthB: float = ..., lengthA: float = ..., lengthB: float = ..., angleA: float | None = ..., angleB: float | None = ..., scaleA: float | None = ..., scaleB: float | None = ...) -> None: + ... + + + + class Curve(_Curve): + def __init__(self) -> None: + ... + + + + class CurveA(_Curve): + arrow: str + ... + + + class CurveB(_Curve): + arrow: str + ... + + + class CurveAB(_Curve): + arrow: str + ... + + + class CurveFilledA(_Curve): + arrow: str + ... + + + class CurveFilledB(_Curve): + arrow: str + ... + + + class CurveFilledAB(_Curve): + arrow: str + ... + + + class BracketA(_Curve): + arrow: str + def __init__(self, widthA: float = ..., lengthA: float = ..., angleA: float = ...) -> None: + ... + + + + class BracketB(_Curve): + arrow: str + def __init__(self, widthB: float = ..., lengthB: float = ..., angleB: float = ...) -> None: + ... + + + + class BracketAB(_Curve): + arrow: str + def __init__(self, widthA: float = ..., lengthA: float = ..., angleA: float = ..., widthB: float = ..., lengthB: float = ..., angleB: float = ...) -> None: + ... + + + + class BarAB(_Curve): + arrow: str + def __init__(self, widthA: float = ..., angleA: float = ..., widthB: float = ..., angleB: float = ...) -> None: + ... + + + + class BracketCurve(_Curve): + arrow: str + def __init__(self, widthA: float = ..., lengthA: float = ..., angleA: float | None = ...) -> None: + ... + + + + class CurveBracket(_Curve): + arrow: str + def __init__(self, widthB: float = ..., lengthB: float = ..., angleB: float | None = ...) -> None: + ... + + + + class Simple(_Base): + def __init__(self, head_length: float = ..., head_width: float = ..., tail_width: float = ...) -> None: + ... + + + + class Fancy(_Base): + def __init__(self, head_length: float = ..., head_width: float = ..., tail_width: float = ...) -> None: + ... + + + + class Wedge(_Base): + tail_width: float + shrink_factor: float + def __init__(self, tail_width: float = ..., shrink_factor: float = ...) -> None: + ... + + + + + +class FancyBboxPatch(Patch): + def __init__(self, xy: tuple[float, float], width: float, height: float, boxstyle: str | BoxStyle = ..., *, mutation_scale: float = ..., mutation_aspect: float = ..., **kwargs) -> None: + ... + + def set_boxstyle(self, boxstyle: str | BoxStyle | None = ..., **kwargs) -> None: + ... + + def get_boxstyle(self) -> BoxStyle: + ... + + def set_mutation_scale(self, scale: float) -> None: + ... + + def get_mutation_scale(self) -> float: + ... + + def set_mutation_aspect(self, aspect: float) -> None: + ... + + def get_mutation_aspect(self) -> float: + ... + + def get_x(self) -> float: + ... + + def get_y(self) -> float: + ... + + def get_width(self) -> float: + ... + + def get_height(self) -> float: + ... + + def set_x(self, x: float) -> None: + ... + + def set_y(self, y: float) -> None: + ... + + def set_width(self, w: float) -> None: + ... + + def set_height(self, h: float) -> None: + ... + + @overload + def set_bounds(self, args: tuple[float, float, float, float], /) -> None: + ... + + @overload + def set_bounds(self, left: float, bottom: float, width: float, height: float, /) -> None: + ... + + def get_bbox(self) -> Bbox: + ... + + + +class FancyArrowPatch(Patch): + patchA: Patch + patchB: Patch + shrinkA: float + shrinkB: float + def __init__(self, posA: tuple[float, float] | None = ..., posB: tuple[float, float] | None = ..., *, path: Path | None = ..., arrowstyle: str | ArrowStyle = ..., connectionstyle: str | ConnectionStyle = ..., patchA: Patch | None = ..., patchB: Patch | None = ..., shrinkA: float = ..., shrinkB: float = ..., mutation_scale: float = ..., mutation_aspect: float | None = ..., **kwargs) -> None: + ... + + def set_positions(self, posA: tuple[float, float], posB: tuple[float, float]) -> None: + ... + + def set_patchA(self, patchA: Patch) -> None: + ... + + def set_patchB(self, patchB: Patch) -> None: + ... + + def set_connectionstyle(self, connectionstyle: str | ConnectionStyle | None = ..., **kwargs) -> None: + ... + + def get_connectionstyle(self) -> ConnectionStyle: + ... + + def set_arrowstyle(self, arrowstyle: str | ArrowStyle | None = ..., **kwargs) -> None: + ... + + def get_arrowstyle(self) -> ArrowStyle: + ... + + def set_mutation_scale(self, scale: float) -> None: + ... + + def get_mutation_scale(self) -> float: + ... + + def set_mutation_aspect(self, aspect: float | None) -> None: + ... + + def get_mutation_aspect(self) -> float: + ... + + + +class ConnectionPatch(FancyArrowPatch): + xy1: tuple[float, float] + xy2: tuple[float, float] + coords1: str | Transform + coords2: str | Transform | None + axesA: Axes | None + axesB: Axes | None + def __init__(self, xyA: tuple[float, float], xyB: tuple[float, float], coordsA: str | Transform, coordsB: str | Transform | None = ..., *, axesA: Axes | None = ..., axesB: Axes | None = ..., arrowstyle: str | ArrowStyle = ..., connectionstyle: str | ConnectionStyle = ..., patchA: Patch | None = ..., patchB: Patch | None = ..., shrinkA: float = ..., shrinkB: float = ..., mutation_scale: float = ..., mutation_aspect: float | None = ..., clip_on: bool = ..., **kwargs) -> None: + ... + + def set_annotation_clip(self, b: bool | None) -> None: + ... + + def get_annotation_clip(self) -> bool | None: + ... + + + diff --git a/typings/matplotlib/path.pyi b/typings/matplotlib/path.pyi new file mode 100644 index 0000000..a1440c8 --- /dev/null +++ b/typings/matplotlib/path.pyi @@ -0,0 +1,167 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from .bezier import BezierSegment +from .transforms import Affine2D, Bbox, Transform +from collections.abc import Generator, Iterable, Sequence +from numpy.typing import ArrayLike +from typing import Any, overload + +class Path: + code_type: type[np.uint8] + STOP: np.uint8 + MOVETO: np.uint8 + LINETO: np.uint8 + CURVE3: np.uint8 + CURVE4: np.uint8 + CLOSEPOLY: np.uint8 + NUM_VERTICES_FOR_CODE: dict[np.uint8, int] + def __init__(self, vertices: ArrayLike, codes: ArrayLike | None = ..., _interpolation_steps: int = ..., closed: bool = ..., readonly: bool = ...) -> None: + ... + + @property + def vertices(self) -> ArrayLike: + ... + + @vertices.setter + def vertices(self, vertices: ArrayLike) -> None: + ... + + @property + def codes(self) -> ArrayLike: + ... + + @codes.setter + def codes(self, codes: ArrayLike) -> None: + ... + + @property + def simplify_threshold(self) -> float: + ... + + @simplify_threshold.setter + def simplify_threshold(self, threshold: float) -> None: + ... + + @property + def should_simplify(self) -> bool: + ... + + @should_simplify.setter + def should_simplify(self, should_simplify: bool) -> None: + ... + + @property + def readonly(self) -> bool: + ... + + def copy(self) -> Path: + ... + + def __deepcopy__(self, memo: dict[int, Any] | None = ...) -> Path: + ... + + deepcopy = ... + @classmethod + def make_compound_path_from_polys(cls, XY: ArrayLike) -> Path: + ... + + @classmethod + def make_compound_path(cls, *args: Path) -> Path: + ... + + def __len__(self) -> int: + ... + + def iter_segments(self, transform: Transform | None = ..., remove_nans: bool = ..., clip: tuple[float, float, float, float] | None = ..., snap: bool | None = ..., stroke_width: float = ..., simplify: bool | None = ..., curves: bool = ..., sketch: tuple[float, float, float] | None = ...) -> Generator[tuple[np.ndarray, np.uint8], None, None]: + ... + + def iter_bezier(self, **kwargs) -> Generator[BezierSegment, None, None]: + ... + + def cleaned(self, transform: Transform | None = ..., remove_nans: bool = ..., clip: tuple[float, float, float, float] | None = ..., *, simplify: bool | None = ..., curves: bool = ..., stroke_width: float = ..., snap: bool | None = ..., sketch: tuple[float, float, float] | None = ...) -> Path: + ... + + def transformed(self, transform: Transform) -> Path: + ... + + def contains_point(self, point: tuple[float, float], transform: Transform | None = ..., radius: float = ...) -> bool: + ... + + def contains_points(self, points: ArrayLike, transform: Transform | None = ..., radius: float = ...) -> np.ndarray: + ... + + def contains_path(self, path: Path, transform: Transform | None = ...) -> bool: + ... + + def get_extents(self, transform: Transform | None = ..., **kwargs) -> Bbox: + ... + + def intersects_path(self, other: Path, filled: bool = ...) -> bool: + ... + + def intersects_bbox(self, bbox: Bbox, filled: bool = ...) -> bool: + ... + + def interpolated(self, steps: int) -> Path: + ... + + def to_polygons(self, transform: Transform | None = ..., width: float = ..., height: float = ..., closed_only: bool = ...) -> list[ArrayLike]: + ... + + @classmethod + def unit_rectangle(cls) -> Path: + ... + + @classmethod + def unit_regular_polygon(cls, numVertices: int) -> Path: + ... + + @classmethod + def unit_regular_star(cls, numVertices: int, innerCircle: float = ...) -> Path: + ... + + @classmethod + def unit_regular_asterisk(cls, numVertices: int) -> Path: + ... + + @classmethod + def unit_circle(cls) -> Path: + ... + + @classmethod + def circle(cls, center: tuple[float, float] = ..., radius: float = ..., readonly: bool = ...) -> Path: + ... + + @classmethod + def unit_circle_righthalf(cls) -> Path: + ... + + @classmethod + def arc(cls, theta1: float, theta2: float, n: int | None = ..., is_wedge: bool = ...) -> Path: + ... + + @classmethod + def wedge(cls, theta1: float, theta2: float, n: int | None = ...) -> Path: + ... + + @overload + @staticmethod + def hatch(hatchpattern: str, density: float = ...) -> Path: + ... + + @overload + @staticmethod + def hatch(hatchpattern: None, density: float = ...) -> None: + ... + + def clip_to_bbox(self, bbox: Bbox, inside: bool = ...) -> Path: + ... + + + +def get_path_collection_extents(master_transform: Transform, paths: Sequence[Path], transforms: Iterable[Affine2D], offsets: ArrayLike, offset_transform: Affine2D) -> Bbox: + ... + diff --git a/typings/matplotlib/patheffects.pyi b/typings/matplotlib/patheffects.pyi new file mode 100644 index 0000000..f167703 --- /dev/null +++ b/typings/matplotlib/patheffects.pyi @@ -0,0 +1,104 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Iterable, Sequence +from typing import Any +from matplotlib.backend_bases import GraphicsContextBase, RendererBase +from matplotlib.path import Path +from matplotlib.patches import Patch +from matplotlib.transforms import Transform +from matplotlib.typing import ColorType + +class AbstractPathEffect: + def __init__(self, offset: tuple[float, float] = ...) -> None: + ... + + def draw_path(self, renderer: RendererBase, gc: GraphicsContextBase, tpath: Path, affine: Transform, rgbFace: ColorType | None = ...) -> None: + ... + + + +class PathEffectRenderer(RendererBase): + def __init__(self, path_effects: Iterable[AbstractPathEffect], renderer: RendererBase) -> None: + ... + + def copy_with_path_effect(self, path_effects: Iterable[AbstractPathEffect]) -> PathEffectRenderer: + ... + + def draw_path(self, gc: GraphicsContextBase, tpath: Path, affine: Transform, rgbFace: ColorType | None = ...) -> None: + ... + + def draw_markers(self, gc: GraphicsContextBase, marker_path: Path, marker_trans: Transform, path: Path, *args, **kwargs) -> None: + ... + + def draw_path_collection(self, gc: GraphicsContextBase, master_transform: Transform, paths: Sequence[Path], *args, **kwargs) -> None: + ... + + def __getattribute__(self, name: str) -> Any: + ... + + + +class Normal(AbstractPathEffect): + ... + + +class Stroke(AbstractPathEffect): + def __init__(self, offset: tuple[float, float] = ..., **kwargs) -> None: + ... + + def draw_path(self, renderer: RendererBase, gc: GraphicsContextBase, tpath: Path, affine: Transform, rgbFace: ColorType) -> None: + ... + + + +class withStroke(Stroke): + ... + + +class SimplePatchShadow(AbstractPathEffect): + def __init__(self, offset: tuple[float, float] = ..., shadow_rgbFace: ColorType | None = ..., alpha: float | None = ..., rho: float = ..., **kwargs) -> None: + ... + + def draw_path(self, renderer: RendererBase, gc: GraphicsContextBase, tpath: Path, affine: Transform, rgbFace: ColorType) -> None: + ... + + + +class withSimplePatchShadow(SimplePatchShadow): + ... + + +class SimpleLineShadow(AbstractPathEffect): + def __init__(self, offset: tuple[float, float] = ..., shadow_color: ColorType = ..., alpha: float = ..., rho: float = ..., **kwargs) -> None: + ... + + def draw_path(self, renderer: RendererBase, gc: GraphicsContextBase, tpath: Path, affine: Transform, rgbFace: ColorType) -> None: + ... + + + +class PathPatchEffect(AbstractPathEffect): + patch: Patch + def __init__(self, offset: tuple[float, float] = ..., **kwargs) -> None: + ... + + def draw_path(self, renderer: RendererBase, gc: GraphicsContextBase, tpath: Path, affine: Transform, rgbFace: ColorType) -> None: + ... + + + +class TickedStroke(AbstractPathEffect): + def __init__(self, offset: tuple[float, float] = ..., spacing: float = ..., angle: float = ..., length: float = ..., **kwargs) -> None: + ... + + def draw_path(self, renderer: RendererBase, gc: GraphicsContextBase, tpath: Path, affine: Transform, rgbFace: ColorType) -> None: + ... + + + +class withTickedStroke(TickedStroke): + ... + + diff --git a/typings/matplotlib/projections/__init__.pyi b/typings/matplotlib/projections/__init__.pyi new file mode 100644 index 0000000..f8763e8 --- /dev/null +++ b/typings/matplotlib/projections/__init__.pyi @@ -0,0 +1,33 @@ +""" +This type stub file was generated by pyright. +""" + +from .geo import AitoffAxes, HammerAxes, LambertAxes, MollweideAxes +from .polar import PolarAxes +from ..axes import Axes + +class ProjectionRegistry: + def __init__(self) -> None: + ... + + def register(self, *projections: type[Axes]) -> None: + ... + + def get_projection_class(self, name: str) -> type[Axes]: + ... + + def get_projection_names(self) -> list[str]: + ... + + + +projection_registry: ProjectionRegistry +def register_projection(cls: type[Axes]) -> None: + ... + +def get_projection_class(projection: str | None = ...) -> type[Axes]: + ... + +def get_projection_names() -> list[str]: + ... + diff --git a/typings/matplotlib/projections/geo.pyi b/typings/matplotlib/projections/geo.pyi new file mode 100644 index 0000000..4f99d8c --- /dev/null +++ b/typings/matplotlib/projections/geo.pyi @@ -0,0 +1,157 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.axes import Axes +from matplotlib.ticker import Formatter +from matplotlib.transforms import Transform +from typing import Any, Literal + +class GeoAxes(Axes): + class ThetaFormatter(Formatter): + def __init__(self, round_to: float = ...) -> None: + ... + + def __call__(self, x: float, pos: Any | None = ...): + ... + + + + RESOLUTION: float + def get_xaxis_transform(self, which: Literal["tick1", "tick2", "grid"] = ...) -> Transform: + ... + + def get_xaxis_text1_transform(self, pad: float) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_xaxis_text2_transform(self, pad: float) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_yaxis_transform(self, which: Literal["tick1", "tick2", "grid"] = ...) -> Transform: + ... + + def get_yaxis_text1_transform(self, pad: float) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_yaxis_text2_transform(self, pad: float) -> tuple[Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def set_xlim(self, *args, **kwargs) -> tuple[float, float]: + ... + + def set_ylim(self, *args, **kwargs) -> tuple[float, float]: + ... + + def format_coord(self, lon: float, lat: float) -> str: + ... + + def set_longitude_grid(self, degrees: float) -> None: + ... + + def set_latitude_grid(self, degrees: float) -> None: + ... + + def set_longitude_grid_ends(self, degrees: float) -> None: + ... + + def get_data_ratio(self) -> float: + ... + + def can_zoom(self) -> bool: + ... + + def can_pan(self) -> bool: + ... + + def start_pan(self, x, y, button) -> None: + ... + + def end_pan(self) -> None: + ... + + def drag_pan(self, button, key, x, y) -> None: + ... + + + +class _GeoTransform(Transform): + input_dims: int + output_dims: int + def __init__(self, resolution: int) -> None: + ... + + + +class AitoffAxes(GeoAxes): + name: str + class AitoffTransform(_GeoTransform): + def inverted(self) -> AitoffAxes.InvertedAitoffTransform: + ... + + + + class InvertedAitoffTransform(_GeoTransform): + def inverted(self) -> AitoffAxes.AitoffTransform: + ... + + + + + +class HammerAxes(GeoAxes): + name: str + class HammerTransform(_GeoTransform): + def inverted(self) -> HammerAxes.InvertedHammerTransform: + ... + + + + class InvertedHammerTransform(_GeoTransform): + def inverted(self) -> HammerAxes.HammerTransform: + ... + + + + + +class MollweideAxes(GeoAxes): + name: str + class MollweideTransform(_GeoTransform): + def inverted(self) -> MollweideAxes.InvertedMollweideTransform: + ... + + + + class InvertedMollweideTransform(_GeoTransform): + def inverted(self) -> MollweideAxes.MollweideTransform: + ... + + + + + +class LambertAxes(GeoAxes): + name: str + class LambertTransform(_GeoTransform): + def __init__(self, center_longitude: float, center_latitude: float, resolution: int) -> None: + ... + + def inverted(self) -> LambertAxes.InvertedLambertTransform: + ... + + + + class InvertedLambertTransform(_GeoTransform): + def __init__(self, center_longitude: float, center_latitude: float, resolution: int) -> None: + ... + + def inverted(self) -> LambertAxes.LambertTransform: + ... + + + + def __init__(self, *args, center_longitude: float = ..., center_latitude: float = ..., **kwargs) -> None: + ... + + + diff --git a/typings/matplotlib/projections/polar.pyi b/typings/matplotlib/projections/polar.pyi new file mode 100644 index 0000000..a5fe868 --- /dev/null +++ b/typings/matplotlib/projections/polar.pyi @@ -0,0 +1,242 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib.axis as maxis +import matplotlib.ticker as mticker +import matplotlib.transforms as mtransforms +import numpy as np +from matplotlib.axes import Axes +from matplotlib.lines import Line2D +from matplotlib.text import Text +from numpy.typing import ArrayLike +from collections.abc import Sequence +from typing import Any, ClassVar, Literal, overload + +class PolarTransform(mtransforms.Transform): + input_dims: int + output_dims: int + def __init__(self, axis: PolarAxes | None = ..., use_rmin: bool = ..., _apply_theta_transforms: bool = ..., *, scale_transform: mtransforms.Transform | None = ...) -> None: + ... + + def inverted(self) -> InvertedPolarTransform: + ... + + + +class PolarAffine(mtransforms.Affine2DBase): + def __init__(self, scale_transform: mtransforms.Transform, limits: mtransforms.BboxBase) -> None: + ... + + + +class InvertedPolarTransform(mtransforms.Transform): + input_dims: int + output_dims: int + def __init__(self, axis: PolarAxes | None = ..., use_rmin: bool = ..., _apply_theta_transforms: bool = ...) -> None: + ... + + def inverted(self) -> PolarTransform: + ... + + + +class ThetaFormatter(mticker.Formatter): + ... + + +class _AxisWrapper: + def __init__(self, axis: maxis.Axis) -> None: + ... + + def get_view_interval(self) -> np.ndarray: + ... + + def set_view_interval(self, vmin: float, vmax: float) -> None: + ... + + def get_minpos(self) -> float: + ... + + def get_data_interval(self) -> np.ndarray: + ... + + def set_data_interval(self, vmin: float, vmax: float) -> None: + ... + + def get_tick_space(self) -> int: + ... + + + +class ThetaLocator(mticker.Locator): + base: mticker.Locator + axis: _AxisWrapper | None + def __init__(self, base: mticker.Locator) -> None: + ... + + + +class ThetaTick(maxis.XTick): + def __init__(self, axes: PolarAxes, *args, **kwargs) -> None: + ... + + + +class ThetaAxis(maxis.XAxis): + axis_name: str + ... + + +class RadialLocator(mticker.Locator): + base: mticker.Locator + def __init__(self, base, axes: PolarAxes | None = ...) -> None: + ... + + + +class RadialTick(maxis.YTick): + ... + + +class RadialAxis(maxis.YAxis): + axis_name: str + ... + + +class _WedgeBbox(mtransforms.Bbox): + def __init__(self, center: tuple[float, float], viewLim: mtransforms.Bbox, originLim: mtransforms.Bbox, **kwargs) -> None: + ... + + + +class PolarAxes(Axes): + PolarTransform: ClassVar[type] = ... + PolarAffine: ClassVar[type] = ... + InvertedPolarTransform: ClassVar[type] = ... + ThetaFormatter: ClassVar[type] = ... + RadialLocator: ClassVar[type] = ... + ThetaLocator: ClassVar[type] = ... + name: str + use_sticky_edges: bool + def __init__(self, *args, theta_offset: float = ..., theta_direction: float = ..., rlabel_position: float = ..., **kwargs) -> None: + ... + + def get_xaxis_transform(self, which: Literal["tick1", "tick2", "grid"] = ...) -> mtransforms.Transform: + ... + + def get_xaxis_text1_transform(self, pad: float) -> tuple[mtransforms.Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_xaxis_text2_transform(self, pad: float) -> tuple[mtransforms.Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_yaxis_transform(self, which: Literal["tick1", "tick2", "grid"] = ...) -> mtransforms.Transform: + ... + + def get_yaxis_text1_transform(self, pad: float) -> tuple[mtransforms.Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def get_yaxis_text2_transform(self, pad: float) -> tuple[mtransforms.Transform, Literal["center", "top", "bottom", "baseline", "center_baseline"], Literal["center", "left", "right"],]: + ... + + def set_thetamax(self, thetamax: float) -> None: + ... + + def get_thetamax(self) -> float: + ... + + def set_thetamin(self, thetamin: float) -> None: + ... + + def get_thetamin(self) -> float: + ... + + @overload + def set_thetalim(self, minval: float, maxval: float, /) -> tuple[float, float]: + ... + + @overload + def set_thetalim(self, *, thetamin: float, thetamax: float) -> tuple[float, float]: + ... + + def set_theta_offset(self, offset: float) -> None: + ... + + def get_theta_offset(self) -> float: + ... + + def set_theta_zero_location(self, loc: Literal["N", "NW", "W", "SW", "S", "SE", "E", "NE"], offset: float = ...) -> None: + ... + + def set_theta_direction(self, direction: Literal[-1, 1, "clockwise", "counterclockwise", "anticlockwise"]) -> None: + ... + + def get_theta_direction(self) -> Literal[-1, 1]: + ... + + def set_rmax(self, rmax: float) -> None: + ... + + def get_rmax(self) -> float: + ... + + def set_rmin(self, rmin: float) -> None: + ... + + def get_rmin(self) -> float: + ... + + def set_rorigin(self, rorigin: float | None) -> None: + ... + + def get_rorigin(self) -> float: + ... + + def get_rsign(self) -> float: + ... + + def set_rlim(self, bottom: float | tuple[float, float] | None = ..., top: float | None = ..., *, emit: bool = ..., auto: bool = ..., **kwargs) -> tuple[float, float]: + ... + + def get_rlabel_position(self) -> float: + ... + + def set_rlabel_position(self, value: float) -> None: + ... + + def set_rscale(self, *args, **kwargs) -> None: + ... + + def set_rticks(self, *args, **kwargs) -> None: + ... + + def set_thetagrids(self, angles: ArrayLike, labels: Sequence[str | Text] | None = ..., fmt: str | None = ..., **kwargs) -> tuple[list[Line2D], list[Text]]: + ... + + def set_rgrids(self, radii: ArrayLike, labels: Sequence[str | Text] | None = ..., angle: float | None = ..., fmt: str | None = ..., **kwargs) -> tuple[list[Line2D], list[Text]]: + ... + + def format_coord(self, theta: float, r: float) -> str: + ... + + def get_data_ratio(self) -> float: + ... + + def can_zoom(self) -> bool: + ... + + def can_pan(self) -> bool: + ... + + def start_pan(self, x: float, y: float, button: int) -> None: + ... + + def end_pan(self) -> None: + ... + + def drag_pan(self, button: Any, key: Any, x: float, y: float) -> None: + ... + + + diff --git a/typings/matplotlib/pylab.pyi b/typings/matplotlib/pylab.pyi new file mode 100644 index 0000000..4e868fb --- /dev/null +++ b/typings/matplotlib/pylab.pyi @@ -0,0 +1,37 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.pyplot import * +from numpy import * +from numpy.fft import * +from numpy.random import * +from numpy.linalg import * + +""" +`pylab` is a historic interface and its use is strongly discouraged. The equivalent +replacement is `matplotlib.pyplot`. See :ref:`api_interfaces` for a full overview +of Matplotlib interfaces. + +`pylab` was designed to support a MATLAB-like way of working with all plotting related +functions directly available in the global namespace. This was achieved through a +wildcard import (``from pylab import *``). + +.. warning:: + The use of `pylab` is discouraged for the following reasons: + + ``from pylab import *`` imports all the functions from `matplotlib.pyplot`, `numpy`, + `numpy.fft`, `numpy.linalg`, and `numpy.random`, and some additional functions into + the global namespace. + + Such a pattern is considered bad practice in modern python, as it clutters the global + namespace. Even more severely, in the case of `pylab`, this will overwrite some + builtin functions (e.g. the builtin `sum` will be replaced by `numpy.sum`), which + can lead to unexpected behavior. + +""" +bytes = ... +abs = ... +max = ... +min = ... +round = ... diff --git a/typings/matplotlib/pyplot.pyi b/typings/matplotlib/pyplot.pyi new file mode 100644 index 0000000..d0b73be --- /dev/null +++ b/typings/matplotlib/pyplot.pyi @@ -0,0 +1,2052 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib +import matplotlib.image +import numpy as np +import datetime +import pathlib +import os +import PIL.Image +from contextlib import AbstractContextManager, ExitStack +from typing import Any, BinaryIO, Literal, TYPE_CHECKING, TypeVar, overload +from matplotlib import _api, _docstring, cbook, rcParams as rcParams, rcsetup +from matplotlib.backend_bases import Event, FigureCanvasBase, FigureManagerBase, MouseButton, RendererBase +from matplotlib.figure import Figure, SubFigure +from matplotlib.artist import Artist +from matplotlib.axes import Axes +from matplotlib.scale import ScaleBase +from matplotlib.cm import ScalarMappable +from matplotlib.colors import Colormap, Normalize +from collections.abc import Callable, Hashable, Iterable, Sequence +from typing_extensions import ParamSpec +from numpy.typing import ArrayLike +from matplotlib.axis import Tick +from matplotlib.axes._base import _AxesBase +from matplotlib.contour import ContourSet, QuadContourSet +from matplotlib.collections import BrokenBarHCollection, Collection, EventCollection, LineCollection, PathCollection, PolyCollection, QuadMesh +from matplotlib.colorbar import Colorbar +from matplotlib.container import BarContainer, ErrorbarContainer, StemContainer +from matplotlib.legend import Legend +from matplotlib.mlab import GaussianKDE +from matplotlib.image import AxesImage, FigureImage +from matplotlib.patches import FancyArrow, Polygon, StepPatch, Wedge +from matplotlib.quiver import Barbs, Quiver, QuiverKey +from matplotlib.transforms import Bbox, Transform +from matplotlib.typing import ColorType, HashableList, LineStyleType, MarkerType +from matplotlib.widgets import SubplotTool +from matplotlib.lines import Line2D +from matplotlib.text import Annotation, Text + +""" +`matplotlib.pyplot` is a state-based interface to matplotlib. It provides +an implicit, MATLAB-like, way of plotting. It also opens figures on your +screen, and acts as the figure GUI manager. + +pyplot is mainly intended for interactive plots and simple cases of +programmatic plot generation:: + + import numpy as np + import matplotlib.pyplot as plt + + x = np.arange(0, 5, 0.1) + y = np.sin(x) + plt.plot(x, y) + +The explicit object-oriented API is recommended for complex plots, though +pyplot is still usually used to create the figure and often the axes in the +figure. See `.pyplot.figure`, `.pyplot.subplots`, and +`.pyplot.subplot_mosaic` to create figures, and +:doc:`Axes API ` for the plotting methods on an Axes:: + + import numpy as np + import matplotlib.pyplot as plt + + x = np.arange(0, 5, 0.1) + y = np.sin(x) + fig, ax = plt.subplots() + ax.plot(x, y) + + +See :ref:`api_interfaces` for an explanation of the tradeoffs between the +implicit and explicit interfaces. +""" +if TYPE_CHECKING: + _P = ParamSpec('_P') + _R = TypeVar('_R') + _T = TypeVar('_T') +_log = ... +colormaps = ... +color_sequences = ... +_ReplDisplayHook = ... +_REPL_DISPLAYHOOK = ... +def install_repl_displayhook() -> None: + """ + Connect to the display hook of the current shell. + + The display hook gets called when the read-evaluate-print-loop (REPL) of + the shell has finished the execution of a command. We use this callback + to be able to automatically update a figure in interactive mode. + + This works both with IPython and with vanilla python shells. + """ + ... + +def uninstall_repl_displayhook() -> None: + """Disconnect from the display hook of the current shell.""" + ... + +draw_all = ... +@_copy_docstring_and_deprecators(matplotlib.set_loglevel) +def set_loglevel(*args, **kwargs) -> None: + ... + +@_copy_docstring_and_deprecators(Artist.findobj) +def findobj(o: Artist | None = ..., match: Callable[[Artist], bool] | type[Artist] | None = ..., include_self: bool = ...) -> list[Artist]: + ... + +_backend_mod: type[matplotlib.backend_bases._Backend] | None = ... +def switch_backend(newbackend: str) -> None: + """ + Set the pyplot backend. + + Switching to an interactive backend is possible only if no event loop for + another interactive backend has started. Switching to and from + non-interactive backends is always possible. + + If the new backend is different than the current backend then all open + Figures will be closed via ``plt.close('all')``. + + Parameters + ---------- + newbackend : str + The case-insensitive name of the backend to use. + + """ + class backend_mod(matplotlib.backend_bases._Backend): + ... + + + +def new_figure_manager(*args, **kwargs): + """Create a new figure manager instance.""" + ... + +def draw_if_interactive(*args, **kwargs): + """ + Redraw the current figure if in interactive mode. + + .. warning:: + + End users will typically not have to call this function because the + the interactive mode takes care of this. + """ + ... + +def show(*args, **kwargs): + """ + Display all open figures. + + Parameters + ---------- + block : bool, optional + Whether to wait for all figures to be closed before returning. + + If `True` block and run the GUI main loop until all figure windows + are closed. + + If `False` ensure that all figure windows are displayed and return + immediately. In this case, you are responsible for ensuring + that the event loop is running to have responsive figures. + + Defaults to True in non-interactive mode and to False in interactive + mode (see `.pyplot.isinteractive`). + + See Also + -------- + ion : Enable interactive mode, which shows / updates the figure after + every plotting command, so that calling ``show()`` is not necessary. + ioff : Disable interactive mode. + savefig : Save the figure to an image file instead of showing it on screen. + + Notes + ----- + **Saving figures to file and showing a window at the same time** + + If you want an image file as well as a user interface window, use + `.pyplot.savefig` before `.pyplot.show`. At the end of (a blocking) + ``show()`` the figure is closed and thus unregistered from pyplot. Calling + `.pyplot.savefig` afterwards would save a new and thus empty figure. This + limitation of command order does not apply if the show is non-blocking or + if you keep a reference to the figure and use `.Figure.savefig`. + + **Auto-show in jupyter notebooks** + + The jupyter backends (activated via ``%matplotlib inline``, + ``%matplotlib notebook``, or ``%matplotlib widget``), call ``show()`` at + the end of every cell by default. Thus, you usually don't have to call it + explicitly there. + """ + ... + +def isinteractive() -> bool: + """ + Return whether plots are updated after every plotting command. + + The interactive mode is mainly useful if you build plots from the command + line and want to see the effect of each command while you are building the + figure. + + In interactive mode: + + - newly created figures will be shown immediately; + - figures will automatically redraw on change; + - `.pyplot.show` will not block by default. + + In non-interactive mode: + + - newly created figures and changes to figures will not be reflected until + explicitly asked to be; + - `.pyplot.show` will block by default. + + See Also + -------- + ion : Enable interactive mode. + ioff : Disable interactive mode. + show : Show all figures (and maybe block). + pause : Show all figures, and block for a time. + """ + ... + +def ioff() -> ExitStack: + """ + Disable interactive mode. + + See `.pyplot.isinteractive` for more details. + + See Also + -------- + ion : Enable interactive mode. + isinteractive : Whether interactive mode is enabled. + show : Show all figures (and maybe block). + pause : Show all figures, and block for a time. + + Notes + ----- + For a temporary change, this can be used as a context manager:: + + # if interactive mode is on + # then figures will be shown on creation + plt.ion() + # This figure will be shown immediately + fig = plt.figure() + + with plt.ioff(): + # interactive mode will be off + # figures will not automatically be shown + fig2 = plt.figure() + # ... + + To enable optional usage as a context manager, this function returns a + `~contextlib.ExitStack` object, which is not intended to be stored or + accessed by the user. + """ + ... + +def ion() -> ExitStack: + """ + Enable interactive mode. + + See `.pyplot.isinteractive` for more details. + + See Also + -------- + ioff : Disable interactive mode. + isinteractive : Whether interactive mode is enabled. + show : Show all figures (and maybe block). + pause : Show all figures, and block for a time. + + Notes + ----- + For a temporary change, this can be used as a context manager:: + + # if interactive mode is off + # then figures will not be shown on creation + plt.ioff() + # This figure will not be shown immediately + fig = plt.figure() + + with plt.ion(): + # interactive mode will be on + # figures will automatically be shown + fig2 = plt.figure() + # ... + + To enable optional usage as a context manager, this function returns a + `~contextlib.ExitStack` object, which is not intended to be stored or + accessed by the user. + """ + ... + +def pause(interval: float) -> None: + """ + Run the GUI event loop for *interval* seconds. + + If there is an active figure, it will be updated and displayed before the + pause, and the GUI event loop (if any) will run during the pause. + + This can be used for crude animation. For more complex animation use + :mod:`matplotlib.animation`. + + If there is no active figure, sleep for *interval* seconds instead. + + See Also + -------- + matplotlib.animation : Proper animations + show : Show all figures and optional block until all figures are closed. + """ + ... + +@_copy_docstring_and_deprecators(matplotlib.rc) +def rc(group: str, **kwargs) -> None: + ... + +@_copy_docstring_and_deprecators(matplotlib.rc_context) +def rc_context(rc: dict[str, Any] | None = ..., fname: str | pathlib.Path | os.PathLike | None = ...) -> AbstractContextManager[None]: + ... + +@_copy_docstring_and_deprecators(matplotlib.rcdefaults) +def rcdefaults() -> None: + ... + +@_copy_docstring_and_deprecators(matplotlib.artist.getp) +def getp(obj, *args, **kwargs): + ... + +@_copy_docstring_and_deprecators(matplotlib.artist.get) +def get(obj, *args, **kwargs): + ... + +@_copy_docstring_and_deprecators(matplotlib.artist.setp) +def setp(obj, *args, **kwargs): + ... + +def xkcd(scale: float = ..., length: float = ..., randomness: float = ...) -> ExitStack: + """ + Turn on `xkcd `_ sketch-style drawing mode. This will + only have effect on things drawn after this function is called. + + For best results, the "Humor Sans" font should be installed: it is + not included with Matplotlib. + + Parameters + ---------- + scale : float, optional + The amplitude of the wiggle perpendicular to the source line. + length : float, optional + The length of the wiggle along the line. + randomness : float, optional + The scale factor by which the length is shrunken or expanded. + + Notes + ----- + This function works by a number of rcParams, so it will probably + override others you have set before. + + If you want the effects of this function to be temporary, it can + be used as a context manager, for example:: + + with plt.xkcd(): + # This figure will be in XKCD-style + fig1 = plt.figure() + # ... + + # This figure will be in regular style + fig2 = plt.figure() + """ + ... + +def figure(num: int | str | Figure | SubFigure | None = ..., figsize: tuple[float, float] | None = ..., dpi: float | None = ..., *, facecolor: ColorType | None = ..., edgecolor: ColorType | None = ..., frameon: bool = ..., FigureClass: type[Figure] = ..., clear: bool = ..., **kwargs) -> Figure: + """ + Create a new figure, or activate an existing figure. + + Parameters + ---------- + num : int or str or `.Figure` or `.SubFigure`, optional + A unique identifier for the figure. + + If a figure with that identifier already exists, this figure is made + active and returned. An integer refers to the ``Figure.number`` + attribute, a string refers to the figure label. + + If there is no figure with the identifier or *num* is not given, a new + figure is created, made active and returned. If *num* is an int, it + will be used for the ``Figure.number`` attribute, otherwise, an + auto-generated integer value is used (starting at 1 and incremented + for each new figure). If *num* is a string, the figure label and the + window title is set to this value. If num is a ``SubFigure``, its + parent ``Figure`` is activated. + + figsize : (float, float), default: :rc:`figure.figsize` + Width, height in inches. + + dpi : float, default: :rc:`figure.dpi` + The resolution of the figure in dots-per-inch. + + facecolor : color, default: :rc:`figure.facecolor` + The background color. + + edgecolor : color, default: :rc:`figure.edgecolor` + The border color. + + frameon : bool, default: True + If False, suppress drawing the figure frame. + + FigureClass : subclass of `~matplotlib.figure.Figure` + If set, an instance of this subclass will be created, rather than a + plain `.Figure`. + + clear : bool, default: False + If True and the figure already exists, then it is cleared. + + layout : {'constrained', 'compressed', 'tight', 'none', `.LayoutEngine`, None}, \ +default: None + The layout mechanism for positioning of plot elements to avoid + overlapping Axes decorations (labels, ticks, etc). Note that layout + managers can measurably slow down figure display. + + - 'constrained': The constrained layout solver adjusts axes sizes + to avoid overlapping axes decorations. Can handle complex plot + layouts and colorbars, and is thus recommended. + + See :ref:`constrainedlayout_guide` + for examples. + + - 'compressed': uses the same algorithm as 'constrained', but + removes extra space between fixed-aspect-ratio Axes. Best for + simple grids of axes. + + - 'tight': Use the tight layout mechanism. This is a relatively + simple algorithm that adjusts the subplot parameters so that + decorations do not overlap. See `.Figure.set_tight_layout` for + further details. + + - 'none': Do not use a layout engine. + + - A `.LayoutEngine` instance. Builtin layout classes are + `.ConstrainedLayoutEngine` and `.TightLayoutEngine`, more easily + accessible by 'constrained' and 'tight'. Passing an instance + allows third parties to provide their own layout engine. + + If not given, fall back to using the parameters *tight_layout* and + *constrained_layout*, including their config defaults + :rc:`figure.autolayout` and :rc:`figure.constrained_layout.use`. + + **kwargs + Additional keyword arguments are passed to the `.Figure` constructor. + + Returns + ------- + `~matplotlib.figure.Figure` + + Notes + ----- + A newly created figure is passed to the `~.FigureCanvasBase.new_manager` + method or the `new_figure_manager` function provided by the current + backend, which install a canvas and a manager on the figure. + + Once this is done, :rc:`figure.hooks` are called, one at a time, on the + figure; these hooks allow arbitrary customization of the figure (e.g., + attaching callbacks) or of associated elements (e.g., modifying the + toolbar). See :doc:`/gallery/user_interfaces/mplcvd` for an example of + toolbar customization. + + If you are creating many figures, make sure you explicitly call + `.pyplot.close` on the figures you are not using, because this will + enable pyplot to properly clean up the memory. + + `~matplotlib.rcParams` defines the default values, which can be modified + in the matplotlibrc file. + """ + ... + +def gcf() -> Figure: + """ + Get the current figure. + + If there is currently no figure on the pyplot figure stack, a new one is + created using `~.pyplot.figure()`. (To test whether there is currently a + figure on the pyplot figure stack, check whether `~.pyplot.get_fignums()` + is empty.) + """ + ... + +def fignum_exists(num: int) -> bool: + """Return whether the figure with the given id exists.""" + ... + +def get_fignums() -> list[int]: + """Return a list of existing figure numbers.""" + ... + +def get_figlabels() -> list[Any]: + """Return a list of existing figure labels.""" + ... + +def get_current_fig_manager() -> FigureManagerBase | None: + """ + Return the figure manager of the current figure. + + The figure manager is a container for the actual backend-depended window + that displays the figure on screen. + + If no current figure exists, a new one is created, and its figure + manager is returned. + + Returns + ------- + `.FigureManagerBase` or backend-dependent subclass thereof + """ + ... + +@_copy_docstring_and_deprecators(FigureCanvasBase.mpl_connect) +def connect(s: str, func: Callable[[Event], Any]) -> int: + ... + +@_copy_docstring_and_deprecators(FigureCanvasBase.mpl_disconnect) +def disconnect(cid: int) -> None: + ... + +def close(fig: None | int | str | Figure | Literal["all"] = ...) -> None: + """ + Close a figure window. + + Parameters + ---------- + fig : None or int or str or `.Figure` + The figure to close. There are a number of ways to specify this: + + - *None*: the current figure + - `.Figure`: the given `.Figure` instance + - ``int``: a figure number + - ``str``: a figure name + - 'all': all figures + + """ + ... + +def clf() -> None: + """Clear the current figure.""" + ... + +def draw() -> None: + """ + Redraw the current figure. + + This is used to update a figure that has been altered, but not + automatically re-drawn. If interactive mode is on (via `.ion()`), this + should be only rarely needed, but there may be ways to modify the state of + a figure without marking it as "stale". Please report these cases as bugs. + + This is equivalent to calling ``fig.canvas.draw_idle()``, where ``fig`` is + the current figure. + + See Also + -------- + .FigureCanvasBase.draw_idle + .FigureCanvasBase.draw + """ + ... + +@_copy_docstring_and_deprecators(Figure.savefig) +def savefig(*args, **kwargs) -> None: + ... + +def figlegend(*args, **kwargs) -> Legend: + ... + +if Figure.legend.__doc__: + ... +@_docstring.dedent_interpd +def axes(arg: None | tuple[float, float, float, float] = ..., **kwargs) -> matplotlib.axes.Axes: + """ + Add an Axes to the current figure and make it the current Axes. + + Call signatures:: + + plt.axes() + plt.axes(rect, projection=None, polar=False, **kwargs) + plt.axes(ax) + + Parameters + ---------- + arg : None or 4-tuple + The exact behavior of this function depends on the type: + + - *None*: A new full window Axes is added using + ``subplot(**kwargs)``. + - 4-tuple of floats *rect* = ``(left, bottom, width, height)``. + A new Axes is added with dimensions *rect* in normalized + (0, 1) units using `~.Figure.add_axes` on the current figure. + + projection : {None, 'aitoff', 'hammer', 'lambert', 'mollweide', \ +'polar', 'rectilinear', str}, optional + The projection type of the `~.axes.Axes`. *str* is the name of + a custom projection, see `~matplotlib.projections`. The default + None results in a 'rectilinear' projection. + + polar : bool, default: False + If True, equivalent to projection='polar'. + + sharex, sharey : `~matplotlib.axes.Axes`, optional + Share the x or y `~matplotlib.axis` with sharex and/or sharey. + The axis will have the same limits, ticks, and scale as the axis + of the shared Axes. + + label : str + A label for the returned Axes. + + Returns + ------- + `~.axes.Axes`, or a subclass of `~.axes.Axes` + The returned axes class depends on the projection used. It is + `~.axes.Axes` if rectilinear projection is used and + `.projections.polar.PolarAxes` if polar projection is used. + + Other Parameters + ---------------- + **kwargs + This method also takes the keyword arguments for + the returned Axes class. The keyword arguments for the + rectilinear Axes class `~.axes.Axes` can be found in + the following table but there might also be other keyword + arguments if another projection is used, see the actual Axes + class. + + %(Axes:kwdoc)s + + See Also + -------- + .Figure.add_axes + .pyplot.subplot + .Figure.add_subplot + .Figure.subplots + .pyplot.subplots + + Examples + -------- + :: + + # Creating a new full window Axes + plt.axes() + + # Creating a new Axes with specified dimensions and a grey background + plt.axes((left, bottom, width, height), facecolor='grey') + """ + ... + +def delaxes(ax: matplotlib.axes.Axes | None = ...) -> None: + """ + Remove an `~.axes.Axes` (defaulting to the current axes) from its figure. + """ + ... + +def sca(ax: Axes) -> None: + """ + Set the current Axes to *ax* and the current Figure to the parent of *ax*. + """ + ... + +def cla() -> None: + """Clear the current axes.""" + ... + +@_docstring.dedent_interpd +def subplot(*args, **kwargs) -> Axes: + """ + Add an Axes to the current figure or retrieve an existing Axes. + + This is a wrapper of `.Figure.add_subplot` which provides additional + behavior when working with the implicit API (see the notes section). + + Call signatures:: + + subplot(nrows, ncols, index, **kwargs) + subplot(pos, **kwargs) + subplot(**kwargs) + subplot(ax) + + Parameters + ---------- + *args : int, (int, int, *index*), or `.SubplotSpec`, default: (1, 1, 1) + The position of the subplot described by one of + + - Three integers (*nrows*, *ncols*, *index*). The subplot will take the + *index* position on a grid with *nrows* rows and *ncols* columns. + *index* starts at 1 in the upper left corner and increases to the + right. *index* can also be a two-tuple specifying the (*first*, + *last*) indices (1-based, and including *last*) of the subplot, e.g., + ``fig.add_subplot(3, 1, (1, 2))`` makes a subplot that spans the + upper 2/3 of the figure. + - A 3-digit integer. The digits are interpreted as if given separately + as three single-digit integers, i.e. ``fig.add_subplot(235)`` is the + same as ``fig.add_subplot(2, 3, 5)``. Note that this can only be used + if there are no more than 9 subplots. + - A `.SubplotSpec`. + + projection : {None, 'aitoff', 'hammer', 'lambert', 'mollweide', \ +'polar', 'rectilinear', str}, optional + The projection type of the subplot (`~.axes.Axes`). *str* is the name + of a custom projection, see `~matplotlib.projections`. The default + None results in a 'rectilinear' projection. + + polar : bool, default: False + If True, equivalent to projection='polar'. + + sharex, sharey : `~matplotlib.axes.Axes`, optional + Share the x or y `~matplotlib.axis` with sharex and/or sharey. The + axis will have the same limits, ticks, and scale as the axis of the + shared axes. + + label : str + A label for the returned axes. + + Returns + ------- + `~.axes.Axes` + + The Axes of the subplot. The returned Axes can actually be an instance + of a subclass, such as `.projections.polar.PolarAxes` for polar + projections. + + Other Parameters + ---------------- + **kwargs + This method also takes the keyword arguments for the returned axes + base class; except for the *figure* argument. The keyword arguments + for the rectilinear base class `~.axes.Axes` can be found in + the following table but there might also be other keyword + arguments if another projection is used. + + %(Axes:kwdoc)s + + Notes + ----- + Creating a new Axes will delete any preexisting Axes that + overlaps with it beyond sharing a boundary:: + + import matplotlib.pyplot as plt + # plot a line, implicitly creating a subplot(111) + plt.plot([1, 2, 3]) + # now create a subplot which represents the top plot of a grid + # with 2 rows and 1 column. Since this subplot will overlap the + # first, the plot (and its axes) previously created, will be removed + plt.subplot(211) + + If you do not want this behavior, use the `.Figure.add_subplot` method + or the `.pyplot.axes` function instead. + + If no *kwargs* are passed and there exists an Axes in the location + specified by *args* then that Axes will be returned rather than a new + Axes being created. + + If *kwargs* are passed and there exists an Axes in the location + specified by *args*, the projection type is the same, and the + *kwargs* match with the existing Axes, then the existing Axes is + returned. Otherwise a new Axes is created with the specified + parameters. We save a reference to the *kwargs* which we use + for this comparison. If any of the values in *kwargs* are + mutable we will not detect the case where they are mutated. + In these cases we suggest using `.Figure.add_subplot` and the + explicit Axes API rather than the implicit pyplot API. + + See Also + -------- + .Figure.add_subplot + .pyplot.subplots + .pyplot.axes + .Figure.subplots + + Examples + -------- + :: + + plt.subplot(221) + + # equivalent but more general + ax1 = plt.subplot(2, 2, 1) + + # add a subplot with no frame + ax2 = plt.subplot(222, frameon=False) + + # add a polar subplot + plt.subplot(223, projection='polar') + + # add a red subplot that shares the x-axis with ax1 + plt.subplot(224, sharex=ax1, facecolor='red') + + # delete ax2 from the figure + plt.delaxes(ax2) + + # add ax2 to the figure again + plt.subplot(ax2) + + # make the first axes "current" again + plt.subplot(221) + + """ + ... + +def subplots(nrows: int = ..., ncols: int = ..., *, sharex: bool | Literal["none", "all", "row", "col"] = ..., sharey: bool | Literal["none", "all", "row", "col"] = ..., squeeze: bool = ..., width_ratios: Sequence[float] | None = ..., height_ratios: Sequence[float] | None = ..., subplot_kw: dict[str, Any] | None = ..., gridspec_kw: dict[str, Any] | None = ..., **fig_kw) -> tuple[Figure, Any]: + """ + Create a figure and a set of subplots. + + This utility wrapper makes it convenient to create common layouts of + subplots, including the enclosing figure object, in a single call. + + Parameters + ---------- + nrows, ncols : int, default: 1 + Number of rows/columns of the subplot grid. + + sharex, sharey : bool or {'none', 'all', 'row', 'col'}, default: False + Controls sharing of properties among x (*sharex*) or y (*sharey*) + axes: + + - True or 'all': x- or y-axis will be shared among all subplots. + - False or 'none': each subplot x- or y-axis will be independent. + - 'row': each subplot row will share an x- or y-axis. + - 'col': each subplot column will share an x- or y-axis. + + When subplots have a shared x-axis along a column, only the x tick + labels of the bottom subplot are created. Similarly, when subplots + have a shared y-axis along a row, only the y tick labels of the first + column subplot are created. To later turn other subplots' ticklabels + on, use `~matplotlib.axes.Axes.tick_params`. + + When subplots have a shared axis that has units, calling + `~matplotlib.axis.Axis.set_units` will update each axis with the + new units. + + squeeze : bool, default: True + - If True, extra dimensions are squeezed out from the returned + array of `~matplotlib.axes.Axes`: + + - if only one subplot is constructed (nrows=ncols=1), the + resulting single Axes object is returned as a scalar. + - for Nx1 or 1xM subplots, the returned object is a 1D numpy + object array of Axes objects. + - for NxM, subplots with N>1 and M>1 are returned as a 2D array. + + - If False, no squeezing at all is done: the returned Axes object is + always a 2D array containing Axes instances, even if it ends up + being 1x1. + + width_ratios : array-like of length *ncols*, optional + Defines the relative widths of the columns. Each column gets a + relative width of ``width_ratios[i] / sum(width_ratios)``. + If not given, all columns will have the same width. Equivalent + to ``gridspec_kw={'width_ratios': [...]}``. + + height_ratios : array-like of length *nrows*, optional + Defines the relative heights of the rows. Each row gets a + relative height of ``height_ratios[i] / sum(height_ratios)``. + If not given, all rows will have the same height. Convenience + for ``gridspec_kw={'height_ratios': [...]}``. + + subplot_kw : dict, optional + Dict with keywords passed to the + `~matplotlib.figure.Figure.add_subplot` call used to create each + subplot. + + gridspec_kw : dict, optional + Dict with keywords passed to the `~matplotlib.gridspec.GridSpec` + constructor used to create the grid the subplots are placed on. + + **fig_kw + All additional keyword arguments are passed to the + `.pyplot.figure` call. + + Returns + ------- + fig : `.Figure` + + ax : `~matplotlib.axes.Axes` or array of Axes + *ax* can be either a single `~.axes.Axes` object, or an array of Axes + objects if more than one subplot was created. The dimensions of the + resulting array can be controlled with the squeeze keyword, see above. + + Typical idioms for handling the return value are:: + + # using the variable ax for single a Axes + fig, ax = plt.subplots() + + # using the variable axs for multiple Axes + fig, axs = plt.subplots(2, 2) + + # using tuple unpacking for multiple Axes + fig, (ax1, ax2) = plt.subplots(1, 2) + fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) + + The names ``ax`` and pluralized ``axs`` are preferred over ``axes`` + because for the latter it's not clear if it refers to a single + `~.axes.Axes` instance or a collection of these. + + See Also + -------- + .pyplot.figure + .pyplot.subplot + .pyplot.axes + .Figure.subplots + .Figure.add_subplot + + Examples + -------- + :: + + # First create some toy data: + x = np.linspace(0, 2*np.pi, 400) + y = np.sin(x**2) + + # Create just a figure and only one subplot + fig, ax = plt.subplots() + ax.plot(x, y) + ax.set_title('Simple plot') + + # Create two subplots and unpack the output array immediately + f, (ax1, ax2) = plt.subplots(1, 2, sharey=True) + ax1.plot(x, y) + ax1.set_title('Sharing Y axis') + ax2.scatter(x, y) + + # Create four polar axes and access them through the returned array + fig, axs = plt.subplots(2, 2, subplot_kw=dict(projection="polar")) + axs[0, 0].plot(x, y) + axs[1, 1].scatter(x, y) + + # Share a X axis with each column of subplots + plt.subplots(2, 2, sharex='col') + + # Share a Y axis with each row of subplots + plt.subplots(2, 2, sharey='row') + + # Share both X and Y axes with all subplots + plt.subplots(2, 2, sharex='all', sharey='all') + + # Note that this is the same as + plt.subplots(2, 2, sharex=True, sharey=True) + + # Create figure number 10 with a single subplot + # and clears it if it already exists. + fig, ax = plt.subplots(num=10, clear=True) + + """ + ... + +@overload +def subplot_mosaic(mosaic: str, *, sharex: bool = ..., sharey: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., empty_sentinel: str = ..., subplot_kw: dict[str, Any] | None = ..., gridspec_kw: dict[str, Any] | None = ..., per_subplot_kw: dict[str | tuple[str, ...], dict[str, Any]] | None = ..., **fig_kw: Any) -> tuple[Figure, dict[str, matplotlib.axes.Axes]]: + ... + +@overload +def subplot_mosaic(mosaic: list[HashableList[_T]], *, sharex: bool = ..., sharey: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., empty_sentinel: _T = ..., subplot_kw: dict[str, Any] | None = ..., gridspec_kw: dict[str, Any] | None = ..., per_subplot_kw: dict[_T | tuple[_T, ...], dict[str, Any]] | None = ..., **fig_kw: Any) -> tuple[Figure, dict[_T, matplotlib.axes.Axes]]: + ... + +@overload +def subplot_mosaic(mosaic: list[HashableList[Hashable]], *, sharex: bool = ..., sharey: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., empty_sentinel: Any = ..., subplot_kw: dict[str, Any] | None = ..., gridspec_kw: dict[str, Any] | None = ..., per_subplot_kw: dict[Hashable | tuple[Hashable, ...], dict[str, Any]] | None = ..., **fig_kw: Any) -> tuple[Figure, dict[Hashable, matplotlib.axes.Axes]]: + ... + +def subplot_mosaic(mosaic: str | list[HashableList[_T]] | list[HashableList[Hashable]], *, sharex: bool = ..., sharey: bool = ..., width_ratios: ArrayLike | None = ..., height_ratios: ArrayLike | None = ..., empty_sentinel: Any = ..., subplot_kw: dict[str, Any] | None = ..., gridspec_kw: dict[str, Any] | None = ..., per_subplot_kw: dict[str | tuple[str, ...], dict[str, Any]] | dict[_T | tuple[_T, ...], dict[str, Any]] | dict[Hashable | tuple[Hashable, ...], dict[str, Any]] | None = ..., **fig_kw: Any) -> tuple[Figure, dict[str, matplotlib.axes.Axes]] | tuple[Figure, dict[_T, matplotlib.axes.Axes]] | tuple[Figure, dict[Hashable, matplotlib.axes.Axes]]: + """ + Build a layout of Axes based on ASCII art or nested lists. + + This is a helper function to build complex GridSpec layouts visually. + + See :ref:`mosaic` + for an example and full API documentation + + Parameters + ---------- + mosaic : list of list of {hashable or nested} or str + + A visual layout of how you want your Axes to be arranged + labeled as strings. For example :: + + x = [['A panel', 'A panel', 'edge'], + ['C panel', '.', 'edge']] + + produces 4 axes: + + - 'A panel' which is 1 row high and spans the first two columns + - 'edge' which is 2 rows high and is on the right edge + - 'C panel' which in 1 row and 1 column wide in the bottom left + - a blank space 1 row and 1 column wide in the bottom center + + Any of the entries in the layout can be a list of lists + of the same form to create nested layouts. + + If input is a str, then it must be of the form :: + + ''' + AAE + C.E + ''' + + where each character is a column and each line is a row. + This only allows only single character Axes labels and does + not allow nesting but is very terse. + + sharex, sharey : bool, default: False + If True, the x-axis (*sharex*) or y-axis (*sharey*) will be shared + among all subplots. In that case, tick label visibility and axis units + behave as for `subplots`. If False, each subplot's x- or y-axis will + be independent. + + width_ratios : array-like of length *ncols*, optional + Defines the relative widths of the columns. Each column gets a + relative width of ``width_ratios[i] / sum(width_ratios)``. + If not given, all columns will have the same width. Convenience + for ``gridspec_kw={'width_ratios': [...]}``. + + height_ratios : array-like of length *nrows*, optional + Defines the relative heights of the rows. Each row gets a + relative height of ``height_ratios[i] / sum(height_ratios)``. + If not given, all rows will have the same height. Convenience + for ``gridspec_kw={'height_ratios': [...]}``. + + empty_sentinel : object, optional + Entry in the layout to mean "leave this space empty". Defaults + to ``'.'``. Note, if *layout* is a string, it is processed via + `inspect.cleandoc` to remove leading white space, which may + interfere with using white-space as the empty sentinel. + + subplot_kw : dict, optional + Dictionary with keywords passed to the `.Figure.add_subplot` call + used to create each subplot. These values may be overridden by + values in *per_subplot_kw*. + + per_subplot_kw : dict, optional + A dictionary mapping the Axes identifiers or tuples of identifiers + to a dictionary of keyword arguments to be passed to the + `.Figure.add_subplot` call used to create each subplot. The values + in these dictionaries have precedence over the values in + *subplot_kw*. + + If *mosaic* is a string, and thus all keys are single characters, + it is possible to use a single string instead of a tuple as keys; + i.e. ``"AB"`` is equivalent to ``("A", "B")``. + + .. versionadded:: 3.7 + + gridspec_kw : dict, optional + Dictionary with keywords passed to the `.GridSpec` constructor used + to create the grid the subplots are placed on. + + **fig_kw + All additional keyword arguments are passed to the + `.pyplot.figure` call. + + Returns + ------- + fig : `.Figure` + The new figure + + dict[label, Axes] + A dictionary mapping the labels to the Axes objects. The order of + the axes is left-to-right and top-to-bottom of their position in the + total layout. + + """ + ... + +def subplot2grid(shape: tuple[int, int], loc: tuple[int, int], rowspan: int = ..., colspan: int = ..., fig: Figure | None = ..., **kwargs) -> matplotlib.axes.Axes: + """ + Create a subplot at a specific location inside a regular grid. + + Parameters + ---------- + shape : (int, int) + Number of rows and of columns of the grid in which to place axis. + loc : (int, int) + Row number and column number of the axis location within the grid. + rowspan : int, default: 1 + Number of rows for the axis to span downwards. + colspan : int, default: 1 + Number of columns for the axis to span to the right. + fig : `.Figure`, optional + Figure to place the subplot in. Defaults to the current figure. + **kwargs + Additional keyword arguments are handed to `~.Figure.add_subplot`. + + Returns + ------- + `~.axes.Axes` + + The Axes of the subplot. The returned Axes can actually be an instance + of a subclass, such as `.projections.polar.PolarAxes` for polar + projections. + + Notes + ----- + The following call :: + + ax = subplot2grid((nrows, ncols), (row, col), rowspan, colspan) + + is identical to :: + + fig = gcf() + gs = fig.add_gridspec(nrows, ncols) + ax = fig.add_subplot(gs[row:row+rowspan, col:col+colspan]) + """ + ... + +def twinx(ax: matplotlib.axes.Axes | None = ...) -> _AxesBase: + """ + Make and return a second axes that shares the *x*-axis. The new axes will + overlay *ax* (or the current axes if *ax* is *None*), and its ticks will be + on the right. + + Examples + -------- + :doc:`/gallery/subplots_axes_and_figures/two_scales` + """ + ... + +def twiny(ax: matplotlib.axes.Axes | None = ...) -> _AxesBase: + """ + Make and return a second axes that shares the *y*-axis. The new axes will + overlay *ax* (or the current axes if *ax* is *None*), and its ticks will be + on the top. + + Examples + -------- + :doc:`/gallery/subplots_axes_and_figures/two_scales` + """ + ... + +def subplot_tool(targetfig: Figure | None = ...) -> SubplotTool | None: + """ + Launch a subplot tool window for a figure. + + Returns + ------- + `matplotlib.widgets.SubplotTool` + """ + ... + +def box(on: bool | None = ...) -> None: + """ + Turn the axes box on or off on the current axes. + + Parameters + ---------- + on : bool or None + The new `~matplotlib.axes.Axes` box state. If ``None``, toggle + the state. + + See Also + -------- + :meth:`matplotlib.axes.Axes.set_frame_on` + :meth:`matplotlib.axes.Axes.get_frame_on` + """ + ... + +def xlim(*args, **kwargs) -> tuple[float, float]: + """ + Get or set the x limits of the current axes. + + Call signatures:: + + left, right = xlim() # return the current xlim + xlim((left, right)) # set the xlim to left, right + xlim(left, right) # set the xlim to left, right + + If you do not specify args, you can pass *left* or *right* as kwargs, + i.e.:: + + xlim(right=3) # adjust the right leaving left unchanged + xlim(left=1) # adjust the left leaving right unchanged + + Setting limits turns autoscaling off for the x-axis. + + Returns + ------- + left, right + A tuple of the new x-axis limits. + + Notes + ----- + Calling this function with no arguments (e.g. ``xlim()``) is the pyplot + equivalent of calling `~.Axes.get_xlim` on the current axes. + Calling this function with arguments is the pyplot equivalent of calling + `~.Axes.set_xlim` on the current axes. All arguments are passed though. + """ + ... + +def ylim(*args, **kwargs) -> tuple[float, float]: + """ + Get or set the y-limits of the current axes. + + Call signatures:: + + bottom, top = ylim() # return the current ylim + ylim((bottom, top)) # set the ylim to bottom, top + ylim(bottom, top) # set the ylim to bottom, top + + If you do not specify args, you can alternatively pass *bottom* or + *top* as kwargs, i.e.:: + + ylim(top=3) # adjust the top leaving bottom unchanged + ylim(bottom=1) # adjust the bottom leaving top unchanged + + Setting limits turns autoscaling off for the y-axis. + + Returns + ------- + bottom, top + A tuple of the new y-axis limits. + + Notes + ----- + Calling this function with no arguments (e.g. ``ylim()``) is the pyplot + equivalent of calling `~.Axes.get_ylim` on the current axes. + Calling this function with arguments is the pyplot equivalent of calling + `~.Axes.set_ylim` on the current axes. All arguments are passed though. + """ + ... + +def xticks(ticks: ArrayLike | None = ..., labels: Sequence[str] | None = ..., *, minor: bool = ..., **kwargs) -> tuple[list[Tick] | np.ndarray, list[Text]]: + """ + Get or set the current tick locations and labels of the x-axis. + + Pass no arguments to return the current values without modifying them. + + Parameters + ---------- + ticks : array-like, optional + The list of xtick locations. Passing an empty list removes all xticks. + labels : array-like, optional + The labels to place at the given *ticks* locations. This argument can + only be passed if *ticks* is passed as well. + minor : bool, default: False + If ``False``, get/set the major ticks/labels; if ``True``, the minor + ticks/labels. + **kwargs + `.Text` properties can be used to control the appearance of the labels. + + Returns + ------- + locs + The list of xtick locations. + labels + The list of xlabel `.Text` objects. + + Notes + ----- + Calling this function with no arguments (e.g. ``xticks()``) is the pyplot + equivalent of calling `~.Axes.get_xticks` and `~.Axes.get_xticklabels` on + the current axes. + Calling this function with arguments is the pyplot equivalent of calling + `~.Axes.set_xticks` and `~.Axes.set_xticklabels` on the current axes. + + Examples + -------- + >>> locs, labels = xticks() # Get the current locations and labels. + >>> xticks(np.arange(0, 1, step=0.2)) # Set label locations. + >>> xticks(np.arange(3), ['Tom', 'Dick', 'Sue']) # Set text labels. + >>> xticks([0, 1, 2], ['January', 'February', 'March'], + ... rotation=20) # Set text labels and properties. + >>> xticks([]) # Disable xticks. + """ + ... + +def yticks(ticks: ArrayLike | None = ..., labels: Sequence[str] | None = ..., *, minor: bool = ..., **kwargs) -> tuple[list[Tick] | np.ndarray, list[Text]]: + """ + Get or set the current tick locations and labels of the y-axis. + + Pass no arguments to return the current values without modifying them. + + Parameters + ---------- + ticks : array-like, optional + The list of ytick locations. Passing an empty list removes all yticks. + labels : array-like, optional + The labels to place at the given *ticks* locations. This argument can + only be passed if *ticks* is passed as well. + minor : bool, default: False + If ``False``, get/set the major ticks/labels; if ``True``, the minor + ticks/labels. + **kwargs + `.Text` properties can be used to control the appearance of the labels. + + Returns + ------- + locs + The list of ytick locations. + labels + The list of ylabel `.Text` objects. + + Notes + ----- + Calling this function with no arguments (e.g. ``yticks()``) is the pyplot + equivalent of calling `~.Axes.get_yticks` and `~.Axes.get_yticklabels` on + the current axes. + Calling this function with arguments is the pyplot equivalent of calling + `~.Axes.set_yticks` and `~.Axes.set_yticklabels` on the current axes. + + Examples + -------- + >>> locs, labels = yticks() # Get the current locations and labels. + >>> yticks(np.arange(0, 1, step=0.2)) # Set label locations. + >>> yticks(np.arange(3), ['Tom', 'Dick', 'Sue']) # Set text labels. + >>> yticks([0, 1, 2], ['January', 'February', 'March'], + ... rotation=45) # Set text labels and properties. + >>> yticks([]) # Disable yticks. + """ + ... + +def rgrids(radii: ArrayLike | None = ..., labels: Sequence[str | Text] | None = ..., angle: float | None = ..., fmt: str | None = ..., **kwargs) -> tuple[list[Line2D], list[Text]]: + """ + Get or set the radial gridlines on the current polar plot. + + Call signatures:: + + lines, labels = rgrids() + lines, labels = rgrids(radii, labels=None, angle=22.5, fmt=None, **kwargs) + + When called with no arguments, `.rgrids` simply returns the tuple + (*lines*, *labels*). When called with arguments, the labels will + appear at the specified radial distances and angle. + + Parameters + ---------- + radii : tuple with floats + The radii for the radial gridlines + + labels : tuple with strings or None + The labels to use at each radial gridline. The + `matplotlib.ticker.ScalarFormatter` will be used if None. + + angle : float + The angular position of the radius labels in degrees. + + fmt : str or None + Format string used in `matplotlib.ticker.FormatStrFormatter`. + For example '%f'. + + Returns + ------- + lines : list of `.lines.Line2D` + The radial gridlines. + + labels : list of `.text.Text` + The tick labels. + + Other Parameters + ---------------- + **kwargs + *kwargs* are optional `.Text` properties for the labels. + + See Also + -------- + .pyplot.thetagrids + .projections.polar.PolarAxes.set_rgrids + .Axis.get_gridlines + .Axis.get_ticklabels + + Examples + -------- + :: + + # set the locations of the radial gridlines + lines, labels = rgrids( (0.25, 0.5, 1.0) ) + + # set the locations and labels of the radial gridlines + lines, labels = rgrids( (0.25, 0.5, 1.0), ('Tom', 'Dick', 'Harry' )) + """ + ... + +def thetagrids(angles: ArrayLike | None = ..., labels: Sequence[str | Text] | None = ..., fmt: str | None = ..., **kwargs) -> tuple[list[Line2D], list[Text]]: + """ + Get or set the theta gridlines on the current polar plot. + + Call signatures:: + + lines, labels = thetagrids() + lines, labels = thetagrids(angles, labels=None, fmt=None, **kwargs) + + When called with no arguments, `.thetagrids` simply returns the tuple + (*lines*, *labels*). When called with arguments, the labels will + appear at the specified angles. + + Parameters + ---------- + angles : tuple with floats, degrees + The angles of the theta gridlines. + + labels : tuple with strings or None + The labels to use at each radial gridline. The + `.projections.polar.ThetaFormatter` will be used if None. + + fmt : str or None + Format string used in `matplotlib.ticker.FormatStrFormatter`. + For example '%f'. Note that the angle in radians will be used. + + Returns + ------- + lines : list of `.lines.Line2D` + The theta gridlines. + + labels : list of `.text.Text` + The tick labels. + + Other Parameters + ---------------- + **kwargs + *kwargs* are optional `.Text` properties for the labels. + + See Also + -------- + .pyplot.rgrids + .projections.polar.PolarAxes.set_thetagrids + .Axis.get_gridlines + .Axis.get_ticklabels + + Examples + -------- + :: + + # set the locations of the angular gridlines + lines, labels = thetagrids(range(45, 360, 90)) + + # set the locations and labels of the angular gridlines + lines, labels = thetagrids(range(45, 360, 90), ('NE', 'NW', 'SW', 'SE')) + """ + ... + +@_api.deprecated("3.7", pending=True) +def get_plot_commands() -> list[str]: + """ + Get a sorted list of all of the plotting commands. + """ + ... + +@_copy_docstring_and_deprecators(Figure.colorbar) +def colorbar(mappable: ScalarMappable | None = ..., cax: matplotlib.axes.Axes | None = ..., ax: matplotlib.axes.Axes | Iterable[matplotlib.axes.Axes] | None = ..., **kwargs) -> Colorbar: + ... + +def clim(vmin: float | None = ..., vmax: float | None = ...) -> None: + """ + Set the color limits of the current image. + + If either *vmin* or *vmax* is None, the image min/max respectively + will be used for color scaling. + + If you want to set the clim of multiple images, use + `~.ScalarMappable.set_clim` on every image, for example:: + + for im in gca().get_images(): + im.set_clim(0, 0.5) + + """ + ... + +def get_cmap(name: Colormap | str | None = ..., lut: int | None = ...) -> Colormap: + ... + +def set_cmap(cmap: Colormap | str) -> None: + """ + Set the default colormap, and applies it to the current image if any. + + Parameters + ---------- + cmap : `~matplotlib.colors.Colormap` or str + A colormap instance or the name of a registered colormap. + + See Also + -------- + colormaps + matplotlib.cm.register_cmap + matplotlib.cm.get_cmap + """ + ... + +@_copy_docstring_and_deprecators(matplotlib.image.imread) +def imread(fname: str | pathlib.Path | BinaryIO, format: str | None = ...) -> np.ndarray: + ... + +@_copy_docstring_and_deprecators(matplotlib.image.imsave) +def imsave(fname: str | os.PathLike | BinaryIO, arr: ArrayLike, **kwargs) -> None: + ... + +def matshow(A: ArrayLike, fignum: None | int = ..., **kwargs) -> AxesImage: + """ + Display an array as a matrix in a new figure window. + + The origin is set at the upper left hand corner and rows (first + dimension of the array) are displayed horizontally. The aspect + ratio of the figure window is that of the array, unless this would + make an excessively short or narrow figure. + + Tick labels for the xaxis are placed on top. + + Parameters + ---------- + A : 2D array-like + The matrix to be displayed. + + fignum : None or int + If *None*, create a new figure window with automatic numbering. + + If a nonzero integer, draw into the figure with the given number + (create it if it does not exist). + + If 0, use the current axes (or create one if it does not exist). + + .. note:: + + Because of how `.Axes.matshow` tries to set the figure aspect + ratio to be the one of the array, strange things may happen if you + reuse an existing figure. + + Returns + ------- + `~matplotlib.image.AxesImage` + + Other Parameters + ---------------- + **kwargs : `~matplotlib.axes.Axes.imshow` arguments + + """ + ... + +def polar(*args, **kwargs) -> list[Line2D]: + """ + Make a polar plot. + + call signature:: + + polar(theta, r, **kwargs) + + Multiple *theta*, *r* arguments are supported, with format strings, as in + `plot`. + """ + ... + +if (rcParams["backend_fallback"] and rcParams._get_backend_or_none() in (set(rcsetup.interactive_bk) - 'WebAgg', 'nbAgg') and cbook._get_running_interactive_framework()): + ... +@_copy_docstring_and_deprecators(Figure.figimage) +def figimage(X: ArrayLike, xo: int = ..., yo: int = ..., alpha: float | None = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., origin: Literal["upper", "lower"] | None = ..., resize: bool = ..., **kwargs) -> FigureImage: + ... + +@_copy_docstring_and_deprecators(Figure.text) +def figtext(x: float, y: float, s: str, fontdict: dict[str, Any] | None = ..., **kwargs) -> Text: + ... + +@_copy_docstring_and_deprecators(Figure.gca) +def gca() -> Axes: + ... + +@_copy_docstring_and_deprecators(Figure._gci) +def gci() -> ScalarMappable | None: + ... + +@_copy_docstring_and_deprecators(Figure.ginput) +def ginput(n: int = ..., timeout: float = ..., show_clicks: bool = ..., mouse_add: MouseButton = ..., mouse_pop: MouseButton = ..., mouse_stop: MouseButton = ...) -> list[tuple[int, int]]: + ... + +@_copy_docstring_and_deprecators(Figure.subplots_adjust) +def subplots_adjust(left: float | None = ..., bottom: float | None = ..., right: float | None = ..., top: float | None = ..., wspace: float | None = ..., hspace: float | None = ...) -> None: + ... + +@_copy_docstring_and_deprecators(Figure.suptitle) +def suptitle(t: str, **kwargs) -> Text: + ... + +@_copy_docstring_and_deprecators(Figure.tight_layout) +def tight_layout(*, pad: float = ..., h_pad: float | None = ..., w_pad: float | None = ..., rect: tuple[float, float, float, float] | None = ...) -> None: + ... + +@_copy_docstring_and_deprecators(Figure.waitforbuttonpress) +def waitforbuttonpress(timeout: float = ...) -> None | bool: + ... + +@_copy_docstring_and_deprecators(Axes.acorr) +def acorr(x: ArrayLike, *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, LineCollection | Line2D, Line2D | None]: + ... + +@_copy_docstring_and_deprecators(Axes.angle_spectrum) +def angle_spectrum(x: ArrayLike, Fs: float | None = ..., Fc: int | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.annotate) +def annotate(text: str, xy: tuple[float, float], xytext: tuple[float, float] | None = ..., xycoords: str | Artist | Transform | Callable[[RendererBase], Bbox | Transform] | tuple[float, float] = ..., textcoords: str | Artist | Transform | Callable[[RendererBase], Bbox | Transform] | tuple[float, float] | None = ..., arrowprops: dict[str, Any] | None = ..., annotation_clip: bool | None = ..., **kwargs) -> Annotation: + ... + +@_copy_docstring_and_deprecators(Axes.arrow) +def arrow(x: float, y: float, dx: float, dy: float, **kwargs) -> FancyArrow: + ... + +@_copy_docstring_and_deprecators(Axes.autoscale) +def autoscale(enable: bool = ..., axis: Literal["both", "x", "y"] = ..., tight: bool | None = ...) -> None: + ... + +@_copy_docstring_and_deprecators(Axes.axhline) +def axhline(y: float = ..., xmin: float = ..., xmax: float = ..., **kwargs) -> Line2D: + ... + +@_copy_docstring_and_deprecators(Axes.axhspan) +def axhspan(ymin: float, ymax: float, xmin: float = ..., xmax: float = ..., **kwargs) -> Polygon: + ... + +@_copy_docstring_and_deprecators(Axes.axis) +def axis(arg: tuple[float, float, float, float] | bool | str | None = ..., /, *, emit: bool = ..., **kwargs) -> tuple[float, float, float, float]: + ... + +@_copy_docstring_and_deprecators(Axes.axline) +def axline(xy1: tuple[float, float], xy2: tuple[float, float] | None = ..., *, slope: float | None = ..., **kwargs) -> Line2D: + ... + +@_copy_docstring_and_deprecators(Axes.axvline) +def axvline(x: float = ..., ymin: float = ..., ymax: float = ..., **kwargs) -> Line2D: + ... + +@_copy_docstring_and_deprecators(Axes.axvspan) +def axvspan(xmin: float, xmax: float, ymin: float = ..., ymax: float = ..., **kwargs) -> Polygon: + ... + +@_copy_docstring_and_deprecators(Axes.bar) +def bar(x: float | ArrayLike, height: float | ArrayLike, width: float | ArrayLike = ..., bottom: float | ArrayLike | None = ..., *, align: Literal["center", "edge"] = ..., data=..., **kwargs) -> BarContainer: + ... + +@_copy_docstring_and_deprecators(Axes.barbs) +def barbs(*args, data=..., **kwargs) -> Barbs: + ... + +@_copy_docstring_and_deprecators(Axes.barh) +def barh(y: float | ArrayLike, width: float | ArrayLike, height: float | ArrayLike = ..., left: float | ArrayLike | None = ..., *, align: Literal["center", "edge"] = ..., data=..., **kwargs) -> BarContainer: + ... + +@_copy_docstring_and_deprecators(Axes.bar_label) +def bar_label(container: BarContainer, labels: ArrayLike | None = ..., *, fmt: str | Callable[[float], str] = ..., label_type: Literal["center", "edge"] = ..., padding: float = ..., **kwargs) -> list[Annotation]: + ... + +@_copy_docstring_and_deprecators(Axes.boxplot) +def boxplot(x: ArrayLike | Sequence[ArrayLike], notch: bool | None = ..., sym: str | None = ..., vert: bool | None = ..., whis: float | tuple[float, float] | None = ..., positions: ArrayLike | None = ..., widths: float | ArrayLike | None = ..., patch_artist: bool | None = ..., bootstrap: int | None = ..., usermedians: ArrayLike | None = ..., conf_intervals: ArrayLike | None = ..., meanline: bool | None = ..., showmeans: bool | None = ..., showcaps: bool | None = ..., showbox: bool | None = ..., showfliers: bool | None = ..., boxprops: dict[str, Any] | None = ..., labels: Sequence[str] | None = ..., flierprops: dict[str, Any] | None = ..., medianprops: dict[str, Any] | None = ..., meanprops: dict[str, Any] | None = ..., capprops: dict[str, Any] | None = ..., whiskerprops: dict[str, Any] | None = ..., manage_ticks: bool = ..., autorange: bool = ..., zorder: float | None = ..., capwidths: float | ArrayLike | None = ..., *, data=...) -> dict[str, Any]: + ... + +@_copy_docstring_and_deprecators(Axes.broken_barh) +def broken_barh(xranges: Sequence[tuple[float, float]], yrange: tuple[float, float], *, data=..., **kwargs) -> BrokenBarHCollection: + ... + +@_copy_docstring_and_deprecators(Axes.clabel) +def clabel(CS: ContourSet, levels: ArrayLike | None = ..., **kwargs) -> list[Text]: + ... + +@_copy_docstring_and_deprecators(Axes.cohere) +def cohere(x: ArrayLike, y: ArrayLike, NFFT: int = ..., Fs: float = ..., Fc: int = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike = ..., noverlap: int = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] = ..., scale_by_freq: bool | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray]: + ... + +@_copy_docstring_and_deprecators(Axes.contour) +def contour(*args, data=..., **kwargs) -> QuadContourSet: + ... + +@_copy_docstring_and_deprecators(Axes.contourf) +def contourf(*args, data=..., **kwargs) -> QuadContourSet: + ... + +@_copy_docstring_and_deprecators(Axes.csd) +def csd(x: ArrayLike, y: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., Fc: int | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ..., return_line: bool | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray] | tuple[np.ndarray, np.ndarray, Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.ecdf) +def ecdf(x: ArrayLike, weights: ArrayLike | None = ..., *, complementary: bool = ..., orientation: Literal["vertical", "horizonatal"] = ..., compress: bool = ..., data=..., **kwargs) -> Line2D: + ... + +@_copy_docstring_and_deprecators(Axes.errorbar) +def errorbar(x: float | ArrayLike, y: float | ArrayLike, yerr: float | ArrayLike | None = ..., xerr: float | ArrayLike | None = ..., fmt: str = ..., ecolor: ColorType | None = ..., elinewidth: float | None = ..., capsize: float | None = ..., barsabove: bool = ..., lolims: bool | ArrayLike = ..., uplims: bool | ArrayLike = ..., xlolims: bool | ArrayLike = ..., xuplims: bool | ArrayLike = ..., errorevery: int | tuple[int, int] = ..., capthick: float | None = ..., *, data=..., **kwargs) -> ErrorbarContainer: + ... + +@_copy_docstring_and_deprecators(Axes.eventplot) +def eventplot(positions: ArrayLike | Sequence[ArrayLike], orientation: Literal["horizontal", "vertical"] = ..., lineoffsets: float | Sequence[float] = ..., linelengths: float | Sequence[float] = ..., linewidths: float | Sequence[float] | None = ..., colors: ColorType | Sequence[ColorType] | None = ..., alpha: float | Sequence[float] | None = ..., linestyles: LineStyleType | Sequence[LineStyleType] = ..., *, data=..., **kwargs) -> EventCollection: + ... + +@_copy_docstring_and_deprecators(Axes.fill) +def fill(*args, data=..., **kwargs) -> list[Polygon]: + ... + +@_copy_docstring_and_deprecators(Axes.fill_between) +def fill_between(x: ArrayLike, y1: ArrayLike | float, y2: ArrayLike | float = ..., where: Sequence[bool] | None = ..., interpolate: bool = ..., step: Literal["pre", "post", "mid"] | None = ..., *, data=..., **kwargs) -> PolyCollection: + ... + +@_copy_docstring_and_deprecators(Axes.fill_betweenx) +def fill_betweenx(y: ArrayLike, x1: ArrayLike | float, x2: ArrayLike | float = ..., where: Sequence[bool] | None = ..., step: Literal["pre", "post", "mid"] | None = ..., interpolate: bool = ..., *, data=..., **kwargs) -> PolyCollection: + ... + +@_copy_docstring_and_deprecators(Axes.grid) +def grid(visible: bool | None = ..., which: Literal["major", "minor", "both"] = ..., axis: Literal["both", "x", "y"] = ..., **kwargs) -> None: + ... + +@_copy_docstring_and_deprecators(Axes.hexbin) +def hexbin(x: ArrayLike, y: ArrayLike, C: ArrayLike | None = ..., gridsize: int | tuple[int, int] = ..., bins: Literal["log"] | int | Sequence[float] | None = ..., xscale: Literal["linear", "log"] = ..., yscale: Literal["linear", "log"] = ..., extent: tuple[float, float, float, float] | None = ..., cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., vmin: float | None = ..., vmax: float | None = ..., alpha: float | None = ..., linewidths: float | None = ..., edgecolors: Literal["face", "none"] | ColorType = ..., reduce_C_function: Callable[[np.ndarray | list[float]], float] = ..., mincnt: int | None = ..., marginals: bool = ..., *, data=..., **kwargs) -> PolyCollection: + ... + +@_copy_docstring_and_deprecators(Axes.hist) +def hist(x: ArrayLike | Sequence[ArrayLike], bins: int | Sequence[float] | str | None = ..., range: tuple[float, float] | None = ..., density: bool = ..., weights: ArrayLike | None = ..., cumulative: bool | float = ..., bottom: ArrayLike | float | None = ..., histtype: Literal["bar", "barstacked", "step", "stepfilled"] = ..., align: Literal["left", "mid", "right"] = ..., orientation: Literal["vertical", "horizontal"] = ..., rwidth: float | None = ..., log: bool = ..., color: ColorType | Sequence[ColorType] | None = ..., label: str | Sequence[str] | None = ..., stacked: bool = ..., *, data=..., **kwargs) -> tuple[np.ndarray | list[np.ndarray], np.ndarray, BarContainer | Polygon | list[BarContainer | Polygon],]: + ... + +@_copy_docstring_and_deprecators(Axes.stairs) +def stairs(values: ArrayLike, edges: ArrayLike | None = ..., *, orientation: Literal["vertical", "horizontal"] = ..., baseline: float | ArrayLike | None = ..., fill: bool = ..., data=..., **kwargs) -> StepPatch: + ... + +@_copy_docstring_and_deprecators(Axes.hist2d) +def hist2d(x: ArrayLike, y: ArrayLike, bins: None | int | tuple[int, int] | ArrayLike | tuple[ArrayLike, ArrayLike] = ..., range: ArrayLike | None = ..., density: bool = ..., weights: ArrayLike | None = ..., cmin: float | None = ..., cmax: float | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, np.ndarray, QuadMesh]: + ... + +@_copy_docstring_and_deprecators(Axes.hlines) +def hlines(y: float | ArrayLike, xmin: float | ArrayLike, xmax: float | ArrayLike, colors: ColorType | Sequence[ColorType] | None = ..., linestyles: LineStyleType = ..., label: str = ..., *, data=..., **kwargs) -> LineCollection: + ... + +@_copy_docstring_and_deprecators(Axes.imshow) +def imshow(X: ArrayLike | PIL.Image.Image, cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., *, aspect: Literal["equal", "auto"] | float | None = ..., interpolation: str | None = ..., alpha: float | ArrayLike | None = ..., vmin: float | None = ..., vmax: float | None = ..., origin: Literal["upper", "lower"] | None = ..., extent: tuple[float, float, float, float] | None = ..., interpolation_stage: Literal["data", "rgba"] | None = ..., filternorm: bool = ..., filterrad: float = ..., resample: bool | None = ..., url: str | None = ..., data=..., **kwargs) -> AxesImage: + ... + +@_copy_docstring_and_deprecators(Axes.legend) +def legend(*args, **kwargs) -> Legend: + ... + +@_copy_docstring_and_deprecators(Axes.locator_params) +def locator_params(axis: Literal["both", "x", "y"] = ..., tight: bool | None = ..., **kwargs) -> None: + ... + +@_copy_docstring_and_deprecators(Axes.loglog) +def loglog(*args, **kwargs) -> list[Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.magnitude_spectrum) +def magnitude_spectrum(x: ArrayLike, Fs: float | None = ..., Fc: int | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale: Literal["default", "linear", "dB"] | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.margins) +def margins(*margins: float, x: float | None = ..., y: float | None = ..., tight: bool | None = ...) -> tuple[float, float] | None: + ... + +@_copy_docstring_and_deprecators(Axes.minorticks_off) +def minorticks_off() -> None: + ... + +@_copy_docstring_and_deprecators(Axes.minorticks_on) +def minorticks_on() -> None: + ... + +@_copy_docstring_and_deprecators(Axes.pcolor) +def pcolor(*args: ArrayLike, shading: Literal["flat", "nearest", "auto"] | None = ..., alpha: float | None = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., data=..., **kwargs) -> Collection: + ... + +@_copy_docstring_and_deprecators(Axes.pcolormesh) +def pcolormesh(*args: ArrayLike, alpha: float | None = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., shading: Literal["flat", "nearest", "gouraud", "auto"] | None = ..., antialiased: bool = ..., data=..., **kwargs) -> QuadMesh: + ... + +@_copy_docstring_and_deprecators(Axes.phase_spectrum) +def phase_spectrum(x: ArrayLike, Fs: float | None = ..., Fc: int | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.pie) +def pie(x: ArrayLike, explode: ArrayLike | None = ..., labels: Sequence[str] | None = ..., colors: ColorType | Sequence[ColorType] | None = ..., autopct: str | Callable[[float], str] | None = ..., pctdistance: float = ..., shadow: bool = ..., labeldistance: float | None = ..., startangle: float = ..., radius: float = ..., counterclock: bool = ..., wedgeprops: dict[str, Any] | None = ..., textprops: dict[str, Any] | None = ..., center: tuple[float, float] = ..., frame: bool = ..., rotatelabels: bool = ..., *, normalize: bool = ..., hatch: str | Sequence[str] | None = ..., data=...) -> tuple[list[Wedge], list[Text]] | tuple[list[Wedge], list[Text], list[Text]]: + ... + +@_copy_docstring_and_deprecators(Axes.plot) +def plot(*args: float | ArrayLike | str, scalex: bool = ..., scaley: bool = ..., data=..., **kwargs) -> list[Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.plot_date) +def plot_date(x: ArrayLike, y: ArrayLike, fmt: str = ..., tz: str | datetime.tzinfo | None = ..., xdate: bool = ..., ydate: bool = ..., *, data=..., **kwargs) -> list[Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.psd) +def psd(x: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., Fc: int | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ..., return_line: bool | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray] | tuple[np.ndarray, np.ndarray, Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.quiver) +def quiver(*args, data=..., **kwargs) -> Quiver: + ... + +@_copy_docstring_and_deprecators(Axes.quiverkey) +def quiverkey(Q: Quiver, X: float, Y: float, U: float, label: str, **kwargs) -> QuiverKey: + ... + +@_copy_docstring_and_deprecators(Axes.scatter) +def scatter(x: float | ArrayLike, y: float | ArrayLike, s: float | ArrayLike | None = ..., c: Sequence[ColorType] | ColorType | None = ..., marker: MarkerType | None = ..., cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., vmin: float | None = ..., vmax: float | None = ..., alpha: float | None = ..., linewidths: float | Sequence[float] | None = ..., *, edgecolors: Literal["face", "none"] | ColorType | Sequence[ColorType] | None = ..., plotnonfinite: bool = ..., data=..., **kwargs) -> PathCollection: + ... + +@_copy_docstring_and_deprecators(Axes.semilogx) +def semilogx(*args, **kwargs) -> list[Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.semilogy) +def semilogy(*args, **kwargs) -> list[Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.specgram) +def specgram(x: ArrayLike, NFFT: int | None = ..., Fs: float | None = ..., Fc: int | None = ..., detrend: Literal["none", "mean", "linear"] | Callable[[ArrayLike], ArrayLike] | None = ..., window: Callable[[ArrayLike], ArrayLike] | ArrayLike | None = ..., noverlap: int | None = ..., cmap: str | Colormap | None = ..., xextent: tuple[float, float] | None = ..., pad_to: int | None = ..., sides: Literal["default", "onesided", "twosided"] | None = ..., scale_by_freq: bool | None = ..., mode: Literal["default", "psd", "magnitude", "angle", "phase"] | None = ..., scale: Literal["default", "linear", "dB"] | None = ..., vmin: float | None = ..., vmax: float | None = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, np.ndarray, AxesImage]: + ... + +@_copy_docstring_and_deprecators(Axes.spy) +def spy(Z: ArrayLike, precision: float | Literal["present"] = ..., marker: str | None = ..., markersize: float | None = ..., aspect: Literal["equal", "auto"] | float | None = ..., origin: Literal["upper", "lower"] = ..., **kwargs) -> AxesImage: + ... + +@_copy_docstring_and_deprecators(Axes.stackplot) +def stackplot(x, *args, labels=..., colors=..., baseline=..., data=..., **kwargs): # -> list[PolyCollection]: + ... + +@_copy_docstring_and_deprecators(Axes.stem) +def stem(*args: ArrayLike | str, linefmt: str | None = ..., markerfmt: str | None = ..., basefmt: str | None = ..., bottom: float = ..., label: str | None = ..., orientation: Literal["vertical", "horizontal"] = ..., data=...) -> StemContainer: + ... + +@_copy_docstring_and_deprecators(Axes.step) +def step(x: ArrayLike, y: ArrayLike, *args, where: Literal["pre", "post", "mid"] = ..., data=..., **kwargs) -> list[Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.streamplot) +def streamplot(x, y, u, v, density=..., linewidth=..., color=..., cmap=..., norm=..., arrowsize=..., arrowstyle=..., minlength=..., transform=..., zorder=..., start_points=..., maxlength=..., integration_direction=..., broken_streamlines=..., *, data=...): # -> StreamplotSet: + ... + +@_copy_docstring_and_deprecators(Axes.table) +def table(cellText=..., cellColours=..., cellLoc=..., colWidths=..., rowLabels=..., rowColours=..., rowLoc=..., colLabels=..., colColours=..., colLoc=..., loc=..., bbox=..., edges=..., **kwargs): # -> Table: + ... + +@_copy_docstring_and_deprecators(Axes.text) +def text(x: float, y: float, s: str, fontdict: dict[str, Any] | None = ..., **kwargs) -> Text: + ... + +@_copy_docstring_and_deprecators(Axes.tick_params) +def tick_params(axis: Literal["both", "x", "y"] = ..., **kwargs) -> None: + ... + +@_copy_docstring_and_deprecators(Axes.ticklabel_format) +def ticklabel_format(*, axis: Literal["both", "x", "y"] = ..., style: Literal["", "sci", "scientific", "plain"] = ..., scilimits: tuple[int, int] | None = ..., useOffset: bool | float | None = ..., useLocale: bool | None = ..., useMathText: bool | None = ...) -> None: + ... + +@_copy_docstring_and_deprecators(Axes.tricontour) +def tricontour(*args, **kwargs): # -> TriContourSet: + ... + +@_copy_docstring_and_deprecators(Axes.tricontourf) +def tricontourf(*args, **kwargs): # -> TriContourSet: + ... + +@_copy_docstring_and_deprecators(Axes.tripcolor) +def tripcolor(*args, alpha=..., norm=..., cmap=..., vmin=..., vmax=..., shading=..., facecolors=..., **kwargs): + ... + +@_copy_docstring_and_deprecators(Axes.triplot) +def triplot(*args, **kwargs): # -> tuple[Line2D, Line2D]: + ... + +@_copy_docstring_and_deprecators(Axes.violinplot) +def violinplot(dataset: ArrayLike | Sequence[ArrayLike], positions: ArrayLike | None = ..., vert: bool = ..., widths: float | ArrayLike = ..., showmeans: bool = ..., showextrema: bool = ..., showmedians: bool = ..., quantiles: Sequence[float | Sequence[float]] | None = ..., points: int = ..., bw_method: Literal["scott", "silverman"] | float | Callable[[GaussianKDE], float] | None = ..., *, data=...) -> dict[str, Collection]: + ... + +@_copy_docstring_and_deprecators(Axes.vlines) +def vlines(x: float | ArrayLike, ymin: float | ArrayLike, ymax: float | ArrayLike, colors: ColorType | Sequence[ColorType] | None = ..., linestyles: LineStyleType = ..., label: str = ..., *, data=..., **kwargs) -> LineCollection: + ... + +@_copy_docstring_and_deprecators(Axes.xcorr) +def xcorr(x: ArrayLike, y: ArrayLike, normed: bool = ..., detrend: Callable[[ArrayLike], ArrayLike] = ..., usevlines: bool = ..., maxlags: int = ..., *, data=..., **kwargs) -> tuple[np.ndarray, np.ndarray, LineCollection | Line2D, Line2D | None]: + ... + +@_copy_docstring_and_deprecators(Axes._sci) +def sci(im: ScalarMappable) -> None: + ... + +@_copy_docstring_and_deprecators(Axes.set_title) +def title(label: str, fontdict: dict[str, Any] | None = ..., loc: Literal["left", "center", "right"] | None = ..., pad: float | None = ..., *, y: float | None = ..., **kwargs) -> Text: + ... + +@_copy_docstring_and_deprecators(Axes.set_xlabel) +def xlabel(xlabel: str, fontdict: dict[str, Any] | None = ..., labelpad: float | None = ..., *, loc: Literal["left", "center", "right"] | None = ..., **kwargs) -> Text: + ... + +@_copy_docstring_and_deprecators(Axes.set_ylabel) +def ylabel(ylabel: str, fontdict: dict[str, Any] | None = ..., labelpad: float | None = ..., *, loc: Literal["bottom", "center", "top"] | None = ..., **kwargs) -> Text: + ... + +@_copy_docstring_and_deprecators(Axes.set_xscale) +def xscale(value: str | ScaleBase, **kwargs) -> None: + ... + +@_copy_docstring_and_deprecators(Axes.set_yscale) +def yscale(value: str | ScaleBase, **kwargs) -> None: + ... + +def autumn() -> None: + """ + Set the colormap to 'autumn'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def bone() -> None: + """ + Set the colormap to 'bone'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def cool() -> None: + """ + Set the colormap to 'cool'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def copper() -> None: + """ + Set the colormap to 'copper'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def flag() -> None: + """ + Set the colormap to 'flag'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def gray() -> None: + """ + Set the colormap to 'gray'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def hot() -> None: + """ + Set the colormap to 'hot'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def hsv() -> None: + """ + Set the colormap to 'hsv'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def jet() -> None: + """ + Set the colormap to 'jet'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def pink() -> None: + """ + Set the colormap to 'pink'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def prism() -> None: + """ + Set the colormap to 'prism'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def spring() -> None: + """ + Set the colormap to 'spring'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def summer() -> None: + """ + Set the colormap to 'summer'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def winter() -> None: + """ + Set the colormap to 'winter'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def magma() -> None: + """ + Set the colormap to 'magma'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def inferno() -> None: + """ + Set the colormap to 'inferno'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def plasma() -> None: + """ + Set the colormap to 'plasma'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def viridis() -> None: + """ + Set the colormap to 'viridis'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + +def nipy_spectral() -> None: + """ + Set the colormap to 'nipy_spectral'. + + This changes the default colormap as well as the colormap of the current + image if there is one. See ``help(colormaps)`` for more information. + """ + ... + diff --git a/typings/matplotlib/quiver.pyi b/typings/matplotlib/quiver.pyi new file mode 100644 index 0000000..7c394c8 --- /dev/null +++ b/typings/matplotlib/quiver.pyi @@ -0,0 +1,117 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib.artist as martist +import matplotlib.collections as mcollections +import numpy as np +from matplotlib.axes import Axes +from matplotlib.figure import Figure +from matplotlib.text import Text +from matplotlib.transforms import Bbox, Transform +from numpy.typing import ArrayLike +from collections.abc import Sequence +from typing import Any, Literal, overload +from matplotlib.typing import ColorType + +class QuiverKey(martist.Artist): + halign: dict[Literal["N", "S", "E", "W"], Literal["left", "center", "right"]] + valign: dict[Literal["N", "S", "E", "W"], Literal["top", "center", "bottom"]] + pivot: dict[Literal["N", "S", "E", "W"], Literal["middle", "tip", "tail"]] + Q: Quiver + X: float + Y: float + U: float + angle: float + coord: Literal["axes", "figure", "data", "inches"] + color: ColorType | None + label: str + labelpos: Literal["N", "S", "E", "W"] + labelcolor: ColorType | None + fontproperties: dict[str, Any] + kw: dict[str, Any] + text: Text + zorder: float + def __init__(self, Q: Quiver, X: float, Y: float, U: float, label: str, *, angle: float = ..., coordinates: Literal["axes", "figure", "data", "inches"] = ..., color: ColorType | None = ..., labelsep: float = ..., labelpos: Literal["N", "S", "E", "W"] = ..., labelcolor: ColorType | None = ..., fontproperties: dict[str, Any] | None = ..., **kwargs) -> None: + ... + + @property + def labelsep(self) -> float: + ... + + def set_figure(self, fig: Figure) -> None: + ... + + + +class Quiver(mcollections.PolyCollection): + X: ArrayLike + Y: ArrayLike + XY: ArrayLike + U: ArrayLike + V: ArrayLike + Umask: ArrayLike + N: int + scale: float | None + headwidth: float + headlength: float + headaxislength: float + minshaft: float + minlength: float + units: Literal["width", "height", "dots", "inches", "x", "y", "xy"] + scale_units: Literal["width", "height", "dots", "inches", "x", "y", "xy"] | None + angles: Literal["uv", "xy"] | ArrayLike + width: float | None + pivot: Literal["tail", "middle", "tip"] + transform: Transform + polykw: dict[str, Any] + @overload + def __init__(self, ax: Axes, U: ArrayLike, V: ArrayLike, C: ArrayLike = ..., *, scale: float | None = ..., headwidth: float = ..., headlength: float = ..., headaxislength: float = ..., minshaft: float = ..., minlength: float = ..., units: Literal["width", "height", "dots", "inches", "x", "y", "xy"] = ..., scale_units: Literal["width", "height", "dots", "inches", "x", "y", "xy"] | None = ..., angles: Literal["uv", "xy"] | ArrayLike = ..., width: float | None = ..., color: ColorType | Sequence[ColorType] = ..., pivot: Literal["tail", "mid", "middle", "tip"] = ..., **kwargs) -> None: + ... + + @overload + def __init__(self, ax: Axes, X: ArrayLike, Y: ArrayLike, U: ArrayLike, V: ArrayLike, C: ArrayLike = ..., *, scale: float | None = ..., headwidth: float = ..., headlength: float = ..., headaxislength: float = ..., minshaft: float = ..., minlength: float = ..., units: Literal["width", "height", "dots", "inches", "x", "y", "xy"] = ..., scale_units: Literal["width", "height", "dots", "inches", "x", "y", "xy"] | None = ..., angles: Literal["uv", "xy"] | ArrayLike = ..., width: float | None = ..., color: ColorType | Sequence[ColorType] = ..., pivot: Literal["tail", "mid", "middle", "tip"] = ..., **kwargs) -> None: + ... + + def get_datalim(self, transData: Transform) -> Bbox: + ... + + def set_UVC(self, U: ArrayLike, V: ArrayLike, C: ArrayLike | None = ...) -> None: + ... + + @property + def quiver_doc(self) -> str: + ... + + + +class Barbs(mcollections.PolyCollection): + sizes: dict[str, float] + fill_empty: bool + barb_increments: dict[str, float] + rounding: bool + flip: np.ndarray + x: ArrayLike + y: ArrayLike + u: ArrayLike + v: ArrayLike + @overload + def __init__(self, ax: Axes, U: ArrayLike, V: ArrayLike, C: ArrayLike = ..., *, pivot: str = ..., length: int = ..., barbcolor: ColorType | Sequence[ColorType] | None = ..., flagcolor: ColorType | Sequence[ColorType] | None = ..., sizes: dict[str, float] | None = ..., fill_empty: bool = ..., barb_increments: dict[str, float] | None = ..., rounding: bool = ..., flip_barb: bool | ArrayLike = ..., **kwargs) -> None: + ... + + @overload + def __init__(self, ax: Axes, X: ArrayLike, Y: ArrayLike, U: ArrayLike, V: ArrayLike, C: ArrayLike = ..., *, pivot: str = ..., length: int = ..., barbcolor: ColorType | Sequence[ColorType] | None = ..., flagcolor: ColorType | Sequence[ColorType] | None = ..., sizes: dict[str, float] | None = ..., fill_empty: bool = ..., barb_increments: dict[str, float] | None = ..., rounding: bool = ..., flip_barb: bool | ArrayLike = ..., **kwargs) -> None: + ... + + def set_UVC(self, U: ArrayLike, V: ArrayLike, C: ArrayLike | None = ...) -> None: + ... + + def set_offsets(self, xy: ArrayLike) -> None: + ... + + @property + def barbs_doc(self) -> str: + ... + + + diff --git a/typings/matplotlib/rcsetup.pyi b/typings/matplotlib/rcsetup.pyi new file mode 100644 index 0000000..6968d18 --- /dev/null +++ b/typings/matplotlib/rcsetup.pyi @@ -0,0 +1,149 @@ +""" +This type stub file was generated by pyright. +""" + +from cycler import Cycler +from collections.abc import Iterable +from typing import Any, Literal, TypeVar +from matplotlib.typing import ColorType, MarkEveryType + +interactive_bk: list[str] +non_interactive_bk: list[str] +all_backends: list[str] +_T = TypeVar("_T") +class ValidateInStrings: + key: str + ignorecase: bool + valid: dict[str, str] + def __init__(self, key: str, valid: Iterable[str], ignorecase: bool = ..., *, _deprecated_since: str | None = ...) -> None: + ... + + def __call__(self, s: Any) -> str: + ... + + + +def validate_any(s: Any) -> Any: + ... + +def validate_anylist(s: Any) -> list[Any]: + ... + +def validate_bool(b: Any) -> bool: + ... + +def validate_axisbelow(s: Any) -> bool | Literal["line"]: + ... + +def validate_dpi(s: Any) -> Literal["figure"] | float: + ... + +def validate_string(s: Any) -> str: + ... + +def validate_string_or_None(s: Any) -> str | None: + ... + +def validate_stringlist(s: Any) -> list[str]: + ... + +def validate_int(s: Any) -> int: + ... + +def validate_int_or_None(s: Any) -> int | None: + ... + +def validate_float(s: Any) -> float: + ... + +def validate_float_or_None(s: Any) -> float | None: + ... + +def validate_floatlist(s: Any) -> list[float]: + ... + +def validate_fonttype(s: Any) -> int: + ... + +_auto_backend_sentinel: object +def validate_backend(s: Any) -> str: + ... + +def validate_color_or_inherit(s: Any) -> Literal["inherit"] | ColorType: + ... + +def validate_color_or_auto(s: Any) -> ColorType | Literal["auto"]: + ... + +def validate_color_for_prop_cycle(s: Any) -> ColorType: + ... + +def validate_color(s: Any) -> ColorType: + ... + +def validate_colorlist(s: Any) -> list[ColorType]: + ... + +def validate_aspect(s: Any) -> Literal["auto", "equal"] | float: + ... + +def validate_fontsize_None(s: Any) -> Literal["xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "smaller", "larger",] | float | None: + ... + +def validate_fontsize(s: Any) -> Literal["xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "smaller", "larger",] | float: + ... + +def validate_fontsizelist(s: Any) -> list[Literal["xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "smaller", "larger",] | float]: + ... + +def validate_fontweight(s: Any) -> Literal["ultralight", "light", "normal", "regular", "book", "medium", "roman", "semibold", "demibold", "demi", "bold", "heavy", "extra bold", "black",] | int: + ... + +def validate_fontstretch(s: Any) -> Literal["ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "normal", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded",] | int: + ... + +def validate_font_properties(s: Any) -> dict[str, Any]: + ... + +def validate_whiskers(s: Any) -> list[float] | float: + ... + +def validate_ps_distiller(s: Any) -> None | Literal["ghostscript", "xpdf"]: + ... + +def validate_fillstyle(s: Any) -> Literal["full", "left", "right", "bottom", "top", "none"]: + ... + +def validate_fillstylelist(s: Any) -> list[Literal["full", "left", "right", "bottom", "top", "none"]]: + ... + +def validate_markevery(s: Any) -> MarkEveryType: + ... + +def validate_markeverylist(s: Any) -> list[MarkEveryType]: + ... + +def validate_bbox(s: Any) -> Literal["tight", "standard"] | None: + ... + +def validate_sketch(s: Any) -> None | tuple[float, float, float]: + ... + +def validate_hatch(s: Any) -> str: + ... + +def validate_hatchlist(s: Any) -> list[str]: + ... + +def validate_dashlist(s: Any) -> list[list[float]]: + ... + +def cycler(*args, **kwargs) -> Cycler: + ... + +def validate_cycler(s: Any) -> Cycler: + ... + +def validate_hist_bins(s: Any) -> Literal["auto", "sturges", "fd", "doane", "scott", "rice", "sqrt"] | int | list[float]: + ... + diff --git a/typings/matplotlib/sankey.pyi b/typings/matplotlib/sankey.pyi new file mode 100644 index 0000000..ffec84c --- /dev/null +++ b/typings/matplotlib/sankey.pyi @@ -0,0 +1,41 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from matplotlib.axes import Axes +from collections.abc import Callable, Iterable +from typing import Any + +__license__: str +__credits__: list[str] +__author__: str +__version__: str +RIGHT: int +UP: int +DOWN: int +class Sankey: + diagrams: list[Any] + ax: Axes + unit: Any + format: str | Callable[[float], str] + scale: float + gap: float + radius: float + shoulder: float + offset: float + margin: float + pitch: float + tolerance: float + extent: np.ndarray + def __init__(self, ax: Axes | None = ..., scale: float = ..., unit: Any = ..., format: str | Callable[[float], str] = ..., gap: float = ..., radius: float = ..., shoulder: float = ..., offset: float = ..., head_angle: float = ..., margin: float = ..., tolerance: float = ..., **kwargs) -> None: + ... + + def add(self, patchlabel: str = ..., flows: Iterable[float] | None = ..., orientations: Iterable[int] | None = ..., labels: str | Iterable[str | None] = ..., trunklength: float = ..., pathlengths: float | Iterable[float] = ..., prior: int | None = ..., connect: tuple[int, int] = ..., rotation: float = ..., **kwargs) -> Sankey: + ... + + def finish(self) -> list[Any]: + ... + + + diff --git a/typings/matplotlib/scale.pyi b/typings/matplotlib/scale.pyi new file mode 100644 index 0000000..96c3a5e --- /dev/null +++ b/typings/matplotlib/scale.pyi @@ -0,0 +1,232 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.axis import Axis +from matplotlib.transforms import Transform +from collections.abc import Callable, Iterable +from typing import Literal +from numpy.typing import ArrayLike + +class ScaleBase: + def __init__(self, axis: Axis | None) -> None: + ... + + def get_transform(self) -> Transform: + ... + + def set_default_locators_and_formatters(self, axis: Axis) -> None: + ... + + def limit_range_for_scale(self, vmin: float, vmax: float, minpos: float) -> tuple[float, float]: + ... + + + +class LinearScale(ScaleBase): + name: str + ... + + +class FuncTransform(Transform): + input_dims: int + output_dims: int + def __init__(self, forward: Callable[[ArrayLike], ArrayLike], inverse: Callable[[ArrayLike], ArrayLike]) -> None: + ... + + def inverted(self) -> FuncTransform: + ... + + + +class FuncScale(ScaleBase): + name: str + def __init__(self, axis: Axis | None, functions: tuple[Callable[[ArrayLike], ArrayLike], Callable[[ArrayLike], ArrayLike]]) -> None: + ... + + + +class LogTransform(Transform): + input_dims: int + output_dims: int + base: float + def __init__(self, base: float, nonpositive: Literal["clip", "mask"] = ...) -> None: + ... + + def inverted(self) -> InvertedLogTransform: + ... + + + +class InvertedLogTransform(Transform): + input_dims: int + output_dims: int + base: float + def __init__(self, base: float) -> None: + ... + + def inverted(self) -> LogTransform: + ... + + + +class LogScale(ScaleBase): + name: str + subs: Iterable[int] | None + def __init__(self, axis: Axis | None, *, base: float = ..., subs: Iterable[int] | None = ..., nonpositive: Literal["clip", "mask"] = ...) -> None: + ... + + @property + def base(self) -> float: + ... + + def get_transform(self) -> Transform: + ... + + + +class FuncScaleLog(LogScale): + def __init__(self, axis: Axis | None, functions: tuple[Callable[[ArrayLike], ArrayLike], Callable[[ArrayLike], ArrayLike]], base: float = ...) -> None: + ... + + @property + def base(self) -> float: + ... + + def get_transform(self) -> Transform: + ... + + + +class SymmetricalLogTransform(Transform): + input_dims: int + output_dims: int + base: float + linthresh: float + linscale: float + def __init__(self, base: float, linthresh: float, linscale: float) -> None: + ... + + def inverted(self) -> InvertedSymmetricalLogTransform: + ... + + + +class InvertedSymmetricalLogTransform(Transform): + input_dims: int + output_dims: int + base: float + linthresh: float + invlinthresh: float + linscale: float + def __init__(self, base: float, linthresh: float, linscale: float) -> None: + ... + + def inverted(self) -> SymmetricalLogTransform: + ... + + + +class SymmetricalLogScale(ScaleBase): + name: str + subs: Iterable[int] | None + def __init__(self, axis: Axis | None, *, base: float = ..., linthresh: float = ..., subs: Iterable[int] | None = ..., linscale: float = ...) -> None: + ... + + @property + def base(self) -> float: + ... + + @property + def linthresh(self) -> float: + ... + + @property + def linscale(self) -> float: + ... + + def get_transform(self) -> SymmetricalLogTransform: + ... + + + +class AsinhTransform(Transform): + input_dims: int + output_dims: int + linear_width: float + def __init__(self, linear_width: float) -> None: + ... + + def inverted(self) -> InvertedAsinhTransform: + ... + + + +class InvertedAsinhTransform(Transform): + input_dims: int + output_dims: int + linear_width: float + def __init__(self, linear_width: float) -> None: + ... + + def inverted(self) -> AsinhTransform: + ... + + + +class AsinhScale(ScaleBase): + name: str + auto_tick_multipliers: dict[int, tuple[int, ...]] + def __init__(self, axis: Axis | None, *, linear_width: float = ..., base: float = ..., subs: Iterable[int] | Literal["auto"] | None = ..., **kwargs) -> None: + ... + + @property + def linear_width(self) -> float: + ... + + def get_transform(self) -> AsinhTransform: + ... + + + +class LogitTransform(Transform): + input_dims: int + output_dims: int + def __init__(self, nonpositive: Literal["mask", "clip"] = ...) -> None: + ... + + def inverted(self) -> LogisticTransform: + ... + + + +class LogisticTransform(Transform): + input_dims: int + output_dims: int + def __init__(self, nonpositive: Literal["mask", "clip"] = ...) -> None: + ... + + def inverted(self) -> LogitTransform: + ... + + + +class LogitScale(ScaleBase): + name: str + def __init__(self, axis: Axis | None, nonpositive: Literal["mask", "clip"] = ..., *, one_half: str = ..., use_overline: bool = ...) -> None: + ... + + def get_transform(self) -> LogitTransform: + ... + + + +def get_scale_names() -> list[str]: + ... + +def scale_factory(scale: str, axis: Axis, **kwargs) -> ScaleBase: + ... + +def register_scale(scale_class: type[ScaleBase]) -> None: + ... + diff --git a/typings/matplotlib/sphinxext/__init__.pyi b/typings/matplotlib/sphinxext/__init__.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/matplotlib/sphinxext/__init__.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/matplotlib/spines.pyi b/typings/matplotlib/spines.pyi new file mode 100644 index 0000000..e8b581d --- /dev/null +++ b/typings/matplotlib/spines.pyi @@ -0,0 +1,119 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib.patches as mpatches +from collections.abc import Callable, Iterator, MutableMapping +from typing import Literal, TypeVar, overload +from matplotlib.axes import Axes +from matplotlib.axis import Axis +from matplotlib.path import Path +from matplotlib.transforms import Transform +from matplotlib.typing import ColorType + +class Spine(mpatches.Patch): + axes: Axes + spine_type: str + axis: Axis | None + def __init__(self, axes: Axes, spine_type: str, path: Path, **kwargs) -> None: + ... + + def set_patch_arc(self, center: tuple[float, float], radius: float, theta1: float, theta2: float) -> None: + ... + + def set_patch_circle(self, center: tuple[float, float], radius: float) -> None: + ... + + def set_patch_line(self) -> None: + ... + + def get_patch_transform(self) -> Transform: + ... + + def get_path(self) -> Path: + ... + + def register_axis(self, axis: Axis) -> None: + ... + + def clear(self) -> None: + ... + + def set_position(self, position: Literal["center", "zero"] | tuple[Literal["outward", "axes", "data"], float]) -> None: + ... + + def get_position(self) -> Literal["center", "zero"] | tuple[Literal["outward", "axes", "data"], float]: + ... + + def get_spine_transform(self) -> Transform: + ... + + def set_bounds(self, low: float | None = ..., high: float | None = ...) -> None: + ... + + def get_bounds(self) -> tuple[float, float]: + ... + + _T = TypeVar("_T", bound=Spine) + @classmethod + def linear_spine(cls: type[_T], axes: Axes, spine_type: Literal["left", "right", "bottom", "top"], **kwargs) -> _T: + ... + + @classmethod + def arc_spine(cls: type[_T], axes: Axes, spine_type: Literal["left", "right", "bottom", "top"], center: tuple[float, float], radius: float, theta1: float, theta2: float, **kwargs) -> _T: + ... + + @classmethod + def circular_spine(cls: type[_T], axes: Axes, center: tuple[float, float], radius: float, **kwargs) -> _T: + ... + + def set_color(self, c: ColorType | None) -> None: + ... + + + +class SpinesProxy: + def __init__(self, spine_dict: dict[str, Spine]) -> None: + ... + + def __getattr__(self, name: str) -> Callable[..., None]: + ... + + def __dir__(self) -> list[str]: + ... + + + +class Spines(MutableMapping[str, Spine]): + def __init__(self, **kwargs: Spine) -> None: + ... + + @classmethod + def from_dict(cls, d: dict[str, Spine]) -> Spines: + ... + + def __getattr__(self, name: str) -> Spine: + ... + + @overload + def __getitem__(self, key: str) -> Spine: + ... + + @overload + def __getitem__(self, key: list[str]) -> SpinesProxy: + ... + + def __setitem__(self, key: str, value: Spine) -> None: + ... + + def __delitem__(self, key: str) -> None: + ... + + def __iter__(self) -> Iterator[str]: + ... + + def __len__(self) -> int: + ... + + + diff --git a/typings/matplotlib/stackplot.pyi b/typings/matplotlib/stackplot.pyi new file mode 100644 index 0000000..9d4387a --- /dev/null +++ b/typings/matplotlib/stackplot.pyi @@ -0,0 +1,14 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.axes import Axes +from matplotlib.collections import PolyCollection +from collections.abc import Iterable +from typing import Literal +from numpy.typing import ArrayLike +from matplotlib.typing import ColorType + +def stackplot(axes: Axes, x: ArrayLike, *args: ArrayLike, labels: Iterable[str] = ..., colors: Iterable[ColorType] | None = ..., baseline: Literal["zero", "sym", "wiggle", "weighted_wiggle"] = ..., **kwargs) -> list[PolyCollection]: + ... + diff --git a/typings/matplotlib/streamplot.pyi b/typings/matplotlib/streamplot.pyi new file mode 100644 index 0000000..478bdf5 --- /dev/null +++ b/typings/matplotlib/streamplot.pyi @@ -0,0 +1,107 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.axes import Axes +from matplotlib.colors import Colormap, Normalize +from matplotlib.collections import LineCollection, PatchCollection +from matplotlib.patches import ArrowStyle +from matplotlib.transforms import Transform +from typing import Literal +from numpy.typing import ArrayLike +from .typing import ColorType + +def streamplot(axes: Axes, x: ArrayLike, y: ArrayLike, u: ArrayLike, v: ArrayLike, density: float | tuple[float, float] = ..., linewidth: float | ArrayLike | None = ..., color: ColorType | ArrayLike | None = ..., cmap: str | Colormap | None = ..., norm: str | Normalize | None = ..., arrowsize: float = ..., arrowstyle: str | ArrowStyle = ..., minlength: float = ..., transform: Transform | None = ..., zorder: float | None = ..., start_points: ArrayLike | None = ..., maxlength: float = ..., integration_direction: Literal["forward", "backward", "both"] = ..., broken_streamlines: bool = ...) -> StreamplotSet: + ... + +class StreamplotSet: + lines: LineCollection + arrows: PatchCollection + def __init__(self, lines: LineCollection, arrows: PatchCollection) -> None: + ... + + + +class DomainMap: + grid: Grid + mask: StreamMask + x_grid2mask: float + y_grid2mask: float + x_mask2grid: float + y_mask2grid: float + x_data2grid: float + y_data2grid: float + def __init__(self, grid: Grid, mask: StreamMask) -> None: + ... + + def grid2mask(self, xi: float, yi: float) -> tuple[int, int]: + ... + + def mask2grid(self, xm: float, ym: float) -> tuple[float, float]: + ... + + def data2grid(self, xd: float, yd: float) -> tuple[float, float]: + ... + + def grid2data(self, xg: float, yg: float) -> tuple[float, float]: + ... + + def start_trajectory(self, xg: float, yg: float, broken_streamlines: bool = ...) -> None: + ... + + def reset_start_point(self, xg: float, yg: float) -> None: + ... + + def update_trajectory(self, xg, yg, broken_streamlines: bool = ...) -> None: + ... + + def undo_trajectory(self) -> None: + ... + + + +class Grid: + nx: int + ny: int + dx: float + dy: float + x_origin: float + y_origin: float + width: float + height: float + def __init__(self, x: ArrayLike, y: ArrayLike) -> None: + ... + + @property + def shape(self) -> tuple[int, int]: + ... + + def within_grid(self, xi: float, yi: float) -> bool: + ... + + + +class StreamMask: + nx: int + ny: int + shape: tuple[int, int] + def __init__(self, density: float | tuple[float, float]) -> None: + ... + + def __getitem__(self, args): + ... + + + +class InvalidIndexError(Exception): + ... + + +class TerminateTrajectory(Exception): + ... + + +class OutOfBounds(IndexError): + ... + + diff --git a/typings/matplotlib/style/__init__.pyi b/typings/matplotlib/style/__init__.pyi new file mode 100644 index 0000000..2561204 --- /dev/null +++ b/typings/matplotlib/style/__init__.pyi @@ -0,0 +1,7 @@ +""" +This type stub file was generated by pyright. +""" + +from .core import available, context, library, reload_library, use + +__all__ = ["available", "context", "library", "reload_library", "use"] diff --git a/typings/matplotlib/style/core.pyi b/typings/matplotlib/style/core.pyi new file mode 100644 index 0000000..da07038 --- /dev/null +++ b/typings/matplotlib/style/core.pyi @@ -0,0 +1,23 @@ +""" +This type stub file was generated by pyright. +""" + +import contextlib +from collections.abc import Generator +from matplotlib import RcParams +from matplotlib.typing import RcStyleType + +USER_LIBRARY_PATHS: list[str] = ... +STYLE_EXTENSION: str = ... +def use(style: RcStyleType) -> None: + ... + +@contextlib.contextmanager +def context(style: RcStyleType, after_reset: bool = ...) -> Generator[None, None, None]: + ... + +library: dict[str, RcParams] +available: list[str] +def reload_library() -> None: + ... + diff --git a/typings/matplotlib/table.pyi b/typings/matplotlib/table.pyi new file mode 100644 index 0000000..b5f85c0 --- /dev/null +++ b/typings/matplotlib/table.pyi @@ -0,0 +1,108 @@ +""" +This type stub file was generated by pyright. +""" + +from .artist import Artist +from .axes import Axes +from .backend_bases import RendererBase +from .patches import Rectangle +from .path import Path +from .text import Text +from .transforms import Bbox +from .typing import ColorType +from collections.abc import Sequence +from typing import Any, Literal + +class Cell(Rectangle): + PAD: float + def __init__(self, xy: tuple[float, float], width: float, height: float, *, edgecolor: ColorType = ..., facecolor: ColorType = ..., fill: bool = ..., text: str = ..., loc: Literal["left", "center", "right"] | None = ..., fontproperties: dict[str, Any] | None = ..., visible_edges: str | None = ...) -> None: + ... + + def get_text(self) -> Text: + ... + + def set_fontsize(self, size: float) -> None: + ... + + def get_fontsize(self) -> float: + ... + + def auto_set_font_size(self, renderer: RendererBase) -> float: + ... + + def get_text_bounds(self, renderer: RendererBase) -> tuple[float, float, float, float]: + ... + + def get_required_width(self, renderer: RendererBase) -> float: + ... + + def set_text_props(self, **kwargs) -> None: + ... + + @property + def visible_edges(self) -> str: + ... + + @visible_edges.setter + def visible_edges(self, value: str | None) -> None: + ... + + def get_path(self) -> Path: + ... + + + +CustomCell = Cell +class Table(Artist): + codes: dict[str, int] + FONTSIZE: float + AXESPAD: float + def __init__(self, ax: Axes, loc: str | None = ..., bbox: Bbox | None = ..., **kwargs) -> None: + ... + + def add_cell(self, row: int, col: int, *args, **kwargs) -> Cell: + ... + + def __setitem__(self, position: tuple[int, int], cell: Cell) -> None: + ... + + def __getitem__(self, position: tuple[int, int]) -> Cell: + ... + + @property + def edges(self) -> str | None: + ... + + @edges.setter + def edges(self, value: str | None) -> None: + ... + + def draw(self, renderer) -> None: + ... + + def get_children(self) -> list[Artist]: + ... + + def get_window_extent(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + def auto_set_column_width(self, col: int | Sequence[int]) -> None: + ... + + def auto_set_font_size(self, value: bool = ...) -> None: + ... + + def scale(self, xscale: float, yscale: float) -> None: + ... + + def set_fontsize(self, size: float) -> None: + ... + + def get_celld(self) -> dict[tuple[int, int], Cell]: + ... + + + +def table(ax: Axes, cellText: Sequence[Sequence[str]] | None = ..., cellColours: Sequence[Sequence[ColorType]] | None = ..., cellLoc: Literal["left", "center", "right"] = ..., colWidths: Sequence[float] | None = ..., rowLabels: Sequence[str] | None = ..., rowColours: Sequence[ColorType] | None = ..., rowLoc: Literal["left", "center", "right"] = ..., colLabels: Sequence[str] | None = ..., colColours: Sequence[ColorType] | None = ..., colLoc: Literal["left", "center", "right"] = ..., loc: str = ..., bbox: Bbox | None = ..., edges: str = ..., **kwargs) -> Table: + ... + diff --git a/typings/matplotlib/testing/__init__.pyi b/typings/matplotlib/testing/__init__.pyi new file mode 100644 index 0000000..c049c56 --- /dev/null +++ b/typings/matplotlib/testing/__init__.pyi @@ -0,0 +1,32 @@ +""" +This type stub file was generated by pyright. +""" + +import subprocess +from collections.abc import Callable +from typing import Any, IO, Literal, overload + +def set_font_settings_for_testing() -> None: + ... + +def set_reproducibility_for_testing() -> None: + ... + +def setup() -> None: + ... + +@overload +def subprocess_run_for_testing(command: list[str], env: dict[str, str] | None = ..., timeout: float | None = ..., stdout: int | IO[Any] | None = ..., stderr: int | IO[Any] | None = ..., check: bool = ..., *, text: Literal[True], capture_output: bool = ...) -> subprocess.CompletedProcess[str]: + ... + +@overload +def subprocess_run_for_testing(command: list[str], env: dict[str, str] | None = ..., timeout: float | None = ..., stdout: int | IO[Any] | None = ..., stderr: int | IO[Any] | None = ..., check: bool = ..., text: Literal[False] = ..., capture_output: bool = ...) -> subprocess.CompletedProcess[bytes]: + ... + +@overload +def subprocess_run_for_testing(command: list[str], env: dict[str, str] | None = ..., timeout: float | None = ..., stdout: int | IO[Any] | None = ..., stderr: int | IO[Any] | None = ..., check: bool = ..., text: bool = ..., capture_output: bool = ...) -> subprocess.CompletedProcess[bytes] | subprocess.CompletedProcess[str]: + ... + +def subprocess_run_helper(func: Callable[[], None], *args: Any, timeout: float, extra_env: dict[str, str] | None = ...) -> subprocess.CompletedProcess[str]: + ... + diff --git a/typings/matplotlib/tests/__init__.pyi b/typings/matplotlib/tests/__init__.pyi new file mode 100644 index 0000000..4b2d379 --- /dev/null +++ b/typings/matplotlib/tests/__init__.pyi @@ -0,0 +1,8 @@ +""" +This type stub file was generated by pyright. +""" + +from pathlib import Path + +if not(Path(__file__).parent / 'baseline_images').exists(): + ... diff --git a/typings/matplotlib/texmanager.pyi b/typings/matplotlib/texmanager.pyi new file mode 100644 index 0000000..9e6e83f --- /dev/null +++ b/typings/matplotlib/texmanager.pyi @@ -0,0 +1,48 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from .backend_bases import RendererBase +from matplotlib.typing import ColorType + +class TexManager: + texcache: str + @classmethod + def get_basefile(cls, tex: str, fontsize: float, dpi: float | None = ...) -> str: + ... + + @classmethod + def get_font_preamble(cls) -> str: + ... + + @classmethod + def get_custom_preamble(cls) -> str: + ... + + @classmethod + def make_tex(cls, tex: str, fontsize: float) -> str: + ... + + @classmethod + def make_dvi(cls, tex: str, fontsize: float) -> str: + ... + + @classmethod + def make_png(cls, tex: str, fontsize: float, dpi: float) -> str: + ... + + @classmethod + def get_grey(cls, tex: str, fontsize: float | None = ..., dpi: float | None = ...) -> np.ndarray: + ... + + @classmethod + def get_rgba(cls, tex: str, fontsize: float | None = ..., dpi: float | None = ..., rgb: ColorType = ...) -> np.ndarray: + ... + + @classmethod + def get_text_width_height_descent(cls, tex: str, fontsize, renderer: RendererBase | None = ...) -> tuple[int, int, int]: + ... + + + diff --git a/typings/matplotlib/text.pyi b/typings/matplotlib/text.pyi new file mode 100644 index 0000000..0ee621b --- /dev/null +++ b/typings/matplotlib/text.pyi @@ -0,0 +1,257 @@ +""" +This type stub file was generated by pyright. +""" + +from .artist import Artist +from .backend_bases import RendererBase +from .font_manager import FontProperties +from .offsetbox import DraggableAnnotation +from .path import Path +from .patches import FancyArrowPatch, FancyBboxPatch +from .transforms import Bbox, BboxBase, Transform +from collections.abc import Callable, Iterable +from typing import Any, Literal +from .typing import ColorType + +class Text(Artist): + zorder: float + def __init__(self, x: float = ..., y: float = ..., text: Any = ..., *, color: ColorType | None = ..., verticalalignment: Literal["bottom", "baseline", "center", "center_baseline", "top"] = ..., horizontalalignment: Literal["left", "center", "right"] = ..., multialignment: Literal["left", "center", "right"] | None = ..., fontproperties: str | Path | FontProperties | None = ..., rotation: float | Literal["vertical", "horizontal"] | None = ..., linespacing: float | None = ..., rotation_mode: Literal["default", "anchor"] | None = ..., usetex: bool | None = ..., wrap: bool = ..., transform_rotates_text: bool = ..., parse_math: bool | None = ..., antialiased: bool | None = ..., **kwargs) -> None: + ... + + def update(self, kwargs: dict[str, Any]) -> list[Any]: + ... + + def get_rotation(self) -> float: + ... + + def get_transform_rotates_text(self) -> bool: + ... + + def set_rotation_mode(self, m: None | Literal["default", "anchor"]) -> None: + ... + + def get_rotation_mode(self) -> Literal["default", "anchor"]: + ... + + def set_bbox(self, rectprops: dict[str, Any]) -> None: + ... + + def get_bbox_patch(self) -> None | FancyBboxPatch: + ... + + def update_bbox_position_size(self, renderer: RendererBase) -> None: + ... + + def get_wrap(self) -> bool: + ... + + def set_wrap(self, wrap: bool) -> None: + ... + + def get_color(self) -> ColorType: + ... + + def get_fontproperties(self) -> FontProperties: + ... + + def get_fontfamily(self) -> list[str]: + ... + + def get_fontname(self) -> str: + ... + + def get_fontstyle(self) -> Literal["normal", "italic", "oblique"]: + ... + + def get_fontsize(self) -> float | str: + ... + + def get_fontvariant(self) -> Literal["normal", "small-caps"]: + ... + + def get_fontweight(self) -> int | str: + ... + + def get_stretch(self) -> int | str: + ... + + def get_horizontalalignment(self) -> Literal["left", "center", "right"]: + ... + + def get_unitless_position(self) -> tuple[float, float]: + ... + + def get_position(self) -> tuple[float, float]: + ... + + def get_text(self) -> str: + ... + + def get_verticalalignment(self) -> Literal["bottom", "baseline", "center", "center_baseline", "top"]: + ... + + def get_window_extent(self, renderer: RendererBase | None = ..., dpi: float | None = ...) -> Bbox: + ... + + def set_backgroundcolor(self, color: ColorType) -> None: + ... + + def set_color(self, color: ColorType) -> None: + ... + + def set_horizontalalignment(self, align: Literal["left", "center", "right"]) -> None: + ... + + def set_multialignment(self, align: Literal["left", "center", "right"]) -> None: + ... + + def set_linespacing(self, spacing: float) -> None: + ... + + def set_fontfamily(self, fontname: str | Iterable[str]) -> None: + ... + + def set_fontvariant(self, variant: Literal["normal", "small-caps"]) -> None: + ... + + def set_fontstyle(self, fontstyle: Literal["normal", "italic", "oblique"]) -> None: + ... + + def set_fontsize(self, fontsize: float | str) -> None: + ... + + def get_math_fontfamily(self) -> str: + ... + + def set_math_fontfamily(self, fontfamily: str) -> None: + ... + + def set_fontweight(self, weight: int | str) -> None: + ... + + def set_fontstretch(self, stretch: int | str) -> None: + ... + + def set_position(self, xy: tuple[float, float]) -> None: + ... + + def set_x(self, x: float) -> None: + ... + + def set_y(self, y: float) -> None: + ... + + def set_rotation(self, s: float) -> None: + ... + + def set_transform_rotates_text(self, t: bool) -> None: + ... + + def set_verticalalignment(self, align: Literal["bottom", "baseline", "center", "center_baseline", "top"]) -> None: + ... + + def set_text(self, s: Any) -> None: + ... + + def set_fontproperties(self, fp: FontProperties | str | Path | None) -> None: + ... + + def set_usetex(self, usetex: bool | None) -> None: + ... + + def get_usetex(self) -> bool: + ... + + def set_parse_math(self, parse_math: bool) -> None: + ... + + def get_parse_math(self) -> bool: + ... + + def set_fontname(self, fontname: str | Iterable[str]) -> None: + ... + + def get_antialiased(self) -> bool: + ... + + def set_antialiased(self, antialiased: bool) -> None: + ... + + + +class OffsetFrom: + def __init__(self, artist: Artist | BboxBase | Transform, ref_coord: tuple[float, float], unit: Literal["points", "pixels"] = ...) -> None: + ... + + def set_unit(self, unit: Literal["points", "pixels"]) -> None: + ... + + def get_unit(self) -> Literal["points", "pixels"]: + ... + + def __call__(self, renderer: RendererBase) -> Transform: + ... + + + +class _AnnotationBase: + xy: tuple[float, float] + xycoords: str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform] + def __init__(self, xy, xycoords: str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform] = ..., annotation_clip: bool | None = ...) -> None: + ... + + def set_annotation_clip(self, b: bool | None) -> None: + ... + + def get_annotation_clip(self) -> bool | None: + ... + + def draggable(self, state: bool | None = ..., use_blit: bool = ...) -> DraggableAnnotation | None: + ... + + + +class Annotation(Text, _AnnotationBase): + arrowprops: dict[str, Any] | None + arrow_patch: FancyArrowPatch | None + def __init__(self, text: str, xy: tuple[float, float], xytext: tuple[float, float] | None = ..., xycoords: str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform] = ..., textcoords: str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform] | None = ..., arrowprops: dict[str, Any] | None = ..., annotation_clip: bool | None = ..., **kwargs) -> None: + ... + + @property + def xycoords(self) -> str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform]: + ... + + @xycoords.setter + def xycoords(self, xycoords: str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform]) -> None: + ... + + @property + def xyann(self) -> tuple[float, float]: + ... + + @xyann.setter + def xyann(self, xytext: tuple[float, float]) -> None: + ... + + def get_anncoords(self) -> str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform]: + ... + + def set_anncoords(self, coords: str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform]) -> None: + ... + + @property + def anncoords(self) -> str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform]: + ... + + @anncoords.setter + def anncoords(self, coords: str | tuple[str, str] | Artist | Transform | Callable[[RendererBase], Bbox | Transform]) -> None: + ... + + def update_positions(self, renderer: RendererBase) -> None: + ... + + def get_window_extent(self, renderer: RendererBase | None = ...) -> Bbox: + ... + + + diff --git a/typings/matplotlib/textpath.pyi b/typings/matplotlib/textpath.pyi new file mode 100644 index 0000000..8e884da --- /dev/null +++ b/typings/matplotlib/textpath.pyi @@ -0,0 +1,56 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from matplotlib.font_manager import FontProperties +from matplotlib.ft2font import FT2Font +from matplotlib.mathtext import MathTextParser, VectorParse +from matplotlib.path import Path +from typing import Literal + +class TextToPath: + FONT_SCALE: float + DPI: float + mathtext_parser: MathTextParser[VectorParse] + def __init__(self) -> None: + ... + + def get_text_width_height_descent(self, s: str, prop: FontProperties, ismath: bool | Literal["TeX"]) -> tuple[float, float, float]: + ... + + def get_text_path(self, prop: FontProperties, s: str, ismath: bool | Literal["TeX"] = ...) -> list[np.ndarray]: + ... + + def get_glyphs_with_font(self, font: FT2Font, s: str, glyph_map: dict[str, tuple[np.ndarray, np.ndarray]] | None = ..., return_new_glyphs_only: bool = ...) -> tuple[list[tuple[str, float, float, float]], dict[str, tuple[np.ndarray, np.ndarray]], list[tuple[list[tuple[float, float]], list[int]]],]: + ... + + def get_glyphs_mathtext(self, prop: FontProperties, s: str, glyph_map: dict[str, tuple[np.ndarray, np.ndarray]] | None = ..., return_new_glyphs_only: bool = ...) -> tuple[list[tuple[str, float, float, float]], dict[str, tuple[np.ndarray, np.ndarray]], list[tuple[list[tuple[float, float]], list[int]]],]: + ... + + def get_glyphs_tex(self, prop: FontProperties, s: str, glyph_map: dict[str, tuple[np.ndarray, np.ndarray]] | None = ..., return_new_glyphs_only: bool = ...) -> tuple[list[tuple[str, float, float, float]], dict[str, tuple[np.ndarray, np.ndarray]], list[tuple[list[tuple[float, float]], list[int]]],]: + ... + + + +text_to_path: TextToPath +class TextPath(Path): + def __init__(self, xy: tuple[float, float], s: str, size: float | None = ..., prop: FontProperties | None = ..., _interpolation_steps: int = ..., usetex: bool = ...) -> None: + ... + + def set_size(self, size: float | None) -> None: + ... + + def get_size(self) -> float | None: + ... + + @property + def vertices(self) -> np.ndarray: + ... + + @property + def codes(self) -> np.ndarray: + ... + + + diff --git a/typings/matplotlib/ticker.pyi b/typings/matplotlib/ticker.pyi new file mode 100644 index 0000000..7b1d9ee --- /dev/null +++ b/typings/matplotlib/ticker.pyi @@ -0,0 +1,464 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from collections.abc import Callable, Sequence +from typing import Any, Literal +from matplotlib.axis import Axis +from matplotlib.transforms import Transform +from matplotlib.projections.polar import _AxisWrapper + +class _DummyAxis: + __name__: str + def __init__(self, minpos: float = ...) -> None: + ... + + def get_view_interval(self) -> tuple[float, float]: + ... + + def set_view_interval(self, vmin: float, vmax: float) -> None: + ... + + def get_minpos(self) -> float: + ... + + def get_data_interval(self) -> tuple[float, float]: + ... + + def set_data_interval(self, vmin: float, vmax: float) -> None: + ... + + def get_tick_space(self) -> int: + ... + + + +class TickHelper: + axis: None | Axis | _DummyAxis | _AxisWrapper + def set_axis(self, axis: Axis | _DummyAxis | None) -> None: + ... + + def create_dummy_axis(self, **kwargs) -> None: + ... + + + +class Formatter(TickHelper): + locs: list[float] + def __call__(self, x: float, pos: int | None = ...) -> str: + ... + + def format_ticks(self, values: list[float]) -> list[str]: + ... + + def format_data(self, value: float) -> str: + ... + + def format_data_short(self, value: float) -> str: + ... + + def get_offset(self) -> str: + ... + + def set_locs(self, locs: list[float]) -> None: + ... + + @staticmethod + def fix_minus(s: str) -> str: + ... + + + +class NullFormatter(Formatter): + ... + + +class FixedFormatter(Formatter): + seq: Sequence[str] + offset_string: str + def __init__(self, seq: Sequence[str]) -> None: + ... + + def set_offset_string(self, ofs: str) -> None: + ... + + + +class FuncFormatter(Formatter): + func: Callable[[float, int | None], str] + offset_string: str + def __init__(self, func: Callable[..., str]) -> None: + ... + + def set_offset_string(self, ofs: str) -> None: + ... + + + +class FormatStrFormatter(Formatter): + fmt: str + def __init__(self, fmt: str) -> None: + ... + + + +class StrMethodFormatter(Formatter): + fmt: str + def __init__(self, fmt: str) -> None: + ... + + + +class ScalarFormatter(Formatter): + orderOfMagnitude: int + format: str + def __init__(self, useOffset: bool | float | None = ..., useMathText: bool | None = ..., useLocale: bool | None = ...) -> None: + ... + + offset: float + def get_useOffset(self) -> bool: + ... + + def set_useOffset(self, val: bool | float) -> None: + ... + + @property + def useOffset(self) -> bool: + ... + + @useOffset.setter + def useOffset(self, val: bool | float) -> None: + ... + + def get_useLocale(self) -> bool: + ... + + def set_useLocale(self, val: bool | None) -> None: + ... + + @property + def useLocale(self) -> bool: + ... + + @useLocale.setter + def useLocale(self, val: bool | None) -> None: + ... + + def get_useMathText(self) -> bool: + ... + + def set_useMathText(self, val: bool | None) -> None: + ... + + @property + def useMathText(self) -> bool: + ... + + @useMathText.setter + def useMathText(self, val: bool | None) -> None: + ... + + def set_scientific(self, b: bool) -> None: + ... + + def set_powerlimits(self, lims: tuple[int, int]) -> None: + ... + + def format_data_short(self, value: float | np.ma.MaskedArray) -> str: + ... + + def format_data(self, value: float) -> str: + ... + + + +class LogFormatter(Formatter): + minor_thresholds: tuple[float, float] + def __init__(self, base: float = ..., labelOnlyBase: bool = ..., minor_thresholds: tuple[float, float] | None = ..., linthresh: float | None = ...) -> None: + ... + + def set_base(self, base: float) -> None: + ... + + labelOnlyBase: bool + def set_label_minor(self, labelOnlyBase: bool) -> None: + ... + + def set_locs(self, locs: Any | None = ...) -> None: + ... + + def format_data(self, value: float) -> str: + ... + + def format_data_short(self, value: float) -> str: + ... + + + +class LogFormatterExponent(LogFormatter): + ... + + +class LogFormatterMathtext(LogFormatter): + ... + + +class LogFormatterSciNotation(LogFormatterMathtext): + ... + + +class LogitFormatter(Formatter): + def __init__(self, *, use_overline: bool = ..., one_half: str = ..., minor: bool = ..., minor_threshold: int = ..., minor_number: int = ...) -> None: + ... + + def use_overline(self, use_overline: bool) -> None: + ... + + def set_one_half(self, one_half: str) -> None: + ... + + def set_minor_threshold(self, minor_threshold: int) -> None: + ... + + def set_minor_number(self, minor_number: int) -> None: + ... + + def format_data_short(self, value: float) -> str: + ... + + + +class EngFormatter(Formatter): + ENG_PREFIXES: dict[int, str] + unit: str + places: int | None + sep: str + def __init__(self, unit: str = ..., places: int | None = ..., sep: str = ..., *, usetex: bool | None = ..., useMathText: bool | None = ...) -> None: + ... + + def get_usetex(self) -> bool: + ... + + def set_usetex(self, val: bool | None) -> None: + ... + + @property + def usetex(self) -> bool: + ... + + @usetex.setter + def usetex(self, val: bool | None) -> None: + ... + + def get_useMathText(self) -> bool: + ... + + def set_useMathText(self, val: bool | None) -> None: + ... + + @property + def useMathText(self) -> bool: + ... + + @useMathText.setter + def useMathText(self, val: bool | None) -> None: + ... + + def format_eng(self, num: float) -> str: + ... + + + +class PercentFormatter(Formatter): + xmax: float + decimals: int | None + def __init__(self, xmax: float = ..., decimals: int | None = ..., symbol: str | None = ..., is_latex: bool = ...) -> None: + ... + + def format_pct(self, x: float, display_range: float) -> str: + ... + + def convert_to_pct(self, x: float) -> float: + ... + + @property + def symbol(self) -> str: + ... + + @symbol.setter + def symbol(self, symbol: str) -> None: + ... + + + +class Locator(TickHelper): + MAXTICKS: int + def tick_values(self, vmin: float, vmax: float) -> Sequence[float]: + ... + + def set_params(self) -> None: + ... + + def __call__(self) -> Sequence[float]: + ... + + def raise_if_exceeds(self, locs: Sequence[float]) -> Sequence[float]: + ... + + def nonsingular(self, v0: float, v1: float) -> tuple[float, float]: + ... + + def view_limits(self, vmin: float, vmax: float) -> tuple[float, float]: + ... + + + +class IndexLocator(Locator): + offset: float + def __init__(self, base: float, offset: float) -> None: + ... + + def set_params(self, base: float | None = ..., offset: float | None = ...) -> None: + ... + + + +class FixedLocator(Locator): + nbins: int | None + def __init__(self, locs: Sequence[float], nbins: int | None = ...) -> None: + ... + + def set_params(self, nbins: int | None = ...) -> None: + ... + + + +class NullLocator(Locator): + ... + + +class LinearLocator(Locator): + presets: dict[tuple[float, float], Sequence[float]] + def __init__(self, numticks: int | None = ..., presets: dict[tuple[float, float], Sequence[float]] | None = ...) -> None: + ... + + @property + def numticks(self) -> int: + ... + + @numticks.setter + def numticks(self, numticks: int | None) -> None: + ... + + def set_params(self, numticks: int | None = ..., presets: dict[tuple[float, float], Sequence[float]] | None = ...) -> None: + ... + + + +class MultipleLocator(Locator): + def __init__(self, base: float = ..., offset: float = ...) -> None: + ... + + def set_params(self, base: float | None = ..., offset: float | None = ...) -> None: + ... + + def view_limits(self, dmin: float, dmax: float) -> tuple[float, float]: + ... + + + +class _Edge_integer: + step: float + def __init__(self, step: float, offset: float) -> None: + ... + + def closeto(self, ms: float, edge: float) -> bool: + ... + + def le(self, x: float) -> float: + ... + + def ge(self, x: float) -> float: + ... + + + +class MaxNLocator(Locator): + default_params: dict[str, Any] + def __init__(self, nbins: int | Literal["auto"] | None = ..., **kwargs) -> None: + ... + + def set_params(self, **kwargs) -> None: + ... + + def view_limits(self, dmin: float, dmax: float) -> tuple[float, float]: + ... + + + +class LogLocator(Locator): + numdecs: float + numticks: int | None + def __init__(self, base: float = ..., subs: None | Literal["auto", "all"] | Sequence[float] = ..., numdecs: float = ..., numticks: int | None = ...) -> None: + ... + + def set_params(self, base: float | None = ..., subs: Literal["auto", "all"] | Sequence[float] | None = ..., numdecs: float | None = ..., numticks: int | None = ...) -> None: + ... + + + +class SymmetricalLogLocator(Locator): + numticks: int + def __init__(self, transform: Transform | None = ..., subs: Sequence[float] | None = ..., linthresh: float | None = ..., base: float | None = ...) -> None: + ... + + def set_params(self, subs: Sequence[float] | None = ..., numticks: int | None = ...) -> None: + ... + + + +class AsinhLocator(Locator): + linear_width: float + numticks: int + symthresh: float + base: int + subs: Sequence[float] | None + def __init__(self, linear_width: float, numticks: int = ..., symthresh: float = ..., base: int = ..., subs: Sequence[float] | None = ...) -> None: + ... + + def set_params(self, numticks: int | None = ..., symthresh: float | None = ..., base: int | None = ..., subs: Sequence[float] | None = ...) -> None: + ... + + + +class LogitLocator(MaxNLocator): + def __init__(self, minor: bool = ..., *, nbins: Literal["auto"] | int = ...) -> None: + ... + + def set_params(self, minor: bool | None = ..., **kwargs) -> None: + ... + + @property + def minor(self) -> bool: + ... + + @minor.setter + def minor(self, value: bool) -> None: + ... + + + +class AutoLocator(MaxNLocator): + def __init__(self) -> None: + ... + + + +class AutoMinorLocator(Locator): + ndivs: int + def __init__(self, n: int | None = ...) -> None: + ... + + + diff --git a/typings/matplotlib/transforms.pyi b/typings/matplotlib/transforms.pyi new file mode 100644 index 0000000..8e84502 --- /dev/null +++ b/typings/matplotlib/transforms.pyi @@ -0,0 +1,604 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from .path import Path +from .patches import Patch +from .figure import Figure +from numpy.typing import ArrayLike +from collections.abc import Iterable, Sequence +from typing import Literal + +DEBUG: bool +class TransformNode: + INVALID_NON_AFFINE: int + INVALID_AFFINE: int + INVALID: int + is_bbox: bool + @property + def is_affine(self) -> bool: + ... + + pass_through: bool + def __init__(self, shorthand_name: str | None = ...) -> None: + ... + + def __copy__(self) -> TransformNode: + ... + + def invalidate(self) -> None: + ... + + def set_children(self, *children: TransformNode) -> None: + ... + + def frozen(self) -> TransformNode: + ... + + + +class BboxBase(TransformNode): + is_bbox: bool + is_affine: bool + def frozen(self) -> Bbox: + ... + + def __array__(self, *args, **kwargs): + ... + + @property + def x0(self) -> float: + ... + + @property + def y0(self) -> float: + ... + + @property + def x1(self) -> float: + ... + + @property + def y1(self) -> float: + ... + + @property + def p0(self) -> tuple[float, float]: + ... + + @property + def p1(self) -> tuple[float, float]: + ... + + @property + def xmin(self) -> float: + ... + + @property + def ymin(self) -> float: + ... + + @property + def xmax(self) -> float: + ... + + @property + def ymax(self) -> float: + ... + + @property + def min(self) -> tuple[float, float]: + ... + + @property + def max(self) -> tuple[float, float]: + ... + + @property + def intervalx(self) -> tuple[float, float]: + ... + + @property + def intervaly(self) -> tuple[float, float]: + ... + + @property + def width(self) -> float: + ... + + @property + def height(self) -> float: + ... + + @property + def size(self) -> tuple[float, float]: + ... + + @property + def bounds(self) -> tuple[float, float, float, float]: + ... + + @property + def extents(self) -> tuple[float, float, float, float]: + ... + + def get_points(self) -> np.ndarray: + ... + + def containsx(self, x: float) -> bool: + ... + + def containsy(self, y: float) -> bool: + ... + + def contains(self, x: float, y: float) -> bool: + ... + + def overlaps(self, other: BboxBase) -> bool: + ... + + def fully_containsx(self, x: float) -> bool: + ... + + def fully_containsy(self, y: float) -> bool: + ... + + def fully_contains(self, x: float, y: float) -> bool: + ... + + def fully_overlaps(self, other: BboxBase) -> bool: + ... + + def transformed(self, transform: Transform) -> Bbox: + ... + + coefs: dict[str, tuple[float, float]] + def anchored(self, c: tuple[float, float] | str, container: BboxBase | None = ...) -> Bbox: + ... + + def shrunk(self, mx: float, my: float) -> Bbox: + ... + + def shrunk_to_aspect(self, box_aspect: float, container: BboxBase | None = ..., fig_aspect: float = ...) -> Bbox: + ... + + def splitx(self, *args: float) -> list[Bbox]: + ... + + def splity(self, *args: float) -> list[Bbox]: + ... + + def count_contains(self, vertices: ArrayLike) -> int: + ... + + def count_overlaps(self, bboxes: Iterable[BboxBase]) -> int: + ... + + def expanded(self, sw: float, sh: float) -> Bbox: + ... + + def padded(self, w_pad: float, h_pad: float | None = ...) -> Bbox: + ... + + def translated(self, tx: float, ty: float) -> Bbox: + ... + + def corners(self) -> np.ndarray: + ... + + def rotated(self, radians: float) -> Bbox: + ... + + @staticmethod + def union(bboxes: Sequence[BboxBase]) -> Bbox: + ... + + @staticmethod + def intersection(bbox1: BboxBase, bbox2: BboxBase) -> Bbox | None: + ... + + + +class Bbox(BboxBase): + def __init__(self, points: ArrayLike, **kwargs) -> None: + ... + + @staticmethod + def unit() -> Bbox: + ... + + @staticmethod + def null() -> Bbox: + ... + + @staticmethod + def from_bounds(x0: float, y0: float, width: float, height: float) -> Bbox: + ... + + @staticmethod + def from_extents(*args: float, minpos: float | None = ...) -> Bbox: + ... + + def __format__(self, fmt: str) -> str: + ... + + def ignore(self, value: bool) -> None: + ... + + def update_from_path(self, path: Path, ignore: bool | None = ..., updatex: bool = ..., updatey: bool = ...) -> None: + ... + + def update_from_data_x(self, x: ArrayLike, ignore: bool | None = ...) -> None: + ... + + def update_from_data_y(self, y: ArrayLike, ignore: bool | None = ...) -> None: + ... + + def update_from_data_xy(self, xy: ArrayLike, ignore: bool | None = ..., updatex: bool = ..., updatey: bool = ...) -> None: + ... + + @property + def minpos(self) -> float: + ... + + @property + def minposx(self) -> float: + ... + + @property + def minposy(self) -> float: + ... + + def get_points(self) -> np.ndarray: + ... + + def set_points(self, points: ArrayLike) -> None: + ... + + def set(self, other: Bbox) -> None: + ... + + def mutated(self) -> bool: + ... + + def mutatedx(self) -> bool: + ... + + def mutatedy(self) -> bool: + ... + + + +class TransformedBbox(BboxBase): + def __init__(self, bbox: Bbox, transform: Transform, **kwargs) -> None: + ... + + def get_points(self) -> np.ndarray: + ... + + + +class LockableBbox(BboxBase): + def __init__(self, bbox: BboxBase, x0: float | None = ..., y0: float | None = ..., x1: float | None = ..., y1: float | None = ..., **kwargs) -> None: + ... + + @property + def locked_x0(self) -> float | None: + ... + + @locked_x0.setter + def locked_x0(self, x0: float | None) -> None: + ... + + @property + def locked_y0(self) -> float | None: + ... + + @locked_y0.setter + def locked_y0(self, y0: float | None) -> None: + ... + + @property + def locked_x1(self) -> float | None: + ... + + @locked_x1.setter + def locked_x1(self, x1: float | None) -> None: + ... + + @property + def locked_y1(self) -> float | None: + ... + + @locked_y1.setter + def locked_y1(self, y1: float | None) -> None: + ... + + + +class Transform(TransformNode): + input_dims: int | None + output_dims: int | None + is_separable: bool + @property + def has_inverse(self) -> bool: + ... + + def __add__(self, other: Transform) -> Transform: + ... + + @property + def depth(self) -> int: + ... + + def contains_branch(self, other: Transform) -> bool: + ... + + def contains_branch_seperately(self, other_transform: Transform) -> Sequence[bool]: + ... + + def __sub__(self, other: Transform) -> Transform: + ... + + def __array__(self, *args, **kwargs) -> np.ndarray: + ... + + def transform(self, values: ArrayLike) -> np.ndarray: + ... + + def transform_affine(self, values: ArrayLike) -> np.ndarray: + ... + + def transform_non_affine(self, values: ArrayLike) -> ArrayLike: + ... + + def transform_bbox(self, bbox: BboxBase) -> Bbox: + ... + + def get_affine(self) -> Transform: + ... + + def get_matrix(self) -> np.ndarray: + ... + + def transform_point(self, point: ArrayLike) -> np.ndarray: + ... + + def transform_path(self, path: Path) -> Path: + ... + + def transform_path_affine(self, path: Path) -> Path: + ... + + def transform_path_non_affine(self, path: Path) -> Path: + ... + + def transform_angles(self, angles: ArrayLike, pts: ArrayLike, radians: bool = ..., pushoff: float = ...) -> np.ndarray: + ... + + def inverted(self) -> Transform: + ... + + + +class TransformWrapper(Transform): + pass_through: bool + def __init__(self, child: Transform) -> None: + ... + + def __eq__(self, other: object) -> bool: + ... + + def frozen(self) -> Transform: + ... + + def set(self, child: Transform) -> None: + ... + + + +class AffineBase(Transform): + is_affine: Literal[True] + def __init__(self, *args, **kwargs) -> None: + ... + + def __eq__(self, other: object) -> bool: + ... + + + +class Affine2DBase(AffineBase): + input_dims: Literal[2] + output_dims: Literal[2] + def frozen(self) -> Affine2D: + ... + + @property + def is_separable(self): + ... + + def to_values(self) -> tuple[float, float, float, float, float, float]: + ... + + + +class Affine2D(Affine2DBase): + def __init__(self, matrix: ArrayLike | None = ..., **kwargs) -> None: + ... + + @staticmethod + def from_values(a: float, b: float, c: float, d: float, e: float, f: float) -> Affine2D: + ... + + def set_matrix(self, mtx: ArrayLike) -> None: + ... + + def clear(self) -> Affine2D: + ... + + def rotate(self, theta: float) -> Affine2D: + ... + + def rotate_deg(self, degrees: float) -> Affine2D: + ... + + def rotate_around(self, x: float, y: float, theta: float) -> Affine2D: + ... + + def rotate_deg_around(self, x: float, y: float, degrees: float) -> Affine2D: + ... + + def translate(self, tx: float, ty: float) -> Affine2D: + ... + + def scale(self, sx: float, sy: float | None = ...) -> Affine2D: + ... + + def skew(self, xShear: float, yShear: float) -> Affine2D: + ... + + def skew_deg(self, xShear: float, yShear: float) -> Affine2D: + ... + + + +class IdentityTransform(Affine2DBase): + ... + + +class _BlendedMixin: + def __eq__(self, other: object) -> bool: + ... + + def contains_branch_seperately(self, transform: Transform) -> Sequence[bool]: + ... + + + +class BlendedGenericTransform(_BlendedMixin, Transform): + input_dims: Literal[2] + output_dims: Literal[2] + is_separable: bool + pass_through: bool + def __init__(self, x_transform: Transform, y_transform: Transform, **kwargs) -> None: + ... + + @property + def depth(self) -> int: + ... + + def contains_branch(self, other: Transform) -> Literal[False]: + ... + + @property + def is_affine(self) -> bool: + ... + + @property + def has_inverse(self) -> bool: + ... + + + +class BlendedAffine2D(_BlendedMixin, Affine2DBase): + def __init__(self, x_transform: Transform, y_transform: Transform, **kwargs) -> None: + ... + + + +def blended_transform_factory(x_transform: Transform, y_transform: Transform) -> BlendedGenericTransform | BlendedAffine2D: + ... + +class CompositeGenericTransform(Transform): + pass_through: bool + input_dims: int | None + output_dims: int | None + def __init__(self, a: Transform, b: Transform, **kwargs) -> None: + ... + + + +class CompositeAffine2D(Affine2DBase): + def __init__(self, a: Affine2DBase, b: Affine2DBase, **kwargs) -> None: + ... + + @property + def depth(self) -> int: + ... + + + +def composite_transform_factory(a: Transform, b: Transform) -> Transform: + ... + +class BboxTransform(Affine2DBase): + def __init__(self, boxin: BboxBase, boxout: BboxBase, **kwargs) -> None: + ... + + + +class BboxTransformTo(Affine2DBase): + def __init__(self, boxout: BboxBase, **kwargs) -> None: + ... + + + +class BboxTransformToMaxOnly(BboxTransformTo): + ... + + +class BboxTransformFrom(Affine2DBase): + def __init__(self, boxin: BboxBase, **kwargs) -> None: + ... + + + +class ScaledTranslation(Affine2DBase): + def __init__(self, xt: float, yt: float, scale_trans: Affine2DBase, **kwargs) -> None: + ... + + + +class AffineDeltaTransform(Affine2DBase): + def __init__(self, transform: Affine2DBase, **kwargs) -> None: + ... + + + +class TransformedPath(TransformNode): + def __init__(self, path: Path, transform: Transform) -> None: + ... + + def get_transformed_points_and_affine(self) -> tuple[Path, Transform]: + ... + + def get_transformed_path_and_affine(self) -> tuple[Path, Transform]: + ... + + def get_fully_transformed_path(self) -> Path: + ... + + def get_affine(self) -> Transform: + ... + + + +class TransformedPatchPath(TransformedPath): + def __init__(self, patch: Patch) -> None: + ... + + + +def nonsingular(vmin: float, vmax: float, expander: float = ..., tiny: float = ..., increasing: bool = ...) -> tuple[float, float]: + ... + +def interval_contains(interval: tuple[float, float], val: float) -> bool: + ... + +def interval_contains_open(interval: tuple[float, float], val: float) -> bool: + ... + +def offset_copy(trans: Transform, fig: Figure | None = ..., x: float = ..., y: float = ..., units: Literal["inches", "points", "dots"] = ...) -> Transform: + ... + diff --git a/typings/matplotlib/tri/__init__.pyi b/typings/matplotlib/tri/__init__.pyi new file mode 100644 index 0000000..9d0ba86 --- /dev/null +++ b/typings/matplotlib/tri/__init__.pyi @@ -0,0 +1,17 @@ +""" +This type stub file was generated by pyright. +""" + +from ._triangulation import Triangulation +from ._tricontour import TriContourSet, tricontour, tricontourf +from ._trifinder import TrapezoidMapTriFinder, TriFinder +from ._triinterpolate import CubicTriInterpolator, LinearTriInterpolator, TriInterpolator +from ._tripcolor import tripcolor +from ._triplot import triplot +from ._trirefine import TriRefiner, UniformTriRefiner +from ._tritools import TriAnalyzer + +""" +Unstructured triangular grid functions. +""" +__all__ = ["Triangulation", "TriContourSet", "tricontour", "tricontourf", "TriFinder", "TrapezoidMapTriFinder", "TriInterpolator", "LinearTriInterpolator", "CubicTriInterpolator", "tripcolor", "triplot", "TriRefiner", "UniformTriRefiner", "TriAnalyzer"] diff --git a/typings/matplotlib/tri/_triangulation.pyi b/typings/matplotlib/tri/_triangulation.pyi new file mode 100644 index 0000000..ce1ff6f --- /dev/null +++ b/typings/matplotlib/tri/_triangulation.pyi @@ -0,0 +1,48 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from matplotlib import _tri +from matplotlib.tri._trifinder import TriFinder +from numpy.typing import ArrayLike +from typing import Any + +class Triangulation: + x: np.ndarray + y: np.ndarray + mask: np.ndarray | None + is_delaunay: bool + triangles: np.ndarray + def __init__(self, x: ArrayLike, y: ArrayLike, triangles: ArrayLike | None = ..., mask: ArrayLike | None = ...) -> None: + ... + + def calculate_plane_coefficients(self, z: ArrayLike) -> np.ndarray: + ... + + @property + def edges(self) -> np.ndarray: + ... + + def get_cpp_triangulation(self) -> _tri.Triangulation: + ... + + def get_masked_triangles(self) -> np.ndarray: + ... + + @staticmethod + def get_from_args_and_kwargs(*args, **kwargs) -> tuple[Triangulation, tuple[Any, ...], dict[str, Any]]: + ... + + def get_trifinder(self) -> TriFinder: + ... + + @property + def neighbors(self) -> np.ndarray: + ... + + def set_mask(self, mask: None | ArrayLike) -> None: + ... + + + diff --git a/typings/matplotlib/tri/_tricontour.pyi b/typings/matplotlib/tri/_tricontour.pyi new file mode 100644 index 0000000..f12f6fa --- /dev/null +++ b/typings/matplotlib/tri/_tricontour.pyi @@ -0,0 +1,32 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.axes import Axes +from matplotlib.contour import ContourSet +from matplotlib.tri._triangulation import Triangulation +from numpy.typing import ArrayLike +from typing import overload + +class TriContourSet(ContourSet): + def __init__(self, ax: Axes, *args, **kwargs) -> None: + ... + + + +@overload +def tricontour(ax: Axes, triangulation: Triangulation, z: ArrayLike, levels: int | ArrayLike = ..., **kwargs) -> TriContourSet: + ... + +@overload +def tricontour(ax: Axes, x: ArrayLike, y: ArrayLike, z: ArrayLike, levels: int | ArrayLike = ..., *, triangles: ArrayLike = ..., mask: ArrayLike = ..., **kwargs) -> TriContourSet: + ... + +@overload +def tricontourf(ax: Axes, triangulation: Triangulation, z: ArrayLike, levels: int | ArrayLike = ..., **kwargs) -> TriContourSet: + ... + +@overload +def tricontourf(ax: Axes, x: ArrayLike, y: ArrayLike, z: ArrayLike, levels: int | ArrayLike = ..., *, triangles: ArrayLike = ..., mask: ArrayLike = ..., **kwargs) -> TriContourSet: + ... + diff --git a/typings/matplotlib/tri/_trifinder.pyi b/typings/matplotlib/tri/_trifinder.pyi new file mode 100644 index 0000000..1731da7 --- /dev/null +++ b/typings/matplotlib/tri/_trifinder.pyi @@ -0,0 +1,25 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.tri import Triangulation +from numpy.typing import ArrayLike + +class TriFinder: + def __init__(self, triangulation: Triangulation) -> None: + ... + + def __call__(self, x: ArrayLike, y: ArrayLike) -> ArrayLike: + ... + + + +class TrapezoidMapTriFinder(TriFinder): + def __init__(self, triangulation: Triangulation) -> None: + ... + + def __call__(self, x: ArrayLike, y: ArrayLike) -> ArrayLike: + ... + + + diff --git a/typings/matplotlib/tri/_triinterpolate.pyi b/typings/matplotlib/tri/_triinterpolate.pyi new file mode 100644 index 0000000..7a356d4 --- /dev/null +++ b/typings/matplotlib/tri/_triinterpolate.pyi @@ -0,0 +1,31 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from matplotlib.tri import TriFinder, Triangulation +from typing import Literal +from numpy.typing import ArrayLike + +class TriInterpolator: + def __init__(self, triangulation: Triangulation, z: ArrayLike, trifinder: TriFinder | None = ...) -> None: + ... + + def __call__(self, x: ArrayLike, y: ArrayLike) -> np.ma.MaskedArray: + ... + + def gradient(self, x: ArrayLike, y: ArrayLike) -> tuple[np.ma.MaskedArray, np.ma.MaskedArray]: + ... + + + +class LinearTriInterpolator(TriInterpolator): + ... + + +class CubicTriInterpolator(TriInterpolator): + def __init__(self, triangulation: Triangulation, z: ArrayLike, kind: Literal["min_E", "geom", "user"] = ..., trifinder: TriFinder | None = ..., dz: tuple[ArrayLike, ArrayLike] | None = ...) -> None: + ... + + + diff --git a/typings/matplotlib/tri/_tripcolor.pyi b/typings/matplotlib/tri/_tripcolor.pyi new file mode 100644 index 0000000..40a9c01 --- /dev/null +++ b/typings/matplotlib/tri/_tripcolor.pyi @@ -0,0 +1,27 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.axes import Axes +from matplotlib.collections import PolyCollection, TriMesh +from matplotlib.colors import Colormap, Normalize +from matplotlib.tri._triangulation import Triangulation +from numpy.typing import ArrayLike +from typing import Literal, overload + +@overload +def tripcolor(ax: Axes, triangulation: Triangulation, c: ArrayLike = ..., *, alpha: float = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., shading: Literal["flat"] = ..., facecolors: ArrayLike | None = ..., **kwargs) -> PolyCollection: + ... + +@overload +def tripcolor(ax: Axes, x: ArrayLike, y: ArrayLike, c: ArrayLike = ..., *, alpha: float = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., shading: Literal["flat"] = ..., facecolors: ArrayLike | None = ..., **kwargs) -> PolyCollection: + ... + +@overload +def tripcolor(ax: Axes, triangulation: Triangulation, c: ArrayLike = ..., *, alpha: float = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., shading: Literal["gouraud"], facecolors: ArrayLike | None = ..., **kwargs) -> TriMesh: + ... + +@overload +def tripcolor(ax: Axes, x: ArrayLike, y: ArrayLike, c: ArrayLike = ..., *, alpha: float = ..., norm: str | Normalize | None = ..., cmap: str | Colormap | None = ..., vmin: float | None = ..., vmax: float | None = ..., shading: Literal["gouraud"], facecolors: ArrayLike | None = ..., **kwargs) -> TriMesh: + ... + diff --git a/typings/matplotlib/tri/_triplot.pyi b/typings/matplotlib/tri/_triplot.pyi new file mode 100644 index 0000000..3fee47f --- /dev/null +++ b/typings/matplotlib/tri/_triplot.pyi @@ -0,0 +1,18 @@ +""" +This type stub file was generated by pyright. +""" + +from matplotlib.tri._triangulation import Triangulation +from matplotlib.axes import Axes +from matplotlib.lines import Line2D +from typing import overload +from numpy.typing import ArrayLike + +@overload +def triplot(ax: Axes, triangulation: Triangulation, *args, **kwargs) -> tuple[Line2D, Line2D]: + ... + +@overload +def triplot(ax: Axes, x: ArrayLike, y: ArrayLike, triangles: ArrayLike = ..., *args, **kwargs) -> tuple[Line2D, Line2D]: + ... + diff --git a/typings/matplotlib/tri/_trirefine.pyi b/typings/matplotlib/tri/_trirefine.pyi new file mode 100644 index 0000000..5109e85 --- /dev/null +++ b/typings/matplotlib/tri/_trirefine.pyi @@ -0,0 +1,37 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from typing import Literal, overload +from numpy.typing import ArrayLike +from matplotlib.tri._triangulation import Triangulation +from matplotlib.tri._triinterpolate import TriInterpolator + +class TriRefiner: + def __init__(self, triangulation: Triangulation) -> None: + ... + + + +class UniformTriRefiner(TriRefiner): + def __init__(self, triangulation: Triangulation) -> None: + ... + + @overload + def refine_triangulation(self, *, return_tri_index: Literal[True], subdiv: int = ...) -> tuple[Triangulation, np.ndarray]: + ... + + @overload + def refine_triangulation(self, return_tri_index: Literal[False] = ..., subdiv: int = ...) -> Triangulation: + ... + + @overload + def refine_triangulation(self, return_tri_index: bool = ..., subdiv: int = ...) -> tuple[Triangulation, np.ndarray] | Triangulation: + ... + + def refine_field(self, z: ArrayLike, triinterpolator: TriInterpolator | None = ..., subdiv: int = ...) -> tuple[Triangulation, np.ndarray]: + ... + + + diff --git a/typings/matplotlib/tri/_tritools.pyi b/typings/matplotlib/tri/_tritools.pyi new file mode 100644 index 0000000..ee0c8b5 --- /dev/null +++ b/typings/matplotlib/tri/_tritools.pyi @@ -0,0 +1,23 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from matplotlib.tri import Triangulation + +class TriAnalyzer: + def __init__(self, triangulation: Triangulation) -> None: + ... + + @property + def scale_factors(self) -> tuple[float, float]: + ... + + def circle_ratios(self, rescale: bool = ...) -> np.ndarray: + ... + + def get_flat_tri_mask(self, min_circle_ratio: float = ..., rescale: bool = ...) -> np.ndarray: + ... + + + diff --git a/typings/matplotlib/typing.pyi b/typings/matplotlib/typing.pyi new file mode 100644 index 0000000..e6bf4c7 --- /dev/null +++ b/typings/matplotlib/typing.pyi @@ -0,0 +1,38 @@ +""" +This type stub file was generated by pyright. +""" + +import pathlib +from collections.abc import Hashable, Sequence +from typing import Any, Literal, TypeVar, Union +from . import path +from ._enums import CapStyle, JoinStyle +from .markers import MarkerStyle + +""" +Typing support for Matplotlib + +This module contains Type aliases which are useful for Matplotlib and potentially +downstream libraries. + +.. admonition:: Provisional status of typing + + The ``typing`` module and type stub files are considered provisional and may change + at any time without a deprecation period. +""" +RGBColorType = Union[tuple[float, float, float], str] +RGBAColorType = Union[str, tuple[float, float, float, float], tuple[RGBColorType, float], tuple[tuple[float, float, float, float], float],] +ColorType = Union[RGBColorType, RGBAColorType] +RGBColourType = RGBColorType +RGBAColourType = RGBAColorType +ColourType = ColorType +LineStyleType = Union[str, tuple[float, Sequence[float]]] +DrawStyleType = Literal["default", "steps", "steps-pre", "steps-mid", "steps-post"] +MarkEveryType = Union[None, int, tuple[int, int], slice, list[int], float, tuple[float, float], list[bool]] +MarkerType = Union[str, path.Path, MarkerStyle] +FillStyleType = Literal["full", "left", "right", "bottom", "top", "none"] +JoinStyleType = Union[JoinStyle, Literal["miter", "round", "bevel"]] +CapStyleType = Union[CapStyle, Literal["butt", "projecting", "round"]] +RcStyleType = Union[str, dict[str, Any], pathlib.Path, Sequence[Union[str, pathlib.Path, dict[str, Any]]],] +_HT = TypeVar("_HT", bound=Hashable) +HashableList = list[Union[_HT, "HashableList[_HT]"]] diff --git a/typings/matplotlib/units.pyi b/typings/matplotlib/units.pyi new file mode 100644 index 0000000..6d5558d --- /dev/null +++ b/typings/matplotlib/units.pyi @@ -0,0 +1,133 @@ +""" +This type stub file was generated by pyright. +""" + +""" +The classes here provide support for using custom classes with +Matplotlib, e.g., those that do not expose the array interface but know +how to convert themselves to arrays. It also supports classes with +units and units conversion. Use cases include converters for custom +objects, e.g., a list of datetime objects, as well as for objects that +are unit aware. We don't assume any particular units implementation; +rather a units implementation must register with the Registry converter +dictionary and provide a `ConversionInterface`. For example, +here is a complete implementation which supports plotting with native +datetime objects:: + + import matplotlib.units as units + import matplotlib.dates as dates + import matplotlib.ticker as ticker + import datetime + + class DateConverter(units.ConversionInterface): + + @staticmethod + def convert(value, unit, axis): + "Convert a datetime value to a scalar or array." + return dates.date2num(value) + + @staticmethod + def axisinfo(unit, axis): + "Return major and minor tick locators and formatters." + if unit != 'date': + return None + majloc = dates.AutoDateLocator() + majfmt = dates.AutoDateFormatter(majloc) + return units.AxisInfo(majloc=majloc, majfmt=majfmt, label='date') + + @staticmethod + def default_units(x, axis): + "Return the default unit for x or None." + return 'date' + + # Finally we register our object type with the Matplotlib units registry. + units.registry[datetime.date] = DateConverter() +""" +class ConversionError(TypeError): + ... + + +class AxisInfo: + """ + Information to support default axis labeling, tick labeling, and limits. + + An instance of this class must be returned by + `ConversionInterface.axisinfo`. + """ + def __init__(self, majloc=..., minloc=..., majfmt=..., minfmt=..., label=..., default_limits=...) -> None: + """ + Parameters + ---------- + majloc, minloc : Locator, optional + Tick locators for the major and minor ticks. + majfmt, minfmt : Formatter, optional + Tick formatters for the major and minor ticks. + label : str, optional + The default axis label. + default_limits : optional + The default min and max limits of the axis if no data has + been plotted. + + Notes + ----- + If any of the above are ``None``, the axis will simply use the + default value. + """ + ... + + + +class ConversionInterface: + """ + The minimal interface for a converter to take custom data types (or + sequences) and convert them to values Matplotlib can use. + """ + @staticmethod + def axisinfo(unit, axis): # -> None: + """Return an `.AxisInfo` for the axis with the specified units.""" + ... + + @staticmethod + def default_units(x, axis): # -> None: + """Return the default unit for *x* or ``None`` for the given axis.""" + ... + + @staticmethod + def convert(obj, unit, axis): + """ + Convert *obj* using *unit* for the specified *axis*. + + If *obj* is a sequence, return the converted sequence. The output must + be a sequence of scalars that can be used by the numpy array layer. + """ + ... + + + +class DecimalConverter(ConversionInterface): + """Converter for decimal.Decimal data to float.""" + @staticmethod + def convert(value, unit, axis): # -> float | NDArray[Any]: + """ + Convert Decimals to floats. + + The *unit* and *axis* arguments are not used. + + Parameters + ---------- + value : decimal.Decimal or iterable + Decimal or list of Decimal need to be converted + """ + ... + + + +class Registry(dict): + """Register types with conversion interface.""" + def get_converter(self, x): # -> None: + """Get the converter interface instance for *x*, or None.""" + ... + + + +registry = ... diff --git a/typings/matplotlib/widgets.pyi b/typings/matplotlib/widgets.pyi new file mode 100644 index 0000000..91dd779 --- /dev/null +++ b/typings/matplotlib/widgets.pyi @@ -0,0 +1,563 @@ +""" +This type stub file was generated by pyright. +""" + +import PIL.Image +import numpy as np +from .artist import Artist +from .axes import Axes +from .backend_bases import Event, FigureCanvasBase, MouseButton, MouseEvent +from .collections import LineCollection +from .figure import Figure +from .lines import Line2D +from .patches import Circle, Polygon, Rectangle +from .text import Text +from collections.abc import Callable, Collection, Iterable, Sequence +from typing import Any, Literal +from numpy.typing import ArrayLike +from .typing import ColorType + +class LockDraw: + def __init__(self) -> None: + ... + + def __call__(self, o: Any) -> None: + ... + + def release(self, o: Any) -> None: + ... + + def available(self, o: Any) -> bool: + ... + + def isowner(self, o: Any) -> bool: + ... + + def locked(self) -> bool: + ... + + + +class Widget: + drawon: bool + eventson: bool + active: bool + def set_active(self, active: bool) -> None: + ... + + def get_active(self) -> None: + ... + + def ignore(self, event) -> bool: + ... + + + +class AxesWidget(Widget): + ax: Axes + canvas: FigureCanvasBase | None + def __init__(self, ax: Axes) -> None: + ... + + def connect_event(self, event: Event, callback: Callable) -> None: + ... + + def disconnect_events(self) -> None: + ... + + + +class Button(AxesWidget): + label: Text + color: ColorType + hovercolor: ColorType + def __init__(self, ax: Axes, label: str, image: ArrayLike | PIL.Image.Image | None = ..., color: ColorType = ..., hovercolor: ColorType = ..., *, useblit: bool = ...) -> None: + ... + + def on_clicked(self, func: Callable[[Event], Any]) -> int: + ... + + def disconnect(self, cid: int) -> None: + ... + + + +class SliderBase(AxesWidget): + orientation: Literal["horizontal", "vertical"] + closedmin: bool + closedmax: bool + valmin: float + valmax: float + valstep: float | ArrayLike | None + drag_active: bool + valfmt: str + def __init__(self, ax: Axes, orientation: Literal["horizontal", "vertical"], closedmin: bool, closedmax: bool, valmin: float, valmax: float, valfmt: str, dragging: Slider | None, valstep: float | ArrayLike | None) -> None: + ... + + def disconnect(self, cid: int) -> None: + ... + + def reset(self) -> None: + ... + + + +class Slider(SliderBase): + slidermin: Slider | None + slidermax: Slider | None + val: float + valinit: float + track: Rectangle + poly: Polygon + hline: Line2D + vline: Line2D + label: Text + valtext: Text + def __init__(self, ax: Axes, label: str, valmin: float, valmax: float, *, valinit: float = ..., valfmt: str | None = ..., closedmin: bool = ..., closedmax: bool = ..., slidermin: Slider | None = ..., slidermax: Slider | None = ..., dragging: bool = ..., valstep: float | ArrayLike | None = ..., orientation: Literal["horizontal", "vertical"] = ..., initcolor: ColorType = ..., track_color: ColorType = ..., handle_style: dict[str, Any] | None = ..., **kwargs) -> None: + ... + + def set_val(self, val: float) -> None: + ... + + def on_changed(self, func: Callable[[float], Any]) -> int: + ... + + + +class RangeSlider(SliderBase): + val: tuple[float, float] + valinit: tuple[float, float] + track: Rectangle + poly: Polygon + label: Text + valtext: Text + def __init__(self, ax: Axes, label: str, valmin: float, valmax: float, *, valinit: tuple[float, float] | None = ..., valfmt: str | None = ..., closedmin: bool = ..., closedmax: bool = ..., dragging: bool = ..., valstep: float | ArrayLike | None = ..., orientation: Literal["horizontal", "vertical"] = ..., track_color: ColorType = ..., handle_style: dict[str, Any] | None = ..., **kwargs) -> None: + ... + + def set_min(self, min: float) -> None: + ... + + def set_max(self, max: float) -> None: + ... + + def set_val(self, val: ArrayLike) -> None: + ... + + def on_changed(self, func: Callable[[tuple[float, float]], Any]) -> int: + ... + + + +class CheckButtons(AxesWidget): + labels: list[Text] + def __init__(self, ax: Axes, labels: Sequence[str], actives: Iterable[bool] | None = ..., *, useblit: bool = ..., label_props: dict[str, Any] | None = ..., frame_props: dict[str, Any] | None = ..., check_props: dict[str, Any] | None = ...) -> None: + ... + + def set_label_props(self, props: dict[str, Any]) -> None: + ... + + def set_frame_props(self, props: dict[str, Any]) -> None: + ... + + def set_check_props(self, props: dict[str, Any]) -> None: + ... + + def set_active(self, index: int) -> None: + ... + + def get_status(self) -> list[bool]: + ... + + def on_clicked(self, func: Callable[[str], Any]) -> int: + ... + + def disconnect(self, cid: int) -> None: + ... + + @property + def lines(self) -> list[tuple[Line2D, Line2D]]: + ... + + @property + def rectangles(self) -> list[Rectangle]: + ... + + + +class TextBox(AxesWidget): + label: Text + text_disp: Text + cursor_index: int + cursor: LineCollection + color: ColorType + hovercolor: ColorType + capturekeystrokes: bool + def __init__(self, ax: Axes, label: str, initial: str = ..., *, color: ColorType = ..., hovercolor: ColorType = ..., label_pad: float = ..., textalignment: Literal["left", "center", "right"] = ...) -> None: + ... + + @property + def text(self) -> str: + ... + + def set_val(self, val: str) -> None: + ... + + def begin_typing(self, x=...) -> None: + ... + + def stop_typing(self) -> None: + ... + + def on_text_change(self, func: Callable[[str], Any]) -> int: + ... + + def on_submit(self, func: Callable[[str], Any]) -> int: + ... + + def disconnect(self, cid: int) -> None: + ... + + + +class RadioButtons(AxesWidget): + activecolor: ColorType + value_selected: str + labels: list[Text] + def __init__(self, ax: Axes, labels: Iterable[str], active: int = ..., activecolor: ColorType | None = ..., *, useblit: bool = ..., label_props: dict[str, Any] | Sequence[dict[str, Any]] | None = ..., radio_props: dict[str, Any] | None = ...) -> None: + ... + + def set_label_props(self, props: dict[str, Any]) -> None: + ... + + def set_radio_props(self, props: dict[str, Any]) -> None: + ... + + def set_active(self, index: int) -> None: + ... + + def on_clicked(self, func: Callable[[str], Any]) -> int: + ... + + def disconnect(self, cid: int) -> None: + ... + + @property + def circles(self) -> list[Circle]: + ... + + + +class SubplotTool(Widget): + figure: Figure + targetfig: Figure + buttonreset: Button + def __init__(self, targetfig: Figure, toolfig: Figure) -> None: + ... + + + +class Cursor(AxesWidget): + visible: bool + horizOn: bool + vertOn: bool + useblit: bool + lineh: Line2D + linev: Line2D + background: Any + needclear: bool + def __init__(self, ax: Axes, *, horizOn: bool = ..., vertOn: bool = ..., useblit: bool = ..., **lineprops) -> None: + ... + + def clear(self, event: Event) -> None: + ... + + def onmove(self, event: Event) -> None: + ... + + + +class MultiCursor(Widget): + axes: Sequence[Axes] + horizOn: bool + vertOn: bool + visible: bool + useblit: bool + needclear: bool + vlines: list[Line2D] + hlines: list[Line2D] + def __init__(self, canvas: Any, axes: Sequence[Axes], *, useblit: bool = ..., horizOn: bool = ..., vertOn: bool = ..., **lineprops) -> None: + ... + + def connect(self) -> None: + ... + + def disconnect(self) -> None: + ... + + def clear(self, event: Event) -> None: + ... + + def onmove(self, event: Event) -> None: + ... + + + +class _SelectorWidget(AxesWidget): + onselect: Callable[[float, float], Any] + useblit: bool + background: Any + validButtons: list[MouseButton] + def __init__(self, ax: Axes, onselect: Callable[[float, float], Any], useblit: bool = ..., button: MouseButton | Collection[MouseButton] | None = ..., state_modifier_keys: dict[str, str] | None = ..., use_data_coordinates: bool = ...) -> None: + ... + + def update_background(self, event: Event) -> None: + ... + + def connect_default_events(self) -> None: + ... + + def ignore(self, event: Event) -> bool: + ... + + def update(self) -> None: + ... + + def press(self, event: Event) -> bool: + ... + + def release(self, event: Event) -> bool: + ... + + def onmove(self, event: Event) -> bool: + ... + + def on_scroll(self, event: Event) -> None: + ... + + def on_key_press(self, event: Event) -> None: + ... + + def on_key_release(self, event: Event) -> None: + ... + + def set_visible(self, visible: bool) -> None: + ... + + def get_visible(self) -> bool: + ... + + @property + def visible(self) -> bool: + ... + + def clear(self) -> None: + ... + + @property + def artists(self) -> tuple[Artist]: + ... + + def set_props(self, **props) -> None: + ... + + def set_handle_props(self, **handle_props) -> None: + ... + + def add_state(self, state: str) -> None: + ... + + def remove_state(self, state: str) -> None: + ... + + + +class SpanSelector(_SelectorWidget): + snap_values: ArrayLike | None + onmove_callback: Callable[[float, float], Any] + minspan: float + grab_range: float + drag_from_anywhere: bool + ignore_event_outside: bool + canvas: FigureCanvasBase | None + def __init__(self, ax: Axes, onselect: Callable[[float, float], Any], direction: Literal["horizontal", "vertical"], *, minspan: float = ..., useblit: bool = ..., props: dict[str, Any] | None = ..., onmove_callback: Callable[[float, float], Any] | None = ..., interactive: bool = ..., button: MouseButton | Collection[MouseButton] | None = ..., handle_props: dict[str, Any] | None = ..., grab_range: float = ..., state_modifier_keys: dict[str, str] | None = ..., drag_from_anywhere: bool = ..., ignore_event_outside: bool = ..., snap_values: ArrayLike | None = ...) -> None: + ... + + def new_axes(self, ax: Axes, *, _props: dict[str, Any] | None = ...) -> None: + ... + + def connect_default_events(self) -> None: + ... + + @property + def direction(self) -> Literal["horizontal", "vertical"]: + ... + + @direction.setter + def direction(self, direction: Literal["horizontal", "vertical"]) -> None: + ... + + @property + def extents(self) -> tuple[float, float]: + ... + + @extents.setter + def extents(self, extents: tuple[float, float]) -> None: + ... + + + +class ToolLineHandles: + ax: Axes + def __init__(self, ax: Axes, positions: ArrayLike, direction: Literal["horizontal", "vertical"], *, line_props: dict[str, Any] | None = ..., useblit: bool = ...) -> None: + ... + + @property + def artists(self) -> tuple[Line2D]: + ... + + @property + def positions(self) -> list[float]: + ... + + @property + def direction(self) -> Literal["horizontal", "vertical"]: + ... + + def set_data(self, positions: ArrayLike) -> None: + ... + + def set_visible(self, value: bool) -> None: + ... + + def set_animated(self, value: bool) -> None: + ... + + def remove(self) -> None: + ... + + def closest(self, x: float, y: float) -> tuple[int, float]: + ... + + + +class ToolHandles: + ax: Axes + def __init__(self, ax: Axes, x: ArrayLike, y: ArrayLike, *, marker: str = ..., marker_props: dict[str, Any] | None = ..., useblit: bool = ...) -> None: + ... + + @property + def x(self) -> ArrayLike: + ... + + @property + def y(self) -> ArrayLike: + ... + + @property + def artists(self) -> tuple[Line2D]: + ... + + def set_data(self, pts: ArrayLike, y: ArrayLike | None = ...) -> None: + ... + + def set_visible(self, val: bool) -> None: + ... + + def set_animated(self, val: bool) -> None: + ... + + def closest(self, x: float, y: float) -> tuple[int, float]: + ... + + + +class RectangleSelector(_SelectorWidget): + drag_from_anywhere: bool + ignore_event_outside: bool + minspanx: float + minspany: float + spancoords: Literal["data", "pixels"] + grab_range: float + def __init__(self, ax: Axes, onselect: Callable[[MouseEvent, MouseEvent], Any], *, minspanx: float = ..., minspany: float = ..., useblit: bool = ..., props: dict[str, Any] | None = ..., spancoords: Literal["data", "pixels"] = ..., button: MouseButton | Collection[MouseButton] | None = ..., grab_range: float = ..., handle_props: dict[str, Any] | None = ..., interactive: bool = ..., state_modifier_keys: dict[str, str] | None = ..., drag_from_anywhere: bool = ..., ignore_event_outside: bool = ..., use_data_coordinates: bool = ...) -> None: + ... + + @property + def corners(self) -> tuple[np.ndarray, np.ndarray]: + ... + + @property + def edge_centers(self) -> tuple[np.ndarray, np.ndarray]: + ... + + @property + def center(self) -> tuple[float, float]: + ... + + @property + def extents(self) -> tuple[float, float, float, float]: + ... + + @extents.setter + def extents(self, extents: tuple[float, float, float, float]) -> None: + ... + + @property + def rotation(self) -> float: + ... + + @rotation.setter + def rotation(self, value: float) -> None: + ... + + @property + def geometry(self) -> np.ndarray: + ... + + + +class EllipseSelector(RectangleSelector): + ... + + +class LassoSelector(_SelectorWidget): + verts: None | list[tuple[float, float]] + def __init__(self, ax: Axes, onselect: Callable[[list[tuple[float, float]]], Any], *, useblit: bool = ..., props: dict[str, Any] | None = ..., button: MouseButton | Collection[MouseButton] | None = ...) -> None: + ... + + + +class PolygonSelector(_SelectorWidget): + grab_range: float + def __init__(self, ax: Axes, onselect: Callable[[ArrayLike, ArrayLike], Any], *, useblit: bool = ..., props: dict[str, Any] | None = ..., handle_props: dict[str, Any] | None = ..., grab_range: float = ..., draw_bounding_box: bool = ..., box_handle_props: dict[str, Any] | None = ..., box_props: dict[str, Any] | None = ...) -> None: + ... + + def onmove(self, event: Event) -> bool: + ... + + @property + def verts(self) -> list[tuple[float, float]]: + ... + + @verts.setter + def verts(self, xys: Sequence[tuple[float, float]]) -> None: + ... + + + +class Lasso(AxesWidget): + useblit: bool + background: Any + verts: list[tuple[float, float]] | None + line: Line2D + callback: Callable[[list[tuple[float, float]]], Any] + def __init__(self, ax: Axes, xy: tuple[float, float], callback: Callable[[list[tuple[float, float]]], Any], *, useblit: bool = ...) -> None: + ... + + def onrelease(self, event: Event) -> None: + ... + + def onmove(self, event: Event) -> None: + ... + + + diff --git a/typings/numpy/__config__.pyi b/typings/numpy/__config__.pyi new file mode 100644 index 0000000..853ac9c --- /dev/null +++ b/typings/numpy/__config__.pyi @@ -0,0 +1,44 @@ +""" +This type stub file was generated by pyright. +""" + +from enum import Enum + +__all__ = ["show"] +_built_with_meson = ... +class DisplayModes(Enum): + stdout = ... + dicts = ... + + +CONFIG = ... +def show(mode=...): # -> dict[str, Unknown] | None: + """ + Show libraries and system information on which NumPy was built + and is being used + + Parameters + ---------- + mode : {`'stdout'`, `'dicts'`}, optional. + Indicates how to display the config information. + `'stdout'` prints to console, `'dicts'` returns a dictionary + of the configuration. + + Returns + ------- + out : {`dict`, `None`} + If mode is `'dicts'`, a dict is returned, else None + + See Also + -------- + get_include : Returns the directory containing NumPy C + header files. + + Notes + ----- + 1. The `'stdout'` mode will give more readable + output if ``pyyaml`` is installed + + """ + ... + diff --git a/typings/numpy/__init__.pyi b/typings/numpy/__init__.pyi new file mode 100644 index 0000000..3403a82 --- /dev/null +++ b/typings/numpy/__init__.pyi @@ -0,0 +1,4443 @@ +""" +This type stub file was generated by pyright. +""" + +import builtins +import sys +import os +import mmap +import ctypes as ct +import array as _array +import datetime as dt +import enum +from abc import abstractmethod +from types import GenericAlias, MappingProxyType, TracebackType +from contextlib import ContextDecorator, contextmanager +from numpy._pytesttester import PytestTester +from numpy.core._internal import _ctypes +from numpy._typing import ArrayLike, DTypeLike, NBitBase, NDArray, _128Bit, _16Bit, _256Bit, _32Bit, _64Bit, _80Bit, _8Bit, _96Bit, _ArrayLikeBool_co, _ArrayLikeBytes_co, _ArrayLikeComplex_co, _ArrayLikeDT64_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeNumber_co, _ArrayLikeObject_co, _ArrayLikeStr_co, _ArrayLikeTD64_co, _ArrayLikeUInt_co, _ArrayLikeUnknown, _BoolCodes, _BoolLike_co, _ByteCodes, _BytesCodes, _CDoubleCodes, _CLongDoubleCodes, _CSingleCodes, _CharLike_co, _Complex128Codes, _Complex64Codes, _ComplexLike_co, _DT64Codes, _DTypeLike, _DTypeLikeVoid, _DoubleCodes, _FiniteNestedSequence, _Float16Codes, _Float32Codes, _Float64Codes, _FloatLike_co, _GUFunc_Nin2_Nout1, _HalfCodes, _Int16Codes, _Int32Codes, _Int64Codes, _Int8Codes, _IntCCodes, _IntCodes, _IntLike_co, _IntPCodes, _LongDoubleCodes, _LongLongCodes, _NBitByte, _NBitDouble, _NBitHalf, _NBitInt, _NBitIntC, _NBitIntP, _NBitLongDouble, _NBitLongLong, _NBitShort, _NBitSingle, _NestedSequence, _NumberLike_co, _ObjectCodes, _ScalarLike_co, _Shape, _ShapeLike, _ShortCodes, _SingleCodes, _StrCodes, _SupportsArray, _SupportsDType, _TD64Codes, _TD64Like_co, _UByteCodes, _UFunc_Nin1_Nout1, _UFunc_Nin1_Nout2, _UFunc_Nin2_Nout1, _UFunc_Nin2_Nout2, _UInt16Codes, _UInt32Codes, _UInt64Codes, _UInt8Codes, _UIntCCodes, _UIntCodes, _UIntPCodes, _ULongLongCodes, _UShortCodes, _UnknownType, _VoidCodes, _VoidDTypeLike +from numpy._typing._callable import _BoolBitOp, _BoolDivMod, _BoolMod, _BoolOp, _BoolSub, _BoolTrueDiv, _ComparisonOp, _ComplexOp, _FloatDivMod, _FloatMod, _FloatOp, _IntTrueDiv, _NumberOp, _SignedIntBitOp, _SignedIntDivMod, _SignedIntMod, _SignedIntOp, _TD64Div, _UnsignedIntBitOp, _UnsignedIntDivMod, _UnsignedIntMod, _UnsignedIntOp +from numpy._typing._extended_precision import complex160 as complex160, complex192 as complex192, complex256 as complex256, complex512 as complex512, float128 as float128, float256 as float256, float80 as float80, float96 as float96, int128 as int128, int256 as int256, uint128 as uint128, uint256 as uint256 +from collections.abc import Buffer as _SupportsBuffer, Callable, Container, Iterable, Iterator, Mapping, Sequence, Sized +from typing import Any, ClassVar, Final, Generator, Generic, IO, Literal as L, NoReturn, Protocol, SupportsComplex, SupportsFloat, SupportsIndex, SupportsInt, TypeVar, Union, final, overload +from numpy import ctypeslib as ctypeslib, dtypes as dtypes, exceptions as exceptions, fft as fft, lib as lib, linalg as linalg, ma as ma, polynomial as polynomial, random as random, testing as testing, version as version +from numpy.core import defchararray, records +from numpy.core.function_base import geomspace as geomspace, linspace as linspace, logspace as logspace +from numpy.core.fromnumeric import all as all, amax as amax, amin as amin, any as any, argmax as argmax, argmin as argmin, argpartition as argpartition, argsort as argsort, around as around, choose as choose, clip as clip, compress as compress, cumprod as cumprod, cumsum as cumsum, diagonal as diagonal, max as max, mean as mean, min as min, ndim as ndim, nonzero as nonzero, partition as partition, prod as prod, ptp as ptp, put as put, ravel as ravel, repeat as repeat, reshape as reshape, resize as resize, round as round, searchsorted as searchsorted, shape as shape, size as size, sort as sort, squeeze as squeeze, std as std, sum as sum, swapaxes as swapaxes, take as take, trace as trace, transpose as transpose, var as var +from numpy.core._asarray import require as require +from numpy.core._type_aliases import sctypeDict as sctypeDict, sctypes as sctypes +from numpy.core._ufunc_config import _ErrDictOptional, _ErrFunc, _ErrKind, getbufsize as getbufsize, geterr as geterr, geterrcall as geterrcall, setbufsize as setbufsize, seterr as seterr, seterrcall as seterrcall +from numpy.core.arrayprint import array2string as array2string, array_repr as array_repr, array_str as array_str, format_float_positional as format_float_positional, format_float_scientific as format_float_scientific, get_printoptions as get_printoptions, printoptions as printoptions, set_printoptions as set_printoptions, set_string_function as set_string_function +from numpy.core.einsumfunc import einsum as einsum, einsum_path as einsum_path +from numpy.core.multiarray import ALLOW_THREADS as ALLOW_THREADS, BUFSIZE as BUFSIZE, CLIP as CLIP, MAXDIMS as MAXDIMS, MAY_SHARE_BOUNDS as MAY_SHARE_BOUNDS, MAY_SHARE_EXACT as MAY_SHARE_EXACT, RAISE as RAISE, WRAP as WRAP, arange as arange, array as array, asanyarray as asanyarray, asarray as asarray, ascontiguousarray as ascontiguousarray, asfortranarray as asfortranarray, bincount as bincount, busday_count as busday_count, busday_offset as busday_offset, can_cast as can_cast, compare_chararrays as compare_chararrays, concatenate as concatenate, copyto as copyto, datetime_as_string as datetime_as_string, datetime_data as datetime_data, dot as dot, empty as empty, empty_like as empty_like, flagsobj, frombuffer as frombuffer, fromfile as fromfile, fromiter as fromiter, frompyfunc as frompyfunc, fromstring as fromstring, geterrobj as geterrobj, inner as inner, is_busday as is_busday, lexsort as lexsort, may_share_memory as may_share_memory, min_scalar_type as min_scalar_type, nested_iters as nested_iters, packbits as packbits, promote_types as promote_types, putmask as putmask, result_type as result_type, seterrobj as seterrobj, shares_memory as shares_memory, tracemalloc_domain as tracemalloc_domain, unpackbits as unpackbits, vdot as vdot, where as where, zeros as zeros +from numpy.core.numeric import allclose as allclose, argwhere as argwhere, array_equal as array_equal, array_equiv as array_equiv, base_repr as base_repr, binary_repr as binary_repr, convolve as convolve, correlate as correlate, count_nonzero as count_nonzero, cross as cross, flatnonzero as flatnonzero, fromfunction as fromfunction, full as full, full_like as full_like, identity as identity, indices as indices, isclose as isclose, isfortran as isfortran, isscalar as isscalar, moveaxis as moveaxis, ones as ones, ones_like as ones_like, outer as outer, roll as roll, rollaxis as rollaxis, tensordot as tensordot, zeros_like as zeros_like +from numpy.core.numerictypes import ScalarType as ScalarType, cast as cast, issctype as issctype, issubclass_ as issubclass_, issubdtype as issubdtype, issubsctype as issubsctype, maximum_sctype as maximum_sctype, nbytes as nbytes, obj2sctype as obj2sctype, sctype2char as sctype2char, typecodes as typecodes +from numpy.core.shape_base import atleast_1d as atleast_1d, atleast_2d as atleast_2d, atleast_3d as atleast_3d, block as block, hstack as hstack, stack as stack, vstack as vstack +from numpy.exceptions import AxisError as AxisError, ComplexWarning as ComplexWarning, DTypePromotionError as DTypePromotionError, ModuleDeprecationWarning as ModuleDeprecationWarning, TooHardError as TooHardError, VisibleDeprecationWarning as VisibleDeprecationWarning +from numpy.lib import emath as emath +from numpy.lib.arraypad import pad as pad +from numpy.lib.arraysetops import ediff1d as ediff1d, in1d as in1d, intersect1d as intersect1d, isin as isin, setdiff1d as setdiff1d, setxor1d as setxor1d, union1d as union1d, unique as unique +from numpy.lib.arrayterator import Arrayterator as Arrayterator +from numpy.lib.function_base import add_docstring as add_docstring, add_newdoc as add_newdoc, add_newdoc_ufunc as add_newdoc_ufunc, angle as angle, append as append, asarray_chkfinite as asarray_chkfinite, average as average, bartlett as bartlett, bincount as bincount, blackman as blackman, copy as copy, corrcoef as corrcoef, cov as cov, delete as delete, diff as diff, digitize as digitize, disp as disp, extract as extract, flip as flip, gradient as gradient, hamming as hamming, hanning as hanning, i0 as i0, insert as insert, interp as interp, iterable as iterable, kaiser as kaiser, median as median, meshgrid as meshgrid, percentile as percentile, piecewise as piecewise, place as place, quantile as quantile, rot90 as rot90, select as select, sinc as sinc, sort_complex as sort_complex, trapz as trapz, trim_zeros as trim_zeros, unwrap as unwrap +from numpy.lib.histograms import histogram as histogram, histogram_bin_edges as histogram_bin_edges, histogramdd as histogramdd +from numpy.lib.index_tricks import c_ as c_, diag_indices as diag_indices, diag_indices_from as diag_indices_from, fill_diagonal as fill_diagonal, index_exp as index_exp, ix_ as ix_, mgrid as mgrid, ogrid as ogrid, r_ as r_, ravel_multi_index as ravel_multi_index, s_ as s_, unravel_index as unravel_index +from numpy.lib.nanfunctions import nanargmax as nanargmax, nanargmin as nanargmin, nancumprod as nancumprod, nancumsum as nancumsum, nanmax as nanmax, nanmean as nanmean, nanmedian as nanmedian, nanmin as nanmin, nanpercentile as nanpercentile, nanprod as nanprod, nanquantile as nanquantile, nanstd as nanstd, nansum as nansum, nanvar as nanvar +from numpy.lib.npyio import fromregex as fromregex, genfromtxt as genfromtxt, load as load, loadtxt as loadtxt, packbits as packbits, recfromcsv as recfromcsv, recfromtxt as recfromtxt, save as save, savetxt as savetxt, savez as savez, savez_compressed as savez_compressed, unpackbits as unpackbits +from numpy.lib.polynomial import poly as poly, polyadd as polyadd, polyder as polyder, polydiv as polydiv, polyfit as polyfit, polyint as polyint, polymul as polymul, polysub as polysub, polyval as polyval, roots as roots +from numpy.lib.shape_base import apply_along_axis as apply_along_axis, apply_over_axes as apply_over_axes, array_split as array_split, column_stack as column_stack, dsplit as dsplit, dstack as dstack, expand_dims as expand_dims, get_array_wrap as get_array_wrap, hsplit as hsplit, kron as kron, put_along_axis as put_along_axis, row_stack as row_stack, split as split, take_along_axis as take_along_axis, tile as tile, vsplit as vsplit +from numpy.lib.stride_tricks import broadcast_arrays as broadcast_arrays, broadcast_shapes as broadcast_shapes, broadcast_to as broadcast_to +from numpy.lib.twodim_base import diag as diag, diagflat as diagflat, eye as eye, fliplr as fliplr, flipud as flipud, histogram2d as histogram2d, mask_indices as mask_indices, tri as tri, tril as tril, tril_indices as tril_indices, tril_indices_from as tril_indices_from, triu as triu, triu_indices as triu_indices, triu_indices_from as triu_indices_from, vander as vander +from numpy.lib.type_check import asfarray as asfarray, common_type as common_type, imag as imag, iscomplex as iscomplex, iscomplexobj as iscomplexobj, isreal as isreal, isrealobj as isrealobj, mintypecode as mintypecode, nan_to_num as nan_to_num, real as real, real_if_close as real_if_close, typename as typename +from numpy.lib.ufunclike import fix as fix, isneginf as isneginf, isposinf as isposinf +from numpy.lib.utils import byte_bounds as byte_bounds, deprecate as deprecate, deprecate_with_doc as deprecate_with_doc, get_include as get_include, info as info, issubclass_ as issubclass_, issubdtype as issubdtype, issubsctype as issubsctype, lookfor as lookfor, safe_eval as safe_eval, show_runtime as show_runtime, source as source, who as who +from numpy.matrixlib import asmatrix as asmatrix, bmat as bmat, mat as mat + +char = defchararray +rec = records +_AnyStr_contra = TypeVar("_AnyStr_contra", str, bytes, contravariant=True) +class _IOProtocol(Protocol): + def flush(self) -> object: + ... + + def fileno(self) -> int: + ... + + def tell(self) -> SupportsIndex: + ... + + def seek(self, offset: int, whence: int, /) -> object: + ... + + + +class _MemMapIOProtocol(Protocol): + def flush(self) -> object: + ... + + def fileno(self) -> SupportsIndex: + ... + + def tell(self) -> int: + ... + + def seek(self, offset: int, whence: int, /) -> object: + ... + + def write(self, s: bytes, /) -> object: + ... + + @property + def read(self) -> object: + ... + + + +class _SupportsWrite(Protocol[_AnyStr_contra]): + def write(self, s: _AnyStr_contra, /) -> object: + ... + + + +__all__: list[str] +__path__: list[str] +__version__: str +test: PytestTester +def show_config() -> None: + ... + +_NdArraySubClass = TypeVar("_NdArraySubClass", bound=ndarray[Any, Any]) +_DTypeScalar_co = TypeVar("_DTypeScalar_co", covariant=True, bound=generic) +_ByteOrder = L["S", "<", ">", "=", "|", "L", "B", "N", "I"] +@final +class dtype(Generic[_DTypeScalar_co]): + names: None | tuple[builtins.str, ...] + def __hash__(self) -> int: + ... + + @overload + def __new__(cls, dtype: type[_DTypeScalar_co], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[_DTypeScalar_co]: + ... + + @overload + def __new__(cls, dtype: type[bool], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[bool_]: + ... + + @overload + def __new__(cls, dtype: type[int], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[int_]: + ... + + @overload + def __new__(cls, dtype: None | type[float], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[float_]: + ... + + @overload + def __new__(cls, dtype: type[complex], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[complex_]: + ... + + @overload + def __new__(cls, dtype: type[builtins.str], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[str_]: + ... + + @overload + def __new__(cls, dtype: type[bytes], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[bytes_]: + ... + + @overload + def __new__(cls, dtype: _UInt8Codes | type[ct.c_uint8], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[uint8]: + ... + + @overload + def __new__(cls, dtype: _UInt16Codes | type[ct.c_uint16], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[uint16]: + ... + + @overload + def __new__(cls, dtype: _UInt32Codes | type[ct.c_uint32], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[uint32]: + ... + + @overload + def __new__(cls, dtype: _UInt64Codes | type[ct.c_uint64], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[uint64]: + ... + + @overload + def __new__(cls, dtype: _UByteCodes | type[ct.c_ubyte], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[ubyte]: + ... + + @overload + def __new__(cls, dtype: _UShortCodes | type[ct.c_ushort], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[ushort]: + ... + + @overload + def __new__(cls, dtype: _UIntCCodes | type[ct.c_uint], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[uintc]: + ... + + @overload + def __new__(cls, dtype: _UIntPCodes | type[ct.c_void_p] | type[ct.c_size_t], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[uintp]: + ... + + @overload + def __new__(cls, dtype: _UIntCodes | type[ct.c_ulong], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[uint]: + ... + + @overload + def __new__(cls, dtype: _ULongLongCodes | type[ct.c_ulonglong], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[ulonglong]: + ... + + @overload + def __new__(cls, dtype: _Int8Codes | type[ct.c_int8], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[int8]: + ... + + @overload + def __new__(cls, dtype: _Int16Codes | type[ct.c_int16], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[int16]: + ... + + @overload + def __new__(cls, dtype: _Int32Codes | type[ct.c_int32], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[int32]: + ... + + @overload + def __new__(cls, dtype: _Int64Codes | type[ct.c_int64], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[int64]: + ... + + @overload + def __new__(cls, dtype: _ByteCodes | type[ct.c_byte], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[byte]: + ... + + @overload + def __new__(cls, dtype: _ShortCodes | type[ct.c_short], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[short]: + ... + + @overload + def __new__(cls, dtype: _IntCCodes | type[ct.c_int], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[intc]: + ... + + @overload + def __new__(cls, dtype: _IntPCodes | type[ct.c_ssize_t], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[intp]: + ... + + @overload + def __new__(cls, dtype: _IntCodes | type[ct.c_long], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[int_]: + ... + + @overload + def __new__(cls, dtype: _LongLongCodes | type[ct.c_longlong], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[longlong]: + ... + + @overload + def __new__(cls, dtype: _Float16Codes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[float16]: + ... + + @overload + def __new__(cls, dtype: _Float32Codes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[float32]: + ... + + @overload + def __new__(cls, dtype: _Float64Codes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[float64]: + ... + + @overload + def __new__(cls, dtype: _HalfCodes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[half]: + ... + + @overload + def __new__(cls, dtype: _SingleCodes | type[ct.c_float], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[single]: + ... + + @overload + def __new__(cls, dtype: _DoubleCodes | type[ct.c_double], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[double]: + ... + + @overload + def __new__(cls, dtype: _LongDoubleCodes | type[ct.c_longdouble], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[longdouble]: + ... + + @overload + def __new__(cls, dtype: _Complex64Codes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[complex64]: + ... + + @overload + def __new__(cls, dtype: _Complex128Codes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[complex128]: + ... + + @overload + def __new__(cls, dtype: _CSingleCodes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[csingle]: + ... + + @overload + def __new__(cls, dtype: _CDoubleCodes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[cdouble]: + ... + + @overload + def __new__(cls, dtype: _CLongDoubleCodes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[clongdouble]: + ... + + @overload + def __new__(cls, dtype: _BoolCodes | type[ct.c_bool], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[bool_]: + ... + + @overload + def __new__(cls, dtype: _TD64Codes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[timedelta64]: + ... + + @overload + def __new__(cls, dtype: _DT64Codes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[datetime64]: + ... + + @overload + def __new__(cls, dtype: _StrCodes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[str_]: + ... + + @overload + def __new__(cls, dtype: _BytesCodes | type[ct.c_char], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[bytes_]: + ... + + @overload + def __new__(cls, dtype: _VoidCodes, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[void]: + ... + + @overload + def __new__(cls, dtype: _ObjectCodes | type[ct.py_object[Any]], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[object_]: + ... + + @overload + def __new__(cls, dtype: dtype[_DTypeScalar_co], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[_DTypeScalar_co]: + ... + + @overload + def __new__(cls, dtype: _SupportsDType[dtype[_DTypeScalar_co]], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[_DTypeScalar_co]: + ... + + @overload + def __new__(cls, dtype: builtins.str, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[Any]: + ... + + @overload + def __new__(cls, dtype: _VoidDTypeLike, align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[void]: + ... + + @overload + def __new__(cls, dtype: type[object], align: bool = ..., copy: bool = ..., metadata: dict[builtins.str, Any] = ...) -> dtype[object_]: + ... + + def __class_getitem__(self, item: Any) -> GenericAlias: + ... + + @overload + def __getitem__(self: dtype[void], key: list[builtins.str]) -> dtype[void]: + ... + + @overload + def __getitem__(self: dtype[void], key: builtins.str | SupportsIndex) -> dtype[Any]: + ... + + @overload + def __mul__(self: _DType, value: L[1]) -> _DType: + ... + + @overload + def __mul__(self: _FlexDType, value: SupportsIndex) -> _FlexDType: + ... + + @overload + def __mul__(self, value: SupportsIndex) -> dtype[void]: + ... + + @overload + def __rmul__(self: _FlexDType, value: SupportsIndex) -> _FlexDType: + ... + + @overload + def __rmul__(self, value: SupportsIndex) -> dtype[Any]: + ... + + def __gt__(self, other: DTypeLike) -> bool: + ... + + def __ge__(self, other: DTypeLike) -> bool: + ... + + def __lt__(self, other: DTypeLike) -> bool: + ... + + def __le__(self, other: DTypeLike) -> bool: + ... + + def __eq__(self, other: Any) -> bool: + ... + + def __ne__(self, other: Any) -> bool: + ... + + @property + def alignment(self) -> int: + ... + + @property + def base(self) -> dtype[Any]: + ... + + @property + def byteorder(self) -> builtins.str: + ... + + @property + def char(self) -> builtins.str: + ... + + @property + def descr(self) -> list[tuple[builtins.str, builtins.str] | tuple[builtins.str, builtins.str, _Shape]]: + ... + + @property + def fields(self) -> None | MappingProxyType[builtins.str, tuple[dtype[Any], int] | tuple[dtype[Any], int, Any]]: + ... + + @property + def flags(self) -> int: + ... + + @property + def hasobject(self) -> bool: + ... + + @property + def isbuiltin(self) -> int: + ... + + @property + def isnative(self) -> bool: + ... + + @property + def isalignedstruct(self) -> bool: + ... + + @property + def itemsize(self) -> int: + ... + + @property + def kind(self) -> builtins.str: + ... + + @property + def metadata(self) -> None | MappingProxyType[builtins.str, Any]: + ... + + @property + def name(self) -> builtins.str: + ... + + @property + def num(self) -> int: + ... + + @property + def shape(self) -> _Shape: + ... + + @property + def ndim(self) -> int: + ... + + @property + def subdtype(self) -> None | tuple[dtype[Any], _Shape]: + ... + + def newbyteorder(self: _DType, __new_order: _ByteOrder = ...) -> _DType: + ... + + @property + def str(self) -> builtins.str: + ... + + @property + def type(self) -> type[_DTypeScalar_co]: + ... + + + +_ArrayLikeInt = Union[int, integer[Any], Sequence[Union[int, integer[Any]]], Sequence[Sequence[Any]], ndarray[Any, Any]] +_FlatIterSelf = TypeVar("_FlatIterSelf", bound=flatiter[Any]) +@final +class flatiter(Generic[_NdArraySubClass]): + __hash__: ClassVar[None] + @property + def base(self) -> _NdArraySubClass: + ... + + @property + def coords(self) -> _Shape: + ... + + @property + def index(self) -> int: + ... + + def copy(self) -> _NdArraySubClass: + ... + + def __iter__(self: _FlatIterSelf) -> _FlatIterSelf: + ... + + def __next__(self: flatiter[ndarray[Any, dtype[_ScalarType]]]) -> _ScalarType: + ... + + def __len__(self) -> int: + ... + + @overload + def __getitem__(self: flatiter[ndarray[Any, dtype[_ScalarType]]], key: int | integer[Any] | tuple[int | integer[Any]]) -> _ScalarType: + ... + + @overload + def __getitem__(self, key: _ArrayLikeInt | slice | ellipsis | tuple[_ArrayLikeInt | slice | ellipsis]) -> _NdArraySubClass: + ... + + def __setitem__(self, key: _ArrayLikeInt | slice | ellipsis | tuple[_ArrayLikeInt | slice | ellipsis], value: Any) -> None: + ... + + @overload + def __array__(self: flatiter[ndarray[Any, _DType]], dtype: None = ..., /) -> ndarray[Any, _DType]: + ... + + @overload + def __array__(self, dtype: _DType, /) -> ndarray[Any, _DType]: + ... + + + +_OrderKACF = L[None, "K", "A", "C", "F"] +_OrderACF = L[None, "A", "C", "F"] +_OrderCF = L[None, "C", "F"] +_ModeKind = L["raise", "wrap", "clip"] +_PartitionKind = L["introselect"] +_SortKind = L["quicksort", "mergesort", "heapsort", "stable"] +_SortSide = L["left", "right"] +_ArraySelf = TypeVar("_ArraySelf", bound=_ArrayOrScalarCommon) +class _ArrayOrScalarCommon: + @property + def T(self: _ArraySelf) -> _ArraySelf: + ... + + @property + def data(self) -> memoryview: + ... + + @property + def flags(self) -> flagsobj: + ... + + @property + def itemsize(self) -> int: + ... + + @property + def nbytes(self) -> int: + ... + + def __bool__(self) -> bool: + ... + + def __bytes__(self) -> bytes: + ... + + def __str__(self) -> str: + ... + + def __repr__(self) -> str: + ... + + def __copy__(self: _ArraySelf) -> _ArraySelf: + ... + + def __deepcopy__(self: _ArraySelf, memo: None | dict[int, Any], /) -> _ArraySelf: + ... + + def __eq__(self, other: Any) -> Any: + ... + + def __ne__(self, other: Any) -> Any: + ... + + def copy(self: _ArraySelf, order: _OrderKACF = ...) -> _ArraySelf: + ... + + def dump(self, file: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _SupportsWrite[bytes]) -> None: + ... + + def dumps(self) -> bytes: + ... + + def tobytes(self, order: _OrderKACF = ...) -> bytes: + ... + + def tofile(self, fid: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _IOProtocol, sep: str = ..., format: str = ...) -> None: + ... + + def tolist(self) -> Any: + ... + + @property + def __array_interface__(self) -> dict[str, Any]: + ... + + @property + def __array_priority__(self) -> float: + ... + + @property + def __array_struct__(self) -> Any: + ... + + def __setstate__(self, state: tuple[SupportsIndex, _ShapeLike, _DType_co, bool, bytes | list[Any],], /) -> None: + ... + + @overload + def all(self, axis: None = ..., out: None = ..., keepdims: L[False] = ..., *, where: _ArrayLikeBool_co = ...) -> bool_: + ... + + @overload + def all(self, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def all(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + @overload + def any(self, axis: None = ..., out: None = ..., keepdims: L[False] = ..., *, where: _ArrayLikeBool_co = ...) -> bool_: + ... + + @overload + def any(self, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def any(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + @overload + def argmax(self, axis: None = ..., out: None = ..., *, keepdims: L[False] = ...) -> intp: + ... + + @overload + def argmax(self, axis: SupportsIndex = ..., out: None = ..., *, keepdims: bool = ...) -> Any: + ... + + @overload + def argmax(self, axis: None | SupportsIndex = ..., out: _NdArraySubClass = ..., *, keepdims: bool = ...) -> _NdArraySubClass: + ... + + @overload + def argmin(self, axis: None = ..., out: None = ..., *, keepdims: L[False] = ...) -> intp: + ... + + @overload + def argmin(self, axis: SupportsIndex = ..., out: None = ..., *, keepdims: bool = ...) -> Any: + ... + + @overload + def argmin(self, axis: None | SupportsIndex = ..., out: _NdArraySubClass = ..., *, keepdims: bool = ...) -> _NdArraySubClass: + ... + + def argsort(self, axis: None | SupportsIndex = ..., kind: None | _SortKind = ..., order: None | str | Sequence[str] = ...) -> ndarray[Any, Any]: + ... + + @overload + def choose(self, choices: ArrayLike, out: None = ..., mode: _ModeKind = ...) -> ndarray[Any, Any]: + ... + + @overload + def choose(self, choices: ArrayLike, out: _NdArraySubClass = ..., mode: _ModeKind = ...) -> _NdArraySubClass: + ... + + @overload + def clip(self, min: ArrayLike = ..., max: None | ArrayLike = ..., out: None = ..., **kwargs: Any) -> ndarray[Any, Any]: + ... + + @overload + def clip(self, min: None = ..., max: ArrayLike = ..., out: None = ..., **kwargs: Any) -> ndarray[Any, Any]: + ... + + @overload + def clip(self, min: ArrayLike = ..., max: None | ArrayLike = ..., out: _NdArraySubClass = ..., **kwargs: Any) -> _NdArraySubClass: + ... + + @overload + def clip(self, min: None = ..., max: ArrayLike = ..., out: _NdArraySubClass = ..., **kwargs: Any) -> _NdArraySubClass: + ... + + @overload + def compress(self, a: ArrayLike, axis: None | SupportsIndex = ..., out: None = ...) -> ndarray[Any, Any]: + ... + + @overload + def compress(self, a: ArrayLike, axis: None | SupportsIndex = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + def conj(self: _ArraySelf) -> _ArraySelf: + ... + + def conjugate(self: _ArraySelf) -> _ArraySelf: + ... + + @overload + def cumprod(self, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: None = ...) -> ndarray[Any, Any]: + ... + + @overload + def cumprod(self, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def cumsum(self, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: None = ...) -> ndarray[Any, Any]: + ... + + @overload + def cumsum(self, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def max(self, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def max(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + @overload + def mean(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def mean(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + @overload + def min(self, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def min(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + def newbyteorder(self: _ArraySelf, __new_order: _ByteOrder = ...) -> _ArraySelf: + ... + + @overload + def prod(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def prod(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + @overload + def ptp(self, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ...) -> Any: + ... + + @overload + def ptp(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ...) -> _NdArraySubClass: + ... + + @overload + def round(self: _ArraySelf, decimals: SupportsIndex = ..., out: None = ...) -> _ArraySelf: + ... + + @overload + def round(self, decimals: SupportsIndex = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def std(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def std(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + @overload + def sum(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def sum(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + @overload + def var(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + + @overload + def var(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _NdArraySubClass: + ... + + + +_DType = TypeVar("_DType", bound=dtype[Any]) +_DType_co = TypeVar("_DType_co", covariant=True, bound=dtype[Any]) +_FlexDType = TypeVar("_FlexDType", bound=dtype[flexible]) +_ShapeType = TypeVar("_ShapeType", bound=Any) +_ShapeType2 = TypeVar("_ShapeType2", bound=Any) +_NumberType = TypeVar("_NumberType", bound=number[Any]) +if sys.version_info >= (3, 12): + ... +else: + ... +_T = TypeVar("_T") +_T_co = TypeVar("_T_co", covariant=True) +_T_contra = TypeVar("_T_contra", contravariant=True) +_2Tuple = tuple[_T, _T] +_CastingKind = L["no", "equiv", "safe", "same_kind", "unsafe"] +_ArrayUInt_co = NDArray[Union[bool_, unsignedinteger[Any]]] +_ArrayInt_co = NDArray[Union[bool_, integer[Any]]] +_ArrayFloat_co = NDArray[Union[bool_, integer[Any], floating[Any]]] +_ArrayComplex_co = NDArray[Union[bool_, integer[Any], floating[Any], complexfloating[Any, Any]]] +_ArrayNumber_co = NDArray[Union[bool_, number[Any]]] +_ArrayTD64_co = NDArray[Union[bool_, integer[Any], timedelta64]] +_dtype = dtype +_PyCapsule = Any +class _SupportsItem(Protocol[_T_co]): + def item(self, args: Any, /) -> _T_co: + ... + + + +class _SupportsReal(Protocol[_T_co]): + @property + def real(self) -> _T_co: + ... + + + +class _SupportsImag(Protocol[_T_co]): + @property + def imag(self) -> _T_co: + ... + + + +class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]): + __hash__: ClassVar[None] + @property + def base(self) -> None | ndarray[Any, Any]: + ... + + @property + def ndim(self) -> int: + ... + + @property + def size(self) -> int: + ... + + @property + def real(self: ndarray[_ShapeType, dtype[_SupportsReal[_ScalarType]]]) -> ndarray[_ShapeType, _dtype[_ScalarType]]: + ... + + @real.setter + def real(self, value: ArrayLike) -> None: + ... + + @property + def imag(self: ndarray[_ShapeType, dtype[_SupportsImag[_ScalarType]]]) -> ndarray[_ShapeType, _dtype[_ScalarType]]: + ... + + @imag.setter + def imag(self, value: ArrayLike) -> None: + ... + + def __new__(cls: type[_ArraySelf], shape: _ShapeLike, dtype: DTypeLike = ..., buffer: None | _SupportsBuffer = ..., offset: SupportsIndex = ..., strides: None | _ShapeLike = ..., order: _OrderKACF = ...) -> _ArraySelf: + ... + + if sys.version_info >= (3, 12): + def __buffer__(self, flags: int, /) -> memoryview: + ... + + def __class_getitem__(self, item: Any) -> GenericAlias: + ... + + @overload + def __array__(self, dtype: None = ..., /) -> ndarray[Any, _DType_co]: + ... + + @overload + def __array__(self, dtype: _DType, /) -> ndarray[Any, _DType]: + ... + + def __array_ufunc__(self, ufunc: ufunc, method: L["__call__", "reduce", "reduceat", "accumulate", "outer", "inner"], *inputs: Any, **kwargs: Any) -> Any: + ... + + def __array_function__(self, func: Callable[..., Any], types: Iterable[type], args: Iterable[Any], kwargs: Mapping[str, Any]) -> Any: + ... + + def __array_finalize__(self, obj: None | NDArray[Any], /) -> None: + ... + + def __array_wrap__(self, array: ndarray[_ShapeType2, _DType], context: None | tuple[ufunc, tuple[Any, ...], int] = ..., /) -> ndarray[_ShapeType2, _DType]: + ... + + def __array_prepare__(self, array: ndarray[_ShapeType2, _DType], context: None | tuple[ufunc, tuple[Any, ...], int] = ..., /) -> ndarray[_ShapeType2, _DType]: + ... + + @overload + def __getitem__(self, key: (NDArray[integer[Any]] | NDArray[bool_] | tuple[NDArray[integer[Any]] | NDArray[bool_], ...])) -> ndarray[Any, _DType_co]: + ... + + @overload + def __getitem__(self, key: SupportsIndex | tuple[SupportsIndex, ...]) -> Any: + ... + + @overload + def __getitem__(self, key: (None | slice | ellipsis | SupportsIndex | _ArrayLikeInt_co | tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...])) -> ndarray[Any, _DType_co]: + ... + + @overload + def __getitem__(self: NDArray[void], key: str) -> NDArray[Any]: + ... + + @overload + def __getitem__(self: NDArray[void], key: list[str]) -> ndarray[_ShapeType, _dtype[void]]: + ... + + @property + def ctypes(self) -> _ctypes[int]: + ... + + @property + def shape(self) -> _Shape: + ... + + @shape.setter + def shape(self, value: _ShapeLike) -> None: + ... + + @property + def strides(self) -> _Shape: + ... + + @strides.setter + def strides(self, value: _ShapeLike) -> None: + ... + + def byteswap(self: _ArraySelf, inplace: bool = ...) -> _ArraySelf: + ... + + def fill(self, value: Any) -> None: + ... + + @property + def flat(self: _NdArraySubClass) -> flatiter[_NdArraySubClass]: + ... + + @overload + def item(self: ndarray[Any, _dtype[_SupportsItem[_T]]], *args: SupportsIndex) -> _T: + ... + + @overload + def item(self: ndarray[Any, _dtype[_SupportsItem[_T]]], args: tuple[SupportsIndex, ...], /) -> _T: + ... + + @overload + def itemset(self, value: Any, /) -> None: + ... + + @overload + def itemset(self, item: _ShapeLike, value: Any, /) -> None: + ... + + @overload + def resize(self, new_shape: _ShapeLike, /, *, refcheck: bool = ...) -> None: + ... + + @overload + def resize(self, *new_shape: SupportsIndex, refcheck: bool = ...) -> None: + ... + + def setflags(self, write: bool = ..., align: bool = ..., uic: bool = ...) -> None: + ... + + def squeeze(self, axis: None | SupportsIndex | tuple[SupportsIndex, ...] = ...) -> ndarray[Any, _DType_co]: + ... + + def swapaxes(self, axis1: SupportsIndex, axis2: SupportsIndex) -> ndarray[Any, _DType_co]: + ... + + @overload + def transpose(self: _ArraySelf, axes: None | _ShapeLike, /) -> _ArraySelf: + ... + + @overload + def transpose(self: _ArraySelf, *axes: SupportsIndex) -> _ArraySelf: + ... + + def argpartition(self, kth: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., kind: _PartitionKind = ..., order: None | str | Sequence[str] = ...) -> ndarray[Any, _dtype[intp]]: + ... + + def diagonal(self, offset: SupportsIndex = ..., axis1: SupportsIndex = ..., axis2: SupportsIndex = ...) -> ndarray[Any, _DType_co]: + ... + + @overload + def dot(self, b: _ScalarLike_co, out: None = ...) -> ndarray[Any, Any]: + ... + + @overload + def dot(self, b: ArrayLike, out: None = ...) -> Any: + ... + + @overload + def dot(self, b: ArrayLike, out: _NdArraySubClass) -> _NdArraySubClass: + ... + + def nonzero(self) -> tuple[ndarray[Any, _dtype[intp]], ...]: + ... + + def partition(self, kth: _ArrayLikeInt_co, axis: SupportsIndex = ..., kind: _PartitionKind = ..., order: None | str | Sequence[str] = ...) -> None: + ... + + def put(self, ind: _ArrayLikeInt_co, v: ArrayLike, mode: _ModeKind = ...) -> None: + ... + + @overload + def searchsorted(self, v: _ScalarLike_co, side: _SortSide = ..., sorter: None | _ArrayLikeInt_co = ...) -> intp: + ... + + @overload + def searchsorted(self, v: ArrayLike, side: _SortSide = ..., sorter: None | _ArrayLikeInt_co = ...) -> ndarray[Any, _dtype[intp]]: + ... + + def setfield(self, val: ArrayLike, dtype: DTypeLike, offset: SupportsIndex = ...) -> None: + ... + + def sort(self, axis: SupportsIndex = ..., kind: None | _SortKind = ..., order: None | str | Sequence[str] = ...) -> None: + ... + + @overload + def trace(self, offset: SupportsIndex = ..., axis1: SupportsIndex = ..., axis2: SupportsIndex = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: + ... + + @overload + def trace(self, offset: SupportsIndex = ..., axis1: SupportsIndex = ..., axis2: SupportsIndex = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def take(self: ndarray[Any, _dtype[_ScalarType]], indices: _IntLike_co, axis: None | SupportsIndex = ..., out: None = ..., mode: _ModeKind = ...) -> _ScalarType: + ... + + @overload + def take(self, indices: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., out: None = ..., mode: _ModeKind = ...) -> ndarray[Any, _DType_co]: + ... + + @overload + def take(self, indices: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., out: _NdArraySubClass = ..., mode: _ModeKind = ...) -> _NdArraySubClass: + ... + + def repeat(self, repeats: _ArrayLikeInt_co, axis: None | SupportsIndex = ...) -> ndarray[Any, _DType_co]: + ... + + def flatten(self, order: _OrderKACF = ...) -> ndarray[Any, _DType_co]: + ... + + def ravel(self, order: _OrderKACF = ...) -> ndarray[Any, _DType_co]: + ... + + @overload + def reshape(self, shape: _ShapeLike, /, *, order: _OrderACF = ...) -> ndarray[Any, _DType_co]: + ... + + @overload + def reshape(self, *shape: SupportsIndex, order: _OrderACF = ...) -> ndarray[Any, _DType_co]: + ... + + @overload + def astype(self, dtype: _DTypeLike[_ScalarType], order: _OrderKACF = ..., casting: _CastingKind = ..., subok: bool = ..., copy: bool | _CopyMode = ...) -> NDArray[_ScalarType]: + ... + + @overload + def astype(self, dtype: DTypeLike, order: _OrderKACF = ..., casting: _CastingKind = ..., subok: bool = ..., copy: bool | _CopyMode = ...) -> NDArray[Any]: + ... + + @overload + def view(self: _ArraySelf) -> _ArraySelf: + ... + + @overload + def view(self, type: type[_NdArraySubClass]) -> _NdArraySubClass: + ... + + @overload + def view(self, dtype: _DTypeLike[_ScalarType]) -> NDArray[_ScalarType]: + ... + + @overload + def view(self, dtype: DTypeLike) -> NDArray[Any]: + ... + + @overload + def view(self, dtype: DTypeLike, type: type[_NdArraySubClass]) -> _NdArraySubClass: + ... + + @overload + def getfield(self, dtype: _DTypeLike[_ScalarType], offset: SupportsIndex = ...) -> NDArray[_ScalarType]: + ... + + @overload + def getfield(self, dtype: DTypeLike, offset: SupportsIndex = ...) -> NDArray[Any]: + ... + + def __int__(self: ndarray[Any, _dtype[SupportsInt]]) -> int: + ... + + def __float__(self: ndarray[Any, _dtype[SupportsFloat]]) -> float: + ... + + def __complex__(self: ndarray[Any, _dtype[SupportsComplex]]) -> complex: + ... + + def __index__(self: ndarray[Any, _dtype[SupportsIndex]]) -> int: + ... + + def __len__(self) -> int: + ... + + def __setitem__(self, key, value): + ... + + def __iter__(self) -> Any: + ... + + def __contains__(self, key) -> bool: + ... + + @overload + def __lt__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: + ... + + @overload + def __lt__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[bool_]: + ... + + @overload + def __lt__(self: NDArray[datetime64], other: _ArrayLikeDT64_co) -> NDArray[bool_]: + ... + + @overload + def __lt__(self: NDArray[object_], other: Any) -> NDArray[bool_]: + ... + + @overload + def __lt__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: + ... + + @overload + def __le__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: + ... + + @overload + def __le__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[bool_]: + ... + + @overload + def __le__(self: NDArray[datetime64], other: _ArrayLikeDT64_co) -> NDArray[bool_]: + ... + + @overload + def __le__(self: NDArray[object_], other: Any) -> NDArray[bool_]: + ... + + @overload + def __le__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: + ... + + @overload + def __gt__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: + ... + + @overload + def __gt__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[bool_]: + ... + + @overload + def __gt__(self: NDArray[datetime64], other: _ArrayLikeDT64_co) -> NDArray[bool_]: + ... + + @overload + def __gt__(self: NDArray[object_], other: Any) -> NDArray[bool_]: + ... + + @overload + def __gt__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: + ... + + @overload + def __ge__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: + ... + + @overload + def __ge__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[bool_]: + ... + + @overload + def __ge__(self: NDArray[datetime64], other: _ArrayLikeDT64_co) -> NDArray[bool_]: + ... + + @overload + def __ge__(self: NDArray[object_], other: Any) -> NDArray[bool_]: + ... + + @overload + def __ge__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: + ... + + @overload + def __abs__(self: NDArray[bool_]) -> NDArray[bool_]: + ... + + @overload + def __abs__(self: NDArray[complexfloating[_NBit1, _NBit1]]) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __abs__(self: NDArray[_NumberType]) -> NDArray[_NumberType]: + ... + + @overload + def __abs__(self: NDArray[timedelta64]) -> NDArray[timedelta64]: + ... + + @overload + def __abs__(self: NDArray[object_]) -> Any: + ... + + @overload + def __invert__(self: NDArray[bool_]) -> NDArray[bool_]: + ... + + @overload + def __invert__(self: NDArray[_IntType]) -> NDArray[_IntType]: + ... + + @overload + def __invert__(self: NDArray[object_]) -> Any: + ... + + @overload + def __pos__(self: NDArray[_NumberType]) -> NDArray[_NumberType]: + ... + + @overload + def __pos__(self: NDArray[timedelta64]) -> NDArray[timedelta64]: + ... + + @overload + def __pos__(self: NDArray[object_]) -> Any: + ... + + @overload + def __neg__(self: NDArray[_NumberType]) -> NDArray[_NumberType]: + ... + + @overload + def __neg__(self: NDArray[timedelta64]) -> NDArray[timedelta64]: + ... + + @overload + def __neg__(self: NDArray[object_]) -> Any: + ... + + @overload + def __matmul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __matmul__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __matmul__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __matmul__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __matmul__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __matmul__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __matmul__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __matmul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rmatmul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __rmatmul__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rmatmul__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rmatmul__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __rmatmul__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __rmatmul__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __rmatmul__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rmatmul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __mod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __mod__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __mod__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __mod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __mod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: + ... + + @overload + def __mod__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __mod__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rmod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __rmod__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rmod__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rmod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __rmod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: + ... + + @overload + def __rmod__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rmod__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __divmod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> _2Tuple[NDArray[int8]]: + ... + + @overload + def __divmod__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> _2Tuple[NDArray[unsignedinteger[Any]]]: + ... + + @overload + def __divmod__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> _2Tuple[NDArray[signedinteger[Any]]]: + ... + + @overload + def __divmod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> _2Tuple[NDArray[floating[Any]]]: + ... + + @overload + def __divmod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> tuple[NDArray[int64], NDArray[timedelta64]]: + ... + + @overload + def __rdivmod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> _2Tuple[NDArray[int8]]: + ... + + @overload + def __rdivmod__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> _2Tuple[NDArray[unsignedinteger[Any]]]: + ... + + @overload + def __rdivmod__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> _2Tuple[NDArray[signedinteger[Any]]]: + ... + + @overload + def __rdivmod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> _2Tuple[NDArray[floating[Any]]]: + ... + + @overload + def __rdivmod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> tuple[NDArray[int64], NDArray[timedelta64]]: + ... + + @overload + def __add__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __add__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __add__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __add__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __add__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __add__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __add__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __add__(self: _ArrayTD64_co, other: _ArrayLikeDT64_co) -> NDArray[datetime64]: + ... + + @overload + def __add__(self: NDArray[datetime64], other: _ArrayLikeTD64_co) -> NDArray[datetime64]: + ... + + @overload + def __add__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __add__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __radd__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __radd__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __radd__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __radd__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __radd__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __radd__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __radd__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __radd__(self: _ArrayTD64_co, other: _ArrayLikeDT64_co) -> NDArray[datetime64]: + ... + + @overload + def __radd__(self: NDArray[datetime64], other: _ArrayLikeTD64_co) -> NDArray[datetime64]: + ... + + @overload + def __radd__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __radd__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __sub__(self: NDArray[_UnknownType], other: _ArrayLikeUnknown) -> NDArray[Any]: + ... + + @overload + def __sub__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NoReturn: + ... + + @overload + def __sub__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __sub__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __sub__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __sub__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __sub__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __sub__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __sub__(self: NDArray[datetime64], other: _ArrayLikeTD64_co) -> NDArray[datetime64]: + ... + + @overload + def __sub__(self: NDArray[datetime64], other: _ArrayLikeDT64_co) -> NDArray[timedelta64]: + ... + + @overload + def __sub__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __sub__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rsub__(self: NDArray[_UnknownType], other: _ArrayLikeUnknown) -> NDArray[Any]: + ... + + @overload + def __rsub__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NoReturn: + ... + + @overload + def __rsub__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rsub__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rsub__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __rsub__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __rsub__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __rsub__(self: _ArrayTD64_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __rsub__(self: _ArrayTD64_co, other: _ArrayLikeDT64_co) -> NDArray[datetime64]: + ... + + @overload + def __rsub__(self: NDArray[datetime64], other: _ArrayLikeDT64_co) -> NDArray[timedelta64]: + ... + + @overload + def __rsub__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rsub__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __mul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __mul__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __mul__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __mul__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __mul__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __mul__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __mul__(self: _ArrayTD64_co, other: _ArrayLikeFloat_co) -> NDArray[timedelta64]: + ... + + @overload + def __mul__(self: _ArrayFloat_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __mul__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __mul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rmul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __rmul__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rmul__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rmul__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __rmul__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __rmul__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __rmul__(self: _ArrayTD64_co, other: _ArrayLikeFloat_co) -> NDArray[timedelta64]: + ... + + @overload + def __rmul__(self: _ArrayFloat_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __rmul__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rmul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __floordiv__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __floordiv__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __floordiv__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __floordiv__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __floordiv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[int64]: + ... + + @overload + def __floordiv__(self: NDArray[timedelta64], other: _ArrayLikeBool_co) -> NoReturn: + ... + + @overload + def __floordiv__(self: NDArray[timedelta64], other: _ArrayLikeFloat_co) -> NDArray[timedelta64]: + ... + + @overload + def __floordiv__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __floordiv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rfloordiv__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __rfloordiv__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rfloordiv__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rfloordiv__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __rfloordiv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[int64]: + ... + + @overload + def __rfloordiv__(self: NDArray[bool_], other: _ArrayLikeTD64_co) -> NoReturn: + ... + + @overload + def __rfloordiv__(self: _ArrayFloat_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __rfloordiv__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rfloordiv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __pow__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __pow__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __pow__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __pow__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __pow__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __pow__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __pow__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __pow__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rpow__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __rpow__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rpow__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rpow__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __rpow__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __rpow__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __rpow__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rpow__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __truediv__(self: _ArrayInt_co, other: _ArrayInt_co) -> NDArray[float64]: + ... + + @overload + def __truediv__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __truediv__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __truediv__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __truediv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[float64]: + ... + + @overload + def __truediv__(self: NDArray[timedelta64], other: _ArrayLikeBool_co) -> NoReturn: + ... + + @overload + def __truediv__(self: NDArray[timedelta64], other: _ArrayLikeFloat_co) -> NDArray[timedelta64]: + ... + + @overload + def __truediv__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __truediv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rtruediv__(self: _ArrayInt_co, other: _ArrayInt_co) -> NDArray[float64]: + ... + + @overload + def __rtruediv__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + + @overload + def __rtruediv__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + + @overload + def __rtruediv__(self: NDArray[number[Any]], other: _ArrayLikeNumber_co) -> NDArray[number[Any]]: + ... + + @overload + def __rtruediv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[float64]: + ... + + @overload + def __rtruediv__(self: NDArray[bool_], other: _ArrayLikeTD64_co) -> NoReturn: + ... + + @overload + def __rtruediv__(self: _ArrayFloat_co, other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __rtruediv__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rtruediv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __lshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __lshift__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __lshift__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __lshift__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __lshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rlshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __rlshift__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rlshift__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rlshift__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rlshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __rshift__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rshift__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rshift__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rrshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: + ... + + @overload + def __rrshift__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rrshift__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rrshift__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rrshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __and__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __and__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __and__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __and__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __and__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rand__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __rand__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rand__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rand__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rand__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __xor__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __xor__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __xor__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __xor__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __xor__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __rxor__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __rxor__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __rxor__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __rxor__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __rxor__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __or__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __or__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __or__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __or__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __or__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __ror__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __ror__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + + @overload + def __ror__(self: _ArrayInt_co, other: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + + @overload + def __ror__(self: NDArray[object_], other: Any) -> Any: + ... + + @overload + def __ror__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: + ... + + @overload + def __iadd__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __iadd__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __iadd__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __iadd__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __iadd__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: + ... + + @overload + def __iadd__(self: NDArray[timedelta64], other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __iadd__(self: NDArray[datetime64], other: _ArrayLikeTD64_co) -> NDArray[datetime64]: + ... + + @overload + def __iadd__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __isub__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __isub__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __isub__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __isub__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: + ... + + @overload + def __isub__(self: NDArray[timedelta64], other: _ArrayLikeTD64_co) -> NDArray[timedelta64]: + ... + + @overload + def __isub__(self: NDArray[datetime64], other: _ArrayLikeTD64_co) -> NDArray[datetime64]: + ... + + @overload + def __isub__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __imul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __imul__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __imul__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __imul__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __imul__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: + ... + + @overload + def __imul__(self: NDArray[timedelta64], other: _ArrayLikeFloat_co) -> NDArray[timedelta64]: + ... + + @overload + def __imul__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __itruediv__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __itruediv__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: + ... + + @overload + def __itruediv__(self: NDArray[timedelta64], other: _ArrayLikeBool_co) -> NoReturn: + ... + + @overload + def __itruediv__(self: NDArray[timedelta64], other: _ArrayLikeInt_co) -> NDArray[timedelta64]: + ... + + @overload + def __itruediv__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __ifloordiv__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __ifloordiv__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __ifloordiv__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __ifloordiv__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: + ... + + @overload + def __ifloordiv__(self: NDArray[timedelta64], other: _ArrayLikeBool_co) -> NoReturn: + ... + + @overload + def __ifloordiv__(self: NDArray[timedelta64], other: _ArrayLikeInt_co) -> NDArray[timedelta64]: + ... + + @overload + def __ifloordiv__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __ipow__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __ipow__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __ipow__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __ipow__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: + ... + + @overload + def __ipow__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __imod__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __imod__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __imod__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __imod__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: + ... + + @overload + def __imod__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __ilshift__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __ilshift__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __ilshift__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __irshift__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __irshift__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __irshift__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __iand__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __iand__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __iand__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __iand__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __ixor__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __ixor__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __ixor__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __ixor__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __ior__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __ior__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co | _IntLike_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __ior__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __ior__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + @overload + def __imatmul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + + @overload + def __imatmul__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[_NBit1]]: + ... + + @overload + def __imatmul__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: + ... + + @overload + def __imatmul__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: + ... + + @overload + def __imatmul__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: + ... + + @overload + def __imatmul__(self: NDArray[object_], other: Any) -> NDArray[object_]: + ... + + def __dlpack__(self: NDArray[number[Any]], *, stream: None = ...) -> _PyCapsule: + ... + + def __dlpack_device__(self) -> tuple[int, L[0]]: + ... + + @property + def dtype(self) -> _DType_co: + ... + + + +_ScalarType = TypeVar("_ScalarType", bound=generic) +_NBit1 = TypeVar("_NBit1", bound=NBitBase) +_NBit2 = TypeVar("_NBit2", bound=NBitBase) +class generic(_ArrayOrScalarCommon): + @abstractmethod + def __init__(self, *args: Any, **kwargs: Any) -> None: + ... + + @overload + def __array__(self: _ScalarType, dtype: None = ..., /) -> ndarray[Any, _dtype[_ScalarType]]: + ... + + @overload + def __array__(self, dtype: _DType, /) -> ndarray[Any, _DType]: + ... + + def __hash__(self) -> int: + ... + + @property + def base(self) -> None: + ... + + @property + def ndim(self) -> L[0]: + ... + + @property + def size(self) -> L[1]: + ... + + @property + def shape(self) -> tuple[()]: + ... + + @property + def strides(self) -> tuple[()]: + ... + + def byteswap(self: _ScalarType, inplace: L[False] = ...) -> _ScalarType: + ... + + @property + def flat(self: _ScalarType) -> flatiter[ndarray[Any, _dtype[_ScalarType]]]: + ... + + if sys.version_info >= (3, 12): + def __buffer__(self, flags: int, /) -> memoryview: + ... + + @overload + def astype(self, dtype: _DTypeLike[_ScalarType], order: _OrderKACF = ..., casting: _CastingKind = ..., subok: bool = ..., copy: bool | _CopyMode = ...) -> _ScalarType: + ... + + @overload + def astype(self, dtype: DTypeLike, order: _OrderKACF = ..., casting: _CastingKind = ..., subok: bool = ..., copy: bool | _CopyMode = ...) -> Any: + ... + + @overload + def view(self: _ScalarType, type: type[ndarray[Any, Any]] = ...) -> _ScalarType: + ... + + @overload + def view(self, dtype: _DTypeLike[_ScalarType], type: type[ndarray[Any, Any]] = ...) -> _ScalarType: + ... + + @overload + def view(self, dtype: DTypeLike, type: type[ndarray[Any, Any]] = ...) -> Any: + ... + + @overload + def getfield(self, dtype: _DTypeLike[_ScalarType], offset: SupportsIndex = ...) -> _ScalarType: + ... + + @overload + def getfield(self, dtype: DTypeLike, offset: SupportsIndex = ...) -> Any: + ... + + def item(self, args: L[0] | tuple[()] | tuple[L[0]] = ..., /) -> Any: + ... + + @overload + def take(self: _ScalarType, indices: _IntLike_co, axis: None | SupportsIndex = ..., out: None = ..., mode: _ModeKind = ...) -> _ScalarType: + ... + + @overload + def take(self: _ScalarType, indices: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., out: None = ..., mode: _ModeKind = ...) -> ndarray[Any, _dtype[_ScalarType]]: + ... + + @overload + def take(self, indices: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., out: _NdArraySubClass = ..., mode: _ModeKind = ...) -> _NdArraySubClass: + ... + + def repeat(self: _ScalarType, repeats: _ArrayLikeInt_co, axis: None | SupportsIndex = ...) -> ndarray[Any, _dtype[_ScalarType]]: + ... + + def flatten(self: _ScalarType, order: _OrderKACF = ...) -> ndarray[Any, _dtype[_ScalarType]]: + ... + + def ravel(self: _ScalarType, order: _OrderKACF = ...) -> ndarray[Any, _dtype[_ScalarType]]: + ... + + @overload + def reshape(self: _ScalarType, shape: _ShapeLike, /, *, order: _OrderACF = ...) -> ndarray[Any, _dtype[_ScalarType]]: + ... + + @overload + def reshape(self: _ScalarType, *shape: SupportsIndex, order: _OrderACF = ...) -> ndarray[Any, _dtype[_ScalarType]]: + ... + + def squeeze(self: _ScalarType, axis: None | L[0] | tuple[()] = ...) -> _ScalarType: + ... + + def transpose(self: _ScalarType, axes: None | tuple[()] = ..., /) -> _ScalarType: + ... + + @property + def dtype(self: _ScalarType) -> _dtype[_ScalarType]: + ... + + + +class number(generic, Generic[_NBit1]): + @property + def real(self: _ArraySelf) -> _ArraySelf: + ... + + @property + def imag(self: _ArraySelf) -> _ArraySelf: + ... + + def __class_getitem__(self, item: Any) -> GenericAlias: + ... + + def __int__(self) -> int: + ... + + def __float__(self) -> float: + ... + + def __complex__(self) -> complex: + ... + + def __neg__(self: _ArraySelf) -> _ArraySelf: + ... + + def __pos__(self: _ArraySelf) -> _ArraySelf: + ... + + def __abs__(self: _ArraySelf) -> _ArraySelf: + ... + + __add__: _NumberOp + __radd__: _NumberOp + __sub__: _NumberOp + __rsub__: _NumberOp + __mul__: _NumberOp + __rmul__: _NumberOp + __floordiv__: _NumberOp + __rfloordiv__: _NumberOp + __pow__: _NumberOp + __rpow__: _NumberOp + __truediv__: _NumberOp + __rtruediv__: _NumberOp + __lt__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + __le__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + __gt__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + __ge__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + + +class bool_(generic): + def __init__(self, value: object = ..., /) -> None: + ... + + def item(self, args: L[0] | tuple[()] | tuple[L[0]] = ..., /) -> bool: + ... + + def tolist(self) -> bool: + ... + + @property + def real(self: _ArraySelf) -> _ArraySelf: + ... + + @property + def imag(self: _ArraySelf) -> _ArraySelf: + ... + + def __int__(self) -> int: + ... + + def __float__(self) -> float: + ... + + def __complex__(self) -> complex: + ... + + def __abs__(self: _ArraySelf) -> _ArraySelf: + ... + + __add__: _BoolOp[bool_] + __radd__: _BoolOp[bool_] + __sub__: _BoolSub + __rsub__: _BoolSub + __mul__: _BoolOp[bool_] + __rmul__: _BoolOp[bool_] + __floordiv__: _BoolOp[int8] + __rfloordiv__: _BoolOp[int8] + __pow__: _BoolOp[int8] + __rpow__: _BoolOp[int8] + __truediv__: _BoolTrueDiv + __rtruediv__: _BoolTrueDiv + def __invert__(self) -> bool_: + ... + + __lshift__: _BoolBitOp[int8] + __rlshift__: _BoolBitOp[int8] + __rshift__: _BoolBitOp[int8] + __rrshift__: _BoolBitOp[int8] + __and__: _BoolBitOp[bool_] + __rand__: _BoolBitOp[bool_] + __xor__: _BoolBitOp[bool_] + __rxor__: _BoolBitOp[bool_] + __or__: _BoolBitOp[bool_] + __ror__: _BoolBitOp[bool_] + __mod__: _BoolMod + __rmod__: _BoolMod + __divmod__: _BoolDivMod + __rdivmod__: _BoolDivMod + __lt__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + __le__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + __gt__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + __ge__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co] + + +class object_(generic): + def __init__(self, value: object = ..., /) -> None: + ... + + @property + def real(self: _ArraySelf) -> _ArraySelf: + ... + + @property + def imag(self: _ArraySelf) -> _ArraySelf: + ... + + def __int__(self) -> int: + ... + + def __float__(self) -> float: + ... + + def __complex__(self) -> complex: + ... + + if sys.version_info >= (3, 12): + def __release_buffer__(self, buffer: memoryview, /) -> None: + ... + + + +class _DatetimeScalar(Protocol): + @property + def day(self) -> int: + ... + + @property + def month(self) -> int: + ... + + @property + def year(self) -> int: + ... + + + +class datetime64(generic): + @overload + def __init__(self, value: None | datetime64 | _CharLike_co | _DatetimeScalar = ..., format: _CharLike_co | tuple[_CharLike_co, _IntLike_co] = ..., /) -> None: + ... + + @overload + def __init__(self, value: int, format: _CharLike_co | tuple[_CharLike_co, _IntLike_co], /) -> None: + ... + + def __add__(self, other: _TD64Like_co) -> datetime64: + ... + + def __radd__(self, other: _TD64Like_co) -> datetime64: + ... + + @overload + def __sub__(self, other: datetime64) -> timedelta64: + ... + + @overload + def __sub__(self, other: _TD64Like_co) -> datetime64: + ... + + def __rsub__(self, other: datetime64) -> timedelta64: + ... + + __lt__: _ComparisonOp[datetime64, _ArrayLikeDT64_co] + __le__: _ComparisonOp[datetime64, _ArrayLikeDT64_co] + __gt__: _ComparisonOp[datetime64, _ArrayLikeDT64_co] + __ge__: _ComparisonOp[datetime64, _ArrayLikeDT64_co] + + +_IntValue = Union[SupportsInt, _CharLike_co, SupportsIndex] +_FloatValue = Union[None, _CharLike_co, SupportsFloat, SupportsIndex] +_ComplexValue = Union[None, _CharLike_co, SupportsFloat, SupportsComplex, SupportsIndex, complex,] +class integer(number[_NBit1]): + @property + def numerator(self: _ScalarType) -> _ScalarType: + ... + + @property + def denominator(self) -> L[1]: + ... + + @overload + def __round__(self, ndigits: None = ...) -> int: + ... + + @overload + def __round__(self: _ScalarType, ndigits: SupportsIndex) -> _ScalarType: + ... + + def item(self, args: L[0] | tuple[()] | tuple[L[0]] = ..., /) -> int: + ... + + def tolist(self) -> int: + ... + + def is_integer(self) -> L[True]: + ... + + def bit_count(self: _ScalarType) -> int: + ... + + def __index__(self) -> int: + ... + + __truediv__: _IntTrueDiv[_NBit1] + __rtruediv__: _IntTrueDiv[_NBit1] + def __mod__(self, value: _IntLike_co) -> integer[Any]: + ... + + def __rmod__(self, value: _IntLike_co) -> integer[Any]: + ... + + def __invert__(self: _IntType) -> _IntType: + ... + + def __lshift__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __rlshift__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __rshift__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __rrshift__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __and__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __rand__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __or__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __ror__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __xor__(self, other: _IntLike_co) -> integer[Any]: + ... + + def __rxor__(self, other: _IntLike_co) -> integer[Any]: + ... + + + +class signedinteger(integer[_NBit1]): + def __init__(self, value: _IntValue = ..., /) -> None: + ... + + __add__: _SignedIntOp[_NBit1] + __radd__: _SignedIntOp[_NBit1] + __sub__: _SignedIntOp[_NBit1] + __rsub__: _SignedIntOp[_NBit1] + __mul__: _SignedIntOp[_NBit1] + __rmul__: _SignedIntOp[_NBit1] + __floordiv__: _SignedIntOp[_NBit1] + __rfloordiv__: _SignedIntOp[_NBit1] + __pow__: _SignedIntOp[_NBit1] + __rpow__: _SignedIntOp[_NBit1] + __lshift__: _SignedIntBitOp[_NBit1] + __rlshift__: _SignedIntBitOp[_NBit1] + __rshift__: _SignedIntBitOp[_NBit1] + __rrshift__: _SignedIntBitOp[_NBit1] + __and__: _SignedIntBitOp[_NBit1] + __rand__: _SignedIntBitOp[_NBit1] + __xor__: _SignedIntBitOp[_NBit1] + __rxor__: _SignedIntBitOp[_NBit1] + __or__: _SignedIntBitOp[_NBit1] + __ror__: _SignedIntBitOp[_NBit1] + __mod__: _SignedIntMod[_NBit1] + __rmod__: _SignedIntMod[_NBit1] + __divmod__: _SignedIntDivMod[_NBit1] + __rdivmod__: _SignedIntDivMod[_NBit1] + + +int8 = signedinteger[_8Bit] +int16 = signedinteger[_16Bit] +int32 = signedinteger[_32Bit] +int64 = signedinteger[_64Bit] +byte = signedinteger[_NBitByte] +short = signedinteger[_NBitShort] +intc = signedinteger[_NBitIntC] +intp = signedinteger[_NBitIntP] +int_ = signedinteger[_NBitInt] +longlong = signedinteger[_NBitLongLong] +class timedelta64(generic): + def __init__(self, value: None | int | _CharLike_co | dt.timedelta | timedelta64 = ..., format: _CharLike_co | tuple[_CharLike_co, _IntLike_co] = ..., /) -> None: + ... + + @property + def numerator(self: _ScalarType) -> _ScalarType: + ... + + @property + def denominator(self) -> L[1]: + ... + + def __int__(self) -> int: + ... + + def __float__(self) -> float: + ... + + def __complex__(self) -> complex: + ... + + def __neg__(self: _ArraySelf) -> _ArraySelf: + ... + + def __pos__(self: _ArraySelf) -> _ArraySelf: + ... + + def __abs__(self: _ArraySelf) -> _ArraySelf: + ... + + def __add__(self, other: _TD64Like_co) -> timedelta64: + ... + + def __radd__(self, other: _TD64Like_co) -> timedelta64: + ... + + def __sub__(self, other: _TD64Like_co) -> timedelta64: + ... + + def __rsub__(self, other: _TD64Like_co) -> timedelta64: + ... + + def __mul__(self, other: _FloatLike_co) -> timedelta64: + ... + + def __rmul__(self, other: _FloatLike_co) -> timedelta64: + ... + + __truediv__: _TD64Div[float64] + __floordiv__: _TD64Div[int64] + def __rtruediv__(self, other: timedelta64) -> float64: + ... + + def __rfloordiv__(self, other: timedelta64) -> int64: + ... + + def __mod__(self, other: timedelta64) -> timedelta64: + ... + + def __rmod__(self, other: timedelta64) -> timedelta64: + ... + + def __divmod__(self, other: timedelta64) -> tuple[int64, timedelta64]: + ... + + def __rdivmod__(self, other: timedelta64) -> tuple[int64, timedelta64]: + ... + + __lt__: _ComparisonOp[_TD64Like_co, _ArrayLikeTD64_co] + __le__: _ComparisonOp[_TD64Like_co, _ArrayLikeTD64_co] + __gt__: _ComparisonOp[_TD64Like_co, _ArrayLikeTD64_co] + __ge__: _ComparisonOp[_TD64Like_co, _ArrayLikeTD64_co] + + +class unsignedinteger(integer[_NBit1]): + def __init__(self, value: _IntValue = ..., /) -> None: + ... + + __add__: _UnsignedIntOp[_NBit1] + __radd__: _UnsignedIntOp[_NBit1] + __sub__: _UnsignedIntOp[_NBit1] + __rsub__: _UnsignedIntOp[_NBit1] + __mul__: _UnsignedIntOp[_NBit1] + __rmul__: _UnsignedIntOp[_NBit1] + __floordiv__: _UnsignedIntOp[_NBit1] + __rfloordiv__: _UnsignedIntOp[_NBit1] + __pow__: _UnsignedIntOp[_NBit1] + __rpow__: _UnsignedIntOp[_NBit1] + __lshift__: _UnsignedIntBitOp[_NBit1] + __rlshift__: _UnsignedIntBitOp[_NBit1] + __rshift__: _UnsignedIntBitOp[_NBit1] + __rrshift__: _UnsignedIntBitOp[_NBit1] + __and__: _UnsignedIntBitOp[_NBit1] + __rand__: _UnsignedIntBitOp[_NBit1] + __xor__: _UnsignedIntBitOp[_NBit1] + __rxor__: _UnsignedIntBitOp[_NBit1] + __or__: _UnsignedIntBitOp[_NBit1] + __ror__: _UnsignedIntBitOp[_NBit1] + __mod__: _UnsignedIntMod[_NBit1] + __rmod__: _UnsignedIntMod[_NBit1] + __divmod__: _UnsignedIntDivMod[_NBit1] + __rdivmod__: _UnsignedIntDivMod[_NBit1] + + +uint8 = unsignedinteger[_8Bit] +uint16 = unsignedinteger[_16Bit] +uint32 = unsignedinteger[_32Bit] +uint64 = unsignedinteger[_64Bit] +ubyte = unsignedinteger[_NBitByte] +ushort = unsignedinteger[_NBitShort] +uintc = unsignedinteger[_NBitIntC] +uintp = unsignedinteger[_NBitIntP] +uint = unsignedinteger[_NBitInt] +ulonglong = unsignedinteger[_NBitLongLong] +class inexact(number[_NBit1]): + def __getnewargs__(self: inexact[_64Bit]) -> tuple[float, ...]: + ... + + + +_IntType = TypeVar("_IntType", bound=integer[Any]) +_FloatType = TypeVar('_FloatType', bound=floating[Any]) +class floating(inexact[_NBit1]): + def __init__(self, value: _FloatValue = ..., /) -> None: + ... + + def item(self, args: L[0] | tuple[()] | tuple[L[0]] = ..., /) -> float: + ... + + def tolist(self) -> float: + ... + + def is_integer(self) -> bool: + ... + + def hex(self: float64) -> str: + ... + + @classmethod + def fromhex(cls: type[float64], string: str, /) -> float64: + ... + + def as_integer_ratio(self) -> tuple[int, int]: + ... + + def __ceil__(self: float64) -> int: + ... + + def __floor__(self: float64) -> int: + ... + + def __trunc__(self: float64) -> int: + ... + + def __getnewargs__(self: float64) -> tuple[float]: + ... + + def __getformat__(self: float64, typestr: L["double", "float"], /) -> str: + ... + + @overload + def __round__(self, ndigits: None = ...) -> int: + ... + + @overload + def __round__(self: _ScalarType, ndigits: SupportsIndex) -> _ScalarType: + ... + + __add__: _FloatOp[_NBit1] + __radd__: _FloatOp[_NBit1] + __sub__: _FloatOp[_NBit1] + __rsub__: _FloatOp[_NBit1] + __mul__: _FloatOp[_NBit1] + __rmul__: _FloatOp[_NBit1] + __truediv__: _FloatOp[_NBit1] + __rtruediv__: _FloatOp[_NBit1] + __floordiv__: _FloatOp[_NBit1] + __rfloordiv__: _FloatOp[_NBit1] + __pow__: _FloatOp[_NBit1] + __rpow__: _FloatOp[_NBit1] + __mod__: _FloatMod[_NBit1] + __rmod__: _FloatMod[_NBit1] + __divmod__: _FloatDivMod[_NBit1] + __rdivmod__: _FloatDivMod[_NBit1] + + +float16 = floating[_16Bit] +float32 = floating[_32Bit] +float64 = floating[_64Bit] +half = floating[_NBitHalf] +single = floating[_NBitSingle] +double = floating[_NBitDouble] +float_ = floating[_NBitDouble] +longdouble = floating[_NBitLongDouble] +longfloat = floating[_NBitLongDouble] +class complexfloating(inexact[_NBit1], Generic[_NBit1, _NBit2]): + def __init__(self, value: _ComplexValue = ..., /) -> None: + ... + + def item(self, args: L[0] | tuple[()] | tuple[L[0]] = ..., /) -> complex: + ... + + def tolist(self) -> complex: + ... + + @property + def real(self) -> floating[_NBit1]: + ... + + @property + def imag(self) -> floating[_NBit2]: + ... + + def __abs__(self) -> floating[_NBit1]: + ... + + def __getnewargs__(self: complex128) -> tuple[float, float]: + ... + + __add__: _ComplexOp[_NBit1] + __radd__: _ComplexOp[_NBit1] + __sub__: _ComplexOp[_NBit1] + __rsub__: _ComplexOp[_NBit1] + __mul__: _ComplexOp[_NBit1] + __rmul__: _ComplexOp[_NBit1] + __truediv__: _ComplexOp[_NBit1] + __rtruediv__: _ComplexOp[_NBit1] + __pow__: _ComplexOp[_NBit1] + __rpow__: _ComplexOp[_NBit1] + + +complex64 = complexfloating[_32Bit, _32Bit] +complex128 = complexfloating[_64Bit, _64Bit] +csingle = complexfloating[_NBitSingle, _NBitSingle] +singlecomplex = complexfloating[_NBitSingle, _NBitSingle] +cdouble = complexfloating[_NBitDouble, _NBitDouble] +complex_ = complexfloating[_NBitDouble, _NBitDouble] +cfloat = complexfloating[_NBitDouble, _NBitDouble] +clongdouble = complexfloating[_NBitLongDouble, _NBitLongDouble] +clongfloat = complexfloating[_NBitLongDouble, _NBitLongDouble] +longcomplex = complexfloating[_NBitLongDouble, _NBitLongDouble] +class flexible(generic): + ... + + +class void(flexible): + @overload + def __init__(self, value: _IntLike_co | bytes, /, dtype: None = ...) -> None: + ... + + @overload + def __init__(self, value: Any, /, dtype: _DTypeLikeVoid) -> None: + ... + + @property + def real(self: _ArraySelf) -> _ArraySelf: + ... + + @property + def imag(self: _ArraySelf) -> _ArraySelf: + ... + + def setfield(self, val: ArrayLike, dtype: DTypeLike, offset: int = ...) -> None: + ... + + @overload + def __getitem__(self, key: str | SupportsIndex) -> Any: + ... + + @overload + def __getitem__(self, key: list[str]) -> void: + ... + + def __setitem__(self, key: str | list[str] | SupportsIndex, value: ArrayLike) -> None: + ... + + + +class character(flexible): + def __int__(self) -> int: + ... + + def __float__(self) -> float: + ... + + + +class bytes_(character, bytes): + @overload + def __init__(self, value: object = ..., /) -> None: + ... + + @overload + def __init__(self, value: str, /, encoding: str = ..., errors: str = ...) -> None: + ... + + def item(self, args: L[0] | tuple[()] | tuple[L[0]] = ..., /) -> bytes: + ... + + def tolist(self) -> bytes: + ... + + + +string_ = bytes_ +class str_(character, str): + @overload + def __init__(self, value: object = ..., /) -> None: + ... + + @overload + def __init__(self, value: bytes, /, encoding: str = ..., errors: str = ...) -> None: + ... + + def item(self, args: L[0] | tuple[()] | tuple[L[0]] = ..., /) -> str: + ... + + def tolist(self) -> str: + ... + + + +unicode_ = str_ +Inf: Final[float] +Infinity: Final[float] +NAN: Final[float] +NINF: Final[float] +NZERO: Final[float] +NaN: Final[float] +PINF: Final[float] +PZERO: Final[float] +e: Final[float] +euler_gamma: Final[float] +inf: Final[float] +infty: Final[float] +nan: Final[float] +pi: Final[float] +ERR_IGNORE: L[0] +ERR_WARN: L[1] +ERR_RAISE: L[2] +ERR_CALL: L[3] +ERR_PRINT: L[4] +ERR_LOG: L[5] +ERR_DEFAULT: L[521] +SHIFT_DIVIDEBYZERO: L[0] +SHIFT_OVERFLOW: L[3] +SHIFT_UNDERFLOW: L[6] +SHIFT_INVALID: L[9] +FPE_DIVIDEBYZERO: L[1] +FPE_OVERFLOW: L[2] +FPE_UNDERFLOW: L[4] +FPE_INVALID: L[8] +FLOATING_POINT_SUPPORT: L[1] +UFUNC_BUFSIZE_DEFAULT = ... +little_endian: Final[bool] +True_: Final[bool_] +False_: Final[bool_] +UFUNC_PYVALS_NAME: L["UFUNC_PYVALS"] +newaxis: None +@final +class ufunc: + @property + def __name__(self) -> str: + ... + + @property + def __doc__(self) -> str: + ... + + __call__: Callable[..., Any] + @property + def nin(self) -> int: + ... + + @property + def nout(self) -> int: + ... + + @property + def nargs(self) -> int: + ... + + @property + def ntypes(self) -> int: + ... + + @property + def types(self) -> list[str]: + ... + + @property + def identity(self) -> Any: + ... + + @property + def signature(self) -> None | str: + ... + + reduce: Any + accumulate: Any + reduceat: Any + outer: Any + at: Any + + +absolute: _UFunc_Nin1_Nout1[L['absolute'], L[20], None] +add: _UFunc_Nin2_Nout1[L['add'], L[22], L[0]] +arccos: _UFunc_Nin1_Nout1[L['arccos'], L[8], None] +arccosh: _UFunc_Nin1_Nout1[L['arccosh'], L[8], None] +arcsin: _UFunc_Nin1_Nout1[L['arcsin'], L[8], None] +arcsinh: _UFunc_Nin1_Nout1[L['arcsinh'], L[8], None] +arctan2: _UFunc_Nin2_Nout1[L['arctan2'], L[5], None] +arctan: _UFunc_Nin1_Nout1[L['arctan'], L[8], None] +arctanh: _UFunc_Nin1_Nout1[L['arctanh'], L[8], None] +bitwise_and: _UFunc_Nin2_Nout1[L['bitwise_and'], L[12], L[-1]] +bitwise_not: _UFunc_Nin1_Nout1[L['invert'], L[12], None] +bitwise_or: _UFunc_Nin2_Nout1[L['bitwise_or'], L[12], L[0]] +bitwise_xor: _UFunc_Nin2_Nout1[L['bitwise_xor'], L[12], L[0]] +cbrt: _UFunc_Nin1_Nout1[L['cbrt'], L[5], None] +ceil: _UFunc_Nin1_Nout1[L['ceil'], L[7], None] +conj: _UFunc_Nin1_Nout1[L['conjugate'], L[18], None] +conjugate: _UFunc_Nin1_Nout1[L['conjugate'], L[18], None] +copysign: _UFunc_Nin2_Nout1[L['copysign'], L[4], None] +cos: _UFunc_Nin1_Nout1[L['cos'], L[9], None] +cosh: _UFunc_Nin1_Nout1[L['cosh'], L[8], None] +deg2rad: _UFunc_Nin1_Nout1[L['deg2rad'], L[5], None] +degrees: _UFunc_Nin1_Nout1[L['degrees'], L[5], None] +divide: _UFunc_Nin2_Nout1[L['true_divide'], L[11], None] +divmod: _UFunc_Nin2_Nout2[L['divmod'], L[15], None] +equal: _UFunc_Nin2_Nout1[L['equal'], L[23], None] +exp2: _UFunc_Nin1_Nout1[L['exp2'], L[8], None] +exp: _UFunc_Nin1_Nout1[L['exp'], L[10], None] +expm1: _UFunc_Nin1_Nout1[L['expm1'], L[8], None] +fabs: _UFunc_Nin1_Nout1[L['fabs'], L[5], None] +float_power: _UFunc_Nin2_Nout1[L['float_power'], L[4], None] +floor: _UFunc_Nin1_Nout1[L['floor'], L[7], None] +floor_divide: _UFunc_Nin2_Nout1[L['floor_divide'], L[21], None] +fmax: _UFunc_Nin2_Nout1[L['fmax'], L[21], None] +fmin: _UFunc_Nin2_Nout1[L['fmin'], L[21], None] +fmod: _UFunc_Nin2_Nout1[L['fmod'], L[15], None] +frexp: _UFunc_Nin1_Nout2[L['frexp'], L[4], None] +gcd: _UFunc_Nin2_Nout1[L['gcd'], L[11], L[0]] +greater: _UFunc_Nin2_Nout1[L['greater'], L[23], None] +greater_equal: _UFunc_Nin2_Nout1[L['greater_equal'], L[23], None] +heaviside: _UFunc_Nin2_Nout1[L['heaviside'], L[4], None] +hypot: _UFunc_Nin2_Nout1[L['hypot'], L[5], L[0]] +invert: _UFunc_Nin1_Nout1[L['invert'], L[12], None] +isfinite: _UFunc_Nin1_Nout1[L['isfinite'], L[20], None] +isinf: _UFunc_Nin1_Nout1[L['isinf'], L[20], None] +isnan: _UFunc_Nin1_Nout1[L['isnan'], L[20], None] +isnat: _UFunc_Nin1_Nout1[L['isnat'], L[2], None] +lcm: _UFunc_Nin2_Nout1[L['lcm'], L[11], None] +ldexp: _UFunc_Nin2_Nout1[L['ldexp'], L[8], None] +left_shift: _UFunc_Nin2_Nout1[L['left_shift'], L[11], None] +less: _UFunc_Nin2_Nout1[L['less'], L[23], None] +less_equal: _UFunc_Nin2_Nout1[L['less_equal'], L[23], None] +log10: _UFunc_Nin1_Nout1[L['log10'], L[8], None] +log1p: _UFunc_Nin1_Nout1[L['log1p'], L[8], None] +log2: _UFunc_Nin1_Nout1[L['log2'], L[8], None] +log: _UFunc_Nin1_Nout1[L['log'], L[10], None] +logaddexp2: _UFunc_Nin2_Nout1[L['logaddexp2'], L[4], float] +logaddexp: _UFunc_Nin2_Nout1[L['logaddexp'], L[4], float] +logical_and: _UFunc_Nin2_Nout1[L['logical_and'], L[20], L[True]] +logical_not: _UFunc_Nin1_Nout1[L['logical_not'], L[20], None] +logical_or: _UFunc_Nin2_Nout1[L['logical_or'], L[20], L[False]] +logical_xor: _UFunc_Nin2_Nout1[L['logical_xor'], L[19], L[False]] +matmul: _GUFunc_Nin2_Nout1[L['matmul'], L[19], None] +maximum: _UFunc_Nin2_Nout1[L['maximum'], L[21], None] +minimum: _UFunc_Nin2_Nout1[L['minimum'], L[21], None] +mod: _UFunc_Nin2_Nout1[L['remainder'], L[16], None] +modf: _UFunc_Nin1_Nout2[L['modf'], L[4], None] +multiply: _UFunc_Nin2_Nout1[L['multiply'], L[23], L[1]] +negative: _UFunc_Nin1_Nout1[L['negative'], L[19], None] +nextafter: _UFunc_Nin2_Nout1[L['nextafter'], L[4], None] +not_equal: _UFunc_Nin2_Nout1[L['not_equal'], L[23], None] +positive: _UFunc_Nin1_Nout1[L['positive'], L[19], None] +power: _UFunc_Nin2_Nout1[L['power'], L[18], None] +rad2deg: _UFunc_Nin1_Nout1[L['rad2deg'], L[5], None] +radians: _UFunc_Nin1_Nout1[L['radians'], L[5], None] +reciprocal: _UFunc_Nin1_Nout1[L['reciprocal'], L[18], None] +remainder: _UFunc_Nin2_Nout1[L['remainder'], L[16], None] +right_shift: _UFunc_Nin2_Nout1[L['right_shift'], L[11], None] +rint: _UFunc_Nin1_Nout1[L['rint'], L[10], None] +sign: _UFunc_Nin1_Nout1[L['sign'], L[19], None] +signbit: _UFunc_Nin1_Nout1[L['signbit'], L[4], None] +sin: _UFunc_Nin1_Nout1[L['sin'], L[9], None] +sinh: _UFunc_Nin1_Nout1[L['sinh'], L[8], None] +spacing: _UFunc_Nin1_Nout1[L['spacing'], L[4], None] +sqrt: _UFunc_Nin1_Nout1[L['sqrt'], L[10], None] +square: _UFunc_Nin1_Nout1[L['square'], L[18], None] +subtract: _UFunc_Nin2_Nout1[L['subtract'], L[21], None] +tan: _UFunc_Nin1_Nout1[L['tan'], L[8], None] +tanh: _UFunc_Nin1_Nout1[L['tanh'], L[8], None] +true_divide: _UFunc_Nin2_Nout1[L['true_divide'], L[11], None] +trunc: _UFunc_Nin1_Nout1[L['trunc'], L[7], None] +abs = ... +class _CopyMode(enum.Enum): + ALWAYS: L[True] + IF_NEEDED: L[False] + NEVER: L[2] + ... + + +class RankWarning(UserWarning): + ... + + +_CallType = TypeVar("_CallType", bound=_ErrFunc | _SupportsWrite[str]) +class errstate(Generic[_CallType], ContextDecorator): + call: _CallType + kwargs: _ErrDictOptional + def __init__(self, *, call: _CallType = ..., all: None | _ErrKind = ..., divide: None | _ErrKind = ..., over: None | _ErrKind = ..., under: None | _ErrKind = ..., invalid: None | _ErrKind = ...) -> None: + ... + + def __enter__(self) -> None: + ... + + def __exit__(self, exc_type: None | type[BaseException], exc_value: None | BaseException, traceback: None | TracebackType, /) -> None: + ... + + + +class ndenumerate(Generic[_ScalarType]): + iter: flatiter[NDArray[_ScalarType]] + @overload + def __new__(cls, arr: _FiniteNestedSequence[_SupportsArray[dtype[_ScalarType]]]) -> ndenumerate[_ScalarType]: + ... + + @overload + def __new__(cls, arr: str | _NestedSequence[str]) -> ndenumerate[str_]: + ... + + @overload + def __new__(cls, arr: bytes | _NestedSequence[bytes]) -> ndenumerate[bytes_]: + ... + + @overload + def __new__(cls, arr: bool | _NestedSequence[bool]) -> ndenumerate[bool_]: + ... + + @overload + def __new__(cls, arr: int | _NestedSequence[int]) -> ndenumerate[int_]: + ... + + @overload + def __new__(cls, arr: float | _NestedSequence[float]) -> ndenumerate[float_]: + ... + + @overload + def __new__(cls, arr: complex | _NestedSequence[complex]) -> ndenumerate[complex_]: + ... + + def __next__(self: ndenumerate[_ScalarType]) -> tuple[_Shape, _ScalarType]: + ... + + def __iter__(self: _T) -> _T: + ... + + + +class ndindex: + @overload + def __init__(self, shape: tuple[SupportsIndex, ...], /) -> None: + ... + + @overload + def __init__(self, *shape: SupportsIndex) -> None: + ... + + def __iter__(self: _T) -> _T: + ... + + def __next__(self) -> _Shape: + ... + + + +class DataSource: + def __init__(self, destpath: None | str | os.PathLike[str] = ...) -> None: + ... + + def __del__(self) -> None: + ... + + def abspath(self, path: str) -> str: + ... + + def exists(self, path: str) -> bool: + ... + + def open(self, path: str, mode: str = ..., encoding: None | str = ..., newline: None | str = ...) -> IO[Any]: + ... + + + +@final +class broadcast: + def __new__(cls, *args: ArrayLike) -> broadcast: + ... + + @property + def index(self) -> int: + ... + + @property + def iters(self) -> tuple[flatiter[Any], ...]: + ... + + @property + def nd(self) -> int: + ... + + @property + def ndim(self) -> int: + ... + + @property + def numiter(self) -> int: + ... + + @property + def shape(self) -> _Shape: + ... + + @property + def size(self) -> int: + ... + + def __next__(self) -> tuple[Any, ...]: + ... + + def __iter__(self: _T) -> _T: + ... + + def reset(self) -> None: + ... + + + +@final +class busdaycalendar: + def __new__(cls, weekmask: ArrayLike = ..., holidays: ArrayLike | dt.date | _NestedSequence[dt.date] = ...) -> busdaycalendar: + ... + + @property + def weekmask(self) -> NDArray[bool_]: + ... + + @property + def holidays(self) -> NDArray[datetime64]: + ... + + + +class finfo(Generic[_FloatType]): + dtype: dtype[_FloatType] + bits: int + eps: _FloatType + epsneg: _FloatType + iexp: int + machep: int + max: _FloatType + maxexp: int + min: _FloatType + minexp: int + negep: int + nexp: int + nmant: int + precision: int + resolution: _FloatType + smallest_subnormal: _FloatType + @property + def smallest_normal(self) -> _FloatType: + ... + + @property + def tiny(self) -> _FloatType: + ... + + @overload + def __new__(cls, dtype: inexact[_NBit1] | _DTypeLike[inexact[_NBit1]]) -> finfo[floating[_NBit1]]: + ... + + @overload + def __new__(cls, dtype: complex | float | type[complex] | type[float]) -> finfo[float_]: + ... + + @overload + def __new__(cls, dtype: str) -> finfo[floating[Any]]: + ... + + + +class iinfo(Generic[_IntType]): + dtype: dtype[_IntType] + kind: str + bits: int + key: str + @property + def min(self) -> int: + ... + + @property + def max(self) -> int: + ... + + @overload + def __new__(cls, dtype: _IntType | _DTypeLike[_IntType]) -> iinfo[_IntType]: + ... + + @overload + def __new__(cls, dtype: int | type[int]) -> iinfo[int_]: + ... + + @overload + def __new__(cls, dtype: str) -> iinfo[Any]: + ... + + + +class format_parser: + dtype: dtype[void] + def __init__(self, formats: DTypeLike, names: None | str | Sequence[str], titles: None | str | Sequence[str], aligned: bool = ..., byteorder: None | _ByteOrder = ...) -> None: + ... + + + +class recarray(ndarray[_ShapeType, _DType_co]): + @overload + def __new__(subtype, shape: _ShapeLike, dtype: None = ..., buf: None | _SupportsBuffer = ..., offset: SupportsIndex = ..., strides: None | _ShapeLike = ..., *, formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., byteorder: None | _ByteOrder = ..., aligned: bool = ..., order: _OrderKACF = ...) -> recarray[Any, dtype[record]]: + ... + + @overload + def __new__(subtype, shape: _ShapeLike, dtype: DTypeLike, buf: None | _SupportsBuffer = ..., offset: SupportsIndex = ..., strides: None | _ShapeLike = ..., formats: None = ..., names: None = ..., titles: None = ..., byteorder: None = ..., aligned: L[False] = ..., order: _OrderKACF = ...) -> recarray[Any, dtype[Any]]: + ... + + def __array_finalize__(self, obj: object) -> None: + ... + + def __getattribute__(self, attr: str) -> Any: + ... + + def __setattr__(self, attr: str, val: ArrayLike) -> None: + ... + + @overload + def __getitem__(self, indx: (SupportsIndex | _ArrayLikeInt_co | tuple[SupportsIndex | _ArrayLikeInt_co, ...])) -> Any: + ... + + @overload + def __getitem__(self: recarray[Any, dtype[void]], indx: (None | slice | ellipsis | SupportsIndex | _ArrayLikeInt_co | tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...])) -> recarray[Any, _DType_co]: + ... + + @overload + def __getitem__(self, indx: (None | slice | ellipsis | SupportsIndex | _ArrayLikeInt_co | tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...])) -> ndarray[Any, _DType_co]: + ... + + @overload + def __getitem__(self, indx: str) -> NDArray[Any]: + ... + + @overload + def __getitem__(self, indx: list[str]) -> recarray[_ShapeType, dtype[record]]: + ... + + @overload + def field(self, attr: int | str, val: None = ...) -> Any: + ... + + @overload + def field(self, attr: int | str, val: ArrayLike) -> None: + ... + + + +class record(void): + def __getattribute__(self, attr: str) -> Any: + ... + + def __setattr__(self, attr: str, val: ArrayLike) -> None: + ... + + def pprint(self) -> str: + ... + + @overload + def __getitem__(self, key: str | SupportsIndex) -> Any: + ... + + @overload + def __getitem__(self, key: list[str]) -> record: + ... + + + +_NDIterFlagsKind = L["buffered", "c_index", "copy_if_overlap", "common_dtype", "delay_bufalloc", "external_loop", "f_index", "grow_inner", "growinner", "multi_index", "ranged", "refs_ok", "reduce_ok", "zerosize_ok",] +_NDIterOpFlagsKind = L["aligned", "allocate", "arraymask", "copy", "config", "nbo", "no_subtype", "no_broadcast", "overlap_assume_elementwise", "readonly", "readwrite", "updateifcopy", "virtual", "writeonly", "writemasked"] +@final +class nditer: + def __new__(cls, op: ArrayLike | Sequence[ArrayLike], flags: None | Sequence[_NDIterFlagsKind] = ..., op_flags: None | Sequence[Sequence[_NDIterOpFlagsKind]] = ..., op_dtypes: DTypeLike | Sequence[DTypeLike] = ..., order: _OrderKACF = ..., casting: _CastingKind = ..., op_axes: None | Sequence[Sequence[SupportsIndex]] = ..., itershape: None | _ShapeLike = ..., buffersize: SupportsIndex = ...) -> nditer: + ... + + def __enter__(self) -> nditer: + ... + + def __exit__(self, exc_type: None | type[BaseException], exc_value: None | BaseException, traceback: None | TracebackType) -> None: + ... + + def __iter__(self) -> nditer: + ... + + def __next__(self) -> tuple[NDArray[Any], ...]: + ... + + def __len__(self) -> int: + ... + + def __copy__(self) -> nditer: + ... + + @overload + def __getitem__(self, index: SupportsIndex) -> NDArray[Any]: + ... + + @overload + def __getitem__(self, index: slice) -> tuple[NDArray[Any], ...]: + ... + + def __setitem__(self, index: slice | SupportsIndex, value: ArrayLike) -> None: + ... + + def close(self) -> None: + ... + + def copy(self) -> nditer: + ... + + def debug_print(self) -> None: + ... + + def enable_external_loop(self) -> None: + ... + + def iternext(self) -> bool: + ... + + def remove_axis(self, i: SupportsIndex, /) -> None: + ... + + def remove_multi_index(self) -> None: + ... + + def reset(self) -> None: + ... + + @property + def dtypes(self) -> tuple[dtype[Any], ...]: + ... + + @property + def finished(self) -> bool: + ... + + @property + def has_delayed_bufalloc(self) -> bool: + ... + + @property + def has_index(self) -> bool: + ... + + @property + def has_multi_index(self) -> bool: + ... + + @property + def index(self) -> int: + ... + + @property + def iterationneedsapi(self) -> bool: + ... + + @property + def iterindex(self) -> int: + ... + + @property + def iterrange(self) -> tuple[int, ...]: + ... + + @property + def itersize(self) -> int: + ... + + @property + def itviews(self) -> tuple[NDArray[Any], ...]: + ... + + @property + def multi_index(self) -> tuple[int, ...]: + ... + + @property + def ndim(self) -> int: + ... + + @property + def nop(self) -> int: + ... + + @property + def operands(self) -> tuple[NDArray[Any], ...]: + ... + + @property + def shape(self) -> tuple[int, ...]: + ... + + @property + def value(self) -> tuple[NDArray[Any], ...]: + ... + + + +_MemMapModeKind = L["readonly", "r", "copyonwrite", "c", "readwrite", "r+", "write", "w+",] +class memmap(ndarray[_ShapeType, _DType_co]): + __array_priority__: ClassVar[float] + filename: str | None + offset: int + mode: str + @overload + def __new__(subtype, filename: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _MemMapIOProtocol, dtype: type[uint8] = ..., mode: _MemMapModeKind = ..., offset: int = ..., shape: None | int | tuple[int, ...] = ..., order: _OrderKACF = ...) -> memmap[Any, dtype[uint8]]: + ... + + @overload + def __new__(subtype, filename: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _MemMapIOProtocol, dtype: _DTypeLike[_ScalarType], mode: _MemMapModeKind = ..., offset: int = ..., shape: None | int | tuple[int, ...] = ..., order: _OrderKACF = ...) -> memmap[Any, dtype[_ScalarType]]: + ... + + @overload + def __new__(subtype, filename: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _MemMapIOProtocol, dtype: DTypeLike, mode: _MemMapModeKind = ..., offset: int = ..., shape: None | int | tuple[int, ...] = ..., order: _OrderKACF = ...) -> memmap[Any, dtype[Any]]: + ... + + def __array_finalize__(self, obj: object) -> None: + ... + + def __array_wrap__(self, array: memmap[_ShapeType, _DType_co], context: None | tuple[ufunc, tuple[Any, ...], int] = ...) -> Any: + ... + + def flush(self) -> None: + ... + + + +class vectorize: + pyfunc: Callable[..., Any] + cache: bool + signature: None | str + otypes: None | str + excluded: set[int | str] + __doc__: None | str + def __init__(self, pyfunc: Callable[..., Any], otypes: None | str | Iterable[DTypeLike] = ..., doc: None | str = ..., excluded: None | Iterable[int | str] = ..., cache: bool = ..., signature: None | str = ...) -> None: + ... + + def __call__(self, *args: Any, **kwargs: Any) -> Any: + ... + + + +class poly1d: + @property + def variable(self) -> str: + ... + + @property + def order(self) -> int: + ... + + @property + def o(self) -> int: + ... + + @property + def roots(self) -> NDArray[Any]: + ... + + @property + def r(self) -> NDArray[Any]: + ... + + @property + def coeffs(self) -> NDArray[Any]: + ... + + @coeffs.setter + def coeffs(self, value: NDArray[Any]) -> None: + ... + + @property + def c(self) -> NDArray[Any]: + ... + + @c.setter + def c(self, value: NDArray[Any]) -> None: + ... + + @property + def coef(self) -> NDArray[Any]: + ... + + @coef.setter + def coef(self, value: NDArray[Any]) -> None: + ... + + @property + def coefficients(self) -> NDArray[Any]: + ... + + @coefficients.setter + def coefficients(self, value: NDArray[Any]) -> None: + ... + + __hash__: ClassVar[None] + @overload + def __array__(self, t: None = ...) -> NDArray[Any]: + ... + + @overload + def __array__(self, t: _DType) -> ndarray[Any, _DType]: + ... + + @overload + def __call__(self, val: _ScalarLike_co) -> Any: + ... + + @overload + def __call__(self, val: poly1d) -> poly1d: + ... + + @overload + def __call__(self, val: ArrayLike) -> NDArray[Any]: + ... + + def __init__(self, c_or_r: ArrayLike, r: bool = ..., variable: None | str = ...) -> None: + ... + + def __len__(self) -> int: + ... + + def __neg__(self) -> poly1d: + ... + + def __pos__(self) -> poly1d: + ... + + def __mul__(self, other: ArrayLike) -> poly1d: + ... + + def __rmul__(self, other: ArrayLike) -> poly1d: + ... + + def __add__(self, other: ArrayLike) -> poly1d: + ... + + def __radd__(self, other: ArrayLike) -> poly1d: + ... + + def __pow__(self, val: _FloatLike_co) -> poly1d: + ... + + def __sub__(self, other: ArrayLike) -> poly1d: + ... + + def __rsub__(self, other: ArrayLike) -> poly1d: + ... + + def __div__(self, other: ArrayLike) -> poly1d: + ... + + def __truediv__(self, other: ArrayLike) -> poly1d: + ... + + def __rdiv__(self, other: ArrayLike) -> poly1d: + ... + + def __rtruediv__(self, other: ArrayLike) -> poly1d: + ... + + def __getitem__(self, val: int) -> Any: + ... + + def __setitem__(self, key: int, val: Any) -> None: + ... + + def __iter__(self) -> Iterator[Any]: + ... + + def deriv(self, m: SupportsInt | SupportsIndex = ...) -> poly1d: + ... + + def integ(self, m: SupportsInt | SupportsIndex = ..., k: None | _ArrayLikeComplex_co | _ArrayLikeObject_co = ...) -> poly1d: + ... + + + +class matrix(ndarray[_ShapeType, _DType_co]): + __array_priority__: ClassVar[float] + def __new__(subtype, data: ArrayLike, dtype: DTypeLike = ..., copy: bool = ...) -> matrix[Any, Any]: + ... + + def __array_finalize__(self, obj: object) -> None: + ... + + @overload + def __getitem__(self, key: (SupportsIndex | _ArrayLikeInt_co | tuple[SupportsIndex | _ArrayLikeInt_co, ...])) -> Any: + ... + + @overload + def __getitem__(self, key: (None | slice | ellipsis | SupportsIndex | _ArrayLikeInt_co | tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...])) -> matrix[Any, _DType_co]: + ... + + @overload + def __getitem__(self: NDArray[void], key: str) -> matrix[Any, dtype[Any]]: + ... + + @overload + def __getitem__(self: NDArray[void], key: list[str]) -> matrix[_ShapeType, dtype[void]]: + ... + + def __mul__(self, other: ArrayLike) -> matrix[Any, Any]: + ... + + def __rmul__(self, other: ArrayLike) -> matrix[Any, Any]: + ... + + def __imul__(self, other: ArrayLike) -> matrix[_ShapeType, _DType_co]: + ... + + def __pow__(self, other: ArrayLike) -> matrix[Any, Any]: + ... + + def __ipow__(self, other: ArrayLike) -> matrix[_ShapeType, _DType_co]: + ... + + @overload + def sum(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: + ... + + @overload + def sum(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ...) -> matrix[Any, Any]: + ... + + @overload + def sum(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def mean(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: + ... + + @overload + def mean(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ...) -> matrix[Any, Any]: + ... + + @overload + def mean(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def std(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> Any: + ... + + @overload + def std(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> matrix[Any, Any]: + ... + + @overload + def std(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., ddof: float = ...) -> _NdArraySubClass: + ... + + @overload + def var(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> Any: + ... + + @overload + def var(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> matrix[Any, Any]: + ... + + @overload + def var(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., ddof: float = ...) -> _NdArraySubClass: + ... + + @overload + def prod(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: + ... + + @overload + def prod(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ...) -> matrix[Any, Any]: + ... + + @overload + def prod(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def any(self, axis: None = ..., out: None = ...) -> bool_: + ... + + @overload + def any(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[bool_]]: + ... + + @overload + def any(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def all(self, axis: None = ..., out: None = ...) -> bool_: + ... + + @overload + def all(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[bool_]]: + ... + + @overload + def all(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def max(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> _ScalarType: + ... + + @overload + def max(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, _DType_co]: + ... + + @overload + def max(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def min(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> _ScalarType: + ... + + @overload + def min(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, _DType_co]: + ... + + @overload + def min(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def argmax(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> intp: + ... + + @overload + def argmax(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[intp]]: + ... + + @overload + def argmax(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def argmin(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> intp: + ... + + @overload + def argmin(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[intp]]: + ... + + @overload + def argmin(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + @overload + def ptp(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> _ScalarType: + ... + + @overload + def ptp(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, _DType_co]: + ... + + @overload + def ptp(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: + ... + + def squeeze(self, axis: None | _ShapeLike = ...) -> matrix[Any, _DType_co]: + ... + + def tolist(self: matrix[Any, dtype[_SupportsItem[_T]]]) -> list[list[_T]]: + ... + + def ravel(self, order: _OrderKACF = ...) -> matrix[Any, _DType_co]: + ... + + def flatten(self, order: _OrderKACF = ...) -> matrix[Any, _DType_co]: + ... + + @property + def T(self) -> matrix[Any, _DType_co]: + ... + + @property + def I(self) -> matrix[Any, Any]: + ... + + @property + def A(self) -> ndarray[_ShapeType, _DType_co]: + ... + + @property + def A1(self) -> ndarray[Any, _DType_co]: + ... + + @property + def H(self) -> matrix[Any, _DType_co]: + ... + + def getT(self) -> matrix[Any, _DType_co]: + ... + + def getI(self) -> matrix[Any, Any]: + ... + + def getA(self) -> ndarray[_ShapeType, _DType_co]: + ... + + def getA1(self) -> ndarray[Any, _DType_co]: + ... + + def getH(self) -> matrix[Any, _DType_co]: + ... + + + +_CharType = TypeVar("_CharType", str_, bytes_) +_CharDType = TypeVar("_CharDType", dtype[str_], dtype[bytes_]) +_CharArray = chararray[Any, dtype[_CharType]] +class chararray(ndarray[_ShapeType, _CharDType]): + @overload + def __new__(subtype, shape: _ShapeLike, itemsize: SupportsIndex | SupportsInt = ..., unicode: L[False] = ..., buffer: _SupportsBuffer = ..., offset: SupportsIndex = ..., strides: _ShapeLike = ..., order: _OrderKACF = ...) -> chararray[Any, dtype[bytes_]]: + ... + + @overload + def __new__(subtype, shape: _ShapeLike, itemsize: SupportsIndex | SupportsInt = ..., unicode: L[True] = ..., buffer: _SupportsBuffer = ..., offset: SupportsIndex = ..., strides: _ShapeLike = ..., order: _OrderKACF = ...) -> chararray[Any, dtype[str_]]: + ... + + def __array_finalize__(self, obj: object) -> None: + ... + + def __mul__(self, other: _ArrayLikeInt_co) -> chararray[Any, _CharDType]: + ... + + def __rmul__(self, other: _ArrayLikeInt_co) -> chararray[Any, _CharDType]: + ... + + def __mod__(self, i: Any) -> chararray[Any, _CharDType]: + ... + + @overload + def __eq__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> NDArray[bool_]: + ... + + @overload + def __eq__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> NDArray[bool_]: + ... + + @overload + def __ne__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> NDArray[bool_]: + ... + + @overload + def __ne__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> NDArray[bool_]: + ... + + @overload + def __ge__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> NDArray[bool_]: + ... + + @overload + def __ge__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> NDArray[bool_]: + ... + + @overload + def __le__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> NDArray[bool_]: + ... + + @overload + def __le__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> NDArray[bool_]: + ... + + @overload + def __gt__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> NDArray[bool_]: + ... + + @overload + def __gt__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> NDArray[bool_]: + ... + + @overload + def __lt__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> NDArray[bool_]: + ... + + @overload + def __lt__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> NDArray[bool_]: + ... + + @overload + def __add__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> _CharArray[str_]: + ... + + @overload + def __add__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> _CharArray[bytes_]: + ... + + @overload + def __radd__(self: _CharArray[str_], other: _ArrayLikeStr_co) -> _CharArray[str_]: + ... + + @overload + def __radd__(self: _CharArray[bytes_], other: _ArrayLikeBytes_co) -> _CharArray[bytes_]: + ... + + @overload + def center(self: _CharArray[str_], width: _ArrayLikeInt_co, fillchar: _ArrayLikeStr_co = ...) -> _CharArray[str_]: + ... + + @overload + def center(self: _CharArray[bytes_], width: _ArrayLikeInt_co, fillchar: _ArrayLikeBytes_co = ...) -> _CharArray[bytes_]: + ... + + @overload + def count(self: _CharArray[str_], sub: _ArrayLikeStr_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def count(self: _CharArray[bytes_], sub: _ArrayLikeBytes_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + def decode(self: _CharArray[bytes_], encoding: None | str = ..., errors: None | str = ...) -> _CharArray[str_]: + ... + + def encode(self: _CharArray[str_], encoding: None | str = ..., errors: None | str = ...) -> _CharArray[bytes_]: + ... + + @overload + def endswith(self: _CharArray[str_], suffix: _ArrayLikeStr_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[bool_]: + ... + + @overload + def endswith(self: _CharArray[bytes_], suffix: _ArrayLikeBytes_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[bool_]: + ... + + def expandtabs(self, tabsize: _ArrayLikeInt_co = ...) -> chararray[Any, _CharDType]: + ... + + @overload + def find(self: _CharArray[str_], sub: _ArrayLikeStr_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def find(self: _CharArray[bytes_], sub: _ArrayLikeBytes_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def index(self: _CharArray[str_], sub: _ArrayLikeStr_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def index(self: _CharArray[bytes_], sub: _ArrayLikeBytes_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def join(self: _CharArray[str_], seq: _ArrayLikeStr_co) -> _CharArray[str_]: + ... + + @overload + def join(self: _CharArray[bytes_], seq: _ArrayLikeBytes_co) -> _CharArray[bytes_]: + ... + + @overload + def ljust(self: _CharArray[str_], width: _ArrayLikeInt_co, fillchar: _ArrayLikeStr_co = ...) -> _CharArray[str_]: + ... + + @overload + def ljust(self: _CharArray[bytes_], width: _ArrayLikeInt_co, fillchar: _ArrayLikeBytes_co = ...) -> _CharArray[bytes_]: + ... + + @overload + def lstrip(self: _CharArray[str_], chars: None | _ArrayLikeStr_co = ...) -> _CharArray[str_]: + ... + + @overload + def lstrip(self: _CharArray[bytes_], chars: None | _ArrayLikeBytes_co = ...) -> _CharArray[bytes_]: + ... + + @overload + def partition(self: _CharArray[str_], sep: _ArrayLikeStr_co) -> _CharArray[str_]: + ... + + @overload + def partition(self: _CharArray[bytes_], sep: _ArrayLikeBytes_co) -> _CharArray[bytes_]: + ... + + @overload + def replace(self: _CharArray[str_], old: _ArrayLikeStr_co, new: _ArrayLikeStr_co, count: None | _ArrayLikeInt_co = ...) -> _CharArray[str_]: + ... + + @overload + def replace(self: _CharArray[bytes_], old: _ArrayLikeBytes_co, new: _ArrayLikeBytes_co, count: None | _ArrayLikeInt_co = ...) -> _CharArray[bytes_]: + ... + + @overload + def rfind(self: _CharArray[str_], sub: _ArrayLikeStr_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def rfind(self: _CharArray[bytes_], sub: _ArrayLikeBytes_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def rindex(self: _CharArray[str_], sub: _ArrayLikeStr_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def rindex(self: _CharArray[bytes_], sub: _ArrayLikeBytes_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[int_]: + ... + + @overload + def rjust(self: _CharArray[str_], width: _ArrayLikeInt_co, fillchar: _ArrayLikeStr_co = ...) -> _CharArray[str_]: + ... + + @overload + def rjust(self: _CharArray[bytes_], width: _ArrayLikeInt_co, fillchar: _ArrayLikeBytes_co = ...) -> _CharArray[bytes_]: + ... + + @overload + def rpartition(self: _CharArray[str_], sep: _ArrayLikeStr_co) -> _CharArray[str_]: + ... + + @overload + def rpartition(self: _CharArray[bytes_], sep: _ArrayLikeBytes_co) -> _CharArray[bytes_]: + ... + + @overload + def rsplit(self: _CharArray[str_], sep: None | _ArrayLikeStr_co = ..., maxsplit: None | _ArrayLikeInt_co = ...) -> NDArray[object_]: + ... + + @overload + def rsplit(self: _CharArray[bytes_], sep: None | _ArrayLikeBytes_co = ..., maxsplit: None | _ArrayLikeInt_co = ...) -> NDArray[object_]: + ... + + @overload + def rstrip(self: _CharArray[str_], chars: None | _ArrayLikeStr_co = ...) -> _CharArray[str_]: + ... + + @overload + def rstrip(self: _CharArray[bytes_], chars: None | _ArrayLikeBytes_co = ...) -> _CharArray[bytes_]: + ... + + @overload + def split(self: _CharArray[str_], sep: None | _ArrayLikeStr_co = ..., maxsplit: None | _ArrayLikeInt_co = ...) -> NDArray[object_]: + ... + + @overload + def split(self: _CharArray[bytes_], sep: None | _ArrayLikeBytes_co = ..., maxsplit: None | _ArrayLikeInt_co = ...) -> NDArray[object_]: + ... + + def splitlines(self, keepends: None | _ArrayLikeBool_co = ...) -> NDArray[object_]: + ... + + @overload + def startswith(self: _CharArray[str_], prefix: _ArrayLikeStr_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[bool_]: + ... + + @overload + def startswith(self: _CharArray[bytes_], prefix: _ArrayLikeBytes_co, start: _ArrayLikeInt_co = ..., end: None | _ArrayLikeInt_co = ...) -> NDArray[bool_]: + ... + + @overload + def strip(self: _CharArray[str_], chars: None | _ArrayLikeStr_co = ...) -> _CharArray[str_]: + ... + + @overload + def strip(self: _CharArray[bytes_], chars: None | _ArrayLikeBytes_co = ...) -> _CharArray[bytes_]: + ... + + @overload + def translate(self: _CharArray[str_], table: _ArrayLikeStr_co, deletechars: None | _ArrayLikeStr_co = ...) -> _CharArray[str_]: + ... + + @overload + def translate(self: _CharArray[bytes_], table: _ArrayLikeBytes_co, deletechars: None | _ArrayLikeBytes_co = ...) -> _CharArray[bytes_]: + ... + + def zfill(self, width: _ArrayLikeInt_co) -> chararray[Any, _CharDType]: + ... + + def capitalize(self) -> chararray[_ShapeType, _CharDType]: + ... + + def title(self) -> chararray[_ShapeType, _CharDType]: + ... + + def swapcase(self) -> chararray[_ShapeType, _CharDType]: + ... + + def lower(self) -> chararray[_ShapeType, _CharDType]: + ... + + def upper(self) -> chararray[_ShapeType, _CharDType]: + ... + + def isalnum(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def isalpha(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def isdigit(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def islower(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def isspace(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def istitle(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def isupper(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def isnumeric(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + def isdecimal(self) -> ndarray[_ShapeType, dtype[bool_]]: + ... + + + +class _SupportsDLPack(Protocol[_T_contra]): + def __dlpack__(self, *, stream: None | _T_contra = ...) -> _PyCapsule: + ... + + + +def from_dlpack(obj: _SupportsDLPack[None], /) -> NDArray[Any]: + ... + diff --git a/typings/numpy/_distributor_init.pyi b/typings/numpy/_distributor_init.pyi new file mode 100644 index 0000000..ccc72a9 --- /dev/null +++ b/typings/numpy/_distributor_init.pyi @@ -0,0 +1,14 @@ +""" +This type stub file was generated by pyright. +""" + +""" Distributor init file + +Distributors: you can add custom code here to support particular distributions +of numpy. + +For example, this is a good place to put any checks for hardware requirements. + +The numpy standard source distribution will not put code in this file, so you +can safely replace this file with your own version. +""" diff --git a/typings/numpy/_globals.pyi b/typings/numpy/_globals.pyi new file mode 100644 index 0000000..d82c2b5 --- /dev/null +++ b/typings/numpy/_globals.pyi @@ -0,0 +1,82 @@ +""" +This type stub file was generated by pyright. +""" + +import enum +from ._utils import set_module as _set_module + +""" +Module defining global singleton classes. + +This module raises a RuntimeError if an attempt to reload it is made. In that +way the identities of the classes defined here are fixed and will remain so +even if numpy itself is reloaded. In particular, a function like the following +will still work correctly after numpy is reloaded:: + + def foo(arg=np._NoValue): + if arg is np._NoValue: + ... + +That was not the case when the singleton classes were defined in the numpy +``__init__.py`` file. See gh-7844 for a discussion of the reload problem that +motivated this module. + +""" +__all__ = ['_NoValue', '_CopyMode'] +if '_is_loaded' in globals(): + ... +_is_loaded = ... +class _NoValueType: + """Special keyword value. + + The instance of this class may be used as the default value assigned to a + keyword if no other obvious default (e.g., `None`) is suitable, + + Common reasons for using this keyword are: + + - A new keyword is added to a function, and that function forwards its + inputs to another function or method which can be defined outside of + NumPy. For example, ``np.std(x)`` calls ``x.std``, so when a ``keepdims`` + keyword was added that could only be forwarded if the user explicitly + specified ``keepdims``; downstream array libraries may not have added + the same keyword, so adding ``x.std(..., keepdims=keepdims)`` + unconditionally could have broken previously working code. + - A keyword is being deprecated, and a deprecation warning must only be + emitted when the keyword is used. + + """ + __instance = ... + def __new__(cls): # -> Self@_NoValueType: + ... + + def __repr__(self): # -> Literal['']: + ... + + + +_NoValue = ... +@_set_module("numpy") +class _CopyMode(enum.Enum): + """ + An enumeration for the copy modes supported + by numpy.copy() and numpy.array(). The following three modes are supported, + + - ALWAYS: This means that a deep copy of the input + array will always be taken. + - IF_NEEDED: This means that a deep copy of the input + array will be taken only if necessary. + - NEVER: This means that the deep copy will never be taken. + If a copy cannot be avoided then a `ValueError` will be + raised. + + Note that the buffer-protocol could in theory do copies. NumPy currently + assumes an object exporting the buffer protocol will never do this. + """ + ALWAYS = ... + IF_NEEDED = ... + NEVER = ... + def __bool__(self): # -> bool: + ... + + + diff --git a/typings/numpy/_pyinstaller/__init__.pyi b/typings/numpy/_pyinstaller/__init__.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/numpy/_pyinstaller/__init__.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/numpy/_pytesttester.pyi b/typings/numpy/_pytesttester.pyi new file mode 100644 index 0000000..eb73bbb --- /dev/null +++ b/typings/numpy/_pytesttester.pyi @@ -0,0 +1,18 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Iterable +from typing import Literal as L + +__all__: list[str] +class PytestTester: + module_name: str + def __init__(self, module_name: str) -> None: + ... + + def __call__(self, label: L["fast", "full"] = ..., verbose: int = ..., extra_argv: None | Iterable[str] = ..., doctests: L[False] = ..., coverage: bool = ..., durations: int = ..., tests: None | Iterable[str] = ...) -> bool: + ... + + + diff --git a/typings/numpy/_typing/__init__.pyi b/typings/numpy/_typing/__init__.pyi new file mode 100644 index 0000000..a8607a6 --- /dev/null +++ b/typings/numpy/_typing/__init__.pyi @@ -0,0 +1,104 @@ +""" +This type stub file was generated by pyright. +""" + +from __future__ import annotations +from .. import ufunc +from .._utils import set_module +from typing import TYPE_CHECKING, final +from ._nested_sequence import _NestedSequence as _NestedSequence +from ._nbit import _NBitByte as _NBitByte, _NBitDouble as _NBitDouble, _NBitHalf as _NBitHalf, _NBitInt as _NBitInt, _NBitIntC as _NBitIntC, _NBitIntP as _NBitIntP, _NBitLongDouble as _NBitLongDouble, _NBitLongLong as _NBitLongLong, _NBitShort as _NBitShort, _NBitSingle as _NBitSingle +from ._char_codes import _BoolCodes as _BoolCodes, _ByteCodes as _ByteCodes, _BytesCodes as _BytesCodes, _CDoubleCodes as _CDoubleCodes, _CLongDoubleCodes as _CLongDoubleCodes, _CSingleCodes as _CSingleCodes, _Complex128Codes as _Complex128Codes, _Complex64Codes as _Complex64Codes, _DT64Codes as _DT64Codes, _DoubleCodes as _DoubleCodes, _Float16Codes as _Float16Codes, _Float32Codes as _Float32Codes, _Float64Codes as _Float64Codes, _HalfCodes as _HalfCodes, _Int16Codes as _Int16Codes, _Int32Codes as _Int32Codes, _Int64Codes as _Int64Codes, _Int8Codes as _Int8Codes, _IntCCodes as _IntCCodes, _IntCodes as _IntCodes, _IntPCodes as _IntPCodes, _LongDoubleCodes as _LongDoubleCodes, _LongLongCodes as _LongLongCodes, _ObjectCodes as _ObjectCodes, _ShortCodes as _ShortCodes, _SingleCodes as _SingleCodes, _StrCodes as _StrCodes, _TD64Codes as _TD64Codes, _UByteCodes as _UByteCodes, _UInt16Codes as _UInt16Codes, _UInt32Codes as _UInt32Codes, _UInt64Codes as _UInt64Codes, _UInt8Codes as _UInt8Codes, _UIntCCodes as _UIntCCodes, _UIntCodes as _UIntCodes, _UIntPCodes as _UIntPCodes, _ULongLongCodes as _ULongLongCodes, _UShortCodes as _UShortCodes, _VoidCodes as _VoidCodes +from ._scalars import _BoolLike_co as _BoolLike_co, _CharLike_co as _CharLike_co, _ComplexLike_co as _ComplexLike_co, _FloatLike_co as _FloatLike_co, _IntLike_co as _IntLike_co, _NumberLike_co as _NumberLike_co, _ScalarLike_co as _ScalarLike_co, _TD64Like_co as _TD64Like_co, _UIntLike_co as _UIntLike_co, _VoidLike_co as _VoidLike_co +from ._shape import _Shape as _Shape, _ShapeLike as _ShapeLike +from ._dtype_like import DTypeLike as DTypeLike, _DTypeLike as _DTypeLike, _DTypeLikeBool as _DTypeLikeBool, _DTypeLikeBytes as _DTypeLikeBytes, _DTypeLikeComplex as _DTypeLikeComplex, _DTypeLikeComplex_co as _DTypeLikeComplex_co, _DTypeLikeDT64 as _DTypeLikeDT64, _DTypeLikeFloat as _DTypeLikeFloat, _DTypeLikeInt as _DTypeLikeInt, _DTypeLikeObject as _DTypeLikeObject, _DTypeLikeStr as _DTypeLikeStr, _DTypeLikeTD64 as _DTypeLikeTD64, _DTypeLikeUInt as _DTypeLikeUInt, _DTypeLikeVoid as _DTypeLikeVoid, _SupportsDType as _SupportsDType, _VoidDTypeLike as _VoidDTypeLike +from ._array_like import ArrayLike as ArrayLike, NDArray as NDArray, _ArrayLike as _ArrayLike, _ArrayLikeBool_co as _ArrayLikeBool_co, _ArrayLikeBytes_co as _ArrayLikeBytes_co, _ArrayLikeComplex_co as _ArrayLikeComplex_co, _ArrayLikeDT64_co as _ArrayLikeDT64_co, _ArrayLikeFloat_co as _ArrayLikeFloat_co, _ArrayLikeInt as _ArrayLikeInt, _ArrayLikeInt_co as _ArrayLikeInt_co, _ArrayLikeNumber_co as _ArrayLikeNumber_co, _ArrayLikeObject_co as _ArrayLikeObject_co, _ArrayLikeStr_co as _ArrayLikeStr_co, _ArrayLikeTD64_co as _ArrayLikeTD64_co, _ArrayLikeUInt_co as _ArrayLikeUInt_co, _ArrayLikeUnknown as _ArrayLikeUnknown, _ArrayLikeVoid_co as _ArrayLikeVoid_co, _FiniteNestedSequence as _FiniteNestedSequence, _SupportsArray as _SupportsArray, _SupportsArrayFunc as _SupportsArrayFunc, _UnknownType as _UnknownType +from ._ufunc import _GUFunc_Nin2_Nout1 as _GUFunc_Nin2_Nout1, _UFunc_Nin1_Nout1 as _UFunc_Nin1_Nout1, _UFunc_Nin1_Nout2 as _UFunc_Nin1_Nout2, _UFunc_Nin2_Nout1 as _UFunc_Nin2_Nout1, _UFunc_Nin2_Nout2 as _UFunc_Nin2_Nout2 + +"""Private counterpart of ``numpy.typing``.""" +@final +@set_module("numpy.typing") +class NBitBase: + """ + A type representing `numpy.number` precision during static type checking. + + Used exclusively for the purpose static type checking, `NBitBase` + represents the base of a hierarchical set of subclasses. + Each subsequent subclass is herein used for representing a lower level + of precision, *e.g.* ``64Bit > 32Bit > 16Bit``. + + .. versionadded:: 1.20 + + Examples + -------- + Below is a typical usage example: `NBitBase` is herein used for annotating + a function that takes a float and integer of arbitrary precision + as arguments and returns a new float of whichever precision is largest + (*e.g.* ``np.float16 + np.int64 -> np.float64``). + + .. code-block:: python + + >>> from __future__ import annotations + >>> from typing import TypeVar, TYPE_CHECKING + >>> import numpy as np + >>> import numpy.typing as npt + + >>> T1 = TypeVar("T1", bound=npt.NBitBase) + >>> T2 = TypeVar("T2", bound=npt.NBitBase) + + >>> def add(a: np.floating[T1], b: np.integer[T2]) -> np.floating[T1 | T2]: + ... return a + b + + >>> a = np.float16() + >>> b = np.int64() + >>> out = add(a, b) + + >>> if TYPE_CHECKING: + ... reveal_locals() + ... # note: Revealed local types are: + ... # note: a: numpy.floating[numpy.typing._16Bit*] + ... # note: b: numpy.signedinteger[numpy.typing._64Bit*] + ... # note: out: numpy.floating[numpy.typing._64Bit*] + + """ + def __init_subclass__(cls) -> None: + ... + + + +class _256Bit(NBitBase): + ... + + +class _128Bit(_256Bit): + ... + + +class _96Bit(_128Bit): + ... + + +class _80Bit(_96Bit): + ... + + +class _64Bit(_80Bit): + ... + + +class _32Bit(_64Bit): + ... + + +class _16Bit(_32Bit): + ... + + +class _8Bit(_16Bit): + ... + + +if TYPE_CHECKING: + ... +else: + ... diff --git a/typings/numpy/_typing/_add_docstring.pyi b/typings/numpy/_typing/_add_docstring.pyi new file mode 100644 index 0000000..b588a72 --- /dev/null +++ b/typings/numpy/_typing/_add_docstring.pyi @@ -0,0 +1,22 @@ +""" +This type stub file was generated by pyright. +""" + +"""A module for creating docstrings for sphinx ``data`` domains.""" +_docstrings_list = ... +def add_newdoc(name: str, value: str, doc: str) -> None: + """Append ``_docstrings_list`` with a docstring for `name`. + + Parameters + ---------- + name : str + The name of the object. + value : str + A string-representation of the object. + doc : str + The docstring of the object. + + """ + ... + +_docstrings = ... diff --git a/typings/numpy/_typing/_array_like.pyi b/typings/numpy/_typing/_array_like.pyi new file mode 100644 index 0000000..be08a89 --- /dev/null +++ b/typings/numpy/_typing/_array_like.pyi @@ -0,0 +1,56 @@ +""" +This type stub file was generated by pyright. +""" + +import sys +from collections.abc import Buffer, Callable, Collection, Sequence +from typing import Any, Protocol, TypeVar, Union, runtime_checkable +from numpy import bool_, bytes_, complexfloating, datetime64, dtype, floating, generic, integer, ndarray, number, object_, str_, timedelta64, unsignedinteger, void +from ._nested_sequence import _NestedSequence + +_T = TypeVar("_T") +_ScalarType = TypeVar("_ScalarType", bound=generic) +_ScalarType_co = TypeVar("_ScalarType_co", bound=generic, covariant=True) +_DType = TypeVar("_DType", bound=dtype[Any]) +_DType_co = TypeVar("_DType_co", covariant=True, bound=dtype[Any]) +NDArray = ndarray[Any, dtype[_ScalarType_co]] +@runtime_checkable +class _SupportsArray(Protocol[_DType_co]): + def __array__(self) -> ndarray[Any, _DType_co]: + ... + + + +@runtime_checkable +class _SupportsArrayFunc(Protocol): + """A protocol class representing `~class.__array_function__`.""" + def __array_function__(self, func: Callable[..., Any], types: Collection[type[Any]], args: tuple[Any, ...], kwargs: dict[str, Any]) -> object: + ... + + + +_FiniteNestedSequence = Union[_T, Sequence[_T], Sequence[Sequence[_T]], Sequence[Sequence[Sequence[_T]]], Sequence[Sequence[Sequence[Sequence[_T]]]],] +_ArrayLike = Union[_SupportsArray[dtype[_ScalarType]], _NestedSequence[_SupportsArray[dtype[_ScalarType]]],] +_DualArrayLike = Union[_SupportsArray[_DType], _NestedSequence[_SupportsArray[_DType]], _T, _NestedSequence[_T],] +if sys.version_info >= (3, 12): + ArrayLike = Buffer | _DualArrayLike[dtype[Any], Union[bool, int, float, complex, str, bytes],] +else: + ... +_ArrayLikeBool_co = _DualArrayLike[dtype[bool_], bool,] +_ArrayLikeUInt_co = _DualArrayLike[dtype[Union[bool_, unsignedinteger[Any]]], bool,] +_ArrayLikeInt_co = _DualArrayLike[dtype[Union[bool_, integer[Any]]], Union[bool, int],] +_ArrayLikeFloat_co = _DualArrayLike[dtype[Union[bool_, integer[Any], floating[Any]]], Union[bool, int, float],] +_ArrayLikeComplex_co = _DualArrayLike[dtype[Union[bool_, integer[Any], floating[Any], complexfloating[Any, Any],]], Union[bool, int, float, complex],] +_ArrayLikeNumber_co = _DualArrayLike[dtype[Union[bool_, number[Any]]], Union[bool, int, float, complex],] +_ArrayLikeTD64_co = _DualArrayLike[dtype[Union[bool_, integer[Any], timedelta64]], Union[bool, int],] +_ArrayLikeDT64_co = Union[_SupportsArray[dtype[datetime64]], _NestedSequence[_SupportsArray[dtype[datetime64]]],] +_ArrayLikeObject_co = Union[_SupportsArray[dtype[object_]], _NestedSequence[_SupportsArray[dtype[object_]]],] +_ArrayLikeVoid_co = Union[_SupportsArray[dtype[void]], _NestedSequence[_SupportsArray[dtype[void]]],] +_ArrayLikeStr_co = _DualArrayLike[dtype[str_], str,] +_ArrayLikeBytes_co = _DualArrayLike[dtype[bytes_], bytes,] +_ArrayLikeInt = _DualArrayLike[dtype[integer[Any]], int,] +class _UnknownType: + ... + + +_ArrayLikeUnknown = _DualArrayLike[dtype[_UnknownType], _UnknownType,] diff --git a/typings/numpy/_typing/_callable.pyi b/typings/numpy/_typing/_callable.pyi new file mode 100644 index 0000000..2c78d4d --- /dev/null +++ b/typings/numpy/_typing/_callable.pyi @@ -0,0 +1,462 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, NoReturn, Protocol, TypeVar, overload +from numpy import bool_, complex128, complexfloating, float64, floating, generic, int8, int_, integer, number, signedinteger, timedelta64, unsignedinteger +from ._nbit import _NBitDouble, _NBitInt +from ._scalars import _BoolLike_co, _FloatLike_co, _IntLike_co, _NumberLike_co +from . import NBitBase +from ._array_like import NDArray +from ._nested_sequence import _NestedSequence + +""" +A module with various ``typing.Protocol`` subclasses that implement +the ``__call__`` magic method. + +See the `Mypy documentation`_ on protocols for more details. + +.. _`Mypy documentation`: https://mypy.readthedocs.io/en/stable/protocols.html#callback-protocols + +""" +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_T1_contra = TypeVar("_T1_contra", contravariant=True) +_T2_contra = TypeVar("_T2_contra", contravariant=True) +_2Tuple = tuple[_T1, _T1] +_NBit1 = TypeVar("_NBit1", bound=NBitBase) +_NBit2 = TypeVar("_NBit2", bound=NBitBase) +_IntType = TypeVar("_IntType", bound=integer) +_FloatType = TypeVar("_FloatType", bound=floating) +_NumberType = TypeVar("_NumberType", bound=number) +_NumberType_co = TypeVar("_NumberType_co", covariant=True, bound=number) +_GenericType_co = TypeVar("_GenericType_co", covariant=True, bound=generic) +class _BoolOp(Protocol[_GenericType_co]): + @overload + def __call__(self, other: _BoolLike_co, /) -> _GenericType_co: + ... + + @overload + def __call__(self, other: int, /) -> int_: + ... + + @overload + def __call__(self, other: float, /) -> float64: + ... + + @overload + def __call__(self, other: complex, /) -> complex128: + ... + + @overload + def __call__(self, other: _NumberType, /) -> _NumberType: + ... + + + +class _BoolBitOp(Protocol[_GenericType_co]): + @overload + def __call__(self, other: _BoolLike_co, /) -> _GenericType_co: + ... + + @overload + def __call__(self, other: int, /) -> int_: + ... + + @overload + def __call__(self, other: _IntType, /) -> _IntType: + ... + + + +class _BoolSub(Protocol): + @overload + def __call__(self, other: bool, /) -> NoReturn: + ... + + @overload + def __call__(self, other: int, /) -> int_: + ... + + @overload + def __call__(self, other: float, /) -> float64: + ... + + @overload + def __call__(self, other: complex, /) -> complex128: + ... + + @overload + def __call__(self, other: _NumberType, /) -> _NumberType: + ... + + + +class _BoolTrueDiv(Protocol): + @overload + def __call__(self, other: float | _IntLike_co, /) -> float64: + ... + + @overload + def __call__(self, other: complex, /) -> complex128: + ... + + @overload + def __call__(self, other: _NumberType, /) -> _NumberType: + ... + + + +class _BoolMod(Protocol): + @overload + def __call__(self, other: _BoolLike_co, /) -> int8: + ... + + @overload + def __call__(self, other: int, /) -> int_: + ... + + @overload + def __call__(self, other: float, /) -> float64: + ... + + @overload + def __call__(self, other: _IntType, /) -> _IntType: + ... + + @overload + def __call__(self, other: _FloatType, /) -> _FloatType: + ... + + + +class _BoolDivMod(Protocol): + @overload + def __call__(self, other: _BoolLike_co, /) -> _2Tuple[int8]: + ... + + @overload + def __call__(self, other: int, /) -> _2Tuple[int_]: + ... + + @overload + def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: + ... + + @overload + def __call__(self, other: _IntType, /) -> _2Tuple[_IntType]: + ... + + @overload + def __call__(self, other: _FloatType, /) -> _2Tuple[_FloatType]: + ... + + + +class _TD64Div(Protocol[_NumberType_co]): + @overload + def __call__(self, other: timedelta64, /) -> _NumberType_co: + ... + + @overload + def __call__(self, other: _BoolLike_co, /) -> NoReturn: + ... + + @overload + def __call__(self, other: _FloatLike_co, /) -> timedelta64: + ... + + + +class _IntTrueDiv(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> floating[_NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> floating[_NBit1 | _NBitInt]: + ... + + @overload + def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: complex, /) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: integer[_NBit2], /) -> floating[_NBit1 | _NBit2]: + ... + + + +class _UnsignedIntOp(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> unsignedinteger[_NBit1]: + ... + + @overload + def __call__(self, other: int | signedinteger[Any], /) -> Any: + ... + + @overload + def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: complex, /) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: unsignedinteger[_NBit2], /) -> unsignedinteger[_NBit1 | _NBit2]: + ... + + + +class _UnsignedIntBitOp(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> unsignedinteger[_NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> signedinteger[Any]: + ... + + @overload + def __call__(self, other: signedinteger[Any], /) -> signedinteger[Any]: + ... + + @overload + def __call__(self, other: unsignedinteger[_NBit2], /) -> unsignedinteger[_NBit1 | _NBit2]: + ... + + + +class _UnsignedIntMod(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> unsignedinteger[_NBit1]: + ... + + @overload + def __call__(self, other: int | signedinteger[Any], /) -> Any: + ... + + @overload + def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: unsignedinteger[_NBit2], /) -> unsignedinteger[_NBit1 | _NBit2]: + ... + + + +class _UnsignedIntDivMod(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> _2Tuple[signedinteger[_NBit1]]: + ... + + @overload + def __call__(self, other: int | signedinteger[Any], /) -> _2Tuple[Any]: + ... + + @overload + def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: + ... + + @overload + def __call__(self, other: unsignedinteger[_NBit2], /) -> _2Tuple[unsignedinteger[_NBit1 | _NBit2]]: + ... + + + +class _SignedIntOp(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> signedinteger[_NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> signedinteger[_NBit1 | _NBitInt]: + ... + + @overload + def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: complex, /) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: signedinteger[_NBit2], /) -> signedinteger[_NBit1 | _NBit2]: + ... + + + +class _SignedIntBitOp(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> signedinteger[_NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> signedinteger[_NBit1 | _NBitInt]: + ... + + @overload + def __call__(self, other: signedinteger[_NBit2], /) -> signedinteger[_NBit1 | _NBit2]: + ... + + + +class _SignedIntMod(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> signedinteger[_NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> signedinteger[_NBit1 | _NBitInt]: + ... + + @overload + def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: signedinteger[_NBit2], /) -> signedinteger[_NBit1 | _NBit2]: + ... + + + +class _SignedIntDivMod(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> _2Tuple[signedinteger[_NBit1]]: + ... + + @overload + def __call__(self, other: int, /) -> _2Tuple[signedinteger[_NBit1 | _NBitInt]]: + ... + + @overload + def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: + ... + + @overload + def __call__(self, other: signedinteger[_NBit2], /) -> _2Tuple[signedinteger[_NBit1 | _NBit2]]: + ... + + + +class _FloatOp(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> floating[_NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> floating[_NBit1 | _NBitInt]: + ... + + @overload + def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: complex, /) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: integer[_NBit2] | floating[_NBit2], /) -> floating[_NBit1 | _NBit2]: + ... + + + +class _FloatMod(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> floating[_NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> floating[_NBit1 | _NBitInt]: + ... + + @overload + def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: integer[_NBit2] | floating[_NBit2], /) -> floating[_NBit1 | _NBit2]: + ... + + + +class _FloatDivMod(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> _2Tuple[floating[_NBit1]]: + ... + + @overload + def __call__(self, other: int, /) -> _2Tuple[floating[_NBit1 | _NBitInt]]: + ... + + @overload + def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: + ... + + @overload + def __call__(self, other: integer[_NBit2] | floating[_NBit2], /) -> _2Tuple[floating[_NBit1 | _NBit2]]: + ... + + + +class _ComplexOp(Protocol[_NBit1]): + @overload + def __call__(self, other: bool, /) -> complexfloating[_NBit1, _NBit1]: + ... + + @overload + def __call__(self, other: int, /) -> complexfloating[_NBit1 | _NBitInt, _NBit1 | _NBitInt]: + ... + + @overload + def __call__(self, other: complex, /) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: + ... + + @overload + def __call__(self, other: (integer[_NBit2] | floating[_NBit2] | complexfloating[_NBit2, _NBit2]), /) -> complexfloating[_NBit1 | _NBit2, _NBit1 | _NBit2]: + ... + + + +class _NumberOp(Protocol): + def __call__(self, other: _NumberLike_co, /) -> Any: + ... + + + +class _SupportsLT(Protocol): + def __lt__(self, other: Any, /) -> object: + ... + + + +class _SupportsGT(Protocol): + def __gt__(self, other: Any, /) -> object: + ... + + + +class _ComparisonOp(Protocol[_T1_contra, _T2_contra]): + @overload + def __call__(self, other: _T1_contra, /) -> bool_: + ... + + @overload + def __call__(self, other: _T2_contra, /) -> NDArray[bool_]: + ... + + @overload + def __call__(self, other: _SupportsLT | _SupportsGT | _NestedSequence[_SupportsLT | _SupportsGT], /) -> Any: + ... + + + diff --git a/typings/numpy/_typing/_char_codes.pyi b/typings/numpy/_typing/_char_codes.pyi new file mode 100644 index 0000000..ea9f77c --- /dev/null +++ b/typings/numpy/_typing/_char_codes.pyi @@ -0,0 +1,45 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Literal + +_BoolCodes = Literal["?", "=?", "?", "bool", "bool_", "bool8"] +_UInt8Codes = Literal["uint8", "u1", "=u1", "u1"] +_UInt16Codes = Literal["uint16", "u2", "=u2", "u2"] +_UInt32Codes = Literal["uint32", "u4", "=u4", "u4"] +_UInt64Codes = Literal["uint64", "u8", "=u8", "u8"] +_Int8Codes = Literal["int8", "i1", "=i1", "i1"] +_Int16Codes = Literal["int16", "i2", "=i2", "i2"] +_Int32Codes = Literal["int32", "i4", "=i4", "i4"] +_Int64Codes = Literal["int64", "i8", "=i8", "i8"] +_Float16Codes = Literal["float16", "f2", "=f2", "f2"] +_Float32Codes = Literal["float32", "f4", "=f4", "f4"] +_Float64Codes = Literal["float64", "f8", "=f8", "f8"] +_Complex64Codes = Literal["complex64", "c8", "=c8", "c8"] +_Complex128Codes = Literal["complex128", "c16", "=c16", "c16"] +_ByteCodes = Literal["byte", "b", "=b", "b"] +_ShortCodes = Literal["short", "h", "=h", "h"] +_IntCCodes = Literal["intc", "i", "=i", "i"] +_IntPCodes = Literal["intp", "int0", "p", "=p", "p"] +_IntCodes = Literal["long", "int", "int_", "l", "=l", "l"] +_LongLongCodes = Literal["longlong", "q", "=q", "q"] +_UByteCodes = Literal["ubyte", "B", "=B", "B"] +_UShortCodes = Literal["ushort", "H", "=H", "H"] +_UIntCCodes = Literal["uintc", "I", "=I", "I"] +_UIntPCodes = Literal["uintp", "uint0", "P", "=P", "P"] +_UIntCodes = Literal["ulong", "uint", "L", "=L", "L"] +_ULongLongCodes = Literal["ulonglong", "Q", "=Q", "Q"] +_HalfCodes = Literal["half", "e", "=e", "e"] +_SingleCodes = Literal["single", "f", "=f", "f"] +_DoubleCodes = Literal["double", "float", "float_", "d", "=d", "d"] +_LongDoubleCodes = Literal["longdouble", "longfloat", "g", "=g", "g"] +_CSingleCodes = Literal["csingle", "singlecomplex", "F", "=F", "F"] +_CDoubleCodes = Literal["cdouble", "complex", "complex_", "cfloat", "D", "=D", "D"] +_CLongDoubleCodes = Literal["clongdouble", "clongfloat", "longcomplex", "G", "=G", "G"] +_StrCodes = Literal["str", "str_", "str0", "unicode", "unicode_", "U", "=U", "U"] +_BytesCodes = Literal["bytes", "bytes_", "bytes0", "S", "=S", "S"] +_VoidCodes = Literal["void", "void0", "V", "=V", "V"] +_ObjectCodes = Literal["object", "object_", "O", "=O", "O"] +_DT64Codes = Literal["datetime64", "=datetime64", "datetime64", "datetime64[Y]", "=datetime64[Y]", "datetime64[Y]", "datetime64[M]", "=datetime64[M]", "datetime64[M]", "datetime64[W]", "=datetime64[W]", "datetime64[W]", "datetime64[D]", "=datetime64[D]", "datetime64[D]", "datetime64[h]", "=datetime64[h]", "datetime64[h]", "datetime64[m]", "=datetime64[m]", "datetime64[m]", "datetime64[s]", "=datetime64[s]", "datetime64[s]", "datetime64[ms]", "=datetime64[ms]", "datetime64[ms]", "datetime64[us]", "=datetime64[us]", "datetime64[us]", "datetime64[ns]", "=datetime64[ns]", "datetime64[ns]", "datetime64[ps]", "=datetime64[ps]", "datetime64[ps]", "datetime64[fs]", "=datetime64[fs]", "datetime64[fs]", "datetime64[as]", "=datetime64[as]", "datetime64[as]", "M", "=M", "M", "M8", "=M8", "M8", "M8[Y]", "=M8[Y]", "M8[Y]", "M8[M]", "=M8[M]", "M8[M]", "M8[W]", "=M8[W]", "M8[W]", "M8[D]", "=M8[D]", "M8[D]", "M8[h]", "=M8[h]", "M8[h]", "M8[m]", "=M8[m]", "M8[m]", "M8[s]", "=M8[s]", "M8[s]", "M8[ms]", "=M8[ms]", "M8[ms]", "M8[us]", "=M8[us]", "M8[us]", "M8[ns]", "=M8[ns]", "M8[ns]", "M8[ps]", "=M8[ps]", "M8[ps]", "M8[fs]", "=M8[fs]", "M8[fs]", "M8[as]", "=M8[as]", "M8[as]",] +_TD64Codes = Literal["timedelta64", "=timedelta64", "timedelta64", "timedelta64[Y]", "=timedelta64[Y]", "timedelta64[Y]", "timedelta64[M]", "=timedelta64[M]", "timedelta64[M]", "timedelta64[W]", "=timedelta64[W]", "timedelta64[W]", "timedelta64[D]", "=timedelta64[D]", "timedelta64[D]", "timedelta64[h]", "=timedelta64[h]", "timedelta64[h]", "timedelta64[m]", "=timedelta64[m]", "timedelta64[m]", "timedelta64[s]", "=timedelta64[s]", "timedelta64[s]", "timedelta64[ms]", "=timedelta64[ms]", "timedelta64[ms]", "timedelta64[us]", "=timedelta64[us]", "timedelta64[us]", "timedelta64[ns]", "=timedelta64[ns]", "timedelta64[ns]", "timedelta64[ps]", "=timedelta64[ps]", "timedelta64[ps]", "timedelta64[fs]", "=timedelta64[fs]", "timedelta64[fs]", "timedelta64[as]", "=timedelta64[as]", "timedelta64[as]", "m", "=m", "m", "m8", "=m8", "m8", "m8[Y]", "=m8[Y]", "m8[Y]", "m8[M]", "=m8[M]", "m8[M]", "m8[W]", "=m8[W]", "m8[W]", "m8[D]", "=m8[D]", "m8[D]", "m8[h]", "=m8[h]", "m8[h]", "m8[m]", "=m8[m]", "m8[m]", "m8[s]", "=m8[s]", "m8[s]", "m8[ms]", "=m8[ms]", "m8[ms]", "m8[us]", "=m8[us]", "m8[us]", "m8[ns]", "=m8[ns]", "m8[ns]", "m8[ps]", "=m8[ps]", "m8[ps]", "m8[fs]", "=m8[fs]", "m8[fs]", "m8[as]", "=m8[as]", "m8[as]",] diff --git a/typings/numpy/_typing/_dtype_like.pyi b/typings/numpy/_typing/_dtype_like.pyi new file mode 100644 index 0000000..54fbfef --- /dev/null +++ b/typings/numpy/_typing/_dtype_like.pyi @@ -0,0 +1,50 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from collections.abc import Sequence +from typing import Any, Protocol, Sequence, TypeVar, TypedDict, Union, runtime_checkable +from ._shape import _ShapeLike +from ._char_codes import _BoolCodes, _ByteCodes, _BytesCodes, _CDoubleCodes, _CLongDoubleCodes, _CSingleCodes, _Complex128Codes, _Complex64Codes, _DT64Codes, _DoubleCodes, _Float16Codes, _Float32Codes, _Float64Codes, _HalfCodes, _Int16Codes, _Int32Codes, _Int64Codes, _Int8Codes, _IntCCodes, _IntCodes, _IntPCodes, _LongDoubleCodes, _LongLongCodes, _ObjectCodes, _ShortCodes, _SingleCodes, _StrCodes, _TD64Codes, _UByteCodes, _UInt16Codes, _UInt32Codes, _UInt64Codes, _UInt8Codes, _UIntCCodes, _UIntCodes, _UIntPCodes, _ULongLongCodes, _UShortCodes, _VoidCodes + +_SCT = TypeVar("_SCT", bound=np.generic) +_DType_co = TypeVar("_DType_co", covariant=True, bound=np.dtype[Any]) +_DTypeLikeNested = Any +class _DTypeDictBase(TypedDict): + names: Sequence[str] + formats: Sequence[_DTypeLikeNested] + ... + + +class _DTypeDict(_DTypeDictBase, total=False): + offsets: Sequence[int] + titles: Sequence[Any] + itemsize: int + aligned: bool + ... + + +@runtime_checkable +class _SupportsDType(Protocol[_DType_co]): + @property + def dtype(self) -> _DType_co: + ... + + + +_DTypeLike = Union[np.dtype[_SCT], type[_SCT], _SupportsDType[np.dtype[_SCT]],] +_VoidDTypeLike = Union[tuple[_DTypeLikeNested, int], tuple[_DTypeLikeNested, _ShapeLike], list[Any], _DTypeDict, tuple[_DTypeLikeNested, _DTypeLikeNested],] +DTypeLike = Union[np.dtype[Any], None, type[Any], _SupportsDType[np.dtype[Any]], str, _VoidDTypeLike,] +_DTypeLikeBool = Union[type[bool], type[np.bool_], np.dtype[np.bool_], _SupportsDType[np.dtype[np.bool_]], _BoolCodes,] +_DTypeLikeUInt = Union[type[np.unsignedinteger], np.dtype[np.unsignedinteger], _SupportsDType[np.dtype[np.unsignedinteger]], _UInt8Codes, _UInt16Codes, _UInt32Codes, _UInt64Codes, _UByteCodes, _UShortCodes, _UIntCCodes, _UIntPCodes, _UIntCodes, _ULongLongCodes,] +_DTypeLikeInt = Union[type[int], type[np.signedinteger], np.dtype[np.signedinteger], _SupportsDType[np.dtype[np.signedinteger]], _Int8Codes, _Int16Codes, _Int32Codes, _Int64Codes, _ByteCodes, _ShortCodes, _IntCCodes, _IntPCodes, _IntCodes, _LongLongCodes,] +_DTypeLikeFloat = Union[type[float], type[np.floating], np.dtype[np.floating], _SupportsDType[np.dtype[np.floating]], _Float16Codes, _Float32Codes, _Float64Codes, _HalfCodes, _SingleCodes, _DoubleCodes, _LongDoubleCodes,] +_DTypeLikeComplex = Union[type[complex], type[np.complexfloating], np.dtype[np.complexfloating], _SupportsDType[np.dtype[np.complexfloating]], _Complex64Codes, _Complex128Codes, _CSingleCodes, _CDoubleCodes, _CLongDoubleCodes,] +_DTypeLikeDT64 = Union[type[np.timedelta64], np.dtype[np.timedelta64], _SupportsDType[np.dtype[np.timedelta64]], _TD64Codes,] +_DTypeLikeTD64 = Union[type[np.datetime64], np.dtype[np.datetime64], _SupportsDType[np.dtype[np.datetime64]], _DT64Codes,] +_DTypeLikeStr = Union[type[str], type[np.str_], np.dtype[np.str_], _SupportsDType[np.dtype[np.str_]], _StrCodes,] +_DTypeLikeBytes = Union[type[bytes], type[np.bytes_], np.dtype[np.bytes_], _SupportsDType[np.dtype[np.bytes_]], _BytesCodes,] +_DTypeLikeVoid = Union[type[np.void], np.dtype[np.void], _SupportsDType[np.dtype[np.void]], _VoidCodes, _VoidDTypeLike,] +_DTypeLikeObject = Union[type, np.dtype[np.object_], _SupportsDType[np.dtype[np.object_]], _ObjectCodes,] +_DTypeLikeComplex_co = Union[_DTypeLikeBool, _DTypeLikeUInt, _DTypeLikeInt, _DTypeLikeFloat, _DTypeLikeComplex,] diff --git a/typings/numpy/_typing/_extended_precision.pyi b/typings/numpy/_typing/_extended_precision.pyi new file mode 100644 index 0000000..0e6aee8 --- /dev/null +++ b/typings/numpy/_typing/_extended_precision.pyi @@ -0,0 +1,25 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from . import _128Bit, _256Bit, _80Bit, _96Bit + +"""A module with platform-specific extended precision +`numpy.number` subclasses. + +The subclasses are defined here (instead of ``__init__.pyi``) such +that they can be imported conditionally via the numpy's mypy plugin. +""" +uint128 = np.unsignedinteger[_128Bit] +uint256 = np.unsignedinteger[_256Bit] +int128 = np.signedinteger[_128Bit] +int256 = np.signedinteger[_256Bit] +float80 = np.floating[_80Bit] +float96 = np.floating[_96Bit] +float128 = np.floating[_128Bit] +float256 = np.floating[_256Bit] +complex160 = np.complexfloating[_80Bit, _80Bit] +complex192 = np.complexfloating[_96Bit, _96Bit] +complex256 = np.complexfloating[_128Bit, _128Bit] +complex512 = np.complexfloating[_256Bit, _256Bit] diff --git a/typings/numpy/_typing/_nbit.pyi b/typings/numpy/_typing/_nbit.pyi new file mode 100644 index 0000000..83e1efd --- /dev/null +++ b/typings/numpy/_typing/_nbit.pyi @@ -0,0 +1,17 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any + +"""A module with the precisions of platform-specific `~numpy.number`s.""" +_NBitByte = Any +_NBitShort = Any +_NBitIntC = Any +_NBitIntP = Any +_NBitInt = Any +_NBitLongLong = Any +_NBitHalf = Any +_NBitSingle = Any +_NBitDouble = Any +_NBitLongDouble = Any diff --git a/typings/numpy/_typing/_nested_sequence.pyi b/typings/numpy/_typing/_nested_sequence.pyi new file mode 100644 index 0000000..6cf0234 --- /dev/null +++ b/typings/numpy/_typing/_nested_sequence.pyi @@ -0,0 +1,81 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Iterator +from typing import Any, Protocol, TypeVar, runtime_checkable + +"""A module containing the `_NestedSequence` protocol.""" +__all__ = ["_NestedSequence"] +_T_co = TypeVar("_T_co", covariant=True) +@runtime_checkable +class _NestedSequence(Protocol[_T_co]): + """A protocol for representing nested sequences. + + Warning + ------- + `_NestedSequence` currently does not work in combination with typevars, + *e.g.* ``def func(a: _NestedSequnce[T]) -> T: ...``. + + See Also + -------- + collections.abc.Sequence + ABCs for read-only and mutable :term:`sequences`. + + Examples + -------- + .. code-block:: python + + >>> from __future__ import annotations + + >>> from typing import TYPE_CHECKING + >>> import numpy as np + >>> from numpy._typing import _NestedSequence + + >>> def get_dtype(seq: _NestedSequence[float]) -> np.dtype[np.float64]: + ... return np.asarray(seq).dtype + + >>> a = get_dtype([1.0]) + >>> b = get_dtype([[1.0]]) + >>> c = get_dtype([[[1.0]]]) + >>> d = get_dtype([[[[1.0]]]]) + + >>> if TYPE_CHECKING: + ... reveal_locals() + ... # note: Revealed local types are: + ... # note: a: numpy.dtype[numpy.floating[numpy._typing._64Bit]] + ... # note: b: numpy.dtype[numpy.floating[numpy._typing._64Bit]] + ... # note: c: numpy.dtype[numpy.floating[numpy._typing._64Bit]] + ... # note: d: numpy.dtype[numpy.floating[numpy._typing._64Bit]] + + """ + def __len__(self, /) -> int: + """Implement ``len(self)``.""" + ... + + def __getitem__(self, index: int, /) -> _T_co | _NestedSequence[_T_co]: + """Implement ``self[x]``.""" + ... + + def __contains__(self, x: object, /) -> bool: + """Implement ``x in self``.""" + ... + + def __iter__(self, /) -> Iterator[_T_co | _NestedSequence[_T_co]]: + """Implement ``iter(self)``.""" + ... + + def __reversed__(self, /) -> Iterator[_T_co | _NestedSequence[_T_co]]: + """Implement ``reversed(self)``.""" + ... + + def count(self, value: Any, /) -> int: + """Return the number of occurrences of `value`.""" + ... + + def index(self, value: Any, /) -> int: + """Return the first index of `value`.""" + ... + + + diff --git a/typings/numpy/_typing/_scalars.pyi b/typings/numpy/_typing/_scalars.pyi new file mode 100644 index 0000000..b0cd431 --- /dev/null +++ b/typings/numpy/_typing/_scalars.pyi @@ -0,0 +1,17 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from typing import Any, Union + +_CharLike_co = Union[str, bytes] +_BoolLike_co = Union[bool, np.bool_] +_UIntLike_co = Union[_BoolLike_co, np.unsignedinteger[Any]] +_IntLike_co = Union[_BoolLike_co, int, np.integer[Any]] +_FloatLike_co = Union[_IntLike_co, float, np.floating[Any]] +_ComplexLike_co = Union[_FloatLike_co, complex, np.complexfloating[Any, Any]] +_TD64Like_co = Union[_IntLike_co, np.timedelta64] +_NumberLike_co = Union[int, float, complex, np.number[Any], np.bool_] +_ScalarLike_co = Union[int, float, complex, str, bytes, np.generic,] +_VoidLike_co = Union[tuple[Any, ...], np.void] diff --git a/typings/numpy/_typing/_shape.pyi b/typings/numpy/_typing/_shape.pyi new file mode 100644 index 0000000..e9121e8 --- /dev/null +++ b/typings/numpy/_typing/_shape.pyi @@ -0,0 +1,9 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Sequence +from typing import SupportsIndex, Union + +_Shape = tuple[int, ...] +_ShapeLike = Union[SupportsIndex, Sequence[SupportsIndex]] diff --git a/typings/numpy/_typing/_ufunc.pyi b/typings/numpy/_typing/_ufunc.pyi new file mode 100644 index 0000000..092817e --- /dev/null +++ b/typings/numpy/_typing/_ufunc.pyi @@ -0,0 +1,335 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, Generic, Literal, Protocol, SupportsIndex, TypeVar, overload +from numpy import _CastingKind, _OrderKACF, ufunc +from numpy.typing import NDArray +from ._shape import _ShapeLike +from ._scalars import _ScalarLike_co +from ._array_like import ArrayLike, _ArrayLikeBool_co, _ArrayLikeInt_co +from ._dtype_like import DTypeLike + +"""A module with private type-check-only `numpy.ufunc` subclasses. + +The signatures of the ufuncs are too varied to reasonably type +with a single class. So instead, `ufunc` has been expanded into +four private subclasses, one for each combination of +`~ufunc.nin` and `~ufunc.nout`. + +""" +_T = TypeVar("_T") +_2Tuple = tuple[_T, _T] +_3Tuple = tuple[_T, _T, _T] +_4Tuple = tuple[_T, _T, _T, _T] +_NTypes = TypeVar("_NTypes", bound=int) +_IDType = TypeVar("_IDType", bound=Any) +_NameType = TypeVar("_NameType", bound=str) +class _SupportsArrayUFunc(Protocol): + def __array_ufunc__(self, ufunc: ufunc, method: Literal["__call__", "reduce", "reduceat", "accumulate", "outer", "inner"], *inputs: Any, **kwargs: Any) -> Any: + ... + + + +class _UFunc_Nin1_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]): + @property + def __name__(self) -> _NameType: + ... + + @property + def ntypes(self) -> _NTypes: + ... + + @property + def identity(self) -> _IDType: + ... + + @property + def nin(self) -> Literal[1]: + ... + + @property + def nout(self) -> Literal[1]: + ... + + @property + def nargs(self) -> Literal[2]: + ... + + @property + def signature(self) -> None: + ... + + @property + def reduce(self) -> None: + ... + + @property + def accumulate(self) -> None: + ... + + @property + def reduceat(self) -> None: + ... + + @property + def outer(self) -> None: + ... + + @overload + def __call__(self, __x1: _ScalarLike_co, out: None = ..., *, where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _2Tuple[None | str] = ..., extobj: list[Any] = ...) -> Any: + ... + + @overload + def __call__(self, __x1: ArrayLike, out: None | NDArray[Any] | tuple[NDArray[Any]] = ..., *, where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _2Tuple[None | str] = ..., extobj: list[Any] = ...) -> NDArray[Any]: + ... + + @overload + def __call__(self, __x1: _SupportsArrayUFunc, out: None | NDArray[Any] | tuple[NDArray[Any]] = ..., *, where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _2Tuple[None | str] = ..., extobj: list[Any] = ...) -> Any: + ... + + def at(self, a: _SupportsArrayUFunc, indices: _ArrayLikeInt_co, /) -> None: + ... + + + +class _UFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]): + @property + def __name__(self) -> _NameType: + ... + + @property + def ntypes(self) -> _NTypes: + ... + + @property + def identity(self) -> _IDType: + ... + + @property + def nin(self) -> Literal[2]: + ... + + @property + def nout(self) -> Literal[1]: + ... + + @property + def nargs(self) -> Literal[3]: + ... + + @property + def signature(self) -> None: + ... + + @overload + def __call__(self, __x1: _ScalarLike_co, __x2: _ScalarLike_co, out: None = ..., *, where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ...) -> Any: + ... + + @overload + def __call__(self, __x1: ArrayLike, __x2: ArrayLike, out: None | NDArray[Any] | tuple[NDArray[Any]] = ..., *, where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ...) -> NDArray[Any]: + ... + + def at(self, a: NDArray[Any], indices: _ArrayLikeInt_co, b: ArrayLike, /) -> None: + ... + + def reduce(self, array: ArrayLike, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None | NDArray[Any] = ..., keepdims: bool = ..., initial: Any = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + + def accumulate(self, array: ArrayLike, axis: SupportsIndex = ..., dtype: DTypeLike = ..., out: None | NDArray[Any] = ...) -> NDArray[Any]: + ... + + def reduceat(self, array: ArrayLike, indices: _ArrayLikeInt_co, axis: SupportsIndex = ..., dtype: DTypeLike = ..., out: None | NDArray[Any] = ...) -> NDArray[Any]: + ... + + @overload + def outer(self, A: _ScalarLike_co, B: _ScalarLike_co, /, *, out: None = ..., where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ...) -> Any: + ... + + @overload + def outer(self, A: ArrayLike, B: ArrayLike, /, *, out: None | NDArray[Any] | tuple[NDArray[Any]] = ..., where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ...) -> NDArray[Any]: + ... + + + +class _UFunc_Nin1_Nout2(ufunc, Generic[_NameType, _NTypes, _IDType]): + @property + def __name__(self) -> _NameType: + ... + + @property + def ntypes(self) -> _NTypes: + ... + + @property + def identity(self) -> _IDType: + ... + + @property + def nin(self) -> Literal[1]: + ... + + @property + def nout(self) -> Literal[2]: + ... + + @property + def nargs(self) -> Literal[3]: + ... + + @property + def signature(self) -> None: + ... + + @property + def at(self) -> None: + ... + + @property + def reduce(self) -> None: + ... + + @property + def accumulate(self) -> None: + ... + + @property + def reduceat(self) -> None: + ... + + @property + def outer(self) -> None: + ... + + @overload + def __call__(self, __x1: _ScalarLike_co, __out1: None = ..., __out2: None = ..., *, where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ...) -> _2Tuple[Any]: + ... + + @overload + def __call__(self, __x1: ArrayLike, __out1: None | NDArray[Any] = ..., __out2: None | NDArray[Any] = ..., *, out: _2Tuple[NDArray[Any]] = ..., where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ...) -> _2Tuple[NDArray[Any]]: + ... + + @overload + def __call__(self, __x1: _SupportsArrayUFunc, __out1: None | NDArray[Any] = ..., __out2: None | NDArray[Any] = ..., *, out: _2Tuple[NDArray[Any]] = ..., where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ...) -> _2Tuple[Any]: + ... + + + +class _UFunc_Nin2_Nout2(ufunc, Generic[_NameType, _NTypes, _IDType]): + @property + def __name__(self) -> _NameType: + ... + + @property + def ntypes(self) -> _NTypes: + ... + + @property + def identity(self) -> _IDType: + ... + + @property + def nin(self) -> Literal[2]: + ... + + @property + def nout(self) -> Literal[2]: + ... + + @property + def nargs(self) -> Literal[4]: + ... + + @property + def signature(self) -> None: + ... + + @property + def at(self) -> None: + ... + + @property + def reduce(self) -> None: + ... + + @property + def accumulate(self) -> None: + ... + + @property + def reduceat(self) -> None: + ... + + @property + def outer(self) -> None: + ... + + @overload + def __call__(self, __x1: _ScalarLike_co, __x2: _ScalarLike_co, __out1: None = ..., __out2: None = ..., *, where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _4Tuple[None | str] = ..., extobj: list[Any] = ...) -> _2Tuple[Any]: + ... + + @overload + def __call__(self, __x1: ArrayLike, __x2: ArrayLike, __out1: None | NDArray[Any] = ..., __out2: None | NDArray[Any] = ..., *, out: _2Tuple[NDArray[Any]] = ..., where: None | _ArrayLikeBool_co = ..., casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _4Tuple[None | str] = ..., extobj: list[Any] = ...) -> _2Tuple[NDArray[Any]]: + ... + + + +class _GUFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]): + @property + def __name__(self) -> _NameType: + ... + + @property + def ntypes(self) -> _NTypes: + ... + + @property + def identity(self) -> _IDType: + ... + + @property + def nin(self) -> Literal[2]: + ... + + @property + def nout(self) -> Literal[1]: + ... + + @property + def nargs(self) -> Literal[3]: + ... + + @property + def signature(self) -> Literal["(n?,k),(k,m?)->(n?,m?)"]: + ... + + @property + def reduce(self) -> None: + ... + + @property + def accumulate(self) -> None: + ... + + @property + def reduceat(self) -> None: + ... + + @property + def outer(self) -> None: + ... + + @property + def at(self) -> None: + ... + + @overload + def __call__(self, __x1: ArrayLike, __x2: ArrayLike, out: None = ..., *, casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ..., axes: list[_2Tuple[SupportsIndex]] = ...) -> Any: + ... + + @overload + def __call__(self, __x1: ArrayLike, __x2: ArrayLike, out: NDArray[Any] | tuple[NDArray[Any]], *, casting: _CastingKind = ..., order: _OrderKACF = ..., dtype: DTypeLike = ..., subok: bool = ..., signature: str | _3Tuple[None | str] = ..., extobj: list[Any] = ..., axes: list[_2Tuple[SupportsIndex]] = ...) -> NDArray[Any]: + ... + + + diff --git a/typings/numpy/_utils/__init__.pyi b/typings/numpy/_utils/__init__.pyi new file mode 100644 index 0000000..4dac46e --- /dev/null +++ b/typings/numpy/_utils/__init__.pyi @@ -0,0 +1,28 @@ +""" +This type stub file was generated by pyright. +""" + +from ._convertions import asbytes, asunicode + +""" +This is a module for defining private helpers which do not depend on the +rest of NumPy. + +Everything in here must be self-contained so that it can be +imported anywhere else without creating circular imports. +If a utility requires the import of NumPy, it probably belongs +in ``numpy.core``. +""" +def set_module(module): # -> (func: Unknown) -> Unknown: + """Private decorator for overriding __module__ on a function or class. + + Example usage:: + + @set_module('numpy') + def example(): + pass + + assert example.__module__ == 'numpy' + """ + ... + diff --git a/typings/numpy/_utils/_convertions.pyi b/typings/numpy/_utils/_convertions.pyi new file mode 100644 index 0000000..e16a31a --- /dev/null +++ b/typings/numpy/_utils/_convertions.pyi @@ -0,0 +1,15 @@ +""" +This type stub file was generated by pyright. +""" + +""" +A set of methods retained from np.compat module that +are still used across codebase. +""" +__all__ = ["asunicode", "asbytes"] +def asunicode(s): # -> str: + ... + +def asbytes(s): # -> bytes: + ... + diff --git a/typings/numpy/_utils/_inspect.pyi b/typings/numpy/_utils/_inspect.pyi new file mode 100644 index 0000000..29a7aa3 --- /dev/null +++ b/typings/numpy/_utils/_inspect.pyi @@ -0,0 +1,123 @@ +""" +This type stub file was generated by pyright. +""" + +"""Subset of inspect module from upstream python + +We use this instead of upstream because upstream inspect is slow to import, and +significantly contributes to numpy import times. Importing this copy has almost +no overhead. + +""" +__all__ = ['getargspec', 'formatargspec'] +def ismethod(object): # -> bool: + """Return true if the object is an instance method. + + Instance method objects provide these attributes: + __doc__ documentation string + __name__ name with which this method was defined + im_class class object in which this method belongs + im_func function object containing implementation of method + im_self instance to which this method is bound, or None + + """ + ... + +def isfunction(object): # -> bool: + """Return true if the object is a user-defined function. + + Function objects provide these attributes: + __doc__ documentation string + __name__ name with which this function was defined + func_code code object containing compiled function bytecode + func_defaults tuple of any default values for arguments + func_doc (same as __doc__) + func_globals global namespace in which this function was defined + func_name (same as __name__) + + """ + ... + +def iscode(object): # -> bool: + """Return true if the object is a code object. + + Code objects provide these attributes: + co_argcount number of arguments (not including * or ** args) + co_code string of raw compiled bytecode + co_consts tuple of constants used in the bytecode + co_filename name of file in which this code object was created + co_firstlineno number of first line in Python source code + co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg + co_lnotab encoded mapping of line numbers to bytecode indices + co_name name with which this code object was defined + co_names tuple of names of local variables + co_nlocals number of local variables + co_stacksize virtual machine stack space required + co_varnames tuple of names of arguments and local variables + + """ + ... + +def getargs(co): # -> tuple[list[Unknown], Unknown | None, Unknown | None]: + """Get information about the arguments accepted by a code object. + + Three things are returned: (args, varargs, varkw), where 'args' is + a list of argument names (possibly containing nested lists), and + 'varargs' and 'varkw' are the names of the * and ** arguments or None. + + """ + ... + +def getargspec(func): # -> tuple[list[Unknown], Unknown | None, Unknown | None, Unknown]: + """Get the names and default values of a function's arguments. + + A tuple of four things is returned: (args, varargs, varkw, defaults). + 'args' is a list of the argument names (it may contain nested lists). + 'varargs' and 'varkw' are the names of the * and ** arguments or None. + 'defaults' is an n-tuple of the default values of the last n arguments. + + """ + ... + +def getargvalues(frame): # -> tuple[list[Unknown], Unknown | None, Unknown | None, Unknown]: + """Get information about arguments passed into a particular frame. + + A tuple of four things is returned: (args, varargs, varkw, locals). + 'args' is a list of the argument names (it may contain nested lists). + 'varargs' and 'varkw' are the names of the * and ** arguments or None. + 'locals' is the locals dictionary of the given frame. + + """ + ... + +def joinseq(seq): # -> str: + ... + +def strseq(object, convert, join=...): + """Recursively walk a sequence, stringifying each element. + + """ + ... + +def formatargspec(args, varargs=..., varkw=..., defaults=..., formatarg=..., formatvarargs=..., formatvarkw=..., formatvalue=..., join=...): # -> LiteralString: + """Format an argument spec from the 4 values returned by getargspec. + + The first four arguments are (args, varargs, varkw, defaults). The + other four arguments are the corresponding optional formatting functions + that are called to turn names and values into strings. The ninth + argument is an optional function to format the sequence of arguments. + + """ + ... + +def formatargvalues(args, varargs, varkw, locals, formatarg=..., formatvarargs=..., formatvarkw=..., formatvalue=..., join=...): # -> LiteralString: + """Format an argument spec from the 4 values returned by getargvalues. + + The first four arguments are (args, varargs, varkw, locals). The + next four arguments are the corresponding optional formatting functions + that are called to turn names and values into strings. The ninth + argument is an optional function to format the sequence of arguments. + + """ + ... + diff --git a/typings/numpy/array_api/__init__.pyi b/typings/numpy/array_api/__init__.pyi new file mode 100644 index 0000000..b47d549 --- /dev/null +++ b/typings/numpy/array_api/__init__.pyi @@ -0,0 +1,152 @@ +""" +This type stub file was generated by pyright. +""" + +import warnings +from ._constants import e, inf, nan, pi +from ._creation_functions import arange, asarray, empty, empty_like, eye, from_dlpack, full, full_like, linspace, meshgrid, ones, ones_like, tril, triu, zeros, zeros_like +from ._data_type_functions import astype, broadcast_arrays, broadcast_to, can_cast, finfo, iinfo, isdtype, result_type +from ._dtypes import bool, complex128, complex64, float32, float64, int16, int32, int64, int8, uint16, uint32, uint64, uint8 +from ._elementwise_functions import abs, acos, acosh, add, asin, asinh, atan, atan2, atanh, bitwise_and, bitwise_invert, bitwise_left_shift, bitwise_or, bitwise_right_shift, bitwise_xor, ceil, conj, cos, cosh, divide, equal, exp, expm1, floor, floor_divide, greater, greater_equal, imag, isfinite, isinf, isnan, less, less_equal, log, log10, log1p, log2, logaddexp, logical_and, logical_not, logical_or, logical_xor, multiply, negative, not_equal, positive, pow, real, remainder, round, sign, sin, sinh, sqrt, square, subtract, tan, tanh, trunc +from ._indexing_functions import take +from . import linalg +from .linalg import matmul, matrix_transpose, tensordot, vecdot +from ._manipulation_functions import concat, expand_dims, flip, permute_dims, reshape, roll, squeeze, stack +from ._searching_functions import argmax, argmin, nonzero, where +from ._set_functions import unique_all, unique_counts, unique_inverse, unique_values +from ._sorting_functions import argsort, sort +from ._statistical_functions import max, mean, min, prod, std, sum, var +from ._utility_functions import all, any + +""" +A NumPy sub-namespace that conforms to the Python array API standard. + +This submodule accompanies NEP 47, which proposes its inclusion in NumPy. It +is still considered experimental, and will issue a warning when imported. + +This is a proof-of-concept namespace that wraps the corresponding NumPy +functions to give a conforming implementation of the Python array API standard +(https://data-apis.github.io/array-api/latest/). The standard is currently in +an RFC phase and comments on it are both welcome and encouraged. Comments +should be made either at https://github.com/data-apis/array-api or at +https://github.com/data-apis/consortium-feedback/discussions. + +NumPy already follows the proposed spec for the most part, so this module +serves mostly as a thin wrapper around it. However, NumPy also implements a +lot of behavior that is not included in the spec, so this serves as a +restricted subset of the API. Only those functions that are part of the spec +are included in this namespace, and all functions are given with the exact +signature given in the spec, including the use of position-only arguments, and +omitting any extra keyword arguments implemented by NumPy but not part of the +spec. The behavior of some functions is also modified from the NumPy behavior +to conform to the standard. Note that the underlying array object itself is +wrapped in a wrapper Array() class, but is otherwise unchanged. This submodule +is implemented in pure Python with no C extensions. + +The array API spec is designed as a "minimal API subset" and explicitly allows +libraries to include behaviors not specified by it. But users of this module +that intend to write portable code should be aware that only those behaviors +that are listed in the spec are guaranteed to be implemented across libraries. +Consequently, the NumPy implementation was chosen to be both conforming and +minimal, so that users can use this implementation of the array API namespace +and be sure that behaviors that it defines will be available in conforming +namespaces from other libraries. + +A few notes about the current state of this submodule: + +- There is a test suite that tests modules against the array API standard at + https://github.com/data-apis/array-api-tests. The test suite is still a work + in progress, but the existing tests pass on this module, with a few + exceptions: + + - DLPack support (see https://github.com/data-apis/array-api/pull/106) is + not included here, as it requires a full implementation in NumPy proper + first. + + The test suite is not yet complete, and even the tests that exist are not + guaranteed to give a comprehensive coverage of the spec. Therefore, when + reviewing and using this submodule, you should refer to the standard + documents themselves. There are some tests in numpy.array_api.tests, but + they primarily focus on things that are not tested by the official array API + test suite. + +- There is a custom array object, numpy.array_api.Array, which is returned by + all functions in this module. All functions in the array API namespace + implicitly assume that they will only receive this object as input. The only + way to create instances of this object is to use one of the array creation + functions. It does not have a public constructor on the object itself. The + object is a small wrapper class around numpy.ndarray. The main purpose of it + is to restrict the namespace of the array object to only those dtypes and + only those methods that are required by the spec, as well as to limit/change + certain behavior that differs in the spec. In particular: + + - The array API namespace does not have scalar objects, only 0-D arrays. + Operations on Array that would create a scalar in NumPy create a 0-D + array. + + - Indexing: Only a subset of indices supported by NumPy are required by the + spec. The Array object restricts indexing to only allow those types of + indices that are required by the spec. See the docstring of the + numpy.array_api.Array._validate_indices helper function for more + information. + + - Type promotion: Some type promotion rules are different in the spec. In + particular, the spec does not have any value-based casting. The spec also + does not require cross-kind casting, like integer -> floating-point. Only + those promotions that are explicitly required by the array API + specification are allowed in this module. See NEP 47 for more info. + + - Functions do not automatically call asarray() on their input, and will not + work if the input type is not Array. The exception is array creation + functions, and Python operators on the Array object, which accept Python + scalars of the same type as the array dtype. + +- All functions include type annotations, corresponding to those given in the + spec (see _typing.py for definitions of some custom types). These do not + currently fully pass mypy due to some limitations in mypy. + +- Dtype objects are just the NumPy dtype objects, e.g., float64 = + np.dtype('float64'). The spec does not require any behavior on these dtype + objects other than that they be accessible by name and be comparable by + equality, but it was considered too much extra complexity to create custom + objects to represent dtypes. + +- All places where the implementations in this submodule are known to deviate + from their corresponding functions in NumPy are marked with "# Note:" + comments. + +Still TODO in this module are: + +- DLPack support for numpy.ndarray is still in progress. See + https://github.com/numpy/numpy/pull/19083. + +- The copy=False keyword argument to asarray() is not yet implemented. This + requires support in numpy.asarray() first. + +- Some functions are not yet fully tested in the array API test suite, and may + require updates that are not yet known until the tests are written. + +- The spec is still in an RFC phase and may still have minor updates, which + will need to be reflected here. + +- Complex number support in array API spec is planned but not yet finalized, + as are the fft extension and certain linear algebra functions such as eig + that require complex dtypes. + +""" +__array_api_version__ = ... +__all__ = ["__array_api_version__"] +__all__ += ["e", "inf", "nan", "pi"] +__all__ += ["asarray", "arange", "empty", "empty_like", "eye", "from_dlpack", "full", "full_like", "linspace", "meshgrid", "ones", "ones_like", "tril", "triu", "zeros", "zeros_like"] +__all__ += ["astype", "broadcast_arrays", "broadcast_to", "can_cast", "finfo", "iinfo", "result_type"] +__all__ += ["int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64", "float32", "float64", "bool"] +__all__ += ["abs", "acos", "acosh", "add", "asin", "asinh", "atan", "atan2", "atanh", "bitwise_and", "bitwise_left_shift", "bitwise_invert", "bitwise_or", "bitwise_right_shift", "bitwise_xor", "ceil", "cos", "cosh", "divide", "equal", "exp", "expm1", "floor", "floor_divide", "greater", "greater_equal", "isfinite", "isinf", "isnan", "less", "less_equal", "log", "log1p", "log2", "log10", "logaddexp", "logical_and", "logical_not", "logical_or", "logical_xor", "multiply", "negative", "not_equal", "positive", "pow", "remainder", "round", "sign", "sin", "sinh", "square", "sqrt", "subtract", "tan", "tanh", "trunc"] +__all__ += ["take"] +__all__ += ["linalg"] +__all__ += ["matmul", "tensordot", "matrix_transpose", "vecdot"] +__all__ += ["concat", "expand_dims", "flip", "permute_dims", "reshape", "roll", "squeeze", "stack"] +__all__ += ["argmax", "argmin", "nonzero", "where"] +__all__ += ["unique_all", "unique_counts", "unique_inverse", "unique_values"] +__all__ += ["argsort", "sort"] +__all__ += ["max", "mean", "min", "prod", "std", "sum", "var"] +__all__ += ["all", "any"] diff --git a/typings/numpy/array_api/_array_object.pyi b/typings/numpy/array_api/_array_object.pyi new file mode 100644 index 0000000..5504c83 --- /dev/null +++ b/typings/numpy/array_api/_array_object.pyi @@ -0,0 +1,476 @@ +""" +This type stub file was generated by pyright. +""" + +import types +import numpy.typing as npt +import numpy as np +from enum import IntEnum +from typing import Any, Optional, TYPE_CHECKING, Tuple, Union +from ._typing import Any, Device, Dtype, PyCapsule + +""" +Wrapper class around the ndarray object for the array API standard. + +The array API standard defines some behaviors differently than ndarray, in +particular, type promotion rules are different (the standard has no +value-based casting). The standard also specifies a more limited subset of +array methods and functionalities than are implemented on ndarray. Since the +goal of the array_api namespace is to be a minimal implementation of the array +API standard, we need to define a separate wrapper class for the array_api +namespace. + +The standard compliant class is only a wrapper class. It is *not* a subclass +of ndarray. +""" +if TYPE_CHECKING: + ... +class Array: + """ + n-d array object for the array API namespace. + + See the docstring of :py:obj:`np.ndarray ` for more + information. + + This is a wrapper around numpy.ndarray that restricts the usage to only + those things that are required by the array API namespace. Note, + attributes on this object that start with a single underscore are not part + of the API specification and should only be used internally. This object + should not be constructed directly. Rather, use one of the creation + functions, such as asarray(). + + """ + _array: np.ndarray[Any, Any] + def __new__(cls, *args, **kwargs): + ... + + def __str__(self: Array, /) -> str: + """ + Performs the operation __str__. + """ + ... + + def __repr__(self: Array, /) -> str: + """ + Performs the operation __repr__. + """ + ... + + def __array__(self, dtype: None | np.dtype[Any] = ...) -> npt.NDArray[Any]: + """ + Warning: this method is NOT part of the array API spec. Implementers + of other libraries need not include it, and users should not assume it + will be present in other implementations. + + """ + ... + + def __abs__(self: Array, /) -> Array: + """ + Performs the operation __abs__. + """ + ... + + def __add__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __add__. + """ + ... + + def __and__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __and__. + """ + ... + + def __array_namespace__(self: Array, /, *, api_version: Optional[str] = ...) -> types.ModuleType: + ... + + def __bool__(self: Array, /) -> bool: + """ + Performs the operation __bool__. + """ + ... + + def __complex__(self: Array, /) -> complex: + """ + Performs the operation __complex__. + """ + ... + + def __dlpack__(self: Array, /, *, stream: None = ...) -> PyCapsule: + """ + Performs the operation __dlpack__. + """ + ... + + def __dlpack_device__(self: Array, /) -> Tuple[IntEnum, int]: + """ + Performs the operation __dlpack_device__. + """ + ... + + def __eq__(self: Array, other: Union[int, float, bool, Array], /) -> Array: + """ + Performs the operation __eq__. + """ + ... + + def __float__(self: Array, /) -> float: + """ + Performs the operation __float__. + """ + ... + + def __floordiv__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __floordiv__. + """ + ... + + def __ge__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __ge__. + """ + ... + + def __getitem__(self: Array, key: Union[int, slice, ellipsis, Tuple[Union[int, slice, ellipsis], ...], Array], /) -> Array: + """ + Performs the operation __getitem__. + """ + ... + + def __gt__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __gt__. + """ + ... + + def __int__(self: Array, /) -> int: + """ + Performs the operation __int__. + """ + ... + + def __index__(self: Array, /) -> int: + """ + Performs the operation __index__. + """ + ... + + def __invert__(self: Array, /) -> Array: + """ + Performs the operation __invert__. + """ + ... + + def __le__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __le__. + """ + ... + + def __lshift__(self: Array, other: Union[int, Array], /) -> Array: + """ + Performs the operation __lshift__. + """ + ... + + def __lt__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __lt__. + """ + ... + + def __matmul__(self: Array, other: Array, /) -> Array: + """ + Performs the operation __matmul__. + """ + ... + + def __mod__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __mod__. + """ + ... + + def __mul__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __mul__. + """ + ... + + def __ne__(self: Array, other: Union[int, float, bool, Array], /) -> Array: + """ + Performs the operation __ne__. + """ + ... + + def __neg__(self: Array, /) -> Array: + """ + Performs the operation __neg__. + """ + ... + + def __or__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __or__. + """ + ... + + def __pos__(self: Array, /) -> Array: + """ + Performs the operation __pos__. + """ + ... + + def __pow__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __pow__. + """ + ... + + def __rshift__(self: Array, other: Union[int, Array], /) -> Array: + """ + Performs the operation __rshift__. + """ + ... + + def __setitem__(self, key: Union[int, slice, ellipsis, Tuple[Union[int, slice, ellipsis], ...], Array], value: Union[int, float, bool, Array], /) -> None: + """ + Performs the operation __setitem__. + """ + ... + + def __sub__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __sub__. + """ + ... + + def __truediv__(self: Array, other: Union[float, Array], /) -> Array: + """ + Performs the operation __truediv__. + """ + ... + + def __xor__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __xor__. + """ + ... + + def __iadd__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __iadd__. + """ + ... + + def __radd__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __radd__. + """ + ... + + def __iand__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __iand__. + """ + ... + + def __rand__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __rand__. + """ + ... + + def __ifloordiv__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __ifloordiv__. + """ + ... + + def __rfloordiv__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __rfloordiv__. + """ + ... + + def __ilshift__(self: Array, other: Union[int, Array], /) -> Array: + """ + Performs the operation __ilshift__. + """ + ... + + def __rlshift__(self: Array, other: Union[int, Array], /) -> Array: + """ + Performs the operation __rlshift__. + """ + ... + + def __imatmul__(self: Array, other: Array, /) -> Array: + """ + Performs the operation __imatmul__. + """ + ... + + def __rmatmul__(self: Array, other: Array, /) -> Array: + """ + Performs the operation __rmatmul__. + """ + ... + + def __imod__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __imod__. + """ + ... + + def __rmod__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __rmod__. + """ + ... + + def __imul__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __imul__. + """ + ... + + def __rmul__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __rmul__. + """ + ... + + def __ior__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __ior__. + """ + ... + + def __ror__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __ror__. + """ + ... + + def __ipow__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __ipow__. + """ + ... + + def __rpow__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __rpow__. + """ + ... + + def __irshift__(self: Array, other: Union[int, Array], /) -> Array: + """ + Performs the operation __irshift__. + """ + ... + + def __rrshift__(self: Array, other: Union[int, Array], /) -> Array: + """ + Performs the operation __rrshift__. + """ + ... + + def __isub__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __isub__. + """ + ... + + def __rsub__(self: Array, other: Union[int, float, Array], /) -> Array: + """ + Performs the operation __rsub__. + """ + ... + + def __itruediv__(self: Array, other: Union[float, Array], /) -> Array: + """ + Performs the operation __itruediv__. + """ + ... + + def __rtruediv__(self: Array, other: Union[float, Array], /) -> Array: + """ + Performs the operation __rtruediv__. + """ + ... + + def __ixor__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __ixor__. + """ + ... + + def __rxor__(self: Array, other: Union[int, bool, Array], /) -> Array: + """ + Performs the operation __rxor__. + """ + ... + + def to_device(self: Array, device: Device, /, stream: None = ...) -> Array: + ... + + @property + def dtype(self) -> Dtype: + """ + Array API compatible wrapper for :py:meth:`np.ndarray.dtype `. + + See its docstring for more information. + """ + ... + + @property + def device(self) -> Device: + ... + + @property + def mT(self) -> Array: + ... + + @property + def ndim(self) -> int: + """ + Array API compatible wrapper for :py:meth:`np.ndarray.ndim `. + + See its docstring for more information. + """ + ... + + @property + def shape(self) -> Tuple[int, ...]: + """ + Array API compatible wrapper for :py:meth:`np.ndarray.shape `. + + See its docstring for more information. + """ + ... + + @property + def size(self) -> int: + """ + Array API compatible wrapper for :py:meth:`np.ndarray.size `. + + See its docstring for more information. + """ + ... + + @property + def T(self) -> Array: + """ + Array API compatible wrapper for :py:meth:`np.ndarray.T `. + + See its docstring for more information. + """ + ... + + + diff --git a/typings/numpy/array_api/_constants.pyi b/typings/numpy/array_api/_constants.pyi new file mode 100644 index 0000000..8c0e4f8 --- /dev/null +++ b/typings/numpy/array_api/_constants.pyi @@ -0,0 +1,8 @@ +""" +This type stub file was generated by pyright. +""" + +e = ... +inf = ... +nan = ... +pi = ... diff --git a/typings/numpy/array_api/_creation_functions.pyi b/typings/numpy/array_api/_creation_functions.pyi new file mode 100644 index 0000000..1285930 --- /dev/null +++ b/typings/numpy/array_api/_creation_functions.pyi @@ -0,0 +1,133 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from typing import List, Optional, TYPE_CHECKING, Tuple, Union +from ._typing import Array, Device, Dtype, NestedSequence, SupportsBufferProtocol + +if TYPE_CHECKING: + ... +def asarray(obj: Union[Array, bool, int, float, NestedSequence[bool | int | float], SupportsBufferProtocol,], /, *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ..., copy: Optional[Union[bool, np._CopyMode]] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.asarray `. + + See its docstring for more information. + """ + ... + +def arange(start: Union[int, float], /, stop: Optional[Union[int, float]] = ..., step: Union[int, float] = ..., *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arange `. + + See its docstring for more information. + """ + ... + +def empty(shape: Union[int, Tuple[int, ...]], *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.empty `. + + See its docstring for more information. + """ + ... + +def empty_like(x: Array, /, *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.empty_like `. + + See its docstring for more information. + """ + ... + +def eye(n_rows: int, n_cols: Optional[int] = ..., /, *, k: int = ..., dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.eye `. + + See its docstring for more information. + """ + ... + +def from_dlpack(x: object, /) -> Array: + ... + +def full(shape: Union[int, Tuple[int, ...]], fill_value: Union[int, float], *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.full `. + + See its docstring for more information. + """ + ... + +def full_like(x: Array, /, fill_value: Union[int, float], *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.full_like `. + + See its docstring for more information. + """ + ... + +def linspace(start: Union[int, float], stop: Union[int, float], /, num: int, *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ..., endpoint: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linspace `. + + See its docstring for more information. + """ + ... + +def meshgrid(*arrays: Array, indexing: str = ...) -> List[Array]: + """ + Array API compatible wrapper for :py:func:`np.meshgrid `. + + See its docstring for more information. + """ + ... + +def ones(shape: Union[int, Tuple[int, ...]], *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.ones `. + + See its docstring for more information. + """ + ... + +def ones_like(x: Array, /, *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.ones_like `. + + See its docstring for more information. + """ + ... + +def tril(x: Array, /, *, k: int = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.tril `. + + See its docstring for more information. + """ + ... + +def triu(x: Array, /, *, k: int = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.triu `. + + See its docstring for more information. + """ + ... + +def zeros(shape: Union[int, Tuple[int, ...]], *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.zeros `. + + See its docstring for more information. + """ + ... + +def zeros_like(x: Array, /, *, dtype: Optional[Dtype] = ..., device: Optional[Device] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.zeros_like `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_data_type_functions.pyi b/typings/numpy/array_api/_data_type_functions.pyi new file mode 100644 index 0000000..a08e6ff --- /dev/null +++ b/typings/numpy/array_api/_data_type_functions.pyi @@ -0,0 +1,92 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array +from dataclasses import dataclass +from typing import List, TYPE_CHECKING, Tuple, Union +from ._typing import Dtype + +if TYPE_CHECKING: + ... +def astype(x: Array, dtype: Dtype, /, *, copy: bool = ...) -> Array: + ... + +def broadcast_arrays(*arrays: Array) -> List[Array]: + """ + Array API compatible wrapper for :py:func:`np.broadcast_arrays `. + + See its docstring for more information. + """ + ... + +def broadcast_to(x: Array, /, shape: Tuple[int, ...]) -> Array: + """ + Array API compatible wrapper for :py:func:`np.broadcast_to `. + + See its docstring for more information. + """ + ... + +def can_cast(from_: Union[Dtype, Array], to: Dtype, /) -> bool: + """ + Array API compatible wrapper for :py:func:`np.can_cast `. + + See its docstring for more information. + """ + ... + +@dataclass +class finfo_object: + bits: int + eps: float + max: float + min: float + smallest_normal: float + dtype: Dtype + ... + + +@dataclass +class iinfo_object: + bits: int + max: int + min: int + dtype: Dtype + ... + + +def finfo(type: Union[Dtype, Array], /) -> finfo_object: + """ + Array API compatible wrapper for :py:func:`np.finfo `. + + See its docstring for more information. + """ + ... + +def iinfo(type: Union[Dtype, Array], /) -> iinfo_object: + """ + Array API compatible wrapper for :py:func:`np.iinfo `. + + See its docstring for more information. + """ + ... + +def isdtype(dtype: Dtype, kind: Union[Dtype, str, Tuple[Union[Dtype, str], ...]]) -> bool: + """ + Returns a boolean indicating whether a provided dtype is of a specified data type ``kind``. + + See + https://data-apis.org/array-api/latest/API_specification/generated/array_api.isdtype.html + for more details + """ + ... + +def result_type(*arrays_and_dtypes: Union[Array, Dtype]) -> Dtype: + """ + Array API compatible wrapper for :py:func:`np.result_type `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_dtypes.pyi b/typings/numpy/array_api/_dtypes.pyi new file mode 100644 index 0000000..405ab08 --- /dev/null +++ b/typings/numpy/array_api/_dtypes.pyi @@ -0,0 +1,30 @@ +""" +This type stub file was generated by pyright. +""" + +int8 = ... +int16 = ... +int32 = ... +int64 = ... +uint8 = ... +uint16 = ... +uint32 = ... +uint64 = ... +float32 = ... +float64 = ... +complex64 = ... +complex128 = ... +bool = ... +_all_dtypes = ... +_boolean_dtypes = ... +_real_floating_dtypes = ... +_floating_dtypes = ... +_complex_floating_dtypes = ... +_integer_dtypes = ... +_signed_integer_dtypes = ... +_unsigned_integer_dtypes = ... +_integer_or_boolean_dtypes = ... +_real_numeric_dtypes = ... +_numeric_dtypes = ... +_dtype_categories = ... +_promotion_table = ... diff --git a/typings/numpy/array_api/_elementwise_functions.pyi b/typings/numpy/array_api/_elementwise_functions.pyi new file mode 100644 index 0000000..7958ffa --- /dev/null +++ b/typings/numpy/array_api/_elementwise_functions.pyi @@ -0,0 +1,478 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array + +def abs(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.abs `. + + See its docstring for more information. + """ + ... + +def acos(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arccos `. + + See its docstring for more information. + """ + ... + +def acosh(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arccosh `. + + See its docstring for more information. + """ + ... + +def add(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.add `. + + See its docstring for more information. + """ + ... + +def asin(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arcsin `. + + See its docstring for more information. + """ + ... + +def asinh(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arcsinh `. + + See its docstring for more information. + """ + ... + +def atan(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arctan `. + + See its docstring for more information. + """ + ... + +def atan2(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arctan2 `. + + See its docstring for more information. + """ + ... + +def atanh(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.arctanh `. + + See its docstring for more information. + """ + ... + +def bitwise_and(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.bitwise_and `. + + See its docstring for more information. + """ + ... + +def bitwise_left_shift(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.left_shift `. + + See its docstring for more information. + """ + ... + +def bitwise_invert(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.invert `. + + See its docstring for more information. + """ + ... + +def bitwise_or(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.bitwise_or `. + + See its docstring for more information. + """ + ... + +def bitwise_right_shift(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.right_shift `. + + See its docstring for more information. + """ + ... + +def bitwise_xor(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.bitwise_xor `. + + See its docstring for more information. + """ + ... + +def ceil(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.ceil `. + + See its docstring for more information. + """ + ... + +def conj(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.conj `. + + See its docstring for more information. + """ + ... + +def cos(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.cos `. + + See its docstring for more information. + """ + ... + +def cosh(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.cosh `. + + See its docstring for more information. + """ + ... + +def divide(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.divide `. + + See its docstring for more information. + """ + ... + +def equal(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.equal `. + + See its docstring for more information. + """ + ... + +def exp(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.exp `. + + See its docstring for more information. + """ + ... + +def expm1(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.expm1 `. + + See its docstring for more information. + """ + ... + +def floor(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.floor `. + + See its docstring for more information. + """ + ... + +def floor_divide(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.floor_divide `. + + See its docstring for more information. + """ + ... + +def greater(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.greater `. + + See its docstring for more information. + """ + ... + +def greater_equal(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.greater_equal `. + + See its docstring for more information. + """ + ... + +def imag(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.imag `. + + See its docstring for more information. + """ + ... + +def isfinite(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.isfinite `. + + See its docstring for more information. + """ + ... + +def isinf(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.isinf `. + + See its docstring for more information. + """ + ... + +def isnan(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.isnan `. + + See its docstring for more information. + """ + ... + +def less(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.less `. + + See its docstring for more information. + """ + ... + +def less_equal(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.less_equal `. + + See its docstring for more information. + """ + ... + +def log(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.log `. + + See its docstring for more information. + """ + ... + +def log1p(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.log1p `. + + See its docstring for more information. + """ + ... + +def log2(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.log2 `. + + See its docstring for more information. + """ + ... + +def log10(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.log10 `. + + See its docstring for more information. + """ + ... + +def logaddexp(x1: Array, x2: Array) -> Array: + """ + Array API compatible wrapper for :py:func:`np.logaddexp `. + + See its docstring for more information. + """ + ... + +def logical_and(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.logical_and `. + + See its docstring for more information. + """ + ... + +def logical_not(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.logical_not `. + + See its docstring for more information. + """ + ... + +def logical_or(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.logical_or `. + + See its docstring for more information. + """ + ... + +def logical_xor(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.logical_xor `. + + See its docstring for more information. + """ + ... + +def multiply(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.multiply `. + + See its docstring for more information. + """ + ... + +def negative(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.negative `. + + See its docstring for more information. + """ + ... + +def not_equal(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.not_equal `. + + See its docstring for more information. + """ + ... + +def positive(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.positive `. + + See its docstring for more information. + """ + ... + +def pow(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.power `. + + See its docstring for more information. + """ + ... + +def real(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.real `. + + See its docstring for more information. + """ + ... + +def remainder(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.remainder `. + + See its docstring for more information. + """ + ... + +def round(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.round `. + + See its docstring for more information. + """ + ... + +def sign(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.sign `. + + See its docstring for more information. + """ + ... + +def sin(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.sin `. + + See its docstring for more information. + """ + ... + +def sinh(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.sinh `. + + See its docstring for more information. + """ + ... + +def square(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.square `. + + See its docstring for more information. + """ + ... + +def sqrt(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.sqrt `. + + See its docstring for more information. + """ + ... + +def subtract(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.subtract `. + + See its docstring for more information. + """ + ... + +def tan(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.tan `. + + See its docstring for more information. + """ + ... + +def tanh(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.tanh `. + + See its docstring for more information. + """ + ... + +def trunc(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.trunc `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_indexing_functions.pyi b/typings/numpy/array_api/_indexing_functions.pyi new file mode 100644 index 0000000..0b94dbe --- /dev/null +++ b/typings/numpy/array_api/_indexing_functions.pyi @@ -0,0 +1,14 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array + +def take(x: Array, indices: Array, /, *, axis: Optional[int] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.take `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_manipulation_functions.pyi b/typings/numpy/array_api/_manipulation_functions.pyi new file mode 100644 index 0000000..383f2ff --- /dev/null +++ b/typings/numpy/array_api/_manipulation_functions.pyi @@ -0,0 +1,71 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array +from typing import List, Optional, Tuple, Union + +def concat(arrays: Union[Tuple[Array, ...], List[Array]], /, *, axis: Optional[int] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.concatenate `. + + See its docstring for more information. + """ + ... + +def expand_dims(x: Array, /, *, axis: int) -> Array: + """ + Array API compatible wrapper for :py:func:`np.expand_dims `. + + See its docstring for more information. + """ + ... + +def flip(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.flip `. + + See its docstring for more information. + """ + ... + +def permute_dims(x: Array, /, axes: Tuple[int, ...]) -> Array: + """ + Array API compatible wrapper for :py:func:`np.transpose `. + + See its docstring for more information. + """ + ... + +def reshape(x: Array, /, shape: Tuple[int, ...], *, copy: Optional[Bool] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.reshape `. + + See its docstring for more information. + """ + ... + +def roll(x: Array, /, shift: Union[int, Tuple[int, ...]], *, axis: Optional[Union[int, Tuple[int, ...]]] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.roll `. + + See its docstring for more information. + """ + ... + +def squeeze(x: Array, /, axis: Union[int, Tuple[int, ...]]) -> Array: + """ + Array API compatible wrapper for :py:func:`np.squeeze `. + + See its docstring for more information. + """ + ... + +def stack(arrays: Union[Tuple[Array, ...], List[Array]], /, *, axis: int = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.stack `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_searching_functions.pyi b/typings/numpy/array_api/_searching_functions.pyi new file mode 100644 index 0000000..caf870a --- /dev/null +++ b/typings/numpy/array_api/_searching_functions.pyi @@ -0,0 +1,39 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array +from typing import Optional, Tuple + +def argmax(x: Array, /, *, axis: Optional[int] = ..., keepdims: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.argmax `. + + See its docstring for more information. + """ + ... + +def argmin(x: Array, /, *, axis: Optional[int] = ..., keepdims: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.argmin `. + + See its docstring for more information. + """ + ... + +def nonzero(x: Array, /) -> Tuple[Array, ...]: + """ + Array API compatible wrapper for :py:func:`np.nonzero `. + + See its docstring for more information. + """ + ... + +def where(condition: Array, x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.where `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_set_functions.pyi b/typings/numpy/array_api/_set_functions.pyi new file mode 100644 index 0000000..1784345 --- /dev/null +++ b/typings/numpy/array_api/_set_functions.pyi @@ -0,0 +1,54 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array +from typing import NamedTuple + +class UniqueAllResult(NamedTuple): + values: Array + indices: Array + inverse_indices: Array + counts: Array + ... + + +class UniqueCountsResult(NamedTuple): + values: Array + counts: Array + ... + + +class UniqueInverseResult(NamedTuple): + values: Array + inverse_indices: Array + ... + + +def unique_all(x: Array, /) -> UniqueAllResult: + """ + Array API compatible wrapper for :py:func:`np.unique `. + + See its docstring for more information. + """ + ... + +def unique_counts(x: Array, /) -> UniqueCountsResult: + ... + +def unique_inverse(x: Array, /) -> UniqueInverseResult: + """ + Array API compatible wrapper for :py:func:`np.unique `. + + See its docstring for more information. + """ + ... + +def unique_values(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.unique `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_sorting_functions.pyi b/typings/numpy/array_api/_sorting_functions.pyi new file mode 100644 index 0000000..c5d242b --- /dev/null +++ b/typings/numpy/array_api/_sorting_functions.pyi @@ -0,0 +1,22 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array + +def argsort(x: Array, /, *, axis: int = ..., descending: bool = ..., stable: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.argsort `. + + See its docstring for more information. + """ + ... + +def sort(x: Array, /, *, axis: int = ..., descending: bool = ..., stable: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.sort `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/_statistical_functions.pyi b/typings/numpy/array_api/_statistical_functions.pyi new file mode 100644 index 0000000..9af3d56 --- /dev/null +++ b/typings/numpy/array_api/_statistical_functions.pyi @@ -0,0 +1,31 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array +from typing import Optional, TYPE_CHECKING, Tuple, Union +from ._typing import Dtype + +if TYPE_CHECKING: + ... +def max(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., keepdims: bool = ...) -> Array: + ... + +def mean(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., keepdims: bool = ...) -> Array: + ... + +def min(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., keepdims: bool = ...) -> Array: + ... + +def prod(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., dtype: Optional[Dtype] = ..., keepdims: bool = ...) -> Array: + ... + +def std(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., correction: Union[int, float] = ..., keepdims: bool = ...) -> Array: + ... + +def sum(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., dtype: Optional[Dtype] = ..., keepdims: bool = ...) -> Array: + ... + +def var(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., correction: Union[int, float] = ..., keepdims: bool = ...) -> Array: + ... + diff --git a/typings/numpy/array_api/_typing.pyi b/typings/numpy/array_api/_typing.pyi new file mode 100644 index 0000000..bab0bac --- /dev/null +++ b/typings/numpy/array_api/_typing.pyi @@ -0,0 +1,39 @@ +""" +This type stub file was generated by pyright. +""" + +import sys +from typing import Any, Literal, Protocol, TypeVar, Union +from numpy import dtype, float32, float64, int16, int32, int64, int8, uint16, uint32, uint64, uint8 + +""" +This file defines the types for type annotations. + +These names aren't part of the module namespace, but they are used in the +annotations in the function signatures. The functions in the module are only +valid for inputs that match the given type annotations. +""" +__all__ = ["Array", "Device", "Dtype", "SupportsDLPack", "SupportsBufferProtocol", "PyCapsule"] +_T_co = TypeVar("_T_co", covariant=True) +class NestedSequence(Protocol[_T_co]): + def __getitem__(self, key: int, /) -> _T_co | NestedSequence[_T_co]: + ... + + def __len__(self, /) -> int: + ... + + + +Device = Literal["cpu"] +Dtype = dtype[Union[int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32, float64,]] +if sys.version_info >= (3, 12): + ... +else: + ... +PyCapsule = Any +class SupportsDLPack(Protocol): + def __dlpack__(self, /, *, stream: None = ...) -> PyCapsule: + ... + + + diff --git a/typings/numpy/array_api/_utility_functions.pyi b/typings/numpy/array_api/_utility_functions.pyi new file mode 100644 index 0000000..e5a911f --- /dev/null +++ b/typings/numpy/array_api/_utility_functions.pyi @@ -0,0 +1,23 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array +from typing import Optional, Tuple, Union + +def all(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., keepdims: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.all `. + + See its docstring for more information. + """ + ... + +def any(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., keepdims: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.any `. + + See its docstring for more information. + """ + ... + diff --git a/typings/numpy/array_api/linalg.pyi b/typings/numpy/array_api/linalg.pyi new file mode 100644 index 0000000..5634ea3 --- /dev/null +++ b/typings/numpy/array_api/linalg.pyi @@ -0,0 +1,200 @@ +""" +This type stub file was generated by pyright. +""" + +from ._array_object import Array +from typing import NamedTuple, TYPE_CHECKING +from ._typing import Dtype, Literal, Optional, Sequence, Tuple, Union + +if TYPE_CHECKING: + ... +class EighResult(NamedTuple): + eigenvalues: Array + eigenvectors: Array + ... + + +class QRResult(NamedTuple): + Q: Array + R: Array + ... + + +class SlogdetResult(NamedTuple): + sign: Array + logabsdet: Array + ... + + +class SVDResult(NamedTuple): + U: Array + S: Array + Vh: Array + ... + + +def cholesky(x: Array, /, *, upper: bool = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.cholesky `. + + See its docstring for more information. + """ + ... + +def cross(x1: Array, x2: Array, /, *, axis: int = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.cross `. + + See its docstring for more information. + """ + ... + +def det(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.det `. + + See its docstring for more information. + """ + ... + +def diagonal(x: Array, /, *, offset: int = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.diagonal `. + + See its docstring for more information. + """ + ... + +def eigh(x: Array, /) -> EighResult: + """ + Array API compatible wrapper for :py:func:`np.linalg.eigh `. + + See its docstring for more information. + """ + ... + +def eigvalsh(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.eigvalsh `. + + See its docstring for more information. + """ + ... + +def inv(x: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.inv `. + + See its docstring for more information. + """ + ... + +def matmul(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.matmul `. + + See its docstring for more information. + """ + ... + +def matrix_norm(x: Array, /, *, keepdims: bool = ..., ord: Optional[Union[int, float, Literal[fro, nuc]]] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.norm `. + + See its docstring for more information. + """ + ... + +def matrix_power(x: Array, n: int, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.matrix_power `. + + See its docstring for more information. + """ + ... + +def matrix_rank(x: Array, /, *, rtol: Optional[Union[float, Array]] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.matrix_rank `. + + See its docstring for more information. + """ + ... + +def matrix_transpose(x: Array, /) -> Array: + ... + +def outer(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.outer `. + + See its docstring for more information. + """ + ... + +def pinv(x: Array, /, *, rtol: Optional[Union[float, Array]] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.pinv `. + + See its docstring for more information. + """ + ... + +def qr(x: Array, /, *, mode: Literal[reduced, complete] = ...) -> QRResult: + """ + Array API compatible wrapper for :py:func:`np.linalg.qr `. + + See its docstring for more information. + """ + ... + +def slogdet(x: Array, /) -> SlogdetResult: + """ + Array API compatible wrapper for :py:func:`np.linalg.slogdet `. + + See its docstring for more information. + """ + ... + +def solve(x1: Array, x2: Array, /) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.solve `. + + See its docstring for more information. + """ + ... + +def svd(x: Array, /, *, full_matrices: bool = ...) -> SVDResult: + """ + Array API compatible wrapper for :py:func:`np.linalg.svd `. + + See its docstring for more information. + """ + ... + +def svdvals(x: Array, /) -> Union[Array, Tuple[Array, ...]]: + ... + +def tensordot(x1: Array, x2: Array, /, *, axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = ...) -> Array: + ... + +def trace(x: Array, /, *, offset: int = ..., dtype: Optional[Dtype] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.trace `. + + See its docstring for more information. + """ + ... + +def vecdot(x1: Array, x2: Array, /, *, axis: int = ...) -> Array: + ... + +def vector_norm(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = ..., keepdims: bool = ..., ord: Optional[Union[int, float]] = ...) -> Array: + """ + Array API compatible wrapper for :py:func:`np.linalg.norm `. + + See its docstring for more information. + """ + ... + +__all__ = ['cholesky', 'cross', 'det', 'diagonal', 'eigh', 'eigvalsh', 'inv', 'matmul', 'matrix_norm', 'matrix_power', 'matrix_rank', 'matrix_transpose', 'outer', 'pinv', 'qr', 'slogdet', 'solve', 'svd', 'svdvals', 'tensordot', 'trace', 'vecdot', 'vector_norm'] diff --git a/typings/numpy/compat/__init__.pyi b/typings/numpy/compat/__init__.pyi new file mode 100644 index 0000000..a940069 --- /dev/null +++ b/typings/numpy/compat/__init__.pyi @@ -0,0 +1,20 @@ +""" +This type stub file was generated by pyright. +""" + +from .._utils import _inspect +from .._utils._inspect import formatargspec, getargspec +from . import py3k +from .py3k import * + +""" +Compatibility module. + +This module contains duplicated code from Python itself or 3rd party +extensions, which may be included for the following reasons: + + * compatibility + * we may only need a small subset of the copied library/module + +""" +__all__ = [] diff --git a/typings/numpy/compat/py3k.pyi b/typings/numpy/compat/py3k.pyi new file mode 100644 index 0000000..bc1814e --- /dev/null +++ b/typings/numpy/compat/py3k.pyi @@ -0,0 +1,110 @@ +""" +This type stub file was generated by pyright. +""" + +import os + +""" +Python 3.X compatibility tools. + +While this file was originally intended for Python 2 -> 3 transition, +it is now used to create a compatibility layer between different +minor versions of Python 3. + +While the active version of numpy may not support a given version of python, we +allow downstream libraries to continue to use these shims for forward +compatibility with numpy while they transition their code to newer versions of +Python. +""" +__all__ = ['bytes', 'asbytes', 'isfileobj', 'getexception', 'strchar', 'unicode', 'asunicode', 'asbytes_nested', 'asunicode_nested', 'asstr', 'open_latin1', 'long', 'basestring', 'sixu', 'integer_types', 'is_pathlib_path', 'npy_load_module', 'Path', 'pickle', 'contextlib_nullcontext', 'os_fspath', 'os_PathLike'] +long = int +integer_types = ... +basestring = str +unicode = str +bytes = bytes +def asunicode(s): # -> str: + ... + +def asbytes(s): # -> bytes: + ... + +def asstr(s): # -> str: + ... + +def isfileobj(f): # -> bool: + ... + +def open_latin1(filename, mode=...): # -> IO[Any]: + ... + +def sixu(s): + ... + +strchar = ... +def getexception(): # -> BaseException | None: + ... + +def asbytes_nested(x): # -> list[Unknown] | bytes: + ... + +def asunicode_nested(x): # -> list[Unknown] | str: + ... + +def is_pathlib_path(obj): # -> bool: + """ + Check whether obj is a `pathlib.Path` object. + + Prefer using ``isinstance(obj, os.PathLike)`` instead of this function. + """ + ... + +class contextlib_nullcontext: + """Context manager that does no additional processing. + + Used as a stand-in for a normal context manager, when a particular + block of code is only sometimes used with a normal context manager: + + cm = optional_cm if condition else nullcontext() + with cm: + # Perform operation, using optional_cm if condition is True + + .. note:: + Prefer using `contextlib.nullcontext` instead of this context manager. + """ + def __init__(self, enter_result=...) -> None: + ... + + def __enter__(self): # -> None: + ... + + def __exit__(self, *excinfo): # -> None: + ... + + + +def npy_load_module(name, fn, info=...): # -> ModuleType: + """ + Load a module. Uses ``load_module`` which will be deprecated in python + 3.12. An alternative that uses ``exec_module`` is in + numpy.distutils.misc_util.exec_mod_from_location + + .. versionadded:: 1.11.2 + + Parameters + ---------- + name : str + Full module name. + fn : str + Path to module file. + info : tuple, optional + Only here for backward compatibility with Python 2.*. + + Returns + ------- + mod : module + + """ + ... + +os_fspath = ... +os_PathLike = os.PathLike diff --git a/typings/numpy/conftest.pyi b/typings/numpy/conftest.pyi new file mode 100644 index 0000000..943b007 --- /dev/null +++ b/typings/numpy/conftest.pyi @@ -0,0 +1,56 @@ +""" +This type stub file was generated by pyright. +""" + +import pytest + +""" +Pytest configuration and fixtures for the Numpy test suite. +""" +_old_fpu_mode = ... +_collect_results = ... +_pytest_ini = ... +def pytest_configure(config): # -> None: + ... + +def pytest_addoption(parser): # -> None: + ... + +def pytest_sessionstart(session): # -> None: + ... + +@pytest.hookimpl() +def pytest_itemcollected(item): # -> None: + """ + Check FPU precision mode was not changed during test collection. + + The clumsy way we do it here is mainly necessary because numpy + still uses yield tests, which can execute code at test collection + time. + """ + ... + +@pytest.fixture(scope="function", autouse=True) +def check_fpu_mode(request): # -> Generator[None, Any, None]: + """ + Check FPU precision mode was not changed during the test. + """ + ... + +@pytest.fixture(autouse=True) +def add_np(doctest_namespace): # -> None: + ... + +@pytest.fixture(autouse=True) +def env_setup(monkeypatch): # -> None: + ... + +@pytest.fixture(params=[True, False]) +def weak_promotion(request): # -> Generator[Unknown, Any, None]: + """ + Fixture to ensure "legacy" promotion state or change it to use the new + weak promotion (plus warning). `old_promotion` should be used as a + parameter in the function. + """ + ... + diff --git a/typings/numpy/core/__init__.pyi b/typings/numpy/core/__init__.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/numpy/core/__init__.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/numpy/core/_asarray.pyi b/typings/numpy/core/_asarray.pyi new file mode 100644 index 0000000..c46dee4 --- /dev/null +++ b/typings/numpy/core/_asarray.pyi @@ -0,0 +1,25 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Iterable +from typing import Any, Literal, TypeVar, Union, overload +from numpy import ndarray +from numpy._typing import DTypeLike, _SupportsArrayFunc + +_ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, Any]) +_Requirements = Literal["C", "C_CONTIGUOUS", "CONTIGUOUS", "F", "F_CONTIGUOUS", "FORTRAN", "A", "ALIGNED", "W", "WRITEABLE", "O", "OWNDATA"] +_E = Literal["E", "ENSUREARRAY"] +_RequirementsWithE = Union[_Requirements, _E] +@overload +def require(a: _ArrayType, dtype: None = ..., requirements: None | _Requirements | Iterable[_Requirements] = ..., *, like: _SupportsArrayFunc = ...) -> _ArrayType: + ... + +@overload +def require(a: object, dtype: DTypeLike = ..., requirements: _E | Iterable[_RequirementsWithE] = ..., *, like: _SupportsArrayFunc = ...) -> ndarray[Any, Any]: + ... + +@overload +def require(a: object, dtype: DTypeLike = ..., requirements: None | _Requirements | Iterable[_Requirements] = ..., *, like: _SupportsArrayFunc = ...) -> ndarray[Any, Any]: + ... + diff --git a/typings/numpy/core/_internal.pyi b/typings/numpy/core/_internal.pyi new file mode 100644 index 0000000..f6e37ca --- /dev/null +++ b/typings/numpy/core/_internal.pyi @@ -0,0 +1,44 @@ +""" +This type stub file was generated by pyright. +""" + +import ctypes as ct +from typing import Any, Generic, TypeVar, overload +from numpy import ndarray +from numpy.ctypeslib import c_intp + +_CastT = TypeVar("_CastT", bound=ct._CanCastTo) +_CT = TypeVar("_CT", bound=ct._CData) +_PT = TypeVar("_PT", bound=None | int) +class _ctypes(Generic[_PT]): + @overload + def __new__(cls, array: ndarray[Any, Any], ptr: None = ...) -> _ctypes[None]: + ... + + @overload + def __new__(cls, array: ndarray[Any, Any], ptr: _PT) -> _ctypes[_PT]: + ... + + @property + def data(self) -> _PT: + ... + + @property + def shape(self) -> ct.Array[c_intp]: + ... + + @property + def strides(self) -> ct.Array[c_intp]: + ... + + def data_as(self, obj: type[_CastT]) -> _CastT: + ... + + def shape_as(self, obj: type[_CT]) -> ct.Array[_CT]: + ... + + def strides_as(self, obj: type[_CT]) -> ct.Array[_CT]: + ... + + + diff --git a/typings/numpy/core/_type_aliases.pyi b/typings/numpy/core/_type_aliases.pyi new file mode 100644 index 0000000..a18b74f --- /dev/null +++ b/typings/numpy/core/_type_aliases.pyi @@ -0,0 +1,18 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, TypedDict +from numpy import complexfloating, floating, generic, signedinteger, unsignedinteger + +class _SCTypes(TypedDict): + int: list[type[signedinteger[Any]]] + uint: list[type[unsignedinteger[Any]]] + float: list[type[floating[Any]]] + complex: list[type[complexfloating[Any, Any]]] + others: list[type] + ... + + +sctypeDict: dict[int | str, type[generic]] +sctypes: _SCTypes diff --git a/typings/numpy/core/_ufunc_config.pyi b/typings/numpy/core/_ufunc_config.pyi new file mode 100644 index 0000000..82ff48c --- /dev/null +++ b/typings/numpy/core/_ufunc_config.pyi @@ -0,0 +1,45 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable +from typing import Any, Literal, TypedDict +from numpy import _SupportsWrite + +_ErrKind = Literal["ignore", "warn", "raise", "call", "print", "log"] +_ErrFunc = Callable[[str, int], Any] +class _ErrDict(TypedDict): + divide: _ErrKind + over: _ErrKind + under: _ErrKind + invalid: _ErrKind + ... + + +class _ErrDictOptional(TypedDict, total=False): + all: None | _ErrKind + divide: None | _ErrKind + over: None | _ErrKind + under: None | _ErrKind + invalid: None | _ErrKind + ... + + +def seterr(all: None | _ErrKind = ..., divide: None | _ErrKind = ..., over: None | _ErrKind = ..., under: None | _ErrKind = ..., invalid: None | _ErrKind = ...) -> _ErrDict: + ... + +def geterr() -> _ErrDict: + ... + +def setbufsize(size: int) -> int: + ... + +def getbufsize() -> int: + ... + +def seterrcall(func: None | _ErrFunc | _SupportsWrite[str]) -> None | _ErrFunc | _SupportsWrite[str]: + ... + +def geterrcall() -> None | _ErrFunc | _SupportsWrite[str]: + ... + diff --git a/typings/numpy/core/arrayprint.pyi b/typings/numpy/core/arrayprint.pyi new file mode 100644 index 0000000..9a5ebdc --- /dev/null +++ b/typings/numpy/core/arrayprint.pyi @@ -0,0 +1,73 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable +from typing import Any, Literal, SupportsIndex, TypedDict +from contextlib import _GeneratorContextManager +from numpy import bool_, clongdouble, complexfloating, datetime64, floating, integer, longdouble, ndarray, timedelta64, void +from numpy._typing import _CharLike_co, _FloatLike_co + +_FloatMode = Literal["fixed", "unique", "maxprec", "maxprec_equal"] +class _FormatDict(TypedDict, total=False): + bool: Callable[[bool_], str] + int: Callable[[integer[Any]], str] + timedelta: Callable[[timedelta64], str] + datetime: Callable[[datetime64], str] + float: Callable[[floating[Any]], str] + longfloat: Callable[[longdouble], str] + complexfloat: Callable[[complexfloating[Any, Any]], str] + longcomplexfloat: Callable[[clongdouble], str] + void: Callable[[void], str] + numpystr: Callable[[_CharLike_co], str] + object: Callable[[object], str] + all: Callable[[object], str] + int_kind: Callable[[integer[Any]], str] + float_kind: Callable[[floating[Any]], str] + complex_kind: Callable[[complexfloating[Any, Any]], str] + str_kind: Callable[[_CharLike_co], str] + ... + + +class _FormatOptions(TypedDict): + precision: int + threshold: int + edgeitems: int + linewidth: int + suppress: bool + nanstr: str + infstr: str + formatter: None | _FormatDict + sign: Literal["-", "+", " "] + floatmode: _FloatMode + legacy: Literal[False, "1.13", "1.21"] + ... + + +def set_printoptions(precision: None | SupportsIndex = ..., threshold: None | int = ..., edgeitems: None | int = ..., linewidth: None | int = ..., suppress: None | bool = ..., nanstr: None | str = ..., infstr: None | str = ..., formatter: None | _FormatDict = ..., sign: Literal[None, "-", "+", " "] = ..., floatmode: None | _FloatMode = ..., *, legacy: Literal[None, False, "1.13", "1.21"] = ...) -> None: + ... + +def get_printoptions() -> _FormatOptions: + ... + +def array2string(a: ndarray[Any, Any], max_line_width: None | int = ..., precision: None | SupportsIndex = ..., suppress_small: None | bool = ..., separator: str = ..., prefix: str = ..., *, formatter: None | _FormatDict = ..., threshold: None | int = ..., edgeitems: None | int = ..., sign: Literal[None, "-", "+", " "] = ..., floatmode: None | _FloatMode = ..., suffix: str = ..., legacy: Literal[None, False, "1.13", "1.21"] = ...) -> str: + ... + +def format_float_scientific(x: _FloatLike_co, precision: None | int = ..., unique: bool = ..., trim: Literal["k", ".", "0", "-"] = ..., sign: bool = ..., pad_left: None | int = ..., exp_digits: None | int = ..., min_digits: None | int = ...) -> str: + ... + +def format_float_positional(x: _FloatLike_co, precision: None | int = ..., unique: bool = ..., fractional: bool = ..., trim: Literal["k", ".", "0", "-"] = ..., sign: bool = ..., pad_left: None | int = ..., pad_right: None | int = ..., min_digits: None | int = ...) -> str: + ... + +def array_repr(arr: ndarray[Any, Any], max_line_width: None | int = ..., precision: None | SupportsIndex = ..., suppress_small: None | bool = ...) -> str: + ... + +def array_str(a: ndarray[Any, Any], max_line_width: None | int = ..., precision: None | SupportsIndex = ..., suppress_small: None | bool = ...) -> str: + ... + +def set_string_function(f: None | Callable[[ndarray[Any, Any]], str], repr: bool = ...) -> None: + ... + +def printoptions(precision: None | SupportsIndex = ..., threshold: None | int = ..., edgeitems: None | int = ..., linewidth: None | int = ..., suppress: None | bool = ..., nanstr: None | str = ..., infstr: None | str = ..., formatter: None | _FormatDict = ..., sign: Literal[None, "-", "+", " "] = ..., floatmode: None | _FloatMode = ..., *, legacy: Literal[None, False, "1.13", "1.21"] = ...) -> _GeneratorContextManager[_FormatOptions]: + ... + diff --git a/typings/numpy/core/defchararray.pyi b/typings/numpy/core/defchararray.pyi new file mode 100644 index 0000000..06cf826 --- /dev/null +++ b/typings/numpy/core/defchararray.pyi @@ -0,0 +1,375 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, Literal as L, TypeVar, overload +from numpy import _OrderKACF, bool_, bytes_, chararray as chararray, dtype, int_, object_, str_ +from numpy._typing import NDArray, _ArrayLikeBool_co as b_co, _ArrayLikeBytes_co as S_co, _ArrayLikeInt_co as i_co, _ArrayLikeStr_co as U_co + +_SCT = TypeVar("_SCT", str_, bytes_) +_CharArray = chararray[Any, dtype[_SCT]] +__all__: list[str] +@overload +def equal(x1: U_co, x2: U_co) -> NDArray[bool_]: + ... + +@overload +def equal(x1: S_co, x2: S_co) -> NDArray[bool_]: + ... + +@overload +def not_equal(x1: U_co, x2: U_co) -> NDArray[bool_]: + ... + +@overload +def not_equal(x1: S_co, x2: S_co) -> NDArray[bool_]: + ... + +@overload +def greater_equal(x1: U_co, x2: U_co) -> NDArray[bool_]: + ... + +@overload +def greater_equal(x1: S_co, x2: S_co) -> NDArray[bool_]: + ... + +@overload +def less_equal(x1: U_co, x2: U_co) -> NDArray[bool_]: + ... + +@overload +def less_equal(x1: S_co, x2: S_co) -> NDArray[bool_]: + ... + +@overload +def greater(x1: U_co, x2: U_co) -> NDArray[bool_]: + ... + +@overload +def greater(x1: S_co, x2: S_co) -> NDArray[bool_]: + ... + +@overload +def less(x1: U_co, x2: U_co) -> NDArray[bool_]: + ... + +@overload +def less(x1: S_co, x2: S_co) -> NDArray[bool_]: + ... + +@overload +def add(x1: U_co, x2: U_co) -> NDArray[str_]: + ... + +@overload +def add(x1: S_co, x2: S_co) -> NDArray[bytes_]: + ... + +@overload +def multiply(a: U_co, i: i_co) -> NDArray[str_]: + ... + +@overload +def multiply(a: S_co, i: i_co) -> NDArray[bytes_]: + ... + +@overload +def mod(a: U_co, value: Any) -> NDArray[str_]: + ... + +@overload +def mod(a: S_co, value: Any) -> NDArray[bytes_]: + ... + +@overload +def capitalize(a: U_co) -> NDArray[str_]: + ... + +@overload +def capitalize(a: S_co) -> NDArray[bytes_]: + ... + +@overload +def center(a: U_co, width: i_co, fillchar: U_co = ...) -> NDArray[str_]: + ... + +@overload +def center(a: S_co, width: i_co, fillchar: S_co = ...) -> NDArray[bytes_]: + ... + +def decode(a: S_co, encoding: None | str = ..., errors: None | str = ...) -> NDArray[str_]: + ... + +def encode(a: U_co, encoding: None | str = ..., errors: None | str = ...) -> NDArray[bytes_]: + ... + +@overload +def expandtabs(a: U_co, tabsize: i_co = ...) -> NDArray[str_]: + ... + +@overload +def expandtabs(a: S_co, tabsize: i_co = ...) -> NDArray[bytes_]: + ... + +@overload +def join(sep: U_co, seq: U_co) -> NDArray[str_]: + ... + +@overload +def join(sep: S_co, seq: S_co) -> NDArray[bytes_]: + ... + +@overload +def ljust(a: U_co, width: i_co, fillchar: U_co = ...) -> NDArray[str_]: + ... + +@overload +def ljust(a: S_co, width: i_co, fillchar: S_co = ...) -> NDArray[bytes_]: + ... + +@overload +def lower(a: U_co) -> NDArray[str_]: + ... + +@overload +def lower(a: S_co) -> NDArray[bytes_]: + ... + +@overload +def lstrip(a: U_co, chars: None | U_co = ...) -> NDArray[str_]: + ... + +@overload +def lstrip(a: S_co, chars: None | S_co = ...) -> NDArray[bytes_]: + ... + +@overload +def partition(a: U_co, sep: U_co) -> NDArray[str_]: + ... + +@overload +def partition(a: S_co, sep: S_co) -> NDArray[bytes_]: + ... + +@overload +def replace(a: U_co, old: U_co, new: U_co, count: None | i_co = ...) -> NDArray[str_]: + ... + +@overload +def replace(a: S_co, old: S_co, new: S_co, count: None | i_co = ...) -> NDArray[bytes_]: + ... + +@overload +def rjust(a: U_co, width: i_co, fillchar: U_co = ...) -> NDArray[str_]: + ... + +@overload +def rjust(a: S_co, width: i_co, fillchar: S_co = ...) -> NDArray[bytes_]: + ... + +@overload +def rpartition(a: U_co, sep: U_co) -> NDArray[str_]: + ... + +@overload +def rpartition(a: S_co, sep: S_co) -> NDArray[bytes_]: + ... + +@overload +def rsplit(a: U_co, sep: None | U_co = ..., maxsplit: None | i_co = ...) -> NDArray[object_]: + ... + +@overload +def rsplit(a: S_co, sep: None | S_co = ..., maxsplit: None | i_co = ...) -> NDArray[object_]: + ... + +@overload +def rstrip(a: U_co, chars: None | U_co = ...) -> NDArray[str_]: + ... + +@overload +def rstrip(a: S_co, chars: None | S_co = ...) -> NDArray[bytes_]: + ... + +@overload +def split(a: U_co, sep: None | U_co = ..., maxsplit: None | i_co = ...) -> NDArray[object_]: + ... + +@overload +def split(a: S_co, sep: None | S_co = ..., maxsplit: None | i_co = ...) -> NDArray[object_]: + ... + +@overload +def splitlines(a: U_co, keepends: None | b_co = ...) -> NDArray[object_]: + ... + +@overload +def splitlines(a: S_co, keepends: None | b_co = ...) -> NDArray[object_]: + ... + +@overload +def strip(a: U_co, chars: None | U_co = ...) -> NDArray[str_]: + ... + +@overload +def strip(a: S_co, chars: None | S_co = ...) -> NDArray[bytes_]: + ... + +@overload +def swapcase(a: U_co) -> NDArray[str_]: + ... + +@overload +def swapcase(a: S_co) -> NDArray[bytes_]: + ... + +@overload +def title(a: U_co) -> NDArray[str_]: + ... + +@overload +def title(a: S_co) -> NDArray[bytes_]: + ... + +@overload +def translate(a: U_co, table: U_co, deletechars: None | U_co = ...) -> NDArray[str_]: + ... + +@overload +def translate(a: S_co, table: S_co, deletechars: None | S_co = ...) -> NDArray[bytes_]: + ... + +@overload +def upper(a: U_co) -> NDArray[str_]: + ... + +@overload +def upper(a: S_co) -> NDArray[bytes_]: + ... + +@overload +def zfill(a: U_co, width: i_co) -> NDArray[str_]: + ... + +@overload +def zfill(a: S_co, width: i_co) -> NDArray[bytes_]: + ... + +@overload +def count(a: U_co, sub: U_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def count(a: S_co, sub: S_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def endswith(a: U_co, suffix: U_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[bool_]: + ... + +@overload +def endswith(a: S_co, suffix: S_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[bool_]: + ... + +@overload +def find(a: U_co, sub: U_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def find(a: S_co, sub: S_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def index(a: U_co, sub: U_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def index(a: S_co, sub: S_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +def isalpha(a: U_co | S_co) -> NDArray[bool_]: + ... + +def isalnum(a: U_co | S_co) -> NDArray[bool_]: + ... + +def isdecimal(a: U_co | S_co) -> NDArray[bool_]: + ... + +def isdigit(a: U_co | S_co) -> NDArray[bool_]: + ... + +def islower(a: U_co | S_co) -> NDArray[bool_]: + ... + +def isnumeric(a: U_co | S_co) -> NDArray[bool_]: + ... + +def isspace(a: U_co | S_co) -> NDArray[bool_]: + ... + +def istitle(a: U_co | S_co) -> NDArray[bool_]: + ... + +def isupper(a: U_co | S_co) -> NDArray[bool_]: + ... + +@overload +def rfind(a: U_co, sub: U_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def rfind(a: S_co, sub: S_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def rindex(a: U_co, sub: U_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def rindex(a: S_co, sub: S_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[int_]: + ... + +@overload +def startswith(a: U_co, prefix: U_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[bool_]: + ... + +@overload +def startswith(a: S_co, prefix: S_co, start: i_co = ..., end: None | i_co = ...) -> NDArray[bool_]: + ... + +def str_len(A: U_co | S_co) -> NDArray[int_]: + ... + +@overload +def array(obj: U_co, itemsize: None | int = ..., copy: bool = ..., unicode: L[False] = ..., order: _OrderKACF = ...) -> _CharArray[str_]: + ... + +@overload +def array(obj: S_co, itemsize: None | int = ..., copy: bool = ..., unicode: L[False] = ..., order: _OrderKACF = ...) -> _CharArray[bytes_]: + ... + +@overload +def array(obj: object, itemsize: None | int = ..., copy: bool = ..., unicode: L[False] = ..., order: _OrderKACF = ...) -> _CharArray[bytes_]: + ... + +@overload +def array(obj: object, itemsize: None | int = ..., copy: bool = ..., unicode: L[True] = ..., order: _OrderKACF = ...) -> _CharArray[str_]: + ... + +@overload +def asarray(obj: U_co, itemsize: None | int = ..., unicode: L[False] = ..., order: _OrderKACF = ...) -> _CharArray[str_]: + ... + +@overload +def asarray(obj: S_co, itemsize: None | int = ..., unicode: L[False] = ..., order: _OrderKACF = ...) -> _CharArray[bytes_]: + ... + +@overload +def asarray(obj: object, itemsize: None | int = ..., unicode: L[False] = ..., order: _OrderKACF = ...) -> _CharArray[bytes_]: + ... + +@overload +def asarray(obj: object, itemsize: None | int = ..., unicode: L[True] = ..., order: _OrderKACF = ...) -> _CharArray[str_]: + ... + diff --git a/typings/numpy/core/einsumfunc.pyi b/typings/numpy/core/einsumfunc.pyi new file mode 100644 index 0000000..9984ab9 --- /dev/null +++ b/typings/numpy/core/einsumfunc.pyi @@ -0,0 +1,65 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Sequence +from typing import Any, Literal, TypeVar, Union, overload +from numpy import _OrderKACF, bool_, dtype, ndarray, number +from numpy._typing import _ArrayLikeBool_co, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeUInt_co, _DTypeLikeBool, _DTypeLikeComplex, _DTypeLikeComplex_co, _DTypeLikeFloat, _DTypeLikeInt, _DTypeLikeObject, _DTypeLikeUInt + +_ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, dtype[Union[bool_, number[Any]]]]) +_OptimizeKind = None | bool | Literal["greedy", "optimal"] | Sequence[Any] +_CastingSafe = Literal["no", "equiv", "safe", "same_kind"] +_CastingUnsafe = Literal["unsafe"] +__all__: list[str] +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeBool_co, out: None = ..., dtype: None | _DTypeLikeBool = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeUInt_co, out: None = ..., dtype: None | _DTypeLikeUInt = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeInt_co, out: None = ..., dtype: None | _DTypeLikeInt = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeFloat_co, out: None = ..., dtype: None | _DTypeLikeFloat = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeComplex_co, out: None = ..., dtype: None | _DTypeLikeComplex = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: Any, casting: _CastingUnsafe, dtype: None | _DTypeLikeComplex_co = ..., out: None = ..., order: _OrderKACF = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeComplex_co, out: _ArrayType, dtype: None | _DTypeLikeComplex_co = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> _ArrayType: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: Any, out: _ArrayType, casting: _CastingUnsafe, dtype: None | _DTypeLikeComplex_co = ..., order: _OrderKACF = ..., optimize: _OptimizeKind = ...) -> _ArrayType: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeObject_co, out: None = ..., dtype: None | _DTypeLikeObject = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: Any, casting: _CastingUnsafe, dtype: None | _DTypeLikeObject = ..., out: None = ..., order: _OrderKACF = ..., optimize: _OptimizeKind = ...) -> Any: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeObject_co, out: _ArrayType, dtype: None | _DTypeLikeObject = ..., order: _OrderKACF = ..., casting: _CastingSafe = ..., optimize: _OptimizeKind = ...) -> _ArrayType: + ... + +@overload +def einsum(subscripts: str | _ArrayLikeInt_co, /, *operands: Any, out: _ArrayType, casting: _CastingUnsafe, dtype: None | _DTypeLikeObject = ..., order: _OrderKACF = ..., optimize: _OptimizeKind = ...) -> _ArrayType: + ... + +def einsum_path(subscripts: str | _ArrayLikeInt_co, /, *operands: _ArrayLikeComplex_co | _DTypeLikeObject, optimize: _OptimizeKind = ...) -> tuple[list[Any], str]: + ... + diff --git a/typings/numpy/core/fromnumeric.pyi b/typings/numpy/core/fromnumeric.pyi new file mode 100644 index 0000000..59886b5 --- /dev/null +++ b/typings/numpy/core/fromnumeric.pyi @@ -0,0 +1,489 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Sequence +from typing import Any, Literal, SupportsIndex, TypeVar, overload +from numpy import _CastingKind, _ModeKind, _OrderACF, _OrderKACF, _PartitionKind, _SortKind, _SortSide, bool_, complexfloating, float16, floating, generic, int64, int_, intp, number, object_, uint64 +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLike, _ArrayLikeBool_co, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeUInt_co, _BoolLike_co, _ComplexLike_co, _DTypeLike, _IntLike_co, _NumberLike_co, _ScalarLike_co, _Shape, _ShapeLike + +_SCT = TypeVar("_SCT", bound=generic) +_SCT_uifcO = TypeVar("_SCT_uifcO", bound=number[Any] | object_) +_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) +__all__: list[str] +@overload +def take(a: _ArrayLike[_SCT], indices: _IntLike_co, axis: None = ..., out: None = ..., mode: _ModeKind = ...) -> _SCT: + ... + +@overload +def take(a: ArrayLike, indices: _IntLike_co, axis: None | SupportsIndex = ..., out: None = ..., mode: _ModeKind = ...) -> Any: + ... + +@overload +def take(a: _ArrayLike[_SCT], indices: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., out: None = ..., mode: _ModeKind = ...) -> NDArray[_SCT]: + ... + +@overload +def take(a: ArrayLike, indices: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., out: None = ..., mode: _ModeKind = ...) -> NDArray[Any]: + ... + +@overload +def take(a: ArrayLike, indices: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., out: _ArrayType = ..., mode: _ModeKind = ...) -> _ArrayType: + ... + +@overload +def reshape(a: _ArrayLike[_SCT], newshape: _ShapeLike, order: _OrderACF = ...) -> NDArray[_SCT]: + ... + +@overload +def reshape(a: ArrayLike, newshape: _ShapeLike, order: _OrderACF = ...) -> NDArray[Any]: + ... + +@overload +def choose(a: _IntLike_co, choices: ArrayLike, out: None = ..., mode: _ModeKind = ...) -> Any: + ... + +@overload +def choose(a: _ArrayLikeInt_co, choices: _ArrayLike[_SCT], out: None = ..., mode: _ModeKind = ...) -> NDArray[_SCT]: + ... + +@overload +def choose(a: _ArrayLikeInt_co, choices: ArrayLike, out: None = ..., mode: _ModeKind = ...) -> NDArray[Any]: + ... + +@overload +def choose(a: _ArrayLikeInt_co, choices: ArrayLike, out: _ArrayType = ..., mode: _ModeKind = ...) -> _ArrayType: + ... + +@overload +def repeat(a: _ArrayLike[_SCT], repeats: _ArrayLikeInt_co, axis: None | SupportsIndex = ...) -> NDArray[_SCT]: + ... + +@overload +def repeat(a: ArrayLike, repeats: _ArrayLikeInt_co, axis: None | SupportsIndex = ...) -> NDArray[Any]: + ... + +def put(a: NDArray[Any], ind: _ArrayLikeInt_co, v: ArrayLike, mode: _ModeKind = ...) -> None: + ... + +@overload +def swapaxes(a: _ArrayLike[_SCT], axis1: SupportsIndex, axis2: SupportsIndex) -> NDArray[_SCT]: + ... + +@overload +def swapaxes(a: ArrayLike, axis1: SupportsIndex, axis2: SupportsIndex) -> NDArray[Any]: + ... + +@overload +def transpose(a: _ArrayLike[_SCT], axes: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def transpose(a: ArrayLike, axes: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def partition(a: _ArrayLike[_SCT], kth: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., kind: _PartitionKind = ..., order: None | str | Sequence[str] = ...) -> NDArray[_SCT]: + ... + +@overload +def partition(a: ArrayLike, kth: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., kind: _PartitionKind = ..., order: None | str | Sequence[str] = ...) -> NDArray[Any]: + ... + +def argpartition(a: ArrayLike, kth: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., kind: _PartitionKind = ..., order: None | str | Sequence[str] = ...) -> NDArray[intp]: + ... + +@overload +def sort(a: _ArrayLike[_SCT], axis: None | SupportsIndex = ..., kind: None | _SortKind = ..., order: None | str | Sequence[str] = ...) -> NDArray[_SCT]: + ... + +@overload +def sort(a: ArrayLike, axis: None | SupportsIndex = ..., kind: None | _SortKind = ..., order: None | str | Sequence[str] = ...) -> NDArray[Any]: + ... + +def argsort(a: ArrayLike, axis: None | SupportsIndex = ..., kind: None | _SortKind = ..., order: None | str | Sequence[str] = ...) -> NDArray[intp]: + ... + +@overload +def argmax(a: ArrayLike, axis: None = ..., out: None = ..., *, keepdims: Literal[False] = ...) -> intp: + ... + +@overload +def argmax(a: ArrayLike, axis: None | SupportsIndex = ..., out: None = ..., *, keepdims: bool = ...) -> Any: + ... + +@overload +def argmax(a: ArrayLike, axis: None | SupportsIndex = ..., out: _ArrayType = ..., *, keepdims: bool = ...) -> _ArrayType: + ... + +@overload +def argmin(a: ArrayLike, axis: None = ..., out: None = ..., *, keepdims: Literal[False] = ...) -> intp: + ... + +@overload +def argmin(a: ArrayLike, axis: None | SupportsIndex = ..., out: None = ..., *, keepdims: bool = ...) -> Any: + ... + +@overload +def argmin(a: ArrayLike, axis: None | SupportsIndex = ..., out: _ArrayType = ..., *, keepdims: bool = ...) -> _ArrayType: + ... + +@overload +def searchsorted(a: ArrayLike, v: _ScalarLike_co, side: _SortSide = ..., sorter: None | _ArrayLikeInt_co = ...) -> intp: + ... + +@overload +def searchsorted(a: ArrayLike, v: ArrayLike, side: _SortSide = ..., sorter: None | _ArrayLikeInt_co = ...) -> NDArray[intp]: + ... + +@overload +def resize(a: _ArrayLike[_SCT], new_shape: _ShapeLike) -> NDArray[_SCT]: + ... + +@overload +def resize(a: ArrayLike, new_shape: _ShapeLike) -> NDArray[Any]: + ... + +@overload +def squeeze(a: _SCT, axis: None | _ShapeLike = ...) -> _SCT: + ... + +@overload +def squeeze(a: _ArrayLike[_SCT], axis: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def squeeze(a: ArrayLike, axis: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def diagonal(a: _ArrayLike[_SCT], offset: SupportsIndex = ..., axis1: SupportsIndex = ..., axis2: SupportsIndex = ...) -> NDArray[_SCT]: + ... + +@overload +def diagonal(a: ArrayLike, offset: SupportsIndex = ..., axis1: SupportsIndex = ..., axis2: SupportsIndex = ...) -> NDArray[Any]: + ... + +@overload +def trace(a: ArrayLike, offset: SupportsIndex = ..., axis1: SupportsIndex = ..., axis2: SupportsIndex = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: + ... + +@overload +def trace(a: ArrayLike, offset: SupportsIndex = ..., axis1: SupportsIndex = ..., axis2: SupportsIndex = ..., dtype: DTypeLike = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def ravel(a: _ArrayLike[_SCT], order: _OrderKACF = ...) -> NDArray[_SCT]: + ... + +@overload +def ravel(a: ArrayLike, order: _OrderKACF = ...) -> NDArray[Any]: + ... + +def nonzero(a: ArrayLike) -> tuple[NDArray[intp], ...]: + ... + +def shape(a: ArrayLike) -> _Shape: + ... + +@overload +def compress(condition: _ArrayLikeBool_co, a: _ArrayLike[_SCT], axis: None | SupportsIndex = ..., out: None = ...) -> NDArray[_SCT]: + ... + +@overload +def compress(condition: _ArrayLikeBool_co, a: ArrayLike, axis: None | SupportsIndex = ..., out: None = ...) -> NDArray[Any]: + ... + +@overload +def compress(condition: _ArrayLikeBool_co, a: ArrayLike, axis: None | SupportsIndex = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def clip(a: _SCT, a_min: None | ArrayLike, a_max: None | ArrayLike, out: None = ..., *, dtype: None = ..., where: None | _ArrayLikeBool_co = ..., order: _OrderKACF = ..., subok: bool = ..., signature: str | tuple[None | str, ...] = ..., extobj: list[Any] = ..., casting: _CastingKind = ...) -> _SCT: + ... + +@overload +def clip(a: _ScalarLike_co, a_min: None | ArrayLike, a_max: None | ArrayLike, out: None = ..., *, dtype: None = ..., where: None | _ArrayLikeBool_co = ..., order: _OrderKACF = ..., subok: bool = ..., signature: str | tuple[None | str, ...] = ..., extobj: list[Any] = ..., casting: _CastingKind = ...) -> Any: + ... + +@overload +def clip(a: _ArrayLike[_SCT], a_min: None | ArrayLike, a_max: None | ArrayLike, out: None = ..., *, dtype: None = ..., where: None | _ArrayLikeBool_co = ..., order: _OrderKACF = ..., subok: bool = ..., signature: str | tuple[None | str, ...] = ..., extobj: list[Any] = ..., casting: _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def clip(a: ArrayLike, a_min: None | ArrayLike, a_max: None | ArrayLike, out: None = ..., *, dtype: None = ..., where: None | _ArrayLikeBool_co = ..., order: _OrderKACF = ..., subok: bool = ..., signature: str | tuple[None | str, ...] = ..., extobj: list[Any] = ..., casting: _CastingKind = ...) -> NDArray[Any]: + ... + +@overload +def clip(a: ArrayLike, a_min: None | ArrayLike, a_max: None | ArrayLike, out: _ArrayType = ..., *, dtype: DTypeLike, where: None | _ArrayLikeBool_co = ..., order: _OrderKACF = ..., subok: bool = ..., signature: str | tuple[None | str, ...] = ..., extobj: list[Any] = ..., casting: _CastingKind = ...) -> Any: + ... + +@overload +def clip(a: ArrayLike, a_min: None | ArrayLike, a_max: None | ArrayLike, out: _ArrayType, *, dtype: DTypeLike = ..., where: None | _ArrayLikeBool_co = ..., order: _OrderKACF = ..., subok: bool = ..., signature: str | tuple[None | str, ...] = ..., extobj: list[Any] = ..., casting: _CastingKind = ...) -> _ArrayType: + ... + +@overload +def sum(a: _ArrayLike[_SCT], axis: None = ..., dtype: None = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _SCT: + ... + +@overload +def sum(a: ArrayLike, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def sum(a: ArrayLike, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _ArrayType = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def all(a: ArrayLike, axis: None = ..., out: None = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> bool_: + ... + +@overload +def all(a: ArrayLike, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def all(a: ArrayLike, axis: None | _ShapeLike = ..., out: _ArrayType = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def any(a: ArrayLike, axis: None = ..., out: None = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> bool_: + ... + +@overload +def any(a: ArrayLike, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def any(a: ArrayLike, axis: None | _ShapeLike = ..., out: _ArrayType = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def cumsum(a: _ArrayLike[_SCT], axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[_SCT]: + ... + +@overload +def cumsum(a: ArrayLike, axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[Any]: + ... + +@overload +def cumsum(a: ArrayLike, axis: None | SupportsIndex = ..., dtype: _DTypeLike[_SCT] = ..., out: None = ...) -> NDArray[_SCT]: + ... + +@overload +def cumsum(a: ArrayLike, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: None = ...) -> NDArray[Any]: + ... + +@overload +def cumsum(a: ArrayLike, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def ptp(a: _ArrayLike[_SCT], axis: None = ..., out: None = ..., keepdims: Literal[False] = ...) -> _SCT: + ... + +@overload +def ptp(a: ArrayLike, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ...) -> Any: + ... + +@overload +def ptp(a: ArrayLike, axis: None | _ShapeLike = ..., out: _ArrayType = ..., keepdims: bool = ...) -> _ArrayType: + ... + +@overload +def amax(a: _ArrayLike[_SCT], axis: None = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _SCT: + ... + +@overload +def amax(a: ArrayLike, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def amax(a: ArrayLike, axis: None | _ShapeLike = ..., out: _ArrayType = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def amin(a: _ArrayLike[_SCT], axis: None = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _SCT: + ... + +@overload +def amin(a: ArrayLike, axis: None | _ShapeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def amin(a: ArrayLike, axis: None | _ShapeLike = ..., out: _ArrayType = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def prod(a: _ArrayLikeBool_co, axis: None = ..., dtype: None = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> int_: + ... + +@overload +def prod(a: _ArrayLikeUInt_co, axis: None = ..., dtype: None = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> uint64: + ... + +@overload +def prod(a: _ArrayLikeInt_co, axis: None = ..., dtype: None = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> int64: + ... + +@overload +def prod(a: _ArrayLikeFloat_co, axis: None = ..., dtype: None = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> floating[Any]: + ... + +@overload +def prod(a: _ArrayLikeComplex_co, axis: None = ..., dtype: None = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> complexfloating[Any, Any]: + ... + +@overload +def prod(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: None = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def prod(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None = ..., dtype: _DTypeLike[_SCT] = ..., out: None = ..., keepdims: Literal[False] = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _SCT: + ... + +@overload +def prod(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: None | DTypeLike = ..., out: None = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def prod(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: None | DTypeLike = ..., out: _ArrayType = ..., keepdims: bool = ..., initial: _NumberLike_co = ..., where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def cumprod(a: _ArrayLikeBool_co, axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[int_]: + ... + +@overload +def cumprod(a: _ArrayLikeUInt_co, axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[uint64]: + ... + +@overload +def cumprod(a: _ArrayLikeInt_co, axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[int64]: + ... + +@overload +def cumprod(a: _ArrayLikeFloat_co, axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[floating[Any]]: + ... + +@overload +def cumprod(a: _ArrayLikeComplex_co, axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def cumprod(a: _ArrayLikeObject_co, axis: None | SupportsIndex = ..., dtype: None = ..., out: None = ...) -> NDArray[object_]: + ... + +@overload +def cumprod(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | SupportsIndex = ..., dtype: _DTypeLike[_SCT] = ..., out: None = ...) -> NDArray[_SCT]: + ... + +@overload +def cumprod(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: None = ...) -> NDArray[Any]: + ... + +@overload +def cumprod(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | SupportsIndex = ..., dtype: DTypeLike = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +def ndim(a: ArrayLike) -> int: + ... + +def size(a: ArrayLike, axis: None | int = ...) -> int: + ... + +@overload +def around(a: _BoolLike_co, decimals: SupportsIndex = ..., out: None = ...) -> float16: + ... + +@overload +def around(a: _SCT_uifcO, decimals: SupportsIndex = ..., out: None = ...) -> _SCT_uifcO: + ... + +@overload +def around(a: _ComplexLike_co | object_, decimals: SupportsIndex = ..., out: None = ...) -> Any: + ... + +@overload +def around(a: _ArrayLikeBool_co, decimals: SupportsIndex = ..., out: None = ...) -> NDArray[float16]: + ... + +@overload +def around(a: _ArrayLike[_SCT_uifcO], decimals: SupportsIndex = ..., out: None = ...) -> NDArray[_SCT_uifcO]: + ... + +@overload +def around(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, decimals: SupportsIndex = ..., out: None = ...) -> NDArray[Any]: + ... + +@overload +def around(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, decimals: SupportsIndex = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def mean(a: _ArrayLikeFloat_co, axis: None = ..., dtype: None = ..., out: None = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> floating[Any]: + ... + +@overload +def mean(a: _ArrayLikeComplex_co, axis: None = ..., dtype: None = ..., out: None = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> complexfloating[Any, Any]: + ... + +@overload +def mean(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: None = ..., out: None = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def mean(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None = ..., dtype: _DTypeLike[_SCT] = ..., out: None = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> _SCT: + ... + +@overload +def mean(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def mean(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _ArrayType = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def std(a: _ArrayLikeComplex_co, axis: None = ..., dtype: None = ..., out: None = ..., ddof: float = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> floating[Any]: + ... + +@overload +def std(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: None = ..., out: None = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def std(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None = ..., dtype: _DTypeLike[_SCT] = ..., out: None = ..., ddof: float = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> _SCT: + ... + +@overload +def std(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def std(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _ArrayType = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +@overload +def var(a: _ArrayLikeComplex_co, axis: None = ..., dtype: None = ..., out: None = ..., ddof: float = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> floating[Any]: + ... + +@overload +def var(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: None = ..., out: None = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def var(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None = ..., dtype: _DTypeLike[_SCT] = ..., out: None = ..., ddof: float = ..., keepdims: Literal[False] = ..., *, where: _ArrayLikeBool_co = ...) -> _SCT: + ... + +@overload +def var(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> Any: + ... + +@overload +def var(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _ArrayType = ..., ddof: float = ..., keepdims: bool = ..., *, where: _ArrayLikeBool_co = ...) -> _ArrayType: + ... + +max = ... +min = ... +round = ... diff --git a/typings/numpy/core/function_base.pyi b/typings/numpy/core/function_base.pyi new file mode 100644 index 0000000..32271f3 --- /dev/null +++ b/typings/numpy/core/function_base.pyi @@ -0,0 +1,77 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, Literal as L, SupportsIndex, TypeVar, overload +from numpy import complexfloating, floating, generic +from numpy._typing import DTypeLike, NDArray, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _DTypeLike + +_SCT = TypeVar("_SCT", bound=generic) +__all__: list[str] +@overload +def linspace(start: _ArrayLikeFloat_co, stop: _ArrayLikeFloat_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[False] = ..., dtype: None = ..., axis: SupportsIndex = ...) -> NDArray[floating[Any]]: + ... + +@overload +def linspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[False] = ..., dtype: None = ..., axis: SupportsIndex = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def linspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[False] = ..., dtype: _DTypeLike[_SCT] = ..., axis: SupportsIndex = ...) -> NDArray[_SCT]: + ... + +@overload +def linspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[False] = ..., dtype: DTypeLike = ..., axis: SupportsIndex = ...) -> NDArray[Any]: + ... + +@overload +def linspace(start: _ArrayLikeFloat_co, stop: _ArrayLikeFloat_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[True] = ..., dtype: None = ..., axis: SupportsIndex = ...) -> tuple[NDArray[floating[Any]], floating[Any]]: + ... + +@overload +def linspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[True] = ..., dtype: None = ..., axis: SupportsIndex = ...) -> tuple[NDArray[complexfloating[Any, Any]], complexfloating[Any, Any]]: + ... + +@overload +def linspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[True] = ..., dtype: _DTypeLike[_SCT] = ..., axis: SupportsIndex = ...) -> tuple[NDArray[_SCT], _SCT]: + ... + +@overload +def linspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., retstep: L[True] = ..., dtype: DTypeLike = ..., axis: SupportsIndex = ...) -> tuple[NDArray[Any], Any]: + ... + +@overload +def logspace(start: _ArrayLikeFloat_co, stop: _ArrayLikeFloat_co, num: SupportsIndex = ..., endpoint: bool = ..., base: _ArrayLikeFloat_co = ..., dtype: None = ..., axis: SupportsIndex = ...) -> NDArray[floating[Any]]: + ... + +@overload +def logspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., base: _ArrayLikeComplex_co = ..., dtype: None = ..., axis: SupportsIndex = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def logspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., base: _ArrayLikeComplex_co = ..., dtype: _DTypeLike[_SCT] = ..., axis: SupportsIndex = ...) -> NDArray[_SCT]: + ... + +@overload +def logspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., base: _ArrayLikeComplex_co = ..., dtype: DTypeLike = ..., axis: SupportsIndex = ...) -> NDArray[Any]: + ... + +@overload +def geomspace(start: _ArrayLikeFloat_co, stop: _ArrayLikeFloat_co, num: SupportsIndex = ..., endpoint: bool = ..., dtype: None = ..., axis: SupportsIndex = ...) -> NDArray[floating[Any]]: + ... + +@overload +def geomspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., dtype: None = ..., axis: SupportsIndex = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def geomspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., dtype: _DTypeLike[_SCT] = ..., axis: SupportsIndex = ...) -> NDArray[_SCT]: + ... + +@overload +def geomspace(start: _ArrayLikeComplex_co, stop: _ArrayLikeComplex_co, num: SupportsIndex = ..., endpoint: bool = ..., dtype: DTypeLike = ..., axis: SupportsIndex = ...) -> NDArray[Any]: + ... + +def add_newdoc(place: str, obj: str, doc: str | tuple[str, str] | list[tuple[str, str]], warn_on_python: bool = ...) -> None: + ... + diff --git a/typings/numpy/core/multiarray.pyi b/typings/numpy/core/multiarray.pyi new file mode 100644 index 0000000..4062936 --- /dev/null +++ b/typings/numpy/core/multiarray.pyi @@ -0,0 +1,521 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import datetime as dt +from collections.abc import Callable, Iterable, Sequence +from typing import Any, ClassVar, Final, Literal as L, Protocol, SupportsIndex, TypeVar, final, overload +from numpy import _CastingKind, _CopyMode, _IOProtocol, _ModeKind, _NDIterFlagsKind, _NDIterOpFlagsKind, _OrderCF, _OrderKACF, _SupportsBuffer, bool_, busdaycalendar as busdaycalendar, complexfloating, datetime64, dtype as dtype, float64, floating, generic, int_, intp, nditer as nditer, signedinteger, str_, timedelta64, ufunc, uint8, unsignedinteger +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLike, _ArrayLikeBool_co, _ArrayLikeBytes_co, _ArrayLikeComplex_co, _ArrayLikeDT64_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeStr_co, _ArrayLikeTD64_co, _ArrayLikeUInt_co, _DTypeLike, _FloatLike_co, _IntLike_co, _NestedSequence, _ScalarLike_co, _ShapeLike, _SupportsArrayFunc, _TD64Like_co + +_T_co = TypeVar("_T_co", covariant=True) +_T_contra = TypeVar("_T_contra", contravariant=True) +_SCT = TypeVar("_SCT", bound=generic) +_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) +_UnitKind = L["Y", "M", "D", "h", "m", "s", "ms", "us", "μs", "ns", "ps", "fs", "as",] +_RollKind = L["nat", "forward", "following", "backward", "preceding", "modifiedfollowing", "modifiedpreceding",] +class _SupportsLenAndGetItem(Protocol[_T_contra, _T_co]): + def __len__(self) -> int: + ... + + def __getitem__(self, key: _T_contra, /) -> _T_co: + ... + + + +__all__: list[str] +ALLOW_THREADS: Final[int] +BUFSIZE: L[8192] +CLIP: L[0] +WRAP: L[1] +RAISE: L[2] +MAXDIMS: L[32] +MAY_SHARE_BOUNDS: L[0] +MAY_SHARE_EXACT: L[-1] +tracemalloc_domain: L[389047] +@overload +def empty_like(prototype: _ArrayType, dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> _ArrayType: + ... + +@overload +def empty_like(prototype: _ArrayLike[_SCT], dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def empty_like(prototype: object, dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def empty_like(prototype: Any, dtype: _DTypeLike[_SCT], order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def empty_like(prototype: Any, dtype: DTypeLike, order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def array(object: _ArrayType, dtype: None = ..., *, copy: bool | _CopyMode = ..., order: _OrderKACF = ..., subok: L[True], ndmin: int = ..., like: None | _SupportsArrayFunc = ...) -> _ArrayType: + ... + +@overload +def array(object: _ArrayLike[_SCT], dtype: None = ..., *, copy: bool | _CopyMode = ..., order: _OrderKACF = ..., subok: bool = ..., ndmin: int = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def array(object: object, dtype: None = ..., *, copy: bool | _CopyMode = ..., order: _OrderKACF = ..., subok: bool = ..., ndmin: int = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def array(object: Any, dtype: _DTypeLike[_SCT], *, copy: bool | _CopyMode = ..., order: _OrderKACF = ..., subok: bool = ..., ndmin: int = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def array(object: Any, dtype: DTypeLike, *, copy: bool | _CopyMode = ..., order: _OrderKACF = ..., subok: bool = ..., ndmin: int = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def zeros(shape: _ShapeLike, dtype: None = ..., order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def zeros(shape: _ShapeLike, dtype: _DTypeLike[_SCT], order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def zeros(shape: _ShapeLike, dtype: DTypeLike, order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def empty(shape: _ShapeLike, dtype: None = ..., order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def empty(shape: _ShapeLike, dtype: _DTypeLike[_SCT], order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def empty(shape: _ShapeLike, dtype: DTypeLike, order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def unravel_index(indices: _IntLike_co, shape: _ShapeLike, order: _OrderCF = ...) -> tuple[intp, ...]: + ... + +@overload +def unravel_index(indices: _ArrayLikeInt_co, shape: _ShapeLike, order: _OrderCF = ...) -> tuple[NDArray[intp], ...]: + ... + +@overload +def ravel_multi_index(multi_index: Sequence[_IntLike_co], dims: Sequence[SupportsIndex], mode: _ModeKind | tuple[_ModeKind, ...] = ..., order: _OrderCF = ...) -> intp: + ... + +@overload +def ravel_multi_index(multi_index: Sequence[_ArrayLikeInt_co], dims: Sequence[SupportsIndex], mode: _ModeKind | tuple[_ModeKind, ...] = ..., order: _OrderCF = ...) -> NDArray[intp]: + ... + +@overload +def concatenate(arrays: _ArrayLike[_SCT], /, axis: None | SupportsIndex = ..., out: None = ..., *, dtype: None = ..., casting: None | _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def concatenate(arrays: _SupportsLenAndGetItem[int, ArrayLike], /, axis: None | SupportsIndex = ..., out: None = ..., *, dtype: None = ..., casting: None | _CastingKind = ...) -> NDArray[Any]: + ... + +@overload +def concatenate(arrays: _SupportsLenAndGetItem[int, ArrayLike], /, axis: None | SupportsIndex = ..., out: None = ..., *, dtype: _DTypeLike[_SCT], casting: None | _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def concatenate(arrays: _SupportsLenAndGetItem[int, ArrayLike], /, axis: None | SupportsIndex = ..., out: None = ..., *, dtype: DTypeLike, casting: None | _CastingKind = ...) -> NDArray[Any]: + ... + +@overload +def concatenate(arrays: _SupportsLenAndGetItem[int, ArrayLike], /, axis: None | SupportsIndex = ..., out: _ArrayType = ..., *, dtype: DTypeLike = ..., casting: None | _CastingKind = ...) -> _ArrayType: + ... + +def inner(a: ArrayLike, b: ArrayLike, /) -> Any: + ... + +@overload +def where(condition: ArrayLike, /) -> tuple[NDArray[intp], ...]: + ... + +@overload +def where(condition: ArrayLike, x: ArrayLike, y: ArrayLike, /) -> NDArray[Any]: + ... + +def lexsort(keys: ArrayLike, axis: None | SupportsIndex = ...) -> Any: + ... + +def can_cast(from_: ArrayLike | DTypeLike, to: DTypeLike, casting: None | _CastingKind = ...) -> bool: + ... + +def min_scalar_type(a: ArrayLike, /) -> dtype[Any]: + ... + +def result_type(*arrays_and_dtypes: ArrayLike | DTypeLike) -> dtype[Any]: + ... + +@overload +def dot(a: ArrayLike, b: ArrayLike, out: None = ...) -> Any: + ... + +@overload +def dot(a: ArrayLike, b: ArrayLike, out: _ArrayType) -> _ArrayType: + ... + +@overload +def vdot(a: _ArrayLikeBool_co, b: _ArrayLikeBool_co, /) -> bool_: + ... + +@overload +def vdot(a: _ArrayLikeUInt_co, b: _ArrayLikeUInt_co, /) -> unsignedinteger[Any]: + ... + +@overload +def vdot(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, /) -> signedinteger[Any]: + ... + +@overload +def vdot(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, /) -> floating[Any]: + ... + +@overload +def vdot(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, /) -> complexfloating[Any, Any]: + ... + +@overload +def vdot(a: _ArrayLikeTD64_co, b: _ArrayLikeTD64_co, /) -> timedelta64: + ... + +@overload +def vdot(a: _ArrayLikeObject_co, b: Any, /) -> Any: + ... + +@overload +def vdot(a: Any, b: _ArrayLikeObject_co, /) -> Any: + ... + +def bincount(x: ArrayLike, /, weights: None | ArrayLike = ..., minlength: SupportsIndex = ...) -> NDArray[intp]: + ... + +def copyto(dst: NDArray[Any], src: ArrayLike, casting: None | _CastingKind = ..., where: None | _ArrayLikeBool_co = ...) -> None: + ... + +def putmask(a: NDArray[Any], /, mask: _ArrayLikeBool_co, values: ArrayLike) -> None: + ... + +def packbits(a: _ArrayLikeInt_co, /, axis: None | SupportsIndex = ..., bitorder: L["big", "little"] = ...) -> NDArray[uint8]: + ... + +def unpackbits(a: _ArrayLike[uint8], /, axis: None | SupportsIndex = ..., count: None | SupportsIndex = ..., bitorder: L["big", "little"] = ...) -> NDArray[uint8]: + ... + +def shares_memory(a: object, b: object, /, max_work: None | int = ...) -> bool: + ... + +def may_share_memory(a: object, b: object, /, max_work: None | int = ...) -> bool: + ... + +@overload +def asarray(a: _ArrayLike[_SCT], dtype: None = ..., order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def asarray(a: object, dtype: None = ..., order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def asarray(a: Any, dtype: _DTypeLike[_SCT], order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def asarray(a: Any, dtype: DTypeLike, order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def asanyarray(a: _ArrayType, dtype: None = ..., order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> _ArrayType: + ... + +@overload +def asanyarray(a: _ArrayLike[_SCT], dtype: None = ..., order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def asanyarray(a: object, dtype: None = ..., order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def asanyarray(a: Any, dtype: _DTypeLike[_SCT], order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def asanyarray(a: Any, dtype: DTypeLike, order: _OrderKACF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def ascontiguousarray(a: _ArrayLike[_SCT], dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def ascontiguousarray(a: object, dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def ascontiguousarray(a: Any, dtype: _DTypeLike[_SCT], *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def ascontiguousarray(a: Any, dtype: DTypeLike, *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def asfortranarray(a: _ArrayLike[_SCT], dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def asfortranarray(a: object, dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def asfortranarray(a: Any, dtype: _DTypeLike[_SCT], *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def asfortranarray(a: Any, dtype: DTypeLike, *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +def geterrobj() -> list[Any]: + ... + +def seterrobj(errobj: list[Any], /) -> None: + ... + +def promote_types(__type1: DTypeLike, __type2: DTypeLike) -> dtype[Any]: + ... + +@overload +def fromstring(string: str | bytes, dtype: None = ..., count: SupportsIndex = ..., *, sep: str, like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def fromstring(string: str | bytes, dtype: _DTypeLike[_SCT], count: SupportsIndex = ..., *, sep: str, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def fromstring(string: str | bytes, dtype: DTypeLike, count: SupportsIndex = ..., *, sep: str, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +def frompyfunc(func: Callable[..., Any], /, nin: SupportsIndex, nout: SupportsIndex, *, identity: Any = ...) -> ufunc: + ... + +@overload +def fromfile(file: str | bytes | os.PathLike[Any] | _IOProtocol, dtype: None = ..., count: SupportsIndex = ..., sep: str = ..., offset: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def fromfile(file: str | bytes | os.PathLike[Any] | _IOProtocol, dtype: _DTypeLike[_SCT], count: SupportsIndex = ..., sep: str = ..., offset: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def fromfile(file: str | bytes | os.PathLike[Any] | _IOProtocol, dtype: DTypeLike, count: SupportsIndex = ..., sep: str = ..., offset: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def fromiter(iter: Iterable[Any], dtype: _DTypeLike[_SCT], count: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def fromiter(iter: Iterable[Any], dtype: DTypeLike, count: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def frombuffer(buffer: _SupportsBuffer, dtype: None = ..., count: SupportsIndex = ..., offset: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def frombuffer(buffer: _SupportsBuffer, dtype: _DTypeLike[_SCT], count: SupportsIndex = ..., offset: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def frombuffer(buffer: _SupportsBuffer, dtype: DTypeLike, count: SupportsIndex = ..., offset: SupportsIndex = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def arange(stop: _IntLike_co, /, *, dtype: None = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def arange(start: _IntLike_co, stop: _IntLike_co, step: _IntLike_co = ..., dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def arange(stop: _FloatLike_co, /, *, dtype: None = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[floating[Any]]: + ... + +@overload +def arange(start: _FloatLike_co, stop: _FloatLike_co, step: _FloatLike_co = ..., dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[floating[Any]]: + ... + +@overload +def arange(stop: _TD64Like_co, /, *, dtype: None = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[timedelta64]: + ... + +@overload +def arange(start: _TD64Like_co, stop: _TD64Like_co, step: _TD64Like_co = ..., dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[timedelta64]: + ... + +@overload +def arange(start: datetime64, stop: datetime64, step: datetime64 = ..., dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[datetime64]: + ... + +@overload +def arange(stop: Any, /, *, dtype: _DTypeLike[_SCT], like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def arange(start: Any, stop: Any, step: Any = ..., dtype: _DTypeLike[_SCT] = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def arange(stop: Any, /, *, dtype: DTypeLike, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def arange(start: Any, stop: Any, step: Any = ..., dtype: DTypeLike = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +def datetime_data(dtype: str | _DTypeLike[datetime64] | _DTypeLike[timedelta64], /) -> tuple[str, int]: + ... + +@overload +def busday_count(begindates: _ScalarLike_co | dt.date, enddates: _ScalarLike_co | dt.date, weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> int_: + ... + +@overload +def busday_count(begindates: ArrayLike | dt.date | _NestedSequence[dt.date], enddates: ArrayLike | dt.date | _NestedSequence[dt.date], weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> NDArray[int_]: + ... + +@overload +def busday_count(begindates: ArrayLike | dt.date | _NestedSequence[dt.date], enddates: ArrayLike | dt.date | _NestedSequence[dt.date], weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def busday_offset(dates: datetime64 | dt.date, offsets: _TD64Like_co | dt.timedelta, roll: L["raise"] = ..., weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> datetime64: + ... + +@overload +def busday_offset(dates: _ArrayLike[datetime64] | dt.date | _NestedSequence[dt.date], offsets: _ArrayLikeTD64_co | dt.timedelta | _NestedSequence[dt.timedelta], roll: L["raise"] = ..., weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> NDArray[datetime64]: + ... + +@overload +def busday_offset(dates: _ArrayLike[datetime64] | dt.date | _NestedSequence[dt.date], offsets: _ArrayLikeTD64_co | dt.timedelta | _NestedSequence[dt.timedelta], roll: L["raise"] = ..., weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def busday_offset(dates: _ScalarLike_co | dt.date, offsets: _ScalarLike_co | dt.timedelta, roll: _RollKind, weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> datetime64: + ... + +@overload +def busday_offset(dates: ArrayLike | dt.date | _NestedSequence[dt.date], offsets: ArrayLike | dt.timedelta | _NestedSequence[dt.timedelta], roll: _RollKind, weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> NDArray[datetime64]: + ... + +@overload +def busday_offset(dates: ArrayLike | dt.date | _NestedSequence[dt.date], offsets: ArrayLike | dt.timedelta | _NestedSequence[dt.timedelta], roll: _RollKind, weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def is_busday(dates: _ScalarLike_co | dt.date, weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> bool_: + ... + +@overload +def is_busday(dates: ArrayLike | _NestedSequence[dt.date], weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: None = ...) -> NDArray[bool_]: + ... + +@overload +def is_busday(dates: ArrayLike | _NestedSequence[dt.date], weekmask: ArrayLike = ..., holidays: None | ArrayLike | dt.date | _NestedSequence[dt.date] = ..., busdaycal: None | busdaycalendar = ..., out: _ArrayType = ...) -> _ArrayType: + ... + +@overload +def datetime_as_string(arr: datetime64 | dt.date, unit: None | L["auto"] | _UnitKind = ..., timezone: L["naive", "UTC", "local"] | dt.tzinfo = ..., casting: _CastingKind = ...) -> str_: + ... + +@overload +def datetime_as_string(arr: _ArrayLikeDT64_co | _NestedSequence[dt.date], unit: None | L["auto"] | _UnitKind = ..., timezone: L["naive", "UTC", "local"] | dt.tzinfo = ..., casting: _CastingKind = ...) -> NDArray[str_]: + ... + +@overload +def compare_chararrays(a1: _ArrayLikeStr_co, a2: _ArrayLikeStr_co, cmp: L["<", "<=", "==", ">=", ">", "!="], rstrip: bool) -> NDArray[bool_]: + ... + +@overload +def compare_chararrays(a1: _ArrayLikeBytes_co, a2: _ArrayLikeBytes_co, cmp: L["<", "<=", "==", ">=", ">", "!="], rstrip: bool) -> NDArray[bool_]: + ... + +def add_docstring(obj: Callable[..., Any], docstring: str, /) -> None: + ... + +_GetItemKeys = L["C", "CONTIGUOUS", "C_CONTIGUOUS", "F", "FORTRAN", "F_CONTIGUOUS", "W", "WRITEABLE", "B", "BEHAVED", "O", "OWNDATA", "A", "ALIGNED", "X", "WRITEBACKIFCOPY", "CA", "CARRAY", "FA", "FARRAY", "FNC", "FORC",] +_SetItemKeys = L["A", "ALIGNED", "W", "WRITEABLE", "X", "WRITEBACKIFCOPY",] +@final +class flagsobj: + __hash__: ClassVar[None] + aligned: bool + writeable: bool + writebackifcopy: bool + @property + def behaved(self) -> bool: + ... + + @property + def c_contiguous(self) -> bool: + ... + + @property + def carray(self) -> bool: + ... + + @property + def contiguous(self) -> bool: + ... + + @property + def f_contiguous(self) -> bool: + ... + + @property + def farray(self) -> bool: + ... + + @property + def fnc(self) -> bool: + ... + + @property + def forc(self) -> bool: + ... + + @property + def fortran(self) -> bool: + ... + + @property + def num(self) -> int: + ... + + @property + def owndata(self) -> bool: + ... + + def __getitem__(self, key: _GetItemKeys) -> bool: + ... + + def __setitem__(self, key: _SetItemKeys, value: bool) -> None: + ... + + + +def nested_iters(op: ArrayLike | Sequence[ArrayLike], axes: Sequence[Sequence[SupportsIndex]], flags: None | Sequence[_NDIterFlagsKind] = ..., op_flags: None | Sequence[Sequence[_NDIterOpFlagsKind]] = ..., op_dtypes: DTypeLike | Sequence[DTypeLike] = ..., order: _OrderKACF = ..., casting: _CastingKind = ..., buffersize: SupportsIndex = ...) -> tuple[nditer, ...]: + ... + diff --git a/typings/numpy/core/numeric.pyi b/typings/numpy/core/numeric.pyi new file mode 100644 index 0000000..236c93d --- /dev/null +++ b/typings/numpy/core/numeric.pyi @@ -0,0 +1,359 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable, Sequence +from typing import Any, Literal, NoReturn, SupportsAbs, SupportsIndex, TypeGuard, TypeVar, overload +from typing_extensions import TypeGuard +from numpy import _OrderCF, _OrderKACF, bool_, complexfloating, float64, floating, generic, int_, intp, object_, signedinteger, timedelta64, unsignedinteger +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLike, _ArrayLikeBool_co, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeTD64_co, _ArrayLikeUInt_co, _ArrayLikeUnknown, _DTypeLike, _ScalarLike_co, _ShapeLike, _SupportsArrayFunc + +if sys.version_info >= (3, 10): + ... +else: + ... +_T = TypeVar("_T") +_SCT = TypeVar("_SCT", bound=generic) +_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) +_CorrelateMode = Literal["valid", "same", "full"] +__all__: list[str] +@overload +def zeros_like(a: _ArrayType, dtype: None = ..., order: _OrderKACF = ..., subok: Literal[True] = ..., shape: None = ...) -> _ArrayType: + ... + +@overload +def zeros_like(a: _ArrayLike[_SCT], dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def zeros_like(a: object, dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def zeros_like(a: Any, dtype: _DTypeLike[_SCT], order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def zeros_like(a: Any, dtype: DTypeLike, order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def ones(shape: _ShapeLike, dtype: None = ..., order: _OrderCF = ..., *, like: _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def ones(shape: _ShapeLike, dtype: _DTypeLike[_SCT], order: _OrderCF = ..., *, like: _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def ones(shape: _ShapeLike, dtype: DTypeLike, order: _OrderCF = ..., *, like: _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def ones_like(a: _ArrayType, dtype: None = ..., order: _OrderKACF = ..., subok: Literal[True] = ..., shape: None = ...) -> _ArrayType: + ... + +@overload +def ones_like(a: _ArrayLike[_SCT], dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def ones_like(a: object, dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def ones_like(a: Any, dtype: _DTypeLike[_SCT], order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def ones_like(a: Any, dtype: DTypeLike, order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def full(shape: _ShapeLike, fill_value: Any, dtype: None = ..., order: _OrderCF = ..., *, like: _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def full(shape: _ShapeLike, fill_value: Any, dtype: _DTypeLike[_SCT], order: _OrderCF = ..., *, like: _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def full(shape: _ShapeLike, fill_value: Any, dtype: DTypeLike, order: _OrderCF = ..., *, like: _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def full_like(a: _ArrayType, fill_value: Any, dtype: None = ..., order: _OrderKACF = ..., subok: Literal[True] = ..., shape: None = ...) -> _ArrayType: + ... + +@overload +def full_like(a: _ArrayLike[_SCT], fill_value: Any, dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def full_like(a: object, fill_value: Any, dtype: None = ..., order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def full_like(a: Any, fill_value: Any, dtype: _DTypeLike[_SCT], order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def full_like(a: Any, fill_value: Any, dtype: DTypeLike, order: _OrderKACF = ..., subok: bool = ..., shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def count_nonzero(a: ArrayLike, axis: None = ..., *, keepdims: Literal[False] = ...) -> int: + ... + +@overload +def count_nonzero(a: ArrayLike, axis: _ShapeLike = ..., *, keepdims: bool = ...) -> Any: + ... + +def isfortran(a: NDArray[Any] | generic) -> bool: + ... + +def argwhere(a: ArrayLike) -> NDArray[intp]: + ... + +def flatnonzero(a: ArrayLike) -> NDArray[intp]: + ... + +@overload +def correlate(a: _ArrayLikeUnknown, v: _ArrayLikeUnknown, mode: _CorrelateMode = ...) -> NDArray[Any]: + ... + +@overload +def correlate(a: _ArrayLikeBool_co, v: _ArrayLikeBool_co, mode: _CorrelateMode = ...) -> NDArray[bool_]: + ... + +@overload +def correlate(a: _ArrayLikeUInt_co, v: _ArrayLikeUInt_co, mode: _CorrelateMode = ...) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def correlate(a: _ArrayLikeInt_co, v: _ArrayLikeInt_co, mode: _CorrelateMode = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def correlate(a: _ArrayLikeFloat_co, v: _ArrayLikeFloat_co, mode: _CorrelateMode = ...) -> NDArray[floating[Any]]: + ... + +@overload +def correlate(a: _ArrayLikeComplex_co, v: _ArrayLikeComplex_co, mode: _CorrelateMode = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def correlate(a: _ArrayLikeTD64_co, v: _ArrayLikeTD64_co, mode: _CorrelateMode = ...) -> NDArray[timedelta64]: + ... + +@overload +def correlate(a: _ArrayLikeObject_co, v: _ArrayLikeObject_co, mode: _CorrelateMode = ...) -> NDArray[object_]: + ... + +@overload +def convolve(a: _ArrayLikeUnknown, v: _ArrayLikeUnknown, mode: _CorrelateMode = ...) -> NDArray[Any]: + ... + +@overload +def convolve(a: _ArrayLikeBool_co, v: _ArrayLikeBool_co, mode: _CorrelateMode = ...) -> NDArray[bool_]: + ... + +@overload +def convolve(a: _ArrayLikeUInt_co, v: _ArrayLikeUInt_co, mode: _CorrelateMode = ...) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def convolve(a: _ArrayLikeInt_co, v: _ArrayLikeInt_co, mode: _CorrelateMode = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def convolve(a: _ArrayLikeFloat_co, v: _ArrayLikeFloat_co, mode: _CorrelateMode = ...) -> NDArray[floating[Any]]: + ... + +@overload +def convolve(a: _ArrayLikeComplex_co, v: _ArrayLikeComplex_co, mode: _CorrelateMode = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def convolve(a: _ArrayLikeTD64_co, v: _ArrayLikeTD64_co, mode: _CorrelateMode = ...) -> NDArray[timedelta64]: + ... + +@overload +def convolve(a: _ArrayLikeObject_co, v: _ArrayLikeObject_co, mode: _CorrelateMode = ...) -> NDArray[object_]: + ... + +@overload +def outer(a: _ArrayLikeUnknown, b: _ArrayLikeUnknown, out: None = ...) -> NDArray[Any]: + ... + +@overload +def outer(a: _ArrayLikeBool_co, b: _ArrayLikeBool_co, out: None = ...) -> NDArray[bool_]: + ... + +@overload +def outer(a: _ArrayLikeUInt_co, b: _ArrayLikeUInt_co, out: None = ...) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def outer(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, out: None = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def outer(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, out: None = ...) -> NDArray[floating[Any]]: + ... + +@overload +def outer(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, out: None = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def outer(a: _ArrayLikeTD64_co, b: _ArrayLikeTD64_co, out: None = ...) -> NDArray[timedelta64]: + ... + +@overload +def outer(a: _ArrayLikeObject_co, b: _ArrayLikeObject_co, out: None = ...) -> NDArray[object_]: + ... + +@overload +def outer(a: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co, b: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co, out: _ArrayType) -> _ArrayType: + ... + +@overload +def tensordot(a: _ArrayLikeUnknown, b: _ArrayLikeUnknown, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[Any]: + ... + +@overload +def tensordot(a: _ArrayLikeBool_co, b: _ArrayLikeBool_co, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[bool_]: + ... + +@overload +def tensordot(a: _ArrayLikeUInt_co, b: _ArrayLikeUInt_co, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def tensordot(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def tensordot(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[floating[Any]]: + ... + +@overload +def tensordot(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def tensordot(a: _ArrayLikeTD64_co, b: _ArrayLikeTD64_co, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[timedelta64]: + ... + +@overload +def tensordot(a: _ArrayLikeObject_co, b: _ArrayLikeObject_co, axes: int | tuple[_ShapeLike, _ShapeLike] = ...) -> NDArray[object_]: + ... + +@overload +def roll(a: _ArrayLike[_SCT], shift: _ShapeLike, axis: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def roll(a: ArrayLike, shift: _ShapeLike, axis: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +def rollaxis(a: NDArray[_SCT], axis: int, start: int = ...) -> NDArray[_SCT]: + ... + +def moveaxis(a: NDArray[_SCT], source: _ShapeLike, destination: _ShapeLike) -> NDArray[_SCT]: + ... + +@overload +def cross(a: _ArrayLikeUnknown, b: _ArrayLikeUnknown, axisa: int = ..., axisb: int = ..., axisc: int = ..., axis: None | int = ...) -> NDArray[Any]: + ... + +@overload +def cross(a: _ArrayLikeBool_co, b: _ArrayLikeBool_co, axisa: int = ..., axisb: int = ..., axisc: int = ..., axis: None | int = ...) -> NoReturn: + ... + +@overload +def cross(a: _ArrayLikeUInt_co, b: _ArrayLikeUInt_co, axisa: int = ..., axisb: int = ..., axisc: int = ..., axis: None | int = ...) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def cross(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, axisa: int = ..., axisb: int = ..., axisc: int = ..., axis: None | int = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def cross(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, axisa: int = ..., axisb: int = ..., axisc: int = ..., axis: None | int = ...) -> NDArray[floating[Any]]: + ... + +@overload +def cross(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, axisa: int = ..., axisb: int = ..., axisc: int = ..., axis: None | int = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def cross(a: _ArrayLikeObject_co, b: _ArrayLikeObject_co, axisa: int = ..., axisb: int = ..., axisc: int = ..., axis: None | int = ...) -> NDArray[object_]: + ... + +@overload +def indices(dimensions: Sequence[int], dtype: type[int] = ..., sparse: Literal[False] = ...) -> NDArray[int_]: + ... + +@overload +def indices(dimensions: Sequence[int], dtype: type[int] = ..., sparse: Literal[True] = ...) -> tuple[NDArray[int_], ...]: + ... + +@overload +def indices(dimensions: Sequence[int], dtype: _DTypeLike[_SCT], sparse: Literal[False] = ...) -> NDArray[_SCT]: + ... + +@overload +def indices(dimensions: Sequence[int], dtype: _DTypeLike[_SCT], sparse: Literal[True]) -> tuple[NDArray[_SCT], ...]: + ... + +@overload +def indices(dimensions: Sequence[int], dtype: DTypeLike, sparse: Literal[False] = ...) -> NDArray[Any]: + ... + +@overload +def indices(dimensions: Sequence[int], dtype: DTypeLike, sparse: Literal[True]) -> tuple[NDArray[Any], ...]: + ... + +def fromfunction(function: Callable[..., _T], shape: Sequence[int], *, dtype: DTypeLike = ..., like: _SupportsArrayFunc = ..., **kwargs: Any) -> _T: + ... + +def isscalar(element: object) -> TypeGuard[generic | bool | int | float | complex | str | bytes | memoryview]: + ... + +def binary_repr(num: SupportsIndex, width: None | int = ...) -> str: + ... + +def base_repr(number: SupportsAbs[float], base: float = ..., padding: SupportsIndex = ...) -> str: + ... + +@overload +def identity(n: int, dtype: None = ..., *, like: _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def identity(n: int, dtype: _DTypeLike[_SCT], *, like: _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def identity(n: int, dtype: DTypeLike, *, like: _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +def allclose(a: ArrayLike, b: ArrayLike, rtol: float = ..., atol: float = ..., equal_nan: bool = ...) -> bool: + ... + +@overload +def isclose(a: _ScalarLike_co, b: _ScalarLike_co, rtol: float = ..., atol: float = ..., equal_nan: bool = ...) -> bool_: + ... + +@overload +def isclose(a: ArrayLike, b: ArrayLike, rtol: float = ..., atol: float = ..., equal_nan: bool = ...) -> NDArray[bool_]: + ... + +def array_equal(a1: ArrayLike, a2: ArrayLike, equal_nan: bool = ...) -> bool: + ... + +def array_equiv(a1: ArrayLike, a2: ArrayLike) -> bool: + ... + diff --git a/typings/numpy/core/numerictypes.pyi b/typings/numpy/core/numerictypes.pyi new file mode 100644 index 0000000..08a9157 --- /dev/null +++ b/typings/numpy/core/numerictypes.pyi @@ -0,0 +1,103 @@ +""" +This type stub file was generated by pyright. +""" + +import sys +import types +from typing import Any, Literal as L, Protocol, TypeVar, TypedDict, Union, overload +from numpy import bool_, byte, bytes_, cdouble, clongdouble, csingle, datetime64, double, dtype, generic, half, int_, intc, longdouble, longlong, ndarray, object_, short, single, str_, timedelta64, ubyte, uint, uintc, ulonglong, ushort, void +from numpy._typing import ArrayLike, DTypeLike, _DTypeLike + +_T = TypeVar("_T") +_SCT = TypeVar("_SCT", bound=generic) +class _CastFunc(Protocol): + def __call__(self, x: ArrayLike, k: DTypeLike = ...) -> ndarray[Any, dtype[Any]]: + ... + + + +class _TypeCodes(TypedDict): + Character: L['c'] + Integer: L['bhilqp'] + UnsignedInteger: L['BHILQP'] + Float: L['efdg'] + Complex: L['FDG'] + AllInteger: L['bBhHiIlLqQpP'] + AllFloat: L['efdgFDG'] + Datetime: L['Mm'] + All: L['?bhilqpBHILQPefdgFDGSUVOMm'] + ... + + +class _typedict(dict[type[generic], _T]): + def __getitem__(self, key: DTypeLike) -> _T: + ... + + + +if sys.version_info >= (3, 10): + _TypeTuple = Union[type[Any], types.UnionType, tuple[Union[type[Any], types.UnionType, tuple[Any, ...]], ...],] +else: + ... +__all__: list[str] +@overload +def maximum_sctype(t: _DTypeLike[_SCT]) -> type[_SCT]: + ... + +@overload +def maximum_sctype(t: DTypeLike) -> type[Any]: + ... + +@overload +def issctype(rep: dtype[Any] | type[Any]) -> bool: + ... + +@overload +def issctype(rep: object) -> L[False]: + ... + +@overload +def obj2sctype(rep: _DTypeLike[_SCT], default: None = ...) -> None | type[_SCT]: + ... + +@overload +def obj2sctype(rep: _DTypeLike[_SCT], default: _T) -> _T | type[_SCT]: + ... + +@overload +def obj2sctype(rep: DTypeLike, default: None = ...) -> None | type[Any]: + ... + +@overload +def obj2sctype(rep: DTypeLike, default: _T) -> _T | type[Any]: + ... + +@overload +def obj2sctype(rep: object, default: None = ...) -> None: + ... + +@overload +def obj2sctype(rep: object, default: _T) -> _T: + ... + +@overload +def issubclass_(arg1: type[Any], arg2: _TypeTuple) -> bool: + ... + +@overload +def issubclass_(arg1: object, arg2: object) -> L[False]: + ... + +def issubsctype(arg1: DTypeLike, arg2: DTypeLike) -> bool: + ... + +def issubdtype(arg1: DTypeLike, arg2: DTypeLike) -> bool: + ... + +def sctype2char(sctype: DTypeLike) -> str: + ... + +cast: _typedict[_CastFunc] +nbytes: _typedict[int] +typecodes: _TypeCodes +ScalarType: tuple[type[int], type[float], type[complex], type[bool], type[bytes], type[str], type[memoryview], type[bool_], type[csingle], type[cdouble], type[clongdouble], type[half], type[single], type[double], type[longdouble], type[byte], type[short], type[intc], type[int_], type[longlong], type[timedelta64], type[datetime64], type[object_], type[bytes_], type[str_], type[ubyte], type[ushort], type[uintc], type[uint], type[ulonglong], type[void],] diff --git a/typings/numpy/core/records.pyi b/typings/numpy/core/records.pyi new file mode 100644 index 0000000..64cd7ff --- /dev/null +++ b/typings/numpy/core/records.pyi @@ -0,0 +1,85 @@ +""" +This type stub file was generated by pyright. +""" + +import os +from collections.abc import Iterable, Sequence +from typing import Any, Protocol, TypeVar, overload +from numpy import _ByteOrder, _SupportsBuffer, dtype, generic, recarray as recarray, record as record +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLikeVoid_co, _NestedSequence, _ShapeLike + +_SCT = TypeVar("_SCT", bound=generic) +_RecArray = recarray[Any, dtype[_SCT]] +class _SupportsReadInto(Protocol): + def seek(self, offset: int, whence: int, /) -> object: + ... + + def tell(self, /) -> int: + ... + + def readinto(self, buffer: memoryview, /) -> int: + ... + + + +__all__: list[str] +@overload +def fromarrays(arrayList: Iterable[ArrayLike], dtype: DTypeLike = ..., shape: None | _ShapeLike = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ...) -> _RecArray[Any]: + ... + +@overload +def fromarrays(arrayList: Iterable[ArrayLike], dtype: None = ..., shape: None | _ShapeLike = ..., *, formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., aligned: bool = ..., byteorder: None | _ByteOrder = ...) -> _RecArray[record]: + ... + +@overload +def fromrecords(recList: _ArrayLikeVoid_co | tuple[Any, ...] | _NestedSequence[tuple[Any, ...]], dtype: DTypeLike = ..., shape: None | _ShapeLike = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ...) -> _RecArray[record]: + ... + +@overload +def fromrecords(recList: _ArrayLikeVoid_co | tuple[Any, ...] | _NestedSequence[tuple[Any, ...]], dtype: None = ..., shape: None | _ShapeLike = ..., *, formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., aligned: bool = ..., byteorder: None | _ByteOrder = ...) -> _RecArray[record]: + ... + +@overload +def fromstring(datastring: _SupportsBuffer, dtype: DTypeLike, shape: None | _ShapeLike = ..., offset: int = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ...) -> _RecArray[record]: + ... + +@overload +def fromstring(datastring: _SupportsBuffer, dtype: None = ..., shape: None | _ShapeLike = ..., offset: int = ..., *, formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., aligned: bool = ..., byteorder: None | _ByteOrder = ...) -> _RecArray[record]: + ... + +@overload +def fromfile(fd: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _SupportsReadInto, dtype: DTypeLike, shape: None | _ShapeLike = ..., offset: int = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ...) -> _RecArray[Any]: + ... + +@overload +def fromfile(fd: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _SupportsReadInto, dtype: None = ..., shape: None | _ShapeLike = ..., offset: int = ..., *, formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., aligned: bool = ..., byteorder: None | _ByteOrder = ...) -> _RecArray[record]: + ... + +@overload +def array(obj: _SCT | NDArray[_SCT], dtype: None = ..., shape: None | _ShapeLike = ..., offset: int = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ..., copy: bool = ...) -> _RecArray[_SCT]: + ... + +@overload +def array(obj: ArrayLike, dtype: DTypeLike, shape: None | _ShapeLike = ..., offset: int = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ..., copy: bool = ...) -> _RecArray[Any]: + ... + +@overload +def array(obj: ArrayLike, dtype: None = ..., shape: None | _ShapeLike = ..., offset: int = ..., *, formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., aligned: bool = ..., byteorder: None | _ByteOrder = ..., copy: bool = ...) -> _RecArray[record]: + ... + +@overload +def array(obj: None, dtype: DTypeLike, shape: _ShapeLike, offset: int = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ..., copy: bool = ...) -> _RecArray[Any]: + ... + +@overload +def array(obj: None, dtype: None = ..., *, shape: _ShapeLike, offset: int = ..., formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., aligned: bool = ..., byteorder: None | _ByteOrder = ..., copy: bool = ...) -> _RecArray[record]: + ... + +@overload +def array(obj: _SupportsReadInto, dtype: DTypeLike, shape: None | _ShapeLike = ..., offset: int = ..., formats: None = ..., names: None = ..., titles: None = ..., aligned: bool = ..., byteorder: None = ..., copy: bool = ...) -> _RecArray[Any]: + ... + +@overload +def array(obj: _SupportsReadInto, dtype: None = ..., shape: None | _ShapeLike = ..., offset: int = ..., *, formats: DTypeLike, names: None | str | Sequence[str] = ..., titles: None | str | Sequence[str] = ..., aligned: bool = ..., byteorder: None | _ByteOrder = ..., copy: bool = ...) -> _RecArray[record]: + ... + diff --git a/typings/numpy/core/shape_base.pyi b/typings/numpy/core/shape_base.pyi new file mode 100644 index 0000000..ae975fd --- /dev/null +++ b/typings/numpy/core/shape_base.pyi @@ -0,0 +1,96 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Sequence +from typing import Any, SupportsIndex, TypeVar, overload +from numpy import _CastingKind, generic +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLike, _DTypeLike + +_SCT = TypeVar("_SCT", bound=generic) +_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) +__all__: list[str] +@overload +def atleast_1d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: + ... + +@overload +def atleast_1d(arys: ArrayLike, /) -> NDArray[Any]: + ... + +@overload +def atleast_1d(*arys: ArrayLike) -> list[NDArray[Any]]: + ... + +@overload +def atleast_2d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: + ... + +@overload +def atleast_2d(arys: ArrayLike, /) -> NDArray[Any]: + ... + +@overload +def atleast_2d(*arys: ArrayLike) -> list[NDArray[Any]]: + ... + +@overload +def atleast_3d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: + ... + +@overload +def atleast_3d(arys: ArrayLike, /) -> NDArray[Any]: + ... + +@overload +def atleast_3d(*arys: ArrayLike) -> list[NDArray[Any]]: + ... + +@overload +def vstack(tup: Sequence[_ArrayLike[_SCT]], *, dtype: None = ..., casting: _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def vstack(tup: Sequence[ArrayLike], *, dtype: _DTypeLike[_SCT], casting: _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def vstack(tup: Sequence[ArrayLike], *, dtype: DTypeLike = ..., casting: _CastingKind = ...) -> NDArray[Any]: + ... + +@overload +def hstack(tup: Sequence[_ArrayLike[_SCT]], *, dtype: None = ..., casting: _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def hstack(tup: Sequence[ArrayLike], *, dtype: _DTypeLike[_SCT], casting: _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def hstack(tup: Sequence[ArrayLike], *, dtype: DTypeLike = ..., casting: _CastingKind = ...) -> NDArray[Any]: + ... + +@overload +def stack(arrays: Sequence[_ArrayLike[_SCT]], axis: SupportsIndex = ..., out: None = ..., *, dtype: None = ..., casting: _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def stack(arrays: Sequence[ArrayLike], axis: SupportsIndex = ..., out: None = ..., *, dtype: _DTypeLike[_SCT], casting: _CastingKind = ...) -> NDArray[_SCT]: + ... + +@overload +def stack(arrays: Sequence[ArrayLike], axis: SupportsIndex = ..., out: None = ..., *, dtype: DTypeLike = ..., casting: _CastingKind = ...) -> NDArray[Any]: + ... + +@overload +def stack(arrays: Sequence[ArrayLike], axis: SupportsIndex = ..., out: _ArrayType = ..., *, dtype: DTypeLike = ..., casting: _CastingKind = ...) -> _ArrayType: + ... + +@overload +def block(arrays: _ArrayLike[_SCT]) -> NDArray[_SCT]: + ... + +@overload +def block(arrays: ArrayLike) -> NDArray[Any]: + ... + diff --git a/typings/numpy/core/umath.pyi b/typings/numpy/core/umath.pyi new file mode 100644 index 0000000..986489b --- /dev/null +++ b/typings/numpy/core/umath.pyi @@ -0,0 +1,14 @@ +""" +This type stub file was generated by pyright. +""" + +from ._multiarray_umath import * + +""" +Create the numpy.core.umath namespace for backward compatibility. In v1.16 +the multiarray and umath c-extension modules were merged into a single +_multiarray_umath extension module. So we replicate the old namespace +by importing from the extension module. + +""" +__all__ = ['_UFUNC_API', 'ERR_CALL', 'ERR_DEFAULT', 'ERR_IGNORE', 'ERR_LOG', 'ERR_PRINT', 'ERR_RAISE', 'ERR_WARN', 'FLOATING_POINT_SUPPORT', 'FPE_DIVIDEBYZERO', 'FPE_INVALID', 'FPE_OVERFLOW', 'FPE_UNDERFLOW', 'NAN', 'NINF', 'NZERO', 'PINF', 'PZERO', 'SHIFT_DIVIDEBYZERO', 'SHIFT_INVALID', 'SHIFT_OVERFLOW', 'SHIFT_UNDERFLOW', 'UFUNC_BUFSIZE_DEFAULT', 'UFUNC_PYVALS_NAME', '_add_newdoc_ufunc', 'absolute', 'add', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctan2', 'arctanh', 'bitwise_and', 'bitwise_or', 'bitwise_xor', 'cbrt', 'ceil', 'conj', 'conjugate', 'copysign', 'cos', 'cosh', 'deg2rad', 'degrees', 'divide', 'divmod', 'e', 'equal', 'euler_gamma', 'exp', 'exp2', 'expm1', 'fabs', 'floor', 'floor_divide', 'float_power', 'fmax', 'fmin', 'fmod', 'frexp', 'frompyfunc', 'gcd', 'geterrobj', 'greater', 'greater_equal', 'heaviside', 'hypot', 'invert', 'isfinite', 'isinf', 'isnan', 'isnat', 'lcm', 'ldexp', 'left_shift', 'less', 'less_equal', 'log', 'log10', 'log1p', 'log2', 'logaddexp', 'logaddexp2', 'logical_and', 'logical_not', 'logical_or', 'logical_xor', 'maximum', 'minimum', 'mod', 'modf', 'multiply', 'negative', 'nextafter', 'not_equal', 'pi', 'positive', 'power', 'rad2deg', 'radians', 'reciprocal', 'remainder', 'right_shift', 'rint', 'seterrobj', 'sign', 'signbit', 'sin', 'sinh', 'spacing', 'sqrt', 'square', 'subtract', 'tan', 'tanh', 'true_divide', 'trunc'] diff --git a/typings/numpy/ctypeslib.pyi b/typings/numpy/ctypeslib.pyi new file mode 100644 index 0000000..9408707 --- /dev/null +++ b/typings/numpy/ctypeslib.pyi @@ -0,0 +1,265 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import ctypes +from ctypes import c_int64 as _c_intp +from collections.abc import Iterable, Sequence +from typing import Any, ClassVar, Generic, Literal as L, TypeVar, overload +from numpy import bool_, byte, double, dtype, generic, int_, intc, longdouble, longlong, ndarray, short, single, ubyte, uint, uintc, ulonglong, ushort, void +from numpy.core._internal import _ctypes +from numpy.core.multiarray import flagsobj +from numpy._typing import DTypeLike, NDArray, _ArrayLike, _BoolCodes, _ByteCodes, _DTypeLike, _DoubleCodes, _IntCCodes, _IntCodes, _LongDoubleCodes, _LongLongCodes, _ShapeLike, _ShortCodes, _SingleCodes, _UByteCodes, _UIntCCodes, _UIntCodes, _ULongLongCodes, _UShortCodes, _VoidDTypeLike + +_DType = TypeVar("_DType", bound=dtype[Any]) +_DTypeOptional = TypeVar("_DTypeOptional", bound=None | dtype[Any]) +_SCT = TypeVar("_SCT", bound=generic) +_FlagsKind = L['C_CONTIGUOUS', 'CONTIGUOUS', 'C', 'F_CONTIGUOUS', 'FORTRAN', 'F', 'ALIGNED', 'A', 'WRITEABLE', 'W', 'OWNDATA', 'O', 'WRITEBACKIFCOPY', 'X',] +class _ndptr(ctypes.c_void_p, Generic[_DTypeOptional]): + _dtype_: ClassVar[_DTypeOptional] + _shape_: ClassVar[None] + _ndim_: ClassVar[None | int] + _flags_: ClassVar[None | list[_FlagsKind]] + @overload + @classmethod + def from_param(cls: type[_ndptr[None]], obj: ndarray[Any, Any]) -> _ctypes[Any]: + ... + + @overload + @classmethod + def from_param(cls: type[_ndptr[_DType]], obj: ndarray[Any, _DType]) -> _ctypes[Any]: + ... + + + +class _concrete_ndptr(_ndptr[_DType]): + _dtype_: ClassVar[_DType] + _shape_: ClassVar[tuple[int, ...]] + @property + def contents(self) -> ndarray[Any, _DType]: + ... + + + +def load_library(libname: str | bytes | os.PathLike[str] | os.PathLike[bytes], loader_path: str | bytes | os.PathLike[str] | os.PathLike[bytes]) -> ctypes.CDLL: + ... + +__all__: list[str] +c_intp = _c_intp +@overload +def ndpointer(dtype: None = ..., ndim: int = ..., shape: None | _ShapeLike = ..., flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...) -> type[_ndptr[None]]: + ... + +@overload +def ndpointer(dtype: _DTypeLike[_SCT], ndim: int = ..., *, shape: _ShapeLike, flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...) -> type[_concrete_ndptr[dtype[_SCT]]]: + ... + +@overload +def ndpointer(dtype: DTypeLike, ndim: int = ..., *, shape: _ShapeLike, flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...) -> type[_concrete_ndptr[dtype[Any]]]: + ... + +@overload +def ndpointer(dtype: _DTypeLike[_SCT], ndim: int = ..., shape: None = ..., flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...) -> type[_ndptr[dtype[_SCT]]]: + ... + +@overload +def ndpointer(dtype: DTypeLike, ndim: int = ..., shape: None = ..., flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...) -> type[_ndptr[dtype[Any]]]: + ... + +@overload +def as_ctypes_type(dtype: _BoolCodes | _DTypeLike[bool_] | type[ctypes.c_bool]) -> type[ctypes.c_bool]: + ... + +@overload +def as_ctypes_type(dtype: _ByteCodes | _DTypeLike[byte] | type[ctypes.c_byte]) -> type[ctypes.c_byte]: + ... + +@overload +def as_ctypes_type(dtype: _ShortCodes | _DTypeLike[short] | type[ctypes.c_short]) -> type[ctypes.c_short]: + ... + +@overload +def as_ctypes_type(dtype: _IntCCodes | _DTypeLike[intc] | type[ctypes.c_int]) -> type[ctypes.c_int]: + ... + +@overload +def as_ctypes_type(dtype: _IntCodes | _DTypeLike[int_] | type[int | ctypes.c_long]) -> type[ctypes.c_long]: + ... + +@overload +def as_ctypes_type(dtype: _LongLongCodes | _DTypeLike[longlong] | type[ctypes.c_longlong]) -> type[ctypes.c_longlong]: + ... + +@overload +def as_ctypes_type(dtype: _UByteCodes | _DTypeLike[ubyte] | type[ctypes.c_ubyte]) -> type[ctypes.c_ubyte]: + ... + +@overload +def as_ctypes_type(dtype: _UShortCodes | _DTypeLike[ushort] | type[ctypes.c_ushort]) -> type[ctypes.c_ushort]: + ... + +@overload +def as_ctypes_type(dtype: _UIntCCodes | _DTypeLike[uintc] | type[ctypes.c_uint]) -> type[ctypes.c_uint]: + ... + +@overload +def as_ctypes_type(dtype: _UIntCodes | _DTypeLike[uint] | type[ctypes.c_ulong]) -> type[ctypes.c_ulong]: + ... + +@overload +def as_ctypes_type(dtype: _ULongLongCodes | _DTypeLike[ulonglong] | type[ctypes.c_ulonglong]) -> type[ctypes.c_ulonglong]: + ... + +@overload +def as_ctypes_type(dtype: _SingleCodes | _DTypeLike[single] | type[ctypes.c_float]) -> type[ctypes.c_float]: + ... + +@overload +def as_ctypes_type(dtype: _DoubleCodes | _DTypeLike[double] | type[float | ctypes.c_double]) -> type[ctypes.c_double]: + ... + +@overload +def as_ctypes_type(dtype: _LongDoubleCodes | _DTypeLike[longdouble] | type[ctypes.c_longdouble]) -> type[ctypes.c_longdouble]: + ... + +@overload +def as_ctypes_type(dtype: _VoidDTypeLike) -> type[Any]: + ... + +@overload +def as_ctypes_type(dtype: str) -> type[Any]: + ... + +@overload +def as_array(obj: ctypes._PointerLike, shape: Sequence[int]) -> NDArray[Any]: + ... + +@overload +def as_array(obj: _ArrayLike[_SCT], shape: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def as_array(obj: object, shape: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def as_ctypes(obj: bool_) -> ctypes.c_bool: + ... + +@overload +def as_ctypes(obj: byte) -> ctypes.c_byte: + ... + +@overload +def as_ctypes(obj: short) -> ctypes.c_short: + ... + +@overload +def as_ctypes(obj: intc) -> ctypes.c_int: + ... + +@overload +def as_ctypes(obj: int_) -> ctypes.c_long: + ... + +@overload +def as_ctypes(obj: longlong) -> ctypes.c_longlong: + ... + +@overload +def as_ctypes(obj: ubyte) -> ctypes.c_ubyte: + ... + +@overload +def as_ctypes(obj: ushort) -> ctypes.c_ushort: + ... + +@overload +def as_ctypes(obj: uintc) -> ctypes.c_uint: + ... + +@overload +def as_ctypes(obj: uint) -> ctypes.c_ulong: + ... + +@overload +def as_ctypes(obj: ulonglong) -> ctypes.c_ulonglong: + ... + +@overload +def as_ctypes(obj: single) -> ctypes.c_float: + ... + +@overload +def as_ctypes(obj: double) -> ctypes.c_double: + ... + +@overload +def as_ctypes(obj: longdouble) -> ctypes.c_longdouble: + ... + +@overload +def as_ctypes(obj: void) -> Any: + ... + +@overload +def as_ctypes(obj: NDArray[bool_]) -> ctypes.Array[ctypes.c_bool]: + ... + +@overload +def as_ctypes(obj: NDArray[byte]) -> ctypes.Array[ctypes.c_byte]: + ... + +@overload +def as_ctypes(obj: NDArray[short]) -> ctypes.Array[ctypes.c_short]: + ... + +@overload +def as_ctypes(obj: NDArray[intc]) -> ctypes.Array[ctypes.c_int]: + ... + +@overload +def as_ctypes(obj: NDArray[int_]) -> ctypes.Array[ctypes.c_long]: + ... + +@overload +def as_ctypes(obj: NDArray[longlong]) -> ctypes.Array[ctypes.c_longlong]: + ... + +@overload +def as_ctypes(obj: NDArray[ubyte]) -> ctypes.Array[ctypes.c_ubyte]: + ... + +@overload +def as_ctypes(obj: NDArray[ushort]) -> ctypes.Array[ctypes.c_ushort]: + ... + +@overload +def as_ctypes(obj: NDArray[uintc]) -> ctypes.Array[ctypes.c_uint]: + ... + +@overload +def as_ctypes(obj: NDArray[uint]) -> ctypes.Array[ctypes.c_ulong]: + ... + +@overload +def as_ctypes(obj: NDArray[ulonglong]) -> ctypes.Array[ctypes.c_ulonglong]: + ... + +@overload +def as_ctypes(obj: NDArray[single]) -> ctypes.Array[ctypes.c_float]: + ... + +@overload +def as_ctypes(obj: NDArray[double]) -> ctypes.Array[ctypes.c_double]: + ... + +@overload +def as_ctypes(obj: NDArray[longdouble]) -> ctypes.Array[ctypes.c_longdouble]: + ... + +@overload +def as_ctypes(obj: NDArray[void]) -> ctypes.Array[Any]: + ... + diff --git a/typings/numpy/doc/__init__.pyi b/typings/numpy/doc/__init__.pyi new file mode 100644 index 0000000..d2821e6 --- /dev/null +++ b/typings/numpy/doc/__init__.pyi @@ -0,0 +1,9 @@ +""" +This type stub file was generated by pyright. +""" + +import os + +ref_dir = ... +__all__ = sorted(f[: -3] for f in os.listdir(ref_dir) if f.endswith('.py') and notf.startswith('__')) +__doc__ = ... diff --git a/typings/numpy/dtypes.pyi b/typings/numpy/dtypes.pyi new file mode 100644 index 0000000..15156ae --- /dev/null +++ b/typings/numpy/dtypes.pyi @@ -0,0 +1,39 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np + +__all__: list[str] +BoolDType = np.dtype[np.bool_] +Int8DType = np.dtype[np.int8] +UInt8DType = np.dtype[np.uint8] +Int16DType = np.dtype[np.int16] +UInt16DType = np.dtype[np.uint16] +Int32DType = np.dtype[np.int32] +UInt32DType = np.dtype[np.uint32] +Int64DType = np.dtype[np.int64] +UInt64DType = np.dtype[np.uint64] +ByteDType = np.dtype[np.byte] +UByteDType = np.dtype[np.ubyte] +ShortDType = np.dtype[np.short] +UShortDType = np.dtype[np.ushort] +IntDType = np.dtype[np.intc] +UIntDType = np.dtype[np.uintc] +LongDType = np.dtype[np.int_] +ULongDType = np.dtype[np.uint] +LongLongDType = np.dtype[np.longlong] +ULongLongDType = np.dtype[np.ulonglong] +Float16DType = np.dtype[np.float16] +Float32DType = np.dtype[np.float32] +Float64DType = np.dtype[np.float64] +LongDoubleDType = np.dtype[np.longdouble] +Complex64DType = np.dtype[np.complex64] +Complex128DType = np.dtype[np.complex128] +CLongDoubleDType = np.dtype[np.clongdouble] +ObjectDType = np.dtype[np.object_] +BytesDType = np.dtype[np.bytes_] +StrDType = np.dtype[np.str_] +VoidDType = np.dtype[np.void] +DateTime64DType = np.dtype[np.datetime64] +TimeDelta64DType = np.dtype[np.timedelta64] diff --git a/typings/numpy/exceptions.pyi b/typings/numpy/exceptions.pyi new file mode 100644 index 0000000..5c58bb3 --- /dev/null +++ b/typings/numpy/exceptions.pyi @@ -0,0 +1,43 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import overload + +__all__: list[str] +class ComplexWarning(RuntimeWarning): + ... + + +class ModuleDeprecationWarning(DeprecationWarning): + ... + + +class VisibleDeprecationWarning(UserWarning): + ... + + +class TooHardError(RuntimeError): + ... + + +class DTypePromotionError(TypeError): + ... + + +class AxisError(ValueError, IndexError): + axis: None | int + ndim: None | int + @overload + def __init__(self, axis: str, ndim: None = ..., msg_prefix: None = ...) -> None: + ... + + @overload + def __init__(self, axis: int, ndim: int, msg_prefix: None | str = ...) -> None: + ... + + def __str__(self) -> str: + ... + + + diff --git a/typings/numpy/f2py/__init__.pyi b/typings/numpy/f2py/__init__.pyi new file mode 100644 index 0000000..ffae845 --- /dev/null +++ b/typings/numpy/f2py/__init__.pyi @@ -0,0 +1,38 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import subprocess +from collections.abc import Iterable +from typing import Any, Literal as L, TypedDict, overload +from numpy._pytesttester import PytestTester + +class _F2PyDictBase(TypedDict): + csrc: list[str] + h: list[str] + ... + + +class _F2PyDict(_F2PyDictBase, total=False): + fsrc: list[str] + ltx: list[str] + ... + + +__all__: list[str] +test: PytestTester +def run_main(comline_list: Iterable[str]) -> dict[str, _F2PyDict]: + ... + +@overload +def compile(source: str | bytes, modulename: str = ..., extra_args: str | list[str] = ..., verbose: bool = ..., source_fn: None | str | bytes | os.PathLike[Any] = ..., extension: L[".f", ".f90"] = ..., full_output: L[False] = ...) -> int: + ... + +@overload +def compile(source: str | bytes, modulename: str = ..., extra_args: str | list[str] = ..., verbose: bool = ..., source_fn: None | str | bytes | os.PathLike[Any] = ..., extension: L[".f", ".f90"] = ..., full_output: L[True] = ...) -> subprocess.CompletedProcess[bytes]: + ... + +def get_include() -> str: + ... + diff --git a/typings/numpy/fft/__init__.pyi b/typings/numpy/fft/__init__.pyi new file mode 100644 index 0000000..365c5da --- /dev/null +++ b/typings/numpy/fft/__init__.pyi @@ -0,0 +1,11 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy._pytesttester import PytestTester +from numpy.fft._pocketfft import fft as fft, fft2 as fft2, fftn as fftn, hfft as hfft, ifft as ifft, ifft2 as ifft2, ifftn as ifftn, ihfft as ihfft, irfft as irfft, irfft2 as irfft2, irfftn as irfftn, rfft as rfft, rfft2 as rfft2, rfftn as rfftn +from numpy.fft.helper import fftfreq as fftfreq, fftshift as fftshift, ifftshift as ifftshift, rfftfreq as rfftfreq + +__all__: list[str] +__path__: list[str] +test: PytestTester diff --git a/typings/numpy/fft/_pocketfft.pyi b/typings/numpy/fft/_pocketfft.pyi new file mode 100644 index 0000000..52add9e --- /dev/null +++ b/typings/numpy/fft/_pocketfft.pyi @@ -0,0 +1,53 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Sequence +from typing import Literal as L +from numpy import complex128, float64 +from numpy._typing import ArrayLike, NDArray, _ArrayLikeNumber_co + +_NormKind = L[None, "backward", "ortho", "forward"] +__all__: list[str] +def fft(a: ArrayLike, n: None | int = ..., axis: int = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def ifft(a: ArrayLike, n: None | int = ..., axis: int = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def rfft(a: ArrayLike, n: None | int = ..., axis: int = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def irfft(a: ArrayLike, n: None | int = ..., axis: int = ..., norm: _NormKind = ...) -> NDArray[float64]: + ... + +def hfft(a: _ArrayLikeNumber_co, n: None | int = ..., axis: int = ..., norm: _NormKind = ...) -> NDArray[float64]: + ... + +def ihfft(a: ArrayLike, n: None | int = ..., axis: int = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def fftn(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def ifftn(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def rfftn(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def irfftn(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[float64]: + ... + +def fft2(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def ifft2(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def rfft2(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[complex128]: + ... + +def irfft2(a: ArrayLike, s: None | Sequence[int] = ..., axes: None | Sequence[int] = ..., norm: _NormKind = ...) -> NDArray[float64]: + ... + diff --git a/typings/numpy/fft/helper.pyi b/typings/numpy/fft/helper.pyi new file mode 100644 index 0000000..b36ac6c --- /dev/null +++ b/typings/numpy/fft/helper.pyi @@ -0,0 +1,42 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, TypeVar, overload +from numpy import complexfloating, floating, generic, integer +from numpy._typing import ArrayLike, NDArray, _ArrayLike, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ShapeLike + +_SCT = TypeVar("_SCT", bound=generic) +__all__: list[str] +@overload +def fftshift(x: _ArrayLike[_SCT], axes: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def fftshift(x: ArrayLike, axes: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def ifftshift(x: _ArrayLike[_SCT], axes: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def ifftshift(x: ArrayLike, axes: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +@overload +def fftfreq(n: int | integer[Any], d: _ArrayLikeFloat_co = ...) -> NDArray[floating[Any]]: + ... + +@overload +def fftfreq(n: int | integer[Any], d: _ArrayLikeComplex_co = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def rfftfreq(n: int | integer[Any], d: _ArrayLikeFloat_co = ...) -> NDArray[floating[Any]]: + ... + +@overload +def rfftfreq(n: int | integer[Any], d: _ArrayLikeComplex_co = ...) -> NDArray[complexfloating[Any, Any]]: + ... + diff --git a/typings/numpy/lib/__init__.pyi b/typings/numpy/lib/__init__.pyi new file mode 100644 index 0000000..eb25e41 --- /dev/null +++ b/typings/numpy/lib/__init__.pyi @@ -0,0 +1,33 @@ +""" +This type stub file was generated by pyright. +""" + +import math as math +from typing import Any +from numpy._pytesttester import PytestTester +from numpy import ndenumerate as ndenumerate, ndindex as ndindex +from numpy.version import version +from numpy.lib import format as format, mixins as mixins, scimath as scimath, stride_tricks as stride_tricks +from numpy.lib._version import NumpyVersion as NumpyVersion +from numpy.lib.arraypad import pad as pad +from numpy.lib.arraysetops import ediff1d as ediff1d, in1d as in1d, intersect1d as intersect1d, isin as isin, setdiff1d as setdiff1d, setxor1d as setxor1d, union1d as union1d, unique as unique +from numpy.lib.arrayterator import Arrayterator as Arrayterator +from numpy.lib.function_base import add_docstring as add_docstring, add_newdoc as add_newdoc, add_newdoc_ufunc as add_newdoc_ufunc, angle as angle, append as append, asarray_chkfinite as asarray_chkfinite, average as average, bartlett as bartlett, bincount as bincount, blackman as blackman, copy as copy, corrcoef as corrcoef, cov as cov, delete as delete, diff as diff, digitize as digitize, disp as disp, extract as extract, flip as flip, gradient as gradient, hamming as hamming, hanning as hanning, i0 as i0, insert as insert, interp as interp, iterable as iterable, kaiser as kaiser, median as median, meshgrid as meshgrid, percentile as percentile, piecewise as piecewise, place as place, quantile as quantile, rot90 as rot90, select as select, sinc as sinc, sort_complex as sort_complex, trapz as trapz, trim_zeros as trim_zeros, unwrap as unwrap, vectorize as vectorize +from numpy.lib.histograms import histogram as histogram, histogram_bin_edges as histogram_bin_edges, histogramdd as histogramdd +from numpy.lib.index_tricks import c_ as c_, diag_indices as diag_indices, diag_indices_from as diag_indices_from, fill_diagonal as fill_diagonal, index_exp as index_exp, ix_ as ix_, mgrid as mgrid, ogrid as ogrid, r_ as r_, ravel_multi_index as ravel_multi_index, s_ as s_, unravel_index as unravel_index +from numpy.lib.nanfunctions import nanargmax as nanargmax, nanargmin as nanargmin, nancumprod as nancumprod, nancumsum as nancumsum, nanmax as nanmax, nanmean as nanmean, nanmedian as nanmedian, nanmin as nanmin, nanpercentile as nanpercentile, nanprod as nanprod, nanquantile as nanquantile, nanstd as nanstd, nansum as nansum, nanvar as nanvar +from numpy.lib.npyio import DataSource as DataSource, fromregex as fromregex, genfromtxt as genfromtxt, load as load, loadtxt as loadtxt, packbits as packbits, recfromcsv as recfromcsv, recfromtxt as recfromtxt, save as save, savetxt as savetxt, savez as savez, savez_compressed as savez_compressed, unpackbits as unpackbits +from numpy.lib.polynomial import RankWarning as RankWarning, poly as poly, poly1d as poly1d, polyadd as polyadd, polyder as polyder, polydiv as polydiv, polyfit as polyfit, polyint as polyint, polymul as polymul, polysub as polysub, polyval as polyval, roots as roots +from numpy.lib.shape_base import apply_along_axis as apply_along_axis, apply_over_axes as apply_over_axes, array_split as array_split, column_stack as column_stack, dsplit as dsplit, dstack as dstack, expand_dims as expand_dims, get_array_wrap as get_array_wrap, hsplit as hsplit, kron as kron, put_along_axis as put_along_axis, row_stack as row_stack, split as split, take_along_axis as take_along_axis, tile as tile, vsplit as vsplit +from numpy.lib.stride_tricks import broadcast_arrays as broadcast_arrays, broadcast_shapes as broadcast_shapes, broadcast_to as broadcast_to +from numpy.lib.twodim_base import diag as diag, diagflat as diagflat, eye as eye, fliplr as fliplr, flipud as flipud, histogram2d as histogram2d, mask_indices as mask_indices, tri as tri, tril as tril, tril_indices as tril_indices, tril_indices_from as tril_indices_from, triu as triu, triu_indices as triu_indices, triu_indices_from as triu_indices_from, vander as vander +from numpy.lib.type_check import asfarray as asfarray, common_type as common_type, imag as imag, iscomplex as iscomplex, iscomplexobj as iscomplexobj, isreal as isreal, isrealobj as isrealobj, mintypecode as mintypecode, nan_to_num as nan_to_num, real as real, real_if_close as real_if_close, typename as typename +from numpy.lib.ufunclike import fix as fix, isneginf as isneginf, isposinf as isposinf +from numpy.lib.utils import byte_bounds as byte_bounds, deprecate as deprecate, deprecate_with_doc as deprecate_with_doc, get_include as get_include, info as info, issubclass_ as issubclass_, issubdtype as issubdtype, issubsctype as issubsctype, lookfor as lookfor, safe_eval as safe_eval, show_runtime as show_runtime, source as source, who as who +from numpy.core.multiarray import tracemalloc_domain as tracemalloc_domain + +__all__: list[str] +__path__: list[str] +test: PytestTester +__version__ = ... +emath = scimath diff --git a/typings/numpy/lib/_version.pyi b/typings/numpy/lib/_version.pyi new file mode 100644 index 0000000..6bb2225 --- /dev/null +++ b/typings/numpy/lib/_version.pyi @@ -0,0 +1,36 @@ +""" +This type stub file was generated by pyright. +""" + +__all__: list[str] +class NumpyVersion: + vstring: str + version: str + major: int + minor: int + bugfix: int + pre_release: str + is_devversion: bool + def __init__(self, vstring: str) -> None: + ... + + def __lt__(self, other: str | NumpyVersion) -> bool: + ... + + def __le__(self, other: str | NumpyVersion) -> bool: + ... + + def __eq__(self, other: str | NumpyVersion) -> bool: + ... + + def __ne__(self, other: str | NumpyVersion) -> bool: + ... + + def __gt__(self, other: str | NumpyVersion) -> bool: + ... + + def __ge__(self, other: str | NumpyVersion) -> bool: + ... + + + diff --git a/typings/numpy/lib/arraypad.pyi b/typings/numpy/lib/arraypad.pyi new file mode 100644 index 0000000..76886e1 --- /dev/null +++ b/typings/numpy/lib/arraypad.pyi @@ -0,0 +1,33 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, Literal as L, Protocol, TypeVar, overload +from numpy import generic +from numpy._typing import ArrayLike, NDArray, _ArrayLike, _ArrayLikeInt + +_SCT = TypeVar("_SCT", bound=generic) +class _ModeFunc(Protocol): + def __call__(self, vector: NDArray[Any], iaxis_pad_width: tuple[int, int], iaxis: int, kwargs: dict[str, Any], /) -> None: + ... + + + +_ModeKind = L["constant", "edge", "linear_ramp", "maximum", "mean", "median", "minimum", "reflect", "symmetric", "wrap", "empty",] +__all__: list[str] +@overload +def pad(array: _ArrayLike[_SCT], pad_width: _ArrayLikeInt, mode: _ModeKind = ..., *, stat_length: None | _ArrayLikeInt = ..., constant_values: ArrayLike = ..., end_values: ArrayLike = ..., reflect_type: L["odd", "even"] = ...) -> NDArray[_SCT]: + ... + +@overload +def pad(array: ArrayLike, pad_width: _ArrayLikeInt, mode: _ModeKind = ..., *, stat_length: None | _ArrayLikeInt = ..., constant_values: ArrayLike = ..., end_values: ArrayLike = ..., reflect_type: L["odd", "even"] = ...) -> NDArray[Any]: + ... + +@overload +def pad(array: _ArrayLike[_SCT], pad_width: _ArrayLikeInt, mode: _ModeFunc, **kwargs: Any) -> NDArray[_SCT]: + ... + +@overload +def pad(array: ArrayLike, pad_width: _ArrayLikeInt, mode: _ModeFunc, **kwargs: Any) -> NDArray[Any]: + ... + diff --git a/typings/numpy/lib/arraysetops.pyi b/typings/numpy/lib/arraysetops.pyi new file mode 100644 index 0000000..2acd534 --- /dev/null +++ b/typings/numpy/lib/arraysetops.pyi @@ -0,0 +1,142 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, Literal as L, SupportsIndex, TypeVar, overload +from numpy import bool_, byte, bytes_, cdouble, clongdouble, csingle, datetime64, double, generic, half, int8, int_, intc, intp, longdouble, longlong, number, object_, short, single, str_, timedelta64, ubyte, uint, uintc, ulonglong, ushort, void +from numpy._typing import ArrayLike, NDArray, _ArrayLike, _ArrayLikeBool_co, _ArrayLikeDT64_co, _ArrayLikeNumber_co, _ArrayLikeObject_co, _ArrayLikeTD64_co + +_SCT = TypeVar("_SCT", bound=generic) +_NumberType = TypeVar("_NumberType", bound=number[Any]) +_SCTNoCast = TypeVar("_SCTNoCast", bool_, ushort, ubyte, uintc, uint, ulonglong, short, byte, intc, int_, longlong, half, single, double, longdouble, csingle, cdouble, clongdouble, timedelta64, datetime64, object_, str_, bytes_, void) +__all__: list[str] +@overload +def ediff1d(ary: _ArrayLikeBool_co, to_end: None | ArrayLike = ..., to_begin: None | ArrayLike = ...) -> NDArray[int8]: + ... + +@overload +def ediff1d(ary: _ArrayLike[_NumberType], to_end: None | ArrayLike = ..., to_begin: None | ArrayLike = ...) -> NDArray[_NumberType]: + ... + +@overload +def ediff1d(ary: _ArrayLikeNumber_co, to_end: None | ArrayLike = ..., to_begin: None | ArrayLike = ...) -> NDArray[Any]: + ... + +@overload +def ediff1d(ary: _ArrayLikeDT64_co | _ArrayLikeTD64_co, to_end: None | ArrayLike = ..., to_begin: None | ArrayLike = ...) -> NDArray[timedelta64]: + ... + +@overload +def ediff1d(ary: _ArrayLikeObject_co, to_end: None | ArrayLike = ..., to_begin: None | ArrayLike = ...) -> NDArray[object_]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[False] = ..., return_inverse: L[False] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> NDArray[_SCT]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[False] = ..., return_inverse: L[False] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> NDArray[Any]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[True] = ..., return_inverse: L[False] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[_SCT], NDArray[intp]]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[True] = ..., return_inverse: L[False] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[Any], NDArray[intp]]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[False] = ..., return_inverse: L[True] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[_SCT], NDArray[intp]]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[False] = ..., return_inverse: L[True] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[Any], NDArray[intp]]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[False] = ..., return_inverse: L[False] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[_SCT], NDArray[intp]]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[False] = ..., return_inverse: L[False] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[Any], NDArray[intp]]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[True] = ..., return_inverse: L[True] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[_SCT], NDArray[intp], NDArray[intp]]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[True] = ..., return_inverse: L[True] = ..., return_counts: L[False] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[True] = ..., return_inverse: L[False] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[_SCT], NDArray[intp], NDArray[intp]]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[True] = ..., return_inverse: L[False] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[False] = ..., return_inverse: L[True] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[_SCT], NDArray[intp], NDArray[intp]]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[False] = ..., return_inverse: L[True] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: + ... + +@overload +def unique(ar: _ArrayLike[_SCT], return_index: L[True] = ..., return_inverse: L[True] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[_SCT], NDArray[intp], NDArray[intp], NDArray[intp]]: + ... + +@overload +def unique(ar: ArrayLike, return_index: L[True] = ..., return_inverse: L[True] = ..., return_counts: L[True] = ..., axis: None | SupportsIndex = ..., *, equal_nan: bool = ...) -> tuple[NDArray[Any], NDArray[intp], NDArray[intp], NDArray[intp]]: + ... + +@overload +def intersect1d(ar1: _ArrayLike[_SCTNoCast], ar2: _ArrayLike[_SCTNoCast], assume_unique: bool = ..., return_indices: L[False] = ...) -> NDArray[_SCTNoCast]: + ... + +@overload +def intersect1d(ar1: ArrayLike, ar2: ArrayLike, assume_unique: bool = ..., return_indices: L[False] = ...) -> NDArray[Any]: + ... + +@overload +def intersect1d(ar1: _ArrayLike[_SCTNoCast], ar2: _ArrayLike[_SCTNoCast], assume_unique: bool = ..., return_indices: L[True] = ...) -> tuple[NDArray[_SCTNoCast], NDArray[intp], NDArray[intp]]: + ... + +@overload +def intersect1d(ar1: ArrayLike, ar2: ArrayLike, assume_unique: bool = ..., return_indices: L[True] = ...) -> tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: + ... + +@overload +def setxor1d(ar1: _ArrayLike[_SCTNoCast], ar2: _ArrayLike[_SCTNoCast], assume_unique: bool = ...) -> NDArray[_SCTNoCast]: + ... + +@overload +def setxor1d(ar1: ArrayLike, ar2: ArrayLike, assume_unique: bool = ...) -> NDArray[Any]: + ... + +def in1d(ar1: ArrayLike, ar2: ArrayLike, assume_unique: bool = ..., invert: bool = ...) -> NDArray[bool_]: + ... + +def isin(element: ArrayLike, test_elements: ArrayLike, assume_unique: bool = ..., invert: bool = ..., *, kind: None | str = ...) -> NDArray[bool_]: + ... + +@overload +def union1d(ar1: _ArrayLike[_SCTNoCast], ar2: _ArrayLike[_SCTNoCast]) -> NDArray[_SCTNoCast]: + ... + +@overload +def union1d(ar1: ArrayLike, ar2: ArrayLike) -> NDArray[Any]: + ... + +@overload +def setdiff1d(ar1: _ArrayLike[_SCTNoCast], ar2: _ArrayLike[_SCTNoCast], assume_unique: bool = ...) -> NDArray[_SCTNoCast]: + ... + +@overload +def setdiff1d(ar1: ArrayLike, ar2: ArrayLike, assume_unique: bool = ...) -> NDArray[Any]: + ... + diff --git a/typings/numpy/lib/arrayterator.pyi b/typings/numpy/lib/arrayterator.pyi new file mode 100644 index 0000000..ba8ad4c --- /dev/null +++ b/typings/numpy/lib/arrayterator.pyi @@ -0,0 +1,47 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Generator +from typing import Any, TypeVar, Union, overload +from numpy import dtype, generic, ndarray +from numpy._typing import DTypeLike + +_Shape = TypeVar("_Shape", bound=Any) +_DType = TypeVar("_DType", bound=dtype[Any]) +_ScalarType = TypeVar("_ScalarType", bound=generic) +_Index = Union[Union[ellipsis, int, slice], tuple[Union[ellipsis, int, slice], ...],] +__all__: list[str] +class Arrayterator(ndarray[_Shape, _DType]): + var: ndarray[_Shape, _DType] + buf_size: None | int + start: list[int] + stop: list[int] + step: list[int] + @property + def shape(self) -> tuple[int, ...]: + ... + + @property + def flat(self: ndarray[Any, dtype[_ScalarType]]) -> Generator[_ScalarType, None, None]: + ... + + def __init__(self, var: ndarray[_Shape, _DType], buf_size: None | int = ...) -> None: + ... + + @overload + def __array__(self, dtype: None = ...) -> ndarray[Any, _DType]: + ... + + @overload + def __array__(self, dtype: DTypeLike) -> ndarray[Any, dtype[Any]]: + ... + + def __getitem__(self, index: _Index) -> Arrayterator[Any, _DType]: + ... + + def __iter__(self) -> Generator[ndarray[Any, _DType], None, None]: + ... + + + diff --git a/typings/numpy/lib/format.pyi b/typings/numpy/lib/format.pyi new file mode 100644 index 0000000..34ae354 --- /dev/null +++ b/typings/numpy/lib/format.pyi @@ -0,0 +1,48 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Final, Literal + +__all__: list[str] +EXPECTED_KEYS: Final[set[str]] +MAGIC_PREFIX: Final[bytes] +MAGIC_LEN: Literal[8] +ARRAY_ALIGN: Literal[64] +BUFFER_SIZE: Literal[262144] +def magic(major, minor): + ... + +def read_magic(fp): + ... + +def dtype_to_descr(dtype): + ... + +def descr_to_dtype(descr): + ... + +def header_data_from_array_1_0(array): + ... + +def write_array_header_1_0(fp, d): + ... + +def write_array_header_2_0(fp, d): + ... + +def read_array_header_1_0(fp): + ... + +def read_array_header_2_0(fp): + ... + +def write_array(fp, array, version=..., allow_pickle=..., pickle_kwargs=...): + ... + +def read_array(fp, allow_pickle=..., pickle_kwargs=...): + ... + +def open_memmap(filename, mode=..., dtype=..., shape=..., fortran_order=..., version=...): + ... + diff --git a/typings/numpy/lib/function_base.pyi b/typings/numpy/lib/function_base.pyi new file mode 100644 index 0000000..672b602 --- /dev/null +++ b/typings/numpy/lib/function_base.pyi @@ -0,0 +1,382 @@ +""" +This type stub file was generated by pyright. +""" + +import sys +from collections.abc import Callable, Iterable, Iterator, Sequence +from typing import Any, Literal as L, Protocol, SupportsIndex, SupportsInt, TypeGuard, TypeVar, overload +from numpy import _OrderKACF, complex128, complexfloating, datetime64, float64, floating, generic, intp, object_, timedelta64, ufunc +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLike, _ArrayLikeComplex_co, _ArrayLikeDT64_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeTD64_co, _ComplexLike_co, _DTypeLike, _FloatLike_co, _ScalarLike_co, _ShapeLike + +if sys.version_info >= (3, 10): + ... +else: + ... +_T = TypeVar("_T") +_T_co = TypeVar("_T_co", covariant=True) +_SCT = TypeVar("_SCT", bound=generic) +_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) +_2Tuple = tuple[_T, _T] +class _TrimZerosSequence(Protocol[_T_co]): + def __len__(self) -> int: + ... + + def __getitem__(self, key: slice, /) -> _T_co: + ... + + def __iter__(self) -> Iterator[Any]: + ... + + + +class _SupportsWriteFlush(Protocol): + def write(self, s: str, /) -> object: + ... + + def flush(self) -> object: + ... + + + +__all__: list[str] +def add_newdoc_ufunc(ufunc: ufunc, new_docstring: str, /) -> None: + ... + +@overload +def rot90(m: _ArrayLike[_SCT], k: int = ..., axes: tuple[int, int] = ...) -> NDArray[_SCT]: + ... + +@overload +def rot90(m: ArrayLike, k: int = ..., axes: tuple[int, int] = ...) -> NDArray[Any]: + ... + +@overload +def flip(m: _SCT, axis: None = ...) -> _SCT: + ... + +@overload +def flip(m: _ScalarLike_co, axis: None = ...) -> Any: + ... + +@overload +def flip(m: _ArrayLike[_SCT], axis: None | _ShapeLike = ...) -> NDArray[_SCT]: + ... + +@overload +def flip(m: ArrayLike, axis: None | _ShapeLike = ...) -> NDArray[Any]: + ... + +def iterable(y: object) -> TypeGuard[Iterable[Any]]: + ... + +@overload +def average(a: _ArrayLikeFloat_co, axis: None = ..., weights: None | _ArrayLikeFloat_co = ..., returned: L[False] = ..., keepdims: L[False] = ...) -> floating[Any]: + ... + +@overload +def average(a: _ArrayLikeComplex_co, axis: None = ..., weights: None | _ArrayLikeComplex_co = ..., returned: L[False] = ..., keepdims: L[False] = ...) -> complexfloating[Any, Any]: + ... + +@overload +def average(a: _ArrayLikeObject_co, axis: None = ..., weights: None | Any = ..., returned: L[False] = ..., keepdims: L[False] = ...) -> Any: + ... + +@overload +def average(a: _ArrayLikeFloat_co, axis: None = ..., weights: None | _ArrayLikeFloat_co = ..., returned: L[True] = ..., keepdims: L[False] = ...) -> _2Tuple[floating[Any]]: + ... + +@overload +def average(a: _ArrayLikeComplex_co, axis: None = ..., weights: None | _ArrayLikeComplex_co = ..., returned: L[True] = ..., keepdims: L[False] = ...) -> _2Tuple[complexfloating[Any, Any]]: + ... + +@overload +def average(a: _ArrayLikeObject_co, axis: None = ..., weights: None | Any = ..., returned: L[True] = ..., keepdims: L[False] = ...) -> _2Tuple[Any]: + ... + +@overload +def average(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., weights: None | Any = ..., returned: L[False] = ..., keepdims: bool = ...) -> Any: + ... + +@overload +def average(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., weights: None | Any = ..., returned: L[True] = ..., keepdims: bool = ...) -> _2Tuple[Any]: + ... + +@overload +def asarray_chkfinite(a: _ArrayLike[_SCT], dtype: None = ..., order: _OrderKACF = ...) -> NDArray[_SCT]: + ... + +@overload +def asarray_chkfinite(a: object, dtype: None = ..., order: _OrderKACF = ...) -> NDArray[Any]: + ... + +@overload +def asarray_chkfinite(a: Any, dtype: _DTypeLike[_SCT], order: _OrderKACF = ...) -> NDArray[_SCT]: + ... + +@overload +def asarray_chkfinite(a: Any, dtype: DTypeLike, order: _OrderKACF = ...) -> NDArray[Any]: + ... + +@overload +def piecewise(x: _ArrayLike[_SCT], condlist: ArrayLike, funclist: Sequence[Any | Callable[..., Any]], *args: Any, **kw: Any) -> NDArray[_SCT]: + ... + +@overload +def piecewise(x: ArrayLike, condlist: ArrayLike, funclist: Sequence[Any | Callable[..., Any]], *args: Any, **kw: Any) -> NDArray[Any]: + ... + +def select(condlist: Sequence[ArrayLike], choicelist: Sequence[ArrayLike], default: ArrayLike = ...) -> NDArray[Any]: + ... + +@overload +def copy(a: _ArrayType, order: _OrderKACF, subok: L[True]) -> _ArrayType: + ... + +@overload +def copy(a: _ArrayType, order: _OrderKACF = ..., *, subok: L[True]) -> _ArrayType: + ... + +@overload +def copy(a: _ArrayLike[_SCT], order: _OrderKACF = ..., subok: L[False] = ...) -> NDArray[_SCT]: + ... + +@overload +def copy(a: ArrayLike, order: _OrderKACF = ..., subok: L[False] = ...) -> NDArray[Any]: + ... + +def gradient(f: ArrayLike, *varargs: ArrayLike, axis: None | _ShapeLike = ..., edge_order: L[1, 2] = ...) -> Any: + ... + +@overload +def diff(a: _T, n: L[0], axis: SupportsIndex = ..., prepend: ArrayLike = ..., append: ArrayLike = ...) -> _T: + ... + +@overload +def diff(a: ArrayLike, n: int = ..., axis: SupportsIndex = ..., prepend: ArrayLike = ..., append: ArrayLike = ...) -> NDArray[Any]: + ... + +@overload +def interp(x: _ArrayLikeFloat_co, xp: _ArrayLikeFloat_co, fp: _ArrayLikeFloat_co, left: None | _FloatLike_co = ..., right: None | _FloatLike_co = ..., period: None | _FloatLike_co = ...) -> NDArray[float64]: + ... + +@overload +def interp(x: _ArrayLikeFloat_co, xp: _ArrayLikeFloat_co, fp: _ArrayLikeComplex_co, left: None | _ComplexLike_co = ..., right: None | _ComplexLike_co = ..., period: None | _FloatLike_co = ...) -> NDArray[complex128]: + ... + +@overload +def angle(z: _ComplexLike_co, deg: bool = ...) -> floating[Any]: + ... + +@overload +def angle(z: object_, deg: bool = ...) -> Any: + ... + +@overload +def angle(z: _ArrayLikeComplex_co, deg: bool = ...) -> NDArray[floating[Any]]: + ... + +@overload +def angle(z: _ArrayLikeObject_co, deg: bool = ...) -> NDArray[object_]: + ... + +@overload +def unwrap(p: _ArrayLikeFloat_co, discont: None | float = ..., axis: int = ..., *, period: float = ...) -> NDArray[floating[Any]]: + ... + +@overload +def unwrap(p: _ArrayLikeObject_co, discont: None | float = ..., axis: int = ..., *, period: float = ...) -> NDArray[object_]: + ... + +def sort_complex(a: ArrayLike) -> NDArray[complexfloating[Any, Any]]: + ... + +def trim_zeros(filt: _TrimZerosSequence[_T], trim: L["f", "b", "fb", "bf"] = ...) -> _T: + ... + +@overload +def extract(condition: ArrayLike, arr: _ArrayLike[_SCT]) -> NDArray[_SCT]: + ... + +@overload +def extract(condition: ArrayLike, arr: ArrayLike) -> NDArray[Any]: + ... + +def place(arr: NDArray[Any], mask: ArrayLike, vals: Any) -> None: + ... + +def disp(mesg: object, device: None | _SupportsWriteFlush = ..., linefeed: bool = ...) -> None: + ... + +@overload +def cov(m: _ArrayLikeFloat_co, y: None | _ArrayLikeFloat_co = ..., rowvar: bool = ..., bias: bool = ..., ddof: None | SupportsIndex | SupportsInt = ..., fweights: None | ArrayLike = ..., aweights: None | ArrayLike = ..., *, dtype: None = ...) -> NDArray[floating[Any]]: + ... + +@overload +def cov(m: _ArrayLikeComplex_co, y: None | _ArrayLikeComplex_co = ..., rowvar: bool = ..., bias: bool = ..., ddof: None | SupportsIndex | SupportsInt = ..., fweights: None | ArrayLike = ..., aweights: None | ArrayLike = ..., *, dtype: None = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def cov(m: _ArrayLikeComplex_co, y: None | _ArrayLikeComplex_co = ..., rowvar: bool = ..., bias: bool = ..., ddof: None | SupportsIndex | SupportsInt = ..., fweights: None | ArrayLike = ..., aweights: None | ArrayLike = ..., *, dtype: _DTypeLike[_SCT]) -> NDArray[_SCT]: + ... + +@overload +def cov(m: _ArrayLikeComplex_co, y: None | _ArrayLikeComplex_co = ..., rowvar: bool = ..., bias: bool = ..., ddof: None | SupportsIndex | SupportsInt = ..., fweights: None | ArrayLike = ..., aweights: None | ArrayLike = ..., *, dtype: DTypeLike) -> NDArray[Any]: + ... + +@overload +def corrcoef(m: _ArrayLikeFloat_co, y: None | _ArrayLikeFloat_co = ..., rowvar: bool = ..., *, dtype: None = ...) -> NDArray[floating[Any]]: + ... + +@overload +def corrcoef(m: _ArrayLikeComplex_co, y: None | _ArrayLikeComplex_co = ..., rowvar: bool = ..., *, dtype: None = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def corrcoef(m: _ArrayLikeComplex_co, y: None | _ArrayLikeComplex_co = ..., rowvar: bool = ..., *, dtype: _DTypeLike[_SCT]) -> NDArray[_SCT]: + ... + +@overload +def corrcoef(m: _ArrayLikeComplex_co, y: None | _ArrayLikeComplex_co = ..., rowvar: bool = ..., *, dtype: DTypeLike) -> NDArray[Any]: + ... + +def blackman(M: _FloatLike_co) -> NDArray[floating[Any]]: + ... + +def bartlett(M: _FloatLike_co) -> NDArray[floating[Any]]: + ... + +def hanning(M: _FloatLike_co) -> NDArray[floating[Any]]: + ... + +def hamming(M: _FloatLike_co) -> NDArray[floating[Any]]: + ... + +def i0(x: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +def kaiser(M: _FloatLike_co, beta: _FloatLike_co) -> NDArray[floating[Any]]: + ... + +@overload +def sinc(x: _FloatLike_co) -> floating[Any]: + ... + +@overload +def sinc(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def sinc(x: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def sinc(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def median(a: _ArrayLikeFloat_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., keepdims: L[False] = ...) -> floating[Any]: + ... + +@overload +def median(a: _ArrayLikeComplex_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., keepdims: L[False] = ...) -> complexfloating[Any, Any]: + ... + +@overload +def median(a: _ArrayLikeTD64_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., keepdims: L[False] = ...) -> timedelta64: + ... + +@overload +def median(a: _ArrayLikeObject_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., keepdims: L[False] = ...) -> Any: + ... + +@overload +def median(a: _ArrayLikeFloat_co | _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., out: None = ..., overwrite_input: bool = ..., keepdims: bool = ...) -> Any: + ... + +@overload +def median(a: _ArrayLikeFloat_co | _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co, axis: None | _ShapeLike = ..., out: _ArrayType = ..., overwrite_input: bool = ..., keepdims: bool = ...) -> _ArrayType: + ... + +_MethodKind = L["inverted_cdf", "averaged_inverted_cdf", "closest_observation", "interpolated_inverted_cdf", "hazen", "weibull", "linear", "median_unbiased", "normal_unbiased", "lower", "higher", "midpoint", "nearest",] +@overload +def percentile(a: _ArrayLikeFloat_co, q: _FloatLike_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> floating[Any]: + ... + +@overload +def percentile(a: _ArrayLikeComplex_co, q: _FloatLike_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> complexfloating[Any, Any]: + ... + +@overload +def percentile(a: _ArrayLikeTD64_co, q: _FloatLike_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> timedelta64: + ... + +@overload +def percentile(a: _ArrayLikeDT64_co, q: _FloatLike_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> datetime64: + ... + +@overload +def percentile(a: _ArrayLikeObject_co, q: _FloatLike_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> Any: + ... + +@overload +def percentile(a: _ArrayLikeFloat_co, q: _ArrayLikeFloat_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> NDArray[floating[Any]]: + ... + +@overload +def percentile(a: _ArrayLikeComplex_co, q: _ArrayLikeFloat_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def percentile(a: _ArrayLikeTD64_co, q: _ArrayLikeFloat_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> NDArray[timedelta64]: + ... + +@overload +def percentile(a: _ArrayLikeDT64_co, q: _ArrayLikeFloat_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> NDArray[datetime64]: + ... + +@overload +def percentile(a: _ArrayLikeObject_co, q: _ArrayLikeFloat_co, axis: None = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: L[False] = ...) -> NDArray[object_]: + ... + +@overload +def percentile(a: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeTD64_co | _ArrayLikeObject_co, q: _ArrayLikeFloat_co, axis: None | _ShapeLike = ..., out: None = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: bool = ...) -> Any: + ... + +@overload +def percentile(a: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeTD64_co | _ArrayLikeObject_co, q: _ArrayLikeFloat_co, axis: None | _ShapeLike = ..., out: _ArrayType = ..., overwrite_input: bool = ..., method: _MethodKind = ..., keepdims: bool = ...) -> _ArrayType: + ... + +quantile = ... +def trapz(y: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co, x: None | _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co = ..., dx: float = ..., axis: SupportsIndex = ...) -> Any: + ... + +def meshgrid(*xi: ArrayLike, copy: bool = ..., sparse: bool = ..., indexing: L["xy", "ij"] = ...) -> list[NDArray[Any]]: + ... + +@overload +def delete(arr: _ArrayLike[_SCT], obj: slice | _ArrayLikeInt_co, axis: None | SupportsIndex = ...) -> NDArray[_SCT]: + ... + +@overload +def delete(arr: ArrayLike, obj: slice | _ArrayLikeInt_co, axis: None | SupportsIndex = ...) -> NDArray[Any]: + ... + +@overload +def insert(arr: _ArrayLike[_SCT], obj: slice | _ArrayLikeInt_co, values: ArrayLike, axis: None | SupportsIndex = ...) -> NDArray[_SCT]: + ... + +@overload +def insert(arr: ArrayLike, obj: slice | _ArrayLikeInt_co, values: ArrayLike, axis: None | SupportsIndex = ...) -> NDArray[Any]: + ... + +def append(arr: ArrayLike, values: ArrayLike, axis: None | SupportsIndex = ...) -> NDArray[Any]: + ... + +@overload +def digitize(x: _FloatLike_co, bins: _ArrayLikeFloat_co, right: bool = ...) -> intp: + ... + +@overload +def digitize(x: _ArrayLikeFloat_co, bins: _ArrayLikeFloat_co, right: bool = ...) -> NDArray[intp]: + ... + diff --git a/typings/numpy/lib/histograms.pyi b/typings/numpy/lib/histograms.pyi new file mode 100644 index 0000000..cd7dc4b --- /dev/null +++ b/typings/numpy/lib/histograms.pyi @@ -0,0 +1,19 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Sequence +from typing import Any, Literal as L, SupportsIndex +from numpy._typing import ArrayLike, NDArray + +_BinKind = L["stone", "auto", "doane", "fd", "rice", "scott", "sqrt", "sturges",] +__all__: list[str] +def histogram_bin_edges(a: ArrayLike, bins: _BinKind | SupportsIndex | ArrayLike = ..., range: None | tuple[float, float] = ..., weights: None | ArrayLike = ...) -> NDArray[Any]: + ... + +def histogram(a: ArrayLike, bins: _BinKind | SupportsIndex | ArrayLike = ..., range: None | tuple[float, float] = ..., density: bool = ..., weights: None | ArrayLike = ...) -> tuple[NDArray[Any], NDArray[Any]]: + ... + +def histogramdd(sample: ArrayLike, bins: SupportsIndex | ArrayLike = ..., range: Sequence[tuple[float, float]] = ..., density: None | bool = ..., weights: None | ArrayLike = ...) -> tuple[NDArray[Any], list[NDArray[Any]]]: + ... + diff --git a/typings/numpy/lib/index_tricks.pyi b/typings/numpy/lib/index_tricks.pyi new file mode 100644 index 0000000..16da188 --- /dev/null +++ b/typings/numpy/lib/index_tricks.pyi @@ -0,0 +1,151 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Sequence +from typing import Any, Generic, Literal, SupportsIndex, TypeVar, overload +from numpy import bool_, bytes_, complex_, dtype, float_, int_, matrix as _Matrix, ndarray, str_ +from numpy._typing import ArrayLike, DTypeLike, NDArray, _FiniteNestedSequence, _NestedSequence, _SupportsDType + +_T = TypeVar("_T") +_DType = TypeVar("_DType", bound=dtype[Any]) +_BoolType = TypeVar("_BoolType", Literal[True], Literal[False]) +_TupType = TypeVar("_TupType", bound=tuple[Any, ...]) +_ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, Any]) +__all__: list[str] +@overload +def ix_(*args: _FiniteNestedSequence[_SupportsDType[_DType]]) -> tuple[ndarray[Any, _DType], ...]: + ... + +@overload +def ix_(*args: str | _NestedSequence[str]) -> tuple[NDArray[str_], ...]: + ... + +@overload +def ix_(*args: bytes | _NestedSequence[bytes]) -> tuple[NDArray[bytes_], ...]: + ... + +@overload +def ix_(*args: bool | _NestedSequence[bool]) -> tuple[NDArray[bool_], ...]: + ... + +@overload +def ix_(*args: int | _NestedSequence[int]) -> tuple[NDArray[int_], ...]: + ... + +@overload +def ix_(*args: float | _NestedSequence[float]) -> tuple[NDArray[float_], ...]: + ... + +@overload +def ix_(*args: complex | _NestedSequence[complex]) -> tuple[NDArray[complex_], ...]: + ... + +class nd_grid(Generic[_BoolType]): + sparse: _BoolType + def __init__(self, sparse: _BoolType = ...) -> None: + ... + + @overload + def __getitem__(self: nd_grid[Literal[False]], key: slice | Sequence[slice]) -> NDArray[Any]: + ... + + @overload + def __getitem__(self: nd_grid[Literal[True]], key: slice | Sequence[slice]) -> list[NDArray[Any]]: + ... + + + +class MGridClass(nd_grid[Literal[False]]): + def __init__(self) -> None: + ... + + + +mgrid: MGridClass +class OGridClass(nd_grid[Literal[True]]): + def __init__(self) -> None: + ... + + + +ogrid: OGridClass +class AxisConcatenator: + axis: int + matrix: bool + ndmin: int + trans1d: int + def __init__(self, axis: int = ..., matrix: bool = ..., ndmin: int = ..., trans1d: int = ...) -> None: + ... + + @staticmethod + @overload + def concatenate(*a: ArrayLike, axis: SupportsIndex = ..., out: None = ...) -> NDArray[Any]: + ... + + @staticmethod + @overload + def concatenate(*a: ArrayLike, axis: SupportsIndex = ..., out: _ArrayType = ...) -> _ArrayType: + ... + + @staticmethod + def makemat(data: ArrayLike, dtype: DTypeLike = ..., copy: bool = ...) -> _Matrix[Any, Any]: + ... + + def __getitem__(self, key: Any) -> Any: + ... + + + +class RClass(AxisConcatenator): + axis: Literal[0] + matrix: Literal[False] + ndmin: Literal[1] + trans1d: Literal[-1] + def __init__(self) -> None: + ... + + + +r_: RClass +class CClass(AxisConcatenator): + axis: Literal[-1] + matrix: Literal[False] + ndmin: Literal[2] + trans1d: Literal[0] + def __init__(self) -> None: + ... + + + +c_: CClass +class IndexExpression(Generic[_BoolType]): + maketuple: _BoolType + def __init__(self, maketuple: _BoolType) -> None: + ... + + @overload + def __getitem__(self, item: _TupType) -> _TupType: + ... + + @overload + def __getitem__(self: IndexExpression[Literal[True]], item: _T) -> tuple[_T]: + ... + + @overload + def __getitem__(self: IndexExpression[Literal[False]], item: _T) -> _T: + ... + + + +index_exp: IndexExpression[Literal[True]] +s_: IndexExpression[Literal[False]] +def fill_diagonal(a: ndarray[Any, Any], val: Any, wrap: bool = ...) -> None: + ... + +def diag_indices(n: int, ndim: int = ...) -> tuple[NDArray[int_], ...]: + ... + +def diag_indices_from(arr: ArrayLike) -> tuple[NDArray[int_], ...]: + ... + diff --git a/typings/numpy/lib/mixins.pyi b/typings/numpy/lib/mixins.pyi new file mode 100644 index 0000000..576250d --- /dev/null +++ b/typings/numpy/lib/mixins.pyi @@ -0,0 +1,169 @@ +""" +This type stub file was generated by pyright. +""" + +from abc import ABCMeta, abstractmethod +from typing import Any, Literal as L +from numpy import ufunc + +__all__: list[str] +class NDArrayOperatorsMixin(metaclass=ABCMeta): + @abstractmethod + def __array_ufunc__(self, ufunc: ufunc, method: L["__call__", "reduce", "reduceat", "accumulate", "outer", "inner"], *inputs: Any, **kwargs: Any) -> Any: + ... + + def __lt__(self, other: Any) -> Any: + ... + + def __le__(self, other: Any) -> Any: + ... + + def __eq__(self, other: Any) -> Any: + ... + + def __ne__(self, other: Any) -> Any: + ... + + def __gt__(self, other: Any) -> Any: + ... + + def __ge__(self, other: Any) -> Any: + ... + + def __add__(self, other: Any) -> Any: + ... + + def __radd__(self, other: Any) -> Any: + ... + + def __iadd__(self, other: Any) -> Any: + ... + + def __sub__(self, other: Any) -> Any: + ... + + def __rsub__(self, other: Any) -> Any: + ... + + def __isub__(self, other: Any) -> Any: + ... + + def __mul__(self, other: Any) -> Any: + ... + + def __rmul__(self, other: Any) -> Any: + ... + + def __imul__(self, other: Any) -> Any: + ... + + def __matmul__(self, other: Any) -> Any: + ... + + def __rmatmul__(self, other: Any) -> Any: + ... + + def __imatmul__(self, other: Any) -> Any: + ... + + def __truediv__(self, other: Any) -> Any: + ... + + def __rtruediv__(self, other: Any) -> Any: + ... + + def __itruediv__(self, other: Any) -> Any: + ... + + def __floordiv__(self, other: Any) -> Any: + ... + + def __rfloordiv__(self, other: Any) -> Any: + ... + + def __ifloordiv__(self, other: Any) -> Any: + ... + + def __mod__(self, other: Any) -> Any: + ... + + def __rmod__(self, other: Any) -> Any: + ... + + def __imod__(self, other: Any) -> Any: + ... + + def __divmod__(self, other: Any) -> Any: + ... + + def __rdivmod__(self, other: Any) -> Any: + ... + + def __pow__(self, other: Any) -> Any: + ... + + def __rpow__(self, other: Any) -> Any: + ... + + def __ipow__(self, other: Any) -> Any: + ... + + def __lshift__(self, other: Any) -> Any: + ... + + def __rlshift__(self, other: Any) -> Any: + ... + + def __ilshift__(self, other: Any) -> Any: + ... + + def __rshift__(self, other: Any) -> Any: + ... + + def __rrshift__(self, other: Any) -> Any: + ... + + def __irshift__(self, other: Any) -> Any: + ... + + def __and__(self, other: Any) -> Any: + ... + + def __rand__(self, other: Any) -> Any: + ... + + def __iand__(self, other: Any) -> Any: + ... + + def __xor__(self, other: Any) -> Any: + ... + + def __rxor__(self, other: Any) -> Any: + ... + + def __ixor__(self, other: Any) -> Any: + ... + + def __or__(self, other: Any) -> Any: + ... + + def __ror__(self, other: Any) -> Any: + ... + + def __ior__(self, other: Any) -> Any: + ... + + def __neg__(self) -> Any: + ... + + def __pos__(self) -> Any: + ... + + def __abs__(self) -> Any: + ... + + def __invert__(self) -> Any: + ... + + + diff --git a/typings/numpy/lib/nanfunctions.pyi b/typings/numpy/lib/nanfunctions.pyi new file mode 100644 index 0000000..4a1b63c --- /dev/null +++ b/typings/numpy/lib/nanfunctions.pyi @@ -0,0 +1,19 @@ +""" +This type stub file was generated by pyright. +""" + +__all__: list[str] +nanmin = ... +nanmax = ... +nanargmin = ... +nanargmax = ... +nansum = ... +nanprod = ... +nancumsum = ... +nancumprod = ... +nanmean = ... +nanvar = ... +nanstd = ... +nanmedian = ... +nanpercentile = ... +nanquantile = ... diff --git a/typings/numpy/lib/npyio.pyi b/typings/numpy/lib/npyio.pyi new file mode 100644 index 0000000..7298d32 --- /dev/null +++ b/typings/numpy/lib/npyio.pyi @@ -0,0 +1,170 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import zipfile +import types +from re import Pattern +from collections.abc import Callable, Collection, Iterable, Iterator, Mapping, Sequence +from typing import Any, Generic, IO, Literal as L, Protocol, TypeVar, overload +from numpy import dtype, float64, generic, recarray, record, void +from numpy.ma.mrecords import MaskedRecords +from numpy._typing import ArrayLike, DTypeLike, NDArray, _DTypeLike, _SupportsArrayFunc + +_T = TypeVar("_T") +_T_contra = TypeVar("_T_contra", contravariant=True) +_T_co = TypeVar("_T_co", covariant=True) +_SCT = TypeVar("_SCT", bound=generic) +_CharType_co = TypeVar("_CharType_co", str, bytes, covariant=True) +_CharType_contra = TypeVar("_CharType_contra", str, bytes, contravariant=True) +class _SupportsGetItem(Protocol[_T_contra, _T_co]): + def __getitem__(self, key: _T_contra, /) -> _T_co: + ... + + + +class _SupportsRead(Protocol[_CharType_co]): + def read(self) -> _CharType_co: + ... + + + +class _SupportsReadSeek(Protocol[_CharType_co]): + def read(self, n: int, /) -> _CharType_co: + ... + + def seek(self, offset: int, whence: int, /) -> object: + ... + + + +class _SupportsWrite(Protocol[_CharType_contra]): + def write(self, s: _CharType_contra, /) -> object: + ... + + + +__all__: list[str] +class BagObj(Generic[_T_co]): + def __init__(self, obj: _SupportsGetItem[str, _T_co]) -> None: + ... + + def __getattribute__(self, key: str) -> _T_co: + ... + + def __dir__(self) -> list[str]: + ... + + + +class NpzFile(Mapping[str, NDArray[Any]]): + zip: zipfile.ZipFile + fid: None | IO[str] + files: list[str] + allow_pickle: bool + pickle_kwargs: None | Mapping[str, Any] + _MAX_REPR_ARRAY_COUNT: int + @property + def f(self: _T) -> BagObj[_T]: + ... + + @f.setter + def f(self: _T, value: BagObj[_T]) -> None: + ... + + def __init__(self, fid: IO[str], own_fid: bool = ..., allow_pickle: bool = ..., pickle_kwargs: None | Mapping[str, Any] = ...) -> None: + ... + + def __enter__(self: _T) -> _T: + ... + + def __exit__(self, exc_type: None | type[BaseException], exc_value: None | BaseException, traceback: None | types.TracebackType, /) -> None: + ... + + def close(self) -> None: + ... + + def __del__(self) -> None: + ... + + def __iter__(self) -> Iterator[str]: + ... + + def __len__(self) -> int: + ... + + def __getitem__(self, key: str) -> NDArray[Any]: + ... + + def __contains__(self, key: str) -> bool: + ... + + def __repr__(self) -> str: + ... + + + +def load(file: str | bytes | os.PathLike[Any] | _SupportsReadSeek[bytes], mmap_mode: L[None, "r+", "r", "w+", "c"] = ..., allow_pickle: bool = ..., fix_imports: bool = ..., encoding: L["ASCII", "latin1", "bytes"] = ...) -> Any: + ... + +def save(file: str | os.PathLike[str] | _SupportsWrite[bytes], arr: ArrayLike, allow_pickle: bool = ..., fix_imports: bool = ...) -> None: + ... + +def savez(file: str | os.PathLike[str] | _SupportsWrite[bytes], *args: ArrayLike, **kwds: ArrayLike) -> None: + ... + +def savez_compressed(file: str | os.PathLike[str] | _SupportsWrite[bytes], *args: ArrayLike, **kwds: ArrayLike) -> None: + ... + +@overload +def loadtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], dtype: None = ..., comments: None | str | Sequence[str] = ..., delimiter: None | str = ..., converters: None | Mapping[int | str, Callable[[str], Any]] = ..., skiprows: int = ..., usecols: int | Sequence[int] = ..., unpack: bool = ..., ndmin: L[0, 1, 2] = ..., encoding: None | str = ..., max_rows: None | int = ..., *, quotechar: None | str = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def loadtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], dtype: _DTypeLike[_SCT], comments: None | str | Sequence[str] = ..., delimiter: None | str = ..., converters: None | Mapping[int | str, Callable[[str], Any]] = ..., skiprows: int = ..., usecols: int | Sequence[int] = ..., unpack: bool = ..., ndmin: L[0, 1, 2] = ..., encoding: None | str = ..., max_rows: None | int = ..., *, quotechar: None | str = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def loadtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], dtype: DTypeLike, comments: None | str | Sequence[str] = ..., delimiter: None | str = ..., converters: None | Mapping[int | str, Callable[[str], Any]] = ..., skiprows: int = ..., usecols: int | Sequence[int] = ..., unpack: bool = ..., ndmin: L[0, 1, 2] = ..., encoding: None | str = ..., max_rows: None | int = ..., *, quotechar: None | str = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +def savetxt(fname: str | os.PathLike[str] | _SupportsWrite[str] | _SupportsWrite[bytes], X: ArrayLike, fmt: str | Sequence[str] = ..., delimiter: str = ..., newline: str = ..., header: str = ..., footer: str = ..., comments: str = ..., encoding: None | str = ...) -> None: + ... + +@overload +def fromregex(file: str | os.PathLike[str] | _SupportsRead[str] | _SupportsRead[bytes], regexp: str | bytes | Pattern[Any], dtype: _DTypeLike[_SCT], encoding: None | str = ...) -> NDArray[_SCT]: + ... + +@overload +def fromregex(file: str | os.PathLike[str] | _SupportsRead[str] | _SupportsRead[bytes], regexp: str | bytes | Pattern[Any], dtype: DTypeLike, encoding: None | str = ...) -> NDArray[Any]: + ... + +@overload +def genfromtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], dtype: None = ..., comments: str = ..., delimiter: None | str | int | Iterable[int] = ..., skip_header: int = ..., skip_footer: int = ..., converters: None | Mapping[int | str, Callable[[str], Any]] = ..., missing_values: Any = ..., filling_values: Any = ..., usecols: None | Sequence[int] = ..., names: L[None, True] | str | Collection[str] = ..., excludelist: None | Sequence[str] = ..., deletechars: str = ..., replace_space: str = ..., autostrip: bool = ..., case_sensitive: bool | L['upper', 'lower'] = ..., defaultfmt: str = ..., unpack: None | bool = ..., usemask: bool = ..., loose: bool = ..., invalid_raise: bool = ..., max_rows: None | int = ..., encoding: str = ..., *, ndmin: L[0, 1, 2] = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def genfromtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], dtype: _DTypeLike[_SCT], comments: str = ..., delimiter: None | str | int | Iterable[int] = ..., skip_header: int = ..., skip_footer: int = ..., converters: None | Mapping[int | str, Callable[[str], Any]] = ..., missing_values: Any = ..., filling_values: Any = ..., usecols: None | Sequence[int] = ..., names: L[None, True] | str | Collection[str] = ..., excludelist: None | Sequence[str] = ..., deletechars: str = ..., replace_space: str = ..., autostrip: bool = ..., case_sensitive: bool | L['upper', 'lower'] = ..., defaultfmt: str = ..., unpack: None | bool = ..., usemask: bool = ..., loose: bool = ..., invalid_raise: bool = ..., max_rows: None | int = ..., encoding: str = ..., *, ndmin: L[0, 1, 2] = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def genfromtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], dtype: DTypeLike, comments: str = ..., delimiter: None | str | int | Iterable[int] = ..., skip_header: int = ..., skip_footer: int = ..., converters: None | Mapping[int | str, Callable[[str], Any]] = ..., missing_values: Any = ..., filling_values: Any = ..., usecols: None | Sequence[int] = ..., names: L[None, True] | str | Collection[str] = ..., excludelist: None | Sequence[str] = ..., deletechars: str = ..., replace_space: str = ..., autostrip: bool = ..., case_sensitive: bool | L['upper', 'lower'] = ..., defaultfmt: str = ..., unpack: None | bool = ..., usemask: bool = ..., loose: bool = ..., invalid_raise: bool = ..., max_rows: None | int = ..., encoding: str = ..., *, ndmin: L[0, 1, 2] = ..., like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def recfromtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], *, usemask: L[False] = ..., **kwargs: Any) -> recarray[Any, dtype[record]]: + ... + +@overload +def recfromtxt(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], *, usemask: L[True], **kwargs: Any) -> MaskedRecords[Any, dtype[void]]: + ... + +@overload +def recfromcsv(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], *, usemask: L[False] = ..., **kwargs: Any) -> recarray[Any, dtype[record]]: + ... + +@overload +def recfromcsv(fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes], *, usemask: L[True], **kwargs: Any) -> MaskedRecords[Any, dtype[void]]: + ... + diff --git a/typings/numpy/lib/polynomial.pyi b/typings/numpy/lib/polynomial.pyi new file mode 100644 index 0000000..d3bbd92 --- /dev/null +++ b/typings/numpy/lib/polynomial.pyi @@ -0,0 +1,183 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, Literal as L, NoReturn, SupportsIndex, SupportsInt, TypeVar, overload +from numpy import bool_, complex128, complexfloating, float64, floating, int32, int64, object_, poly1d as poly1d, signedinteger, unsignedinteger +from numpy._typing import ArrayLike, NDArray, _ArrayLikeBool_co, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeUInt_co + +_T = TypeVar("_T") +_2Tup = tuple[_T, _T] +_5Tup = tuple[_T, NDArray[float64], NDArray[int32], NDArray[float64], NDArray[float64],] +__all__: list[str] +def poly(seq_of_zeros: ArrayLike) -> NDArray[floating[Any]]: + ... + +def roots(p: ArrayLike) -> NDArray[complexfloating[Any, Any]] | NDArray[floating[Any]]: + ... + +@overload +def polyint(p: poly1d, m: SupportsInt | SupportsIndex = ..., k: None | _ArrayLikeComplex_co | _ArrayLikeObject_co = ...) -> poly1d: + ... + +@overload +def polyint(p: _ArrayLikeFloat_co, m: SupportsInt | SupportsIndex = ..., k: None | _ArrayLikeFloat_co = ...) -> NDArray[floating[Any]]: + ... + +@overload +def polyint(p: _ArrayLikeComplex_co, m: SupportsInt | SupportsIndex = ..., k: None | _ArrayLikeComplex_co = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def polyint(p: _ArrayLikeObject_co, m: SupportsInt | SupportsIndex = ..., k: None | _ArrayLikeObject_co = ...) -> NDArray[object_]: + ... + +@overload +def polyder(p: poly1d, m: SupportsInt | SupportsIndex = ...) -> poly1d: + ... + +@overload +def polyder(p: _ArrayLikeFloat_co, m: SupportsInt | SupportsIndex = ...) -> NDArray[floating[Any]]: + ... + +@overload +def polyder(p: _ArrayLikeComplex_co, m: SupportsInt | SupportsIndex = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def polyder(p: _ArrayLikeObject_co, m: SupportsInt | SupportsIndex = ...) -> NDArray[object_]: + ... + +@overload +def polyfit(x: _ArrayLikeFloat_co, y: _ArrayLikeFloat_co, deg: SupportsIndex | SupportsInt, rcond: None | float = ..., full: L[False] = ..., w: None | _ArrayLikeFloat_co = ..., cov: L[False] = ...) -> NDArray[float64]: + ... + +@overload +def polyfit(x: _ArrayLikeComplex_co, y: _ArrayLikeComplex_co, deg: SupportsIndex | SupportsInt, rcond: None | float = ..., full: L[False] = ..., w: None | _ArrayLikeFloat_co = ..., cov: L[False] = ...) -> NDArray[complex128]: + ... + +@overload +def polyfit(x: _ArrayLikeFloat_co, y: _ArrayLikeFloat_co, deg: SupportsIndex | SupportsInt, rcond: None | float = ..., full: L[False] = ..., w: None | _ArrayLikeFloat_co = ..., cov: L[True, "unscaled"] = ...) -> _2Tup[NDArray[float64]]: + ... + +@overload +def polyfit(x: _ArrayLikeComplex_co, y: _ArrayLikeComplex_co, deg: SupportsIndex | SupportsInt, rcond: None | float = ..., full: L[False] = ..., w: None | _ArrayLikeFloat_co = ..., cov: L[True, "unscaled"] = ...) -> _2Tup[NDArray[complex128]]: + ... + +@overload +def polyfit(x: _ArrayLikeFloat_co, y: _ArrayLikeFloat_co, deg: SupportsIndex | SupportsInt, rcond: None | float = ..., full: L[True] = ..., w: None | _ArrayLikeFloat_co = ..., cov: bool | L["unscaled"] = ...) -> _5Tup[NDArray[float64]]: + ... + +@overload +def polyfit(x: _ArrayLikeComplex_co, y: _ArrayLikeComplex_co, deg: SupportsIndex | SupportsInt, rcond: None | float = ..., full: L[True] = ..., w: None | _ArrayLikeFloat_co = ..., cov: bool | L["unscaled"] = ...) -> _5Tup[NDArray[complex128]]: + ... + +@overload +def polyval(p: _ArrayLikeBool_co, x: _ArrayLikeBool_co) -> NDArray[int64]: + ... + +@overload +def polyval(p: _ArrayLikeUInt_co, x: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def polyval(p: _ArrayLikeInt_co, x: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + +@overload +def polyval(p: _ArrayLikeFloat_co, x: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def polyval(p: _ArrayLikeComplex_co, x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def polyval(p: _ArrayLikeObject_co, x: _ArrayLikeObject_co) -> NDArray[object_]: + ... + +@overload +def polyadd(a1: poly1d, a2: _ArrayLikeComplex_co | _ArrayLikeObject_co) -> poly1d: + ... + +@overload +def polyadd(a1: _ArrayLikeComplex_co | _ArrayLikeObject_co, a2: poly1d) -> poly1d: + ... + +@overload +def polyadd(a1: _ArrayLikeBool_co, a2: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + +@overload +def polyadd(a1: _ArrayLikeUInt_co, a2: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def polyadd(a1: _ArrayLikeInt_co, a2: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + +@overload +def polyadd(a1: _ArrayLikeFloat_co, a2: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def polyadd(a1: _ArrayLikeComplex_co, a2: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def polyadd(a1: _ArrayLikeObject_co, a2: _ArrayLikeObject_co) -> NDArray[object_]: + ... + +@overload +def polysub(a1: poly1d, a2: _ArrayLikeComplex_co | _ArrayLikeObject_co) -> poly1d: + ... + +@overload +def polysub(a1: _ArrayLikeComplex_co | _ArrayLikeObject_co, a2: poly1d) -> poly1d: + ... + +@overload +def polysub(a1: _ArrayLikeBool_co, a2: _ArrayLikeBool_co) -> NoReturn: + ... + +@overload +def polysub(a1: _ArrayLikeUInt_co, a2: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def polysub(a1: _ArrayLikeInt_co, a2: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + +@overload +def polysub(a1: _ArrayLikeFloat_co, a2: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def polysub(a1: _ArrayLikeComplex_co, a2: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def polysub(a1: _ArrayLikeObject_co, a2: _ArrayLikeObject_co) -> NDArray[object_]: + ... + +polymul = ... +@overload +def polydiv(u: poly1d, v: _ArrayLikeComplex_co | _ArrayLikeObject_co) -> _2Tup[poly1d]: + ... + +@overload +def polydiv(u: _ArrayLikeComplex_co | _ArrayLikeObject_co, v: poly1d) -> _2Tup[poly1d]: + ... + +@overload +def polydiv(u: _ArrayLikeFloat_co, v: _ArrayLikeFloat_co) -> _2Tup[NDArray[floating[Any]]]: + ... + +@overload +def polydiv(u: _ArrayLikeComplex_co, v: _ArrayLikeComplex_co) -> _2Tup[NDArray[complexfloating[Any, Any]]]: + ... + +@overload +def polydiv(u: _ArrayLikeObject_co, v: _ArrayLikeObject_co) -> _2Tup[NDArray[Any]]: + ... + diff --git a/typings/numpy/lib/scimath.pyi b/typings/numpy/lib/scimath.pyi new file mode 100644 index 0000000..f12055a --- /dev/null +++ b/typings/numpy/lib/scimath.pyi @@ -0,0 +1,153 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, overload +from numpy import complexfloating +from numpy._typing import NDArray, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ComplexLike_co, _FloatLike_co + +__all__: list[str] +@overload +def sqrt(x: _FloatLike_co) -> Any: + ... + +@overload +def sqrt(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def sqrt(x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def sqrt(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def log(x: _FloatLike_co) -> Any: + ... + +@overload +def log(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def log(x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def log(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def log10(x: _FloatLike_co) -> Any: + ... + +@overload +def log10(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def log10(x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def log10(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def log2(x: _FloatLike_co) -> Any: + ... + +@overload +def log2(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def log2(x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def log2(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def logn(n: _FloatLike_co, x: _FloatLike_co) -> Any: + ... + +@overload +def logn(n: _ComplexLike_co, x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def logn(n: _ArrayLikeFloat_co, x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def logn(n: _ArrayLikeComplex_co, x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def power(x: _FloatLike_co, p: _FloatLike_co) -> Any: + ... + +@overload +def power(x: _ComplexLike_co, p: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def power(x: _ArrayLikeFloat_co, p: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def power(x: _ArrayLikeComplex_co, p: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def arccos(x: _FloatLike_co) -> Any: + ... + +@overload +def arccos(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def arccos(x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def arccos(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def arcsin(x: _FloatLike_co) -> Any: + ... + +@overload +def arcsin(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def arcsin(x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def arcsin(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def arctanh(x: _FloatLike_co) -> Any: + ... + +@overload +def arctanh(x: _ComplexLike_co) -> complexfloating[Any, Any]: + ... + +@overload +def arctanh(x: _ArrayLikeFloat_co) -> NDArray[Any]: + ... + +@overload +def arctanh(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + diff --git a/typings/numpy/lib/shape_base.pyi b/typings/numpy/lib/shape_base.pyi new file mode 100644 index 0000000..69d16c4 --- /dev/null +++ b/typings/numpy/lib/shape_base.pyi @@ -0,0 +1,177 @@ +""" +This type stub file was generated by pyright. +""" + +import sys +from collections.abc import Callable, Sequence +from typing import Any, Concatenate, ParamSpec, Protocol, SupportsIndex, TypeVar, overload +from numpy import bool_, complexfloating, floating, generic, integer, object_, signedinteger, ufunc, unsignedinteger +from numpy._typing import ArrayLike, NDArray, _ArrayLike, _ArrayLikeBool_co, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeUInt_co, _ShapeLike + +if sys.version_info >= (3, 10): + ... +else: + ... +_P = ParamSpec("_P") +_SCT = TypeVar("_SCT", bound=generic) +class _ArrayWrap(Protocol): + def __call__(self, array: NDArray[Any], context: None | tuple[ufunc, tuple[Any, ...], int] = ..., /) -> Any: + ... + + + +class _ArrayPrepare(Protocol): + def __call__(self, array: NDArray[Any], context: None | tuple[ufunc, tuple[Any, ...], int] = ..., /) -> Any: + ... + + + +class _SupportsArrayWrap(Protocol): + @property + def __array_wrap__(self) -> _ArrayWrap: + ... + + + +class _SupportsArrayPrepare(Protocol): + @property + def __array_prepare__(self) -> _ArrayPrepare: + ... + + + +__all__: list[str] +row_stack = ... +def take_along_axis(arr: _SCT | NDArray[_SCT], indices: NDArray[integer[Any]], axis: None | int) -> NDArray[_SCT]: + ... + +def put_along_axis(arr: NDArray[_SCT], indices: NDArray[integer[Any]], values: ArrayLike, axis: None | int) -> None: + ... + +@overload +def apply_along_axis(func1d: Callable[Concatenate[NDArray[Any], _P], _ArrayLike[_SCT]], axis: SupportsIndex, arr: ArrayLike, *args: _P.args, **kwargs: _P.kwargs) -> NDArray[_SCT]: + ... + +@overload +def apply_along_axis(func1d: Callable[Concatenate[NDArray[Any], _P], ArrayLike], axis: SupportsIndex, arr: ArrayLike, *args: _P.args, **kwargs: _P.kwargs) -> NDArray[Any]: + ... + +def apply_over_axes(func: Callable[[NDArray[Any], int], NDArray[_SCT]], a: ArrayLike, axes: int | Sequence[int]) -> NDArray[_SCT]: + ... + +@overload +def expand_dims(a: _ArrayLike[_SCT], axis: _ShapeLike) -> NDArray[_SCT]: + ... + +@overload +def expand_dims(a: ArrayLike, axis: _ShapeLike) -> NDArray[Any]: + ... + +@overload +def column_stack(tup: Sequence[_ArrayLike[_SCT]]) -> NDArray[_SCT]: + ... + +@overload +def column_stack(tup: Sequence[ArrayLike]) -> NDArray[Any]: + ... + +@overload +def dstack(tup: Sequence[_ArrayLike[_SCT]]) -> NDArray[_SCT]: + ... + +@overload +def dstack(tup: Sequence[ArrayLike]) -> NDArray[Any]: + ... + +@overload +def array_split(ary: _ArrayLike[_SCT], indices_or_sections: _ShapeLike, axis: SupportsIndex = ...) -> list[NDArray[_SCT]]: + ... + +@overload +def array_split(ary: ArrayLike, indices_or_sections: _ShapeLike, axis: SupportsIndex = ...) -> list[NDArray[Any]]: + ... + +@overload +def split(ary: _ArrayLike[_SCT], indices_or_sections: _ShapeLike, axis: SupportsIndex = ...) -> list[NDArray[_SCT]]: + ... + +@overload +def split(ary: ArrayLike, indices_or_sections: _ShapeLike, axis: SupportsIndex = ...) -> list[NDArray[Any]]: + ... + +@overload +def hsplit(ary: _ArrayLike[_SCT], indices_or_sections: _ShapeLike) -> list[NDArray[_SCT]]: + ... + +@overload +def hsplit(ary: ArrayLike, indices_or_sections: _ShapeLike) -> list[NDArray[Any]]: + ... + +@overload +def vsplit(ary: _ArrayLike[_SCT], indices_or_sections: _ShapeLike) -> list[NDArray[_SCT]]: + ... + +@overload +def vsplit(ary: ArrayLike, indices_or_sections: _ShapeLike) -> list[NDArray[Any]]: + ... + +@overload +def dsplit(ary: _ArrayLike[_SCT], indices_or_sections: _ShapeLike) -> list[NDArray[_SCT]]: + ... + +@overload +def dsplit(ary: ArrayLike, indices_or_sections: _ShapeLike) -> list[NDArray[Any]]: + ... + +@overload +def get_array_prepare(*args: _SupportsArrayPrepare) -> _ArrayPrepare: + ... + +@overload +def get_array_prepare(*args: object) -> None | _ArrayPrepare: + ... + +@overload +def get_array_wrap(*args: _SupportsArrayWrap) -> _ArrayWrap: + ... + +@overload +def get_array_wrap(*args: object) -> None | _ArrayWrap: + ... + +@overload +def kron(a: _ArrayLikeBool_co, b: _ArrayLikeBool_co) -> NDArray[bool_]: + ... + +@overload +def kron(a: _ArrayLikeUInt_co, b: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: + ... + +@overload +def kron(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: + ... + +@overload +def kron(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def kron(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def kron(a: _ArrayLikeObject_co, b: Any) -> NDArray[object_]: + ... + +@overload +def kron(a: Any, b: _ArrayLikeObject_co) -> NDArray[object_]: + ... + +@overload +def tile(A: _ArrayLike[_SCT], reps: int | Sequence[int]) -> NDArray[_SCT]: + ... + +@overload +def tile(A: ArrayLike, reps: int | Sequence[int]) -> NDArray[Any]: + ... + diff --git a/typings/numpy/lib/stride_tricks.pyi b/typings/numpy/lib/stride_tricks.pyi new file mode 100644 index 0000000..7d3fb1e --- /dev/null +++ b/typings/numpy/lib/stride_tricks.pyi @@ -0,0 +1,49 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Iterable +from typing import Any, SupportsIndex, TypeVar, overload +from numpy import generic +from numpy._typing import ArrayLike, NDArray, _ArrayLike, _Shape, _ShapeLike + +_SCT = TypeVar("_SCT", bound=generic) +__all__: list[str] +class DummyArray: + __array_interface__: dict[str, Any] + base: None | NDArray[Any] + def __init__(self, interface: dict[str, Any], base: None | NDArray[Any] = ...) -> None: + ... + + + +@overload +def as_strided(x: _ArrayLike[_SCT], shape: None | Iterable[int] = ..., strides: None | Iterable[int] = ..., subok: bool = ..., writeable: bool = ...) -> NDArray[_SCT]: + ... + +@overload +def as_strided(x: ArrayLike, shape: None | Iterable[int] = ..., strides: None | Iterable[int] = ..., subok: bool = ..., writeable: bool = ...) -> NDArray[Any]: + ... + +@overload +def sliding_window_view(x: _ArrayLike[_SCT], window_shape: int | Iterable[int], axis: None | SupportsIndex = ..., *, subok: bool = ..., writeable: bool = ...) -> NDArray[_SCT]: + ... + +@overload +def sliding_window_view(x: ArrayLike, window_shape: int | Iterable[int], axis: None | SupportsIndex = ..., *, subok: bool = ..., writeable: bool = ...) -> NDArray[Any]: + ... + +@overload +def broadcast_to(array: _ArrayLike[_SCT], shape: int | Iterable[int], subok: bool = ...) -> NDArray[_SCT]: + ... + +@overload +def broadcast_to(array: ArrayLike, shape: int | Iterable[int], subok: bool = ...) -> NDArray[Any]: + ... + +def broadcast_shapes(*args: _ShapeLike) -> _Shape: + ... + +def broadcast_arrays(*args: ArrayLike, subok: bool = ...) -> list[NDArray[Any]]: + ... + diff --git a/typings/numpy/lib/twodim_base.pyi b/typings/numpy/lib/twodim_base.pyi new file mode 100644 index 0000000..2a05513 --- /dev/null +++ b/typings/numpy/lib/twodim_base.pyi @@ -0,0 +1,133 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable, Sequence +from typing import Any, TypeVar, Union, overload +from numpy import _OrderCF, bool_, complexfloating, datetime64, float64, floating, generic, int_, intp, number, object_, signedinteger, timedelta64 +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLike, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _DTypeLike, _SupportsArrayFunc + +_T = TypeVar("_T") +_SCT = TypeVar("_SCT", bound=generic) +_MaskFunc = Callable[[NDArray[int_], _T], NDArray[Union[number[Any], bool_, timedelta64, datetime64, object_]],] +__all__: list[str] +@overload +def fliplr(m: _ArrayLike[_SCT]) -> NDArray[_SCT]: + ... + +@overload +def fliplr(m: ArrayLike) -> NDArray[Any]: + ... + +@overload +def flipud(m: _ArrayLike[_SCT]) -> NDArray[_SCT]: + ... + +@overload +def flipud(m: ArrayLike) -> NDArray[Any]: + ... + +@overload +def eye(N: int, M: None | int = ..., k: int = ..., dtype: None = ..., order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def eye(N: int, M: None | int = ..., k: int = ..., dtype: _DTypeLike[_SCT] = ..., order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def eye(N: int, M: None | int = ..., k: int = ..., dtype: DTypeLike = ..., order: _OrderCF = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def diag(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: + ... + +@overload +def diag(v: ArrayLike, k: int = ...) -> NDArray[Any]: + ... + +@overload +def diagflat(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: + ... + +@overload +def diagflat(v: ArrayLike, k: int = ...) -> NDArray[Any]: + ... + +@overload +def tri(N: int, M: None | int = ..., k: int = ..., dtype: None = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[float64]: + ... + +@overload +def tri(N: int, M: None | int = ..., k: int = ..., dtype: _DTypeLike[_SCT] = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[_SCT]: + ... + +@overload +def tri(N: int, M: None | int = ..., k: int = ..., dtype: DTypeLike = ..., *, like: None | _SupportsArrayFunc = ...) -> NDArray[Any]: + ... + +@overload +def tril(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: + ... + +@overload +def tril(v: ArrayLike, k: int = ...) -> NDArray[Any]: + ... + +@overload +def triu(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: + ... + +@overload +def triu(v: ArrayLike, k: int = ...) -> NDArray[Any]: + ... + +@overload +def vander(x: _ArrayLikeInt_co, N: None | int = ..., increasing: bool = ...) -> NDArray[signedinteger[Any]]: + ... + +@overload +def vander(x: _ArrayLikeFloat_co, N: None | int = ..., increasing: bool = ...) -> NDArray[floating[Any]]: + ... + +@overload +def vander(x: _ArrayLikeComplex_co, N: None | int = ..., increasing: bool = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def vander(x: _ArrayLikeObject_co, N: None | int = ..., increasing: bool = ...) -> NDArray[object_]: + ... + +@overload +def histogram2d(x: _ArrayLikeFloat_co, y: _ArrayLikeFloat_co, bins: int | Sequence[int] = ..., range: None | _ArrayLikeFloat_co = ..., density: None | bool = ..., weights: None | _ArrayLikeFloat_co = ...) -> tuple[NDArray[float64], NDArray[floating[Any]], NDArray[floating[Any]],]: + ... + +@overload +def histogram2d(x: _ArrayLikeComplex_co, y: _ArrayLikeComplex_co, bins: int | Sequence[int] = ..., range: None | _ArrayLikeFloat_co = ..., density: None | bool = ..., weights: None | _ArrayLikeFloat_co = ...) -> tuple[NDArray[float64], NDArray[complexfloating[Any, Any]], NDArray[complexfloating[Any, Any]],]: + ... + +@overload +def histogram2d(x: _ArrayLikeComplex_co, y: _ArrayLikeComplex_co, bins: Sequence[_ArrayLikeInt_co], range: None | _ArrayLikeFloat_co = ..., density: None | bool = ..., weights: None | _ArrayLikeFloat_co = ...) -> tuple[NDArray[float64], NDArray[Any], NDArray[Any],]: + ... + +@overload +def mask_indices(n: int, mask_func: _MaskFunc[int], k: int = ...) -> tuple[NDArray[intp], NDArray[intp]]: + ... + +@overload +def mask_indices(n: int, mask_func: _MaskFunc[_T], k: _T) -> tuple[NDArray[intp], NDArray[intp]]: + ... + +def tril_indices(n: int, k: int = ..., m: None | int = ...) -> tuple[NDArray[int_], NDArray[int_]]: + ... + +def tril_indices_from(arr: NDArray[Any], k: int = ...) -> tuple[NDArray[int_], NDArray[int_]]: + ... + +def triu_indices(n: int, k: int = ..., m: None | int = ...) -> tuple[NDArray[int_], NDArray[int_]]: + ... + +def triu_indices_from(arr: NDArray[Any], k: int = ...) -> tuple[NDArray[int_], NDArray[int_]]: + ... + diff --git a/typings/numpy/lib/type_check.pyi b/typings/numpy/lib/type_check.pyi new file mode 100644 index 0000000..8d378e5 --- /dev/null +++ b/typings/numpy/lib/type_check.pyi @@ -0,0 +1,218 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Container, Iterable +from typing import Any, Literal as L, Protocol, TypeVar, overload +from numpy import bool_, complexfloating, dtype, float64, floating, generic, integer +from numpy._typing import ArrayLike, DTypeLike, NBitBase, NDArray, _64Bit, _ArrayLike, _DTypeLikeComplex, _ScalarLike_co, _SupportsDType + +_T = TypeVar("_T") +_T_co = TypeVar("_T_co", covariant=True) +_SCT = TypeVar("_SCT", bound=generic) +_NBit1 = TypeVar("_NBit1", bound=NBitBase) +_NBit2 = TypeVar("_NBit2", bound=NBitBase) +class _SupportsReal(Protocol[_T_co]): + @property + def real(self) -> _T_co: + ... + + + +class _SupportsImag(Protocol[_T_co]): + @property + def imag(self) -> _T_co: + ... + + + +__all__: list[str] +def mintypecode(typechars: Iterable[str | ArrayLike], typeset: Container[str] = ..., default: str = ...) -> str: + ... + +@overload +def asfarray(a: object, dtype: None | type[float] = ...) -> NDArray[float64]: + ... + +@overload +def asfarray(a: Any, dtype: _DTypeLikeComplex) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def asfarray(a: Any, dtype: DTypeLike) -> NDArray[floating[Any]]: + ... + +@overload +def real(val: _SupportsReal[_T]) -> _T: + ... + +@overload +def real(val: ArrayLike) -> NDArray[Any]: + ... + +@overload +def imag(val: _SupportsImag[_T]) -> _T: + ... + +@overload +def imag(val: ArrayLike) -> NDArray[Any]: + ... + +@overload +def iscomplex(x: _ScalarLike_co) -> bool_: + ... + +@overload +def iscomplex(x: ArrayLike) -> NDArray[bool_]: + ... + +@overload +def isreal(x: _ScalarLike_co) -> bool_: + ... + +@overload +def isreal(x: ArrayLike) -> NDArray[bool_]: + ... + +def iscomplexobj(x: _SupportsDType[dtype[Any]] | ArrayLike) -> bool: + ... + +def isrealobj(x: _SupportsDType[dtype[Any]] | ArrayLike) -> bool: + ... + +@overload +def nan_to_num(x: _SCT, copy: bool = ..., nan: float = ..., posinf: None | float = ..., neginf: None | float = ...) -> _SCT: + ... + +@overload +def nan_to_num(x: _ScalarLike_co, copy: bool = ..., nan: float = ..., posinf: None | float = ..., neginf: None | float = ...) -> Any: + ... + +@overload +def nan_to_num(x: _ArrayLike[_SCT], copy: bool = ..., nan: float = ..., posinf: None | float = ..., neginf: None | float = ...) -> NDArray[_SCT]: + ... + +@overload +def nan_to_num(x: ArrayLike, copy: bool = ..., nan: float = ..., posinf: None | float = ..., neginf: None | float = ...) -> NDArray[Any]: + ... + +@overload +def real_if_close(a: _ArrayLike[complexfloating[_NBit1, _NBit1]], tol: float = ...) -> NDArray[floating[_NBit1]] | NDArray[complexfloating[_NBit1, _NBit1]]: + ... + +@overload +def real_if_close(a: _ArrayLike[_SCT], tol: float = ...) -> NDArray[_SCT]: + ... + +@overload +def real_if_close(a: ArrayLike, tol: float = ...) -> NDArray[Any]: + ... + +@overload +def typename(char: L['S1']) -> L['character']: + ... + +@overload +def typename(char: L['?']) -> L['bool']: + ... + +@overload +def typename(char: L['b']) -> L['signed char']: + ... + +@overload +def typename(char: L['B']) -> L['unsigned char']: + ... + +@overload +def typename(char: L['h']) -> L['short']: + ... + +@overload +def typename(char: L['H']) -> L['unsigned short']: + ... + +@overload +def typename(char: L['i']) -> L['integer']: + ... + +@overload +def typename(char: L['I']) -> L['unsigned integer']: + ... + +@overload +def typename(char: L['l']) -> L['long integer']: + ... + +@overload +def typename(char: L['L']) -> L['unsigned long integer']: + ... + +@overload +def typename(char: L['q']) -> L['long long integer']: + ... + +@overload +def typename(char: L['Q']) -> L['unsigned long long integer']: + ... + +@overload +def typename(char: L['f']) -> L['single precision']: + ... + +@overload +def typename(char: L['d']) -> L['double precision']: + ... + +@overload +def typename(char: L['g']) -> L['long precision']: + ... + +@overload +def typename(char: L['F']) -> L['complex single precision']: + ... + +@overload +def typename(char: L['D']) -> L['complex double precision']: + ... + +@overload +def typename(char: L['G']) -> L['complex long double precision']: + ... + +@overload +def typename(char: L['S']) -> L['string']: + ... + +@overload +def typename(char: L['U']) -> L['unicode']: + ... + +@overload +def typename(char: L['V']) -> L['void']: + ... + +@overload +def typename(char: L['O']) -> L['object']: + ... + +@overload +def common_type(*arrays: _SupportsDType[dtype[integer[Any]]]) -> type[floating[_64Bit]]: + ... + +@overload +def common_type(*arrays: _SupportsDType[dtype[floating[_NBit1]]]) -> type[floating[_NBit1]]: + ... + +@overload +def common_type(*arrays: _SupportsDType[dtype[integer[Any] | floating[_NBit1]]]) -> type[floating[_NBit1 | _64Bit]]: + ... + +@overload +def common_type(*arrays: _SupportsDType[dtype[floating[_NBit1] | complexfloating[_NBit2, _NBit2]]]) -> type[complexfloating[_NBit1 | _NBit2, _NBit1 | _NBit2]]: + ... + +@overload +def common_type(*arrays: _SupportsDType[dtype[integer[Any] | floating[_NBit1] | complexfloating[_NBit2, _NBit2]]]) -> type[complexfloating[_64Bit | _NBit1 | _NBit2, _64Bit | _NBit1 | _NBit2]]: + ... + diff --git a/typings/numpy/lib/ufunclike.pyi b/typings/numpy/lib/ufunclike.pyi new file mode 100644 index 0000000..2a54fa1 --- /dev/null +++ b/typings/numpy/lib/ufunclike.pyi @@ -0,0 +1,50 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, TypeVar, overload +from numpy import bool_, floating, ndarray, object_ +from numpy._typing import NDArray, _ArrayLikeFloat_co, _ArrayLikeObject_co, _FloatLike_co + +_ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, Any]) +__all__: list[str] +@overload +def fix(x: _FloatLike_co, out: None = ...) -> floating[Any]: + ... + +@overload +def fix(x: _ArrayLikeFloat_co, out: None = ...) -> NDArray[floating[Any]]: + ... + +@overload +def fix(x: _ArrayLikeObject_co, out: None = ...) -> NDArray[object_]: + ... + +@overload +def fix(x: _ArrayLikeFloat_co | _ArrayLikeObject_co, out: _ArrayType) -> _ArrayType: + ... + +@overload +def isposinf(x: _FloatLike_co, out: None = ...) -> bool_: + ... + +@overload +def isposinf(x: _ArrayLikeFloat_co, out: None = ...) -> NDArray[bool_]: + ... + +@overload +def isposinf(x: _ArrayLikeFloat_co, out: _ArrayType) -> _ArrayType: + ... + +@overload +def isneginf(x: _FloatLike_co, out: None = ...) -> bool_: + ... + +@overload +def isneginf(x: _ArrayLikeFloat_co, out: None = ...) -> NDArray[bool_]: + ... + +@overload +def isneginf(x: _ArrayLikeFloat_co, out: _ArrayType) -> _ArrayType: + ... + diff --git a/typings/numpy/lib/utils.pyi b/typings/numpy/lib/utils.pyi new file mode 100644 index 0000000..b558b86 --- /dev/null +++ b/typings/numpy/lib/utils.pyi @@ -0,0 +1,65 @@ +""" +This type stub file was generated by pyright. +""" + +from ast import AST +from collections.abc import Callable, Mapping, Sequence +from typing import Any, Protocol, TypeVar, overload +from numpy import generic, ndarray + +_T_contra = TypeVar("_T_contra", contravariant=True) +_FuncType = TypeVar("_FuncType", bound=Callable[..., Any]) +class _SupportsWrite(Protocol[_T_contra]): + def write(self, s: _T_contra, /) -> Any: + ... + + + +__all__: list[str] +class _Deprecate: + old_name: None | str + new_name: None | str + message: None | str + def __init__(self, old_name: None | str = ..., new_name: None | str = ..., message: None | str = ...) -> None: + ... + + def __call__(self, func: _FuncType) -> _FuncType: + ... + + + +def get_include() -> str: + ... + +@overload +def deprecate(*, old_name: None | str = ..., new_name: None | str = ..., message: None | str = ...) -> _Deprecate: + ... + +@overload +def deprecate(func: _FuncType, /, old_name: None | str = ..., new_name: None | str = ..., message: None | str = ...) -> _FuncType: + ... + +def deprecate_with_doc(msg: None | str) -> _Deprecate: + ... + +def byte_bounds(a: generic | ndarray[Any, Any]) -> tuple[int, int]: + ... + +def who(vardict: None | Mapping[str, ndarray[Any, Any]] = ...) -> None: + ... + +def info(object: object = ..., maxwidth: int = ..., output: None | _SupportsWrite[str] = ..., toplevel: str = ...) -> None: + ... + +def source(object: object, output: None | _SupportsWrite[str] = ...) -> None: + ... + +def lookfor(what: str, module: None | str | Sequence[str] = ..., import_modules: bool = ..., regenerate: bool = ..., output: None | _SupportsWrite[str] = ...) -> None: + ... + +def safe_eval(source: str | AST) -> Any: + ... + +def show_runtime() -> None: + ... + diff --git a/typings/numpy/linalg/__init__.pyi b/typings/numpy/linalg/__init__.pyi new file mode 100644 index 0000000..50b1446 --- /dev/null +++ b/typings/numpy/linalg/__init__.pyi @@ -0,0 +1,14 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy.linalg.linalg import cholesky as cholesky, cond as cond, det as det, eig as eig, eigh as eigh, eigvals as eigvals, eigvalsh as eigvalsh, inv as inv, lstsq as lstsq, matrix_power as matrix_power, matrix_rank as matrix_rank, multi_dot as multi_dot, norm as norm, pinv as pinv, qr as qr, slogdet as slogdet, solve as solve, svd as svd, tensorinv as tensorinv, tensorsolve as tensorsolve +from numpy._pytesttester import PytestTester + +__all__: list[str] +__path__: list[str] +test: PytestTester +class LinAlgError(Exception): + ... + + diff --git a/typings/numpy/linalg/linalg.pyi b/typings/numpy/linalg/linalg.pyi new file mode 100644 index 0000000..c786400 --- /dev/null +++ b/typings/numpy/linalg/linalg.pyi @@ -0,0 +1,233 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Iterable +from typing import Any, Literal as L, NamedTuple, SupportsIndex, SupportsInt, TypeVar, overload +from numpy import complex128, complexfloating, float64, floating, generic, int32 +from numpy._typing import ArrayLike, NDArray, _ArrayLikeComplex_co, _ArrayLikeFloat_co, _ArrayLikeInt_co, _ArrayLikeObject_co, _ArrayLikeTD64_co + +_T = TypeVar("_T") +_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) +_SCT = TypeVar("_SCT", bound=generic, covariant=True) +_SCT2 = TypeVar("_SCT2", bound=generic, covariant=True) +_2Tuple = tuple[_T, _T] +_ModeKind = L["reduced", "complete", "r", "raw"] +__all__: list[str] +class EigResult(NamedTuple): + eigenvalues: NDArray[Any] + eigenvectors: NDArray[Any] + ... + + +class EighResult(NamedTuple): + eigenvalues: NDArray[Any] + eigenvectors: NDArray[Any] + ... + + +class QRResult(NamedTuple): + Q: NDArray[Any] + R: NDArray[Any] + ... + + +class SlogdetResult(NamedTuple): + sign: Any + logabsdet: Any + ... + + +class SVDResult(NamedTuple): + U: NDArray[Any] + S: NDArray[Any] + Vh: NDArray[Any] + ... + + +@overload +def tensorsolve(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, axes: None | Iterable[int] = ...) -> NDArray[float64]: + ... + +@overload +def tensorsolve(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, axes: None | Iterable[int] = ...) -> NDArray[floating[Any]]: + ... + +@overload +def tensorsolve(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, axes: None | Iterable[int] = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def solve(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co) -> NDArray[float64]: + ... + +@overload +def solve(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def solve(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def tensorinv(a: _ArrayLikeInt_co, ind: int = ...) -> NDArray[float64]: + ... + +@overload +def tensorinv(a: _ArrayLikeFloat_co, ind: int = ...) -> NDArray[floating[Any]]: + ... + +@overload +def tensorinv(a: _ArrayLikeComplex_co, ind: int = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def inv(a: _ArrayLikeInt_co) -> NDArray[float64]: + ... + +@overload +def inv(a: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def inv(a: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +def matrix_power(a: _ArrayLikeComplex_co | _ArrayLikeObject_co, n: SupportsIndex) -> NDArray[Any]: + ... + +@overload +def cholesky(a: _ArrayLikeInt_co) -> NDArray[float64]: + ... + +@overload +def cholesky(a: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: + ... + +@overload +def cholesky(a: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def qr(a: _ArrayLikeInt_co, mode: _ModeKind = ...) -> QRResult: + ... + +@overload +def qr(a: _ArrayLikeFloat_co, mode: _ModeKind = ...) -> QRResult: + ... + +@overload +def qr(a: _ArrayLikeComplex_co, mode: _ModeKind = ...) -> QRResult: + ... + +@overload +def eigvals(a: _ArrayLikeInt_co) -> NDArray[float64] | NDArray[complex128]: + ... + +@overload +def eigvals(a: _ArrayLikeFloat_co) -> NDArray[floating[Any]] | NDArray[complexfloating[Any, Any]]: + ... + +@overload +def eigvals(a: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: + ... + +@overload +def eigvalsh(a: _ArrayLikeInt_co, UPLO: L["L", "U", "l", "u"] = ...) -> NDArray[float64]: + ... + +@overload +def eigvalsh(a: _ArrayLikeComplex_co, UPLO: L["L", "U", "l", "u"] = ...) -> NDArray[floating[Any]]: + ... + +@overload +def eig(a: _ArrayLikeInt_co) -> EigResult: + ... + +@overload +def eig(a: _ArrayLikeFloat_co) -> EigResult: + ... + +@overload +def eig(a: _ArrayLikeComplex_co) -> EigResult: + ... + +@overload +def eigh(a: _ArrayLikeInt_co, UPLO: L["L", "U", "l", "u"] = ...) -> EighResult: + ... + +@overload +def eigh(a: _ArrayLikeFloat_co, UPLO: L["L", "U", "l", "u"] = ...) -> EighResult: + ... + +@overload +def eigh(a: _ArrayLikeComplex_co, UPLO: L["L", "U", "l", "u"] = ...) -> EighResult: + ... + +@overload +def svd(a: _ArrayLikeInt_co, full_matrices: bool = ..., compute_uv: L[True] = ..., hermitian: bool = ...) -> SVDResult: + ... + +@overload +def svd(a: _ArrayLikeFloat_co, full_matrices: bool = ..., compute_uv: L[True] = ..., hermitian: bool = ...) -> SVDResult: + ... + +@overload +def svd(a: _ArrayLikeComplex_co, full_matrices: bool = ..., compute_uv: L[True] = ..., hermitian: bool = ...) -> SVDResult: + ... + +@overload +def svd(a: _ArrayLikeInt_co, full_matrices: bool = ..., compute_uv: L[False] = ..., hermitian: bool = ...) -> NDArray[float64]: + ... + +@overload +def svd(a: _ArrayLikeComplex_co, full_matrices: bool = ..., compute_uv: L[False] = ..., hermitian: bool = ...) -> NDArray[floating[Any]]: + ... + +def cond(x: _ArrayLikeComplex_co, p: None | float | L["fro", "nuc"] = ...) -> Any: + ... + +def matrix_rank(A: _ArrayLikeComplex_co, tol: None | _ArrayLikeFloat_co = ..., hermitian: bool = ...) -> Any: + ... + +@overload +def pinv(a: _ArrayLikeInt_co, rcond: _ArrayLikeFloat_co = ..., hermitian: bool = ...) -> NDArray[float64]: + ... + +@overload +def pinv(a: _ArrayLikeFloat_co, rcond: _ArrayLikeFloat_co = ..., hermitian: bool = ...) -> NDArray[floating[Any]]: + ... + +@overload +def pinv(a: _ArrayLikeComplex_co, rcond: _ArrayLikeFloat_co = ..., hermitian: bool = ...) -> NDArray[complexfloating[Any, Any]]: + ... + +def slogdet(a: _ArrayLikeComplex_co) -> SlogdetResult: + ... + +def det(a: _ArrayLikeComplex_co) -> Any: + ... + +@overload +def lstsq(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, rcond: None | float = ...) -> tuple[NDArray[float64], NDArray[float64], int32, NDArray[float64],]: + ... + +@overload +def lstsq(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, rcond: None | float = ...) -> tuple[NDArray[floating[Any]], NDArray[floating[Any]], int32, NDArray[floating[Any]],]: + ... + +@overload +def lstsq(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, rcond: None | float = ...) -> tuple[NDArray[complexfloating[Any, Any]], NDArray[floating[Any]], int32, NDArray[floating[Any]],]: + ... + +@overload +def norm(x: ArrayLike, ord: None | float | L["fro", "nuc"] = ..., axis: None = ..., keepdims: bool = ...) -> floating[Any]: + ... + +@overload +def norm(x: ArrayLike, ord: None | float | L["fro", "nuc"] = ..., axis: SupportsInt | SupportsIndex | tuple[int, ...] = ..., keepdims: bool = ...) -> Any: + ... + +def multi_dot(arrays: Iterable[_ArrayLikeComplex_co | _ArrayLikeObject_co | _ArrayLikeTD64_co], *, out: None | NDArray[Any] = ...) -> Any: + ... + diff --git a/typings/numpy/ma/__init__.pyi b/typings/numpy/ma/__init__.pyi new file mode 100644 index 0000000..52c2a4d --- /dev/null +++ b/typings/numpy/ma/__init__.pyi @@ -0,0 +1,12 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy._pytesttester import PytestTester +from numpy.ma import extras as extras +from numpy.ma.core import MAError as MAError, MaskError as MaskError, MaskType as MaskType, MaskedArray as MaskedArray, abs as abs, absolute as absolute, add as add, all as all, allclose as allclose, allequal as allequal, alltrue as alltrue, amax as amax, amin as amin, angle as angle, anom as anom, anomalies as anomalies, any as any, append as append, arange as arange, arccos as arccos, arccosh as arccosh, arcsin as arcsin, arcsinh as arcsinh, arctan as arctan, arctan2 as arctan2, arctanh as arctanh, argmax as argmax, argmin as argmin, argsort as argsort, around as around, array as array, asanyarray as asanyarray, asarray as asarray, bitwise_and as bitwise_and, bitwise_or as bitwise_or, bitwise_xor as bitwise_xor, bool_ as bool_, ceil as ceil, choose as choose, clip as clip, common_fill_value as common_fill_value, compress as compress, compressed as compressed, concatenate as concatenate, conjugate as conjugate, convolve as convolve, copy as copy, correlate as correlate, cos as cos, cosh as cosh, count as count, cumprod as cumprod, cumsum as cumsum, default_fill_value as default_fill_value, diag as diag, diagonal as diagonal, diff as diff, divide as divide, empty as empty, empty_like as empty_like, equal as equal, exp as exp, expand_dims as expand_dims, fabs as fabs, filled as filled, fix_invalid as fix_invalid, flatten_mask as flatten_mask, flatten_structured_array as flatten_structured_array, floor as floor, floor_divide as floor_divide, fmod as fmod, frombuffer as frombuffer, fromflex as fromflex, fromfunction as fromfunction, getdata as getdata, getmask as getmask, getmaskarray as getmaskarray, greater as greater, greater_equal as greater_equal, harden_mask as harden_mask, hypot as hypot, identity as identity, ids as ids, indices as indices, inner as inner, innerproduct as innerproduct, isMA as isMA, isMaskedArray as isMaskedArray, is_mask as is_mask, is_masked as is_masked, isarray as isarray, left_shift as left_shift, less as less, less_equal as less_equal, log as log, log10 as log10, log2 as log2, logical_and as logical_and, logical_not as logical_not, logical_or as logical_or, logical_xor as logical_xor, make_mask as make_mask, make_mask_descr as make_mask_descr, make_mask_none as make_mask_none, mask_or as mask_or, masked as masked, masked_array as masked_array, masked_equal as masked_equal, masked_greater as masked_greater, masked_greater_equal as masked_greater_equal, masked_inside as masked_inside, masked_invalid as masked_invalid, masked_less as masked_less, masked_less_equal as masked_less_equal, masked_not_equal as masked_not_equal, masked_object as masked_object, masked_outside as masked_outside, masked_print_option as masked_print_option, masked_singleton as masked_singleton, masked_values as masked_values, masked_where as masked_where, max as max, maximum as maximum, maximum_fill_value as maximum_fill_value, mean as mean, min as min, minimum as minimum, minimum_fill_value as minimum_fill_value, mod as mod, multiply as multiply, mvoid as mvoid, ndim as ndim, negative as negative, nomask as nomask, nonzero as nonzero, not_equal as not_equal, ones as ones, outer as outer, outerproduct as outerproduct, power as power, prod as prod, product as product, ptp as ptp, put as put, putmask as putmask, ravel as ravel, remainder as remainder, repeat as repeat, reshape as reshape, resize as resize, right_shift as right_shift, round as round, set_fill_value as set_fill_value, shape as shape, sin as sin, sinh as sinh, size as size, soften_mask as soften_mask, sometrue as sometrue, sort as sort, sqrt as sqrt, squeeze as squeeze, std as std, subtract as subtract, sum as sum, swapaxes as swapaxes, take as take, tan as tan, tanh as tanh, trace as trace, transpose as transpose, true_divide as true_divide, var as var, where as where, zeros as zeros +from numpy.ma.extras import apply_along_axis as apply_along_axis, apply_over_axes as apply_over_axes, atleast_1d as atleast_1d, atleast_2d as atleast_2d, atleast_3d as atleast_3d, average as average, clump_masked as clump_masked, clump_unmasked as clump_unmasked, column_stack as column_stack, compress_cols as compress_cols, compress_nd as compress_nd, compress_rowcols as compress_rowcols, compress_rows as compress_rows, corrcoef as corrcoef, count_masked as count_masked, cov as cov, diagflat as diagflat, dot as dot, dstack as dstack, ediff1d as ediff1d, flatnotmasked_contiguous as flatnotmasked_contiguous, flatnotmasked_edges as flatnotmasked_edges, hsplit as hsplit, hstack as hstack, in1d as in1d, intersect1d as intersect1d, isin as isin, mask_cols as mask_cols, mask_rowcols as mask_rowcols, mask_rows as mask_rows, masked_all as masked_all, masked_all_like as masked_all_like, median as median, mr_ as mr_, ndenumerate as ndenumerate, notmasked_contiguous as notmasked_contiguous, notmasked_edges as notmasked_edges, polyfit as polyfit, row_stack as row_stack, setdiff1d as setdiff1d, setxor1d as setxor1d, stack as stack, union1d as union1d, unique as unique, vander as vander, vstack as vstack + +__all__: list[str] +__path__: list[str] +test: PytestTester diff --git a/typings/numpy/ma/core.pyi b/typings/numpy/ma/core.pyi new file mode 100644 index 0000000..a12e554 --- /dev/null +++ b/typings/numpy/ma/core.pyi @@ -0,0 +1,853 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable +from typing import Any, TypeVar +from numpy import bool_ as bool_, dtype, float64, ndarray, squeeze as squeeze + +_ShapeType = TypeVar("_ShapeType", bound=Any) +_DType_co = TypeVar("_DType_co", bound=dtype[Any], covariant=True) +__all__: list[str] +MaskType = bool_ +nomask: bool_ +class MaskedArrayFutureWarning(FutureWarning): + ... + + +class MAError(Exception): + ... + + +class MaskError(MAError): + ... + + +def default_fill_value(obj): + ... + +def minimum_fill_value(obj): + ... + +def maximum_fill_value(obj): + ... + +def set_fill_value(a, fill_value): + ... + +def common_fill_value(a, b): + ... + +def filled(a, fill_value=...): + ... + +def getdata(a, subok=...): + ... + +get_data = ... +def fix_invalid(a, mask=..., copy=..., fill_value=...): + ... + +class _MaskedUFunc: + f: Any + __doc__: Any + __name__: Any + def __init__(self, ufunc) -> None: + ... + + + +class _MaskedUnaryOperation(_MaskedUFunc): + fill: Any + domain: Any + def __init__(self, mufunc, fill=..., domain=...) -> None: + ... + + def __call__(self, a, *args, **kwargs): + ... + + + +class _MaskedBinaryOperation(_MaskedUFunc): + fillx: Any + filly: Any + def __init__(self, mbfunc, fillx=..., filly=...) -> None: + ... + + def __call__(self, a, b, *args, **kwargs): + ... + + def reduce(self, target, axis=..., dtype=...): + ... + + def outer(self, a, b): + ... + + def accumulate(self, target, axis=...): + ... + + + +class _DomainedBinaryOperation(_MaskedUFunc): + domain: Any + fillx: Any + filly: Any + def __init__(self, dbfunc, domain, fillx=..., filly=...) -> None: + ... + + def __call__(self, a, b, *args, **kwargs): + ... + + + +exp: _MaskedUnaryOperation +conjugate: _MaskedUnaryOperation +sin: _MaskedUnaryOperation +cos: _MaskedUnaryOperation +arctan: _MaskedUnaryOperation +arcsinh: _MaskedUnaryOperation +sinh: _MaskedUnaryOperation +cosh: _MaskedUnaryOperation +tanh: _MaskedUnaryOperation +abs: _MaskedUnaryOperation +absolute: _MaskedUnaryOperation +fabs: _MaskedUnaryOperation +negative: _MaskedUnaryOperation +floor: _MaskedUnaryOperation +ceil: _MaskedUnaryOperation +around: _MaskedUnaryOperation +logical_not: _MaskedUnaryOperation +sqrt: _MaskedUnaryOperation +log: _MaskedUnaryOperation +log2: _MaskedUnaryOperation +log10: _MaskedUnaryOperation +tan: _MaskedUnaryOperation +arcsin: _MaskedUnaryOperation +arccos: _MaskedUnaryOperation +arccosh: _MaskedUnaryOperation +arctanh: _MaskedUnaryOperation +add: _MaskedBinaryOperation +subtract: _MaskedBinaryOperation +multiply: _MaskedBinaryOperation +arctan2: _MaskedBinaryOperation +equal: _MaskedBinaryOperation +not_equal: _MaskedBinaryOperation +less_equal: _MaskedBinaryOperation +greater_equal: _MaskedBinaryOperation +less: _MaskedBinaryOperation +greater: _MaskedBinaryOperation +logical_and: _MaskedBinaryOperation +alltrue: _MaskedBinaryOperation +logical_or: _MaskedBinaryOperation +sometrue: Callable[..., Any] +logical_xor: _MaskedBinaryOperation +bitwise_and: _MaskedBinaryOperation +bitwise_or: _MaskedBinaryOperation +bitwise_xor: _MaskedBinaryOperation +hypot: _MaskedBinaryOperation +divide: _MaskedBinaryOperation +true_divide: _MaskedBinaryOperation +floor_divide: _MaskedBinaryOperation +remainder: _MaskedBinaryOperation +fmod: _MaskedBinaryOperation +mod: _MaskedBinaryOperation +def make_mask_descr(ndtype): + ... + +def getmask(a): + ... + +get_mask = ... +def getmaskarray(arr): + ... + +def is_mask(m): + ... + +def make_mask(m, copy=..., shrink=..., dtype=...): + ... + +def make_mask_none(newshape, dtype=...): + ... + +def mask_or(m1, m2, copy=..., shrink=...): + ... + +def flatten_mask(mask): + ... + +def masked_where(condition, a, copy=...): + ... + +def masked_greater(x, value, copy=...): + ... + +def masked_greater_equal(x, value, copy=...): + ... + +def masked_less(x, value, copy=...): + ... + +def masked_less_equal(x, value, copy=...): + ... + +def masked_not_equal(x, value, copy=...): + ... + +def masked_equal(x, value, copy=...): + ... + +def masked_inside(x, v1, v2, copy=...): + ... + +def masked_outside(x, v1, v2, copy=...): + ... + +def masked_object(x, value, copy=..., shrink=...): + ... + +def masked_values(x, value, rtol=..., atol=..., copy=..., shrink=...): + ... + +def masked_invalid(a, copy=...): + ... + +class _MaskedPrintOption: + def __init__(self, display) -> None: + ... + + def display(self): + ... + + def set_display(self, s): + ... + + def enabled(self): + ... + + def enable(self, shrink=...): + ... + + + +masked_print_option: _MaskedPrintOption +def flatten_structured_array(a): + ... + +class MaskedIterator: + ma: Any + dataiter: Any + maskiter: Any + def __init__(self, ma) -> None: + ... + + def __iter__(self): + ... + + def __getitem__(self, indx): + ... + + def __setitem__(self, index, value): + ... + + def __next__(self): + ... + + + +class MaskedArray(ndarray[_ShapeType, _DType_co]): + __array_priority__: Any + def __new__(cls, data=..., mask=..., dtype=..., copy=..., subok=..., ndmin=..., fill_value=..., keep_mask=..., hard_mask=..., shrink=..., order=...): + ... + + def __array_finalize__(self, obj): + ... + + def __array_wrap__(self, obj, context=...): + ... + + def view(self, dtype=..., type=..., fill_value=...): + ... + + def __getitem__(self, indx): + ... + + def __setitem__(self, indx, value): + ... + + @property + def dtype(self): + ... + + @dtype.setter + def dtype(self, dtype): + ... + + @property + def shape(self): + ... + + @shape.setter + def shape(self, shape): + ... + + def __setmask__(self, mask, copy=...): + ... + + @property + def mask(self): + ... + + @mask.setter + def mask(self, value): + ... + + @property + def recordmask(self): + ... + + @recordmask.setter + def recordmask(self, mask): + ... + + def harden_mask(self): + ... + + def soften_mask(self): + ... + + @property + def hardmask(self): + ... + + def unshare_mask(self): + ... + + @property + def sharedmask(self): + ... + + def shrink_mask(self): + ... + + @property + def baseclass(self): + ... + + data: Any + @property + def flat(self): + ... + + @flat.setter + def flat(self, value): + ... + + @property + def fill_value(self): + ... + + @fill_value.setter + def fill_value(self, value=...): + ... + + get_fill_value: Any + set_fill_value: Any + def filled(self, fill_value=...): + ... + + def compressed(self): + ... + + def compress(self, condition, axis=..., out=...): + ... + + def __eq__(self, other) -> bool: + ... + + def __ne__(self, other) -> bool: + ... + + def __ge__(self, other) -> bool: + ... + + def __gt__(self, other) -> bool: + ... + + def __le__(self, other) -> bool: + ... + + def __lt__(self, other) -> bool: + ... + + def __add__(self, other): + ... + + def __radd__(self, other): + ... + + def __sub__(self, other): + ... + + def __rsub__(self, other): + ... + + def __mul__(self, other): + ... + + def __rmul__(self, other): + ... + + def __div__(self, other): + ... + + def __truediv__(self, other): + ... + + def __rtruediv__(self, other): + ... + + def __floordiv__(self, other): + ... + + def __rfloordiv__(self, other): + ... + + def __pow__(self, other): + ... + + def __rpow__(self, other): + ... + + def __iadd__(self, other): + ... + + def __isub__(self, other): + ... + + def __imul__(self, other): + ... + + def __idiv__(self, other): + ... + + def __ifloordiv__(self, other): + ... + + def __itruediv__(self, other): + ... + + def __ipow__(self, other): + ... + + def __float__(self): + ... + + def __int__(self) -> int: + ... + + @property + def imag(self): + ... + + get_imag: Any + @property + def real(self): + ... + + get_real: Any + def count(self, axis=..., keepdims=...): + ... + + def ravel(self, order=...): + ... + + def reshape(self, *s, **kwargs): + ... + + def resize(self, newshape, refcheck=..., order=...): + ... + + def put(self, indices, values, mode=...): + ... + + def ids(self): + ... + + def iscontiguous(self): + ... + + def all(self, axis=..., out=..., keepdims=...): + ... + + def any(self, axis=..., out=..., keepdims=...): + ... + + def nonzero(self): + ... + + def trace(self, offset=..., axis1=..., axis2=..., dtype=..., out=...): + ... + + def dot(self, b, out=..., strict=...): + ... + + def sum(self, axis=..., dtype=..., out=..., keepdims=...): + ... + + def cumsum(self, axis=..., dtype=..., out=...): + ... + + def prod(self, axis=..., dtype=..., out=..., keepdims=...): + ... + + product: Any + def cumprod(self, axis=..., dtype=..., out=...): + ... + + def mean(self, axis=..., dtype=..., out=..., keepdims=...): + ... + + def anom(self, axis=..., dtype=...): + ... + + def var(self, axis=..., dtype=..., out=..., ddof=..., keepdims=...): + ... + + def std(self, axis=..., dtype=..., out=..., ddof=..., keepdims=...): + ... + + def round(self, decimals=..., out=...): + ... + + def argsort(self, axis=..., kind=..., order=..., endwith=..., fill_value=...): + ... + + def argmin(self, axis=..., fill_value=..., out=..., *, keepdims=...): + ... + + def argmax(self, axis=..., fill_value=..., out=..., *, keepdims=...): + ... + + def sort(self, axis=..., kind=..., order=..., endwith=..., fill_value=...): + ... + + def min(self, axis=..., out=..., fill_value=..., keepdims=...): + ... + + def max(self, axis=..., out=..., fill_value=..., keepdims=...): + ... + + def ptp(self, axis=..., out=..., fill_value=..., keepdims=...): + ... + + def partition(self, *args, **kwargs): + ... + + def argpartition(self, *args, **kwargs): + ... + + def take(self, indices, axis=..., out=..., mode=...): + ... + + copy: Any + diagonal: Any + flatten: Any + repeat: Any + squeeze: Any + swapaxes: Any + T: Any + transpose: Any + def tolist(self, fill_value=...): + ... + + def tobytes(self, fill_value=..., order=...): + ... + + def tofile(self, fid, sep=..., format=...): + ... + + def toflex(self): + ... + + torecords: Any + def __reduce__(self): + ... + + def __deepcopy__(self, memo=...): + ... + + + +class mvoid(MaskedArray[_ShapeType, _DType_co]): + def __new__(self, data, mask=..., dtype=..., fill_value=..., hardmask=..., copy=..., subok=...): + ... + + def __getitem__(self, indx): + ... + + def __setitem__(self, indx, value): + ... + + def __iter__(self): + ... + + def __len__(self): + ... + + def filled(self, fill_value=...): + ... + + def tolist(self): + ... + + + +def isMaskedArray(x): + ... + +isarray = ... +isMA = ... +class MaskedConstant(MaskedArray[Any, dtype[float64]]): + def __new__(cls): + ... + + __class__: Any + def __array_finalize__(self, obj): + ... + + def __array_prepare__(self, obj, context=...): + ... + + def __array_wrap__(self, obj, context=...): + ... + + def __format__(self, format_spec): + ... + + def __reduce__(self): + ... + + def __iop__(self, other): + ... + + __iadd__: Any + __isub__: Any + __imul__: Any + __ifloordiv__: Any + __itruediv__: Any + __ipow__: Any + def copy(self, *args, **kwargs): + ... + + def __copy__(self): + ... + + def __deepcopy__(self, memo): + ... + + def __setattr__(self, attr, value): + ... + + + +masked: MaskedConstant +masked_singleton: MaskedConstant +masked_array = MaskedArray +def array(data, dtype=..., copy=..., order=..., mask=..., fill_value=..., keep_mask=..., hard_mask=..., shrink=..., subok=..., ndmin=...): + ... + +def is_masked(x): + ... + +class _extrema_operation(_MaskedUFunc): + compare: Any + fill_value_func: Any + def __init__(self, ufunc, compare, fill_value) -> None: + ... + + def __call__(self, a, b): + ... + + def reduce(self, target, axis=...): + ... + + def outer(self, a, b): + ... + + + +def min(obj, axis=..., out=..., fill_value=..., keepdims=...): + ... + +def max(obj, axis=..., out=..., fill_value=..., keepdims=...): + ... + +def ptp(obj, axis=..., out=..., fill_value=..., keepdims=...): + ... + +class _frommethod: + __name__: Any + __doc__: Any + reversed: Any + def __init__(self, methodname, reversed=...) -> None: + ... + + def getdoc(self): + ... + + def __call__(self, a, *args, **params): + ... + + + +all: _frommethod +anomalies: _frommethod +anom: _frommethod +any: _frommethod +compress: _frommethod +cumprod: _frommethod +cumsum: _frommethod +copy: _frommethod +diagonal: _frommethod +harden_mask: _frommethod +ids: _frommethod +mean: _frommethod +nonzero: _frommethod +prod: _frommethod +product: _frommethod +ravel: _frommethod +repeat: _frommethod +soften_mask: _frommethod +std: _frommethod +sum: _frommethod +swapaxes: _frommethod +trace: _frommethod +var: _frommethod +count: _frommethod +argmin: _frommethod +argmax: _frommethod +minimum: _extrema_operation +maximum: _extrema_operation +def take(a, indices, axis=..., out=..., mode=...): + ... + +def power(a, b, third=...): + ... + +def argsort(a, axis=..., kind=..., order=..., endwith=..., fill_value=...): + ... + +def sort(a, axis=..., kind=..., order=..., endwith=..., fill_value=...): + ... + +def compressed(x): + ... + +def concatenate(arrays, axis=...): + ... + +def diag(v, k=...): + ... + +def left_shift(a, n): + ... + +def right_shift(a, n): + ... + +def put(a, indices, values, mode=...): + ... + +def putmask(a, mask, values): + ... + +def transpose(a, axes=...): + ... + +def reshape(a, new_shape, order=...): + ... + +def resize(x, new_shape): + ... + +def ndim(obj): + ... + +def shape(obj): + ... + +def size(obj, axis=...): + ... + +def diff(a, /, n=..., axis=..., prepend=..., append=...): + ... + +def where(condition, x=..., y=...): + ... + +def choose(indices, choices, out=..., mode=...): + ... + +def round(a, decimals=..., out=...): + ... + +def inner(a, b): + ... + +innerproduct = ... +def outer(a, b): + ... + +outerproduct = ... +def correlate(a, v, mode=..., propagate_mask=...): + ... + +def convolve(a, v, mode=..., propagate_mask=...): + ... + +def allequal(a, b, fill_value=...): + ... + +def allclose(a, b, masked_equal=..., rtol=..., atol=...): + ... + +def asarray(a, dtype=..., order=...): + ... + +def asanyarray(a, dtype=...): + ... + +def fromflex(fxarray): + ... + +class _convert2ma: + __doc__: Any + def __init__(self, funcname, params=...) -> None: + ... + + def getdoc(self): + ... + + def __call__(self, *args, **params): + ... + + + +arange: _convert2ma +empty: _convert2ma +empty_like: _convert2ma +frombuffer: _convert2ma +fromfunction: _convert2ma +identity: _convert2ma +ones: _convert2ma +zeros: _convert2ma +def append(a, b, axis=...): + ... + +def dot(a, b, strict=..., out=...): + ... + +def mask_rowcols(a, axis=...): + ... + diff --git a/typings/numpy/ma/extras.pyi b/typings/numpy/ma/extras.pyi new file mode 100644 index 0000000..86931ff --- /dev/null +++ b/typings/numpy/ma/extras.pyi @@ -0,0 +1,165 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any +from numpy.lib.index_tricks import AxisConcatenator + +__all__: list[str] +def count_masked(arr, axis=...): + ... + +def masked_all(shape, dtype=...): + ... + +def masked_all_like(arr): + ... + +class _fromnxfunction: + __name__: Any + __doc__: Any + def __init__(self, funcname) -> None: + ... + + def getdoc(self): + ... + + def __call__(self, *args, **params): + ... + + + +class _fromnxfunction_single(_fromnxfunction): + def __call__(self, x, *args, **params): + ... + + + +class _fromnxfunction_seq(_fromnxfunction): + def __call__(self, x, *args, **params): + ... + + + +class _fromnxfunction_allargs(_fromnxfunction): + def __call__(self, *args, **params): + ... + + + +atleast_1d: _fromnxfunction_allargs +atleast_2d: _fromnxfunction_allargs +atleast_3d: _fromnxfunction_allargs +vstack: _fromnxfunction_seq +row_stack: _fromnxfunction_seq +hstack: _fromnxfunction_seq +column_stack: _fromnxfunction_seq +dstack: _fromnxfunction_seq +stack: _fromnxfunction_seq +hsplit: _fromnxfunction_single +diagflat: _fromnxfunction_single +def apply_along_axis(func1d, axis, arr, *args, **kwargs): + ... + +def apply_over_axes(func, a, axes): + ... + +def average(a, axis=..., weights=..., returned=..., keepdims=...): + ... + +def median(a, axis=..., out=..., overwrite_input=..., keepdims=...): + ... + +def compress_nd(x, axis=...): + ... + +def compress_rowcols(x, axis=...): + ... + +def compress_rows(a): + ... + +def compress_cols(a): + ... + +def mask_rows(a, axis=...): + ... + +def mask_cols(a, axis=...): + ... + +def ediff1d(arr, to_end=..., to_begin=...): + ... + +def unique(ar1, return_index=..., return_inverse=...): + ... + +def intersect1d(ar1, ar2, assume_unique=...): + ... + +def setxor1d(ar1, ar2, assume_unique=...): + ... + +def in1d(ar1, ar2, assume_unique=..., invert=...): + ... + +def isin(element, test_elements, assume_unique=..., invert=...): + ... + +def union1d(ar1, ar2): + ... + +def setdiff1d(ar1, ar2, assume_unique=...): + ... + +def cov(x, y=..., rowvar=..., bias=..., allow_masked=..., ddof=...): + ... + +def corrcoef(x, y=..., rowvar=..., bias=..., allow_masked=..., ddof=...): + ... + +class MAxisConcatenator(AxisConcatenator): + concatenate: Any + @classmethod + def makemat(cls, arr): + ... + + def __getitem__(self, key): + ... + + + +class mr_class(MAxisConcatenator): + def __init__(self) -> None: + ... + + + +mr_: mr_class +def ndenumerate(a, compressed=...): + ... + +def flatnotmasked_edges(a): + ... + +def notmasked_edges(a, axis=...): + ... + +def flatnotmasked_contiguous(a): + ... + +def notmasked_contiguous(a, axis=...): + ... + +def clump_unmasked(a): + ... + +def clump_masked(a): + ... + +def vander(x, n=...): + ... + +def polyfit(x, y, deg, rcond=..., full=..., w=..., cov=...): + ... + diff --git a/typings/numpy/ma/mrecords.pyi b/typings/numpy/ma/mrecords.pyi new file mode 100644 index 0000000..5b41e25 --- /dev/null +++ b/typings/numpy/ma/mrecords.pyi @@ -0,0 +1,68 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, TypeVar +from numpy import dtype +from numpy.ma import MaskedArray + +__all__: list[str] +_ShapeType = TypeVar("_ShapeType", bound=Any) +_DType_co = TypeVar("_DType_co", bound=dtype[Any], covariant=True) +class MaskedRecords(MaskedArray[_ShapeType, _DType_co]): + def __new__(cls, shape, dtype=..., buf=..., offset=..., strides=..., formats=..., names=..., titles=..., byteorder=..., aligned=..., mask=..., hard_mask=..., fill_value=..., keep_mask=..., copy=..., **options): + ... + + _mask: Any + _fill_value: Any + def __array_finalize__(self, obj): + ... + + def __len__(self): + ... + + def __getattribute__(self, attr): + ... + + def __setattr__(self, attr, val): + ... + + def __getitem__(self, indx): + ... + + def __setitem__(self, indx, value): + ... + + def view(self, dtype=..., type=...): + ... + + def harden_mask(self): + ... + + def soften_mask(self): + ... + + def copy(self): + ... + + def tolist(self, fill_value=...): + ... + + def __reduce__(self): + ... + + + +mrecarray = MaskedRecords +def fromarrays(arraylist, dtype=..., shape=..., formats=..., names=..., titles=..., aligned=..., byteorder=..., fill_value=...): + ... + +def fromrecords(reclist, dtype=..., shape=..., formats=..., names=..., titles=..., aligned=..., byteorder=..., fill_value=..., mask=...): + ... + +def fromtextfile(fname, delimiter=..., commentchar=..., missingchar=..., varnames=..., vartypes=...): + ... + +def addfield(mrecord, newfield, newfieldname=...): + ... + diff --git a/typings/numpy/matlib.pyi b/typings/numpy/matlib.pyi new file mode 100644 index 0000000..5916be5 --- /dev/null +++ b/typings/numpy/matlib.pyi @@ -0,0 +1,344 @@ +""" +This type stub file was generated by pyright. +""" + +import numpy as np +from numpy import * + +__version__ = ... +__all__ = np.__all__[:] +__all__ += ['rand', 'randn', 'repmat'] +def empty(shape, dtype=..., order=...): # -> matrix[Unknown, Unknown]: + """Return a new matrix of given shape and type, without initializing entries. + + Parameters + ---------- + shape : int or tuple of int + Shape of the empty matrix. + dtype : data-type, optional + Desired output data-type. + order : {'C', 'F'}, optional + Whether to store multi-dimensional data in row-major + (C-style) or column-major (Fortran-style) order in + memory. + + See Also + -------- + empty_like, zeros + + Notes + ----- + `empty`, unlike `zeros`, does not set the matrix values to zero, + and may therefore be marginally faster. On the other hand, it requires + the user to manually set all the values in the array, and should be + used with caution. + + Examples + -------- + >>> import numpy.matlib + >>> np.matlib.empty((2, 2)) # filled with random data + matrix([[ 6.76425276e-320, 9.79033856e-307], # random + [ 7.39337286e-309, 3.22135945e-309]]) + >>> np.matlib.empty((2, 2), dtype=int) + matrix([[ 6600475, 0], # random + [ 6586976, 22740995]]) + + """ + ... + +def ones(shape, dtype=..., order=...): # -> matrix[Unknown, Unknown]: + """ + Matrix of ones. + + Return a matrix of given shape and type, filled with ones. + + Parameters + ---------- + shape : {sequence of ints, int} + Shape of the matrix + dtype : data-type, optional + The desired data-type for the matrix, default is np.float64. + order : {'C', 'F'}, optional + Whether to store matrix in C- or Fortran-contiguous order, + default is 'C'. + + Returns + ------- + out : matrix + Matrix of ones of given shape, dtype, and order. + + See Also + -------- + ones : Array of ones. + matlib.zeros : Zero matrix. + + Notes + ----- + If `shape` has length one i.e. ``(N,)``, or is a scalar ``N``, + `out` becomes a single row matrix of shape ``(1,N)``. + + Examples + -------- + >>> np.matlib.ones((2,3)) + matrix([[1., 1., 1.], + [1., 1., 1.]]) + + >>> np.matlib.ones(2) + matrix([[1., 1.]]) + + """ + ... + +def zeros(shape, dtype=..., order=...): # -> matrix[Unknown, Unknown]: + """ + Return a matrix of given shape and type, filled with zeros. + + Parameters + ---------- + shape : int or sequence of ints + Shape of the matrix + dtype : data-type, optional + The desired data-type for the matrix, default is float. + order : {'C', 'F'}, optional + Whether to store the result in C- or Fortran-contiguous order, + default is 'C'. + + Returns + ------- + out : matrix + Zero matrix of given shape, dtype, and order. + + See Also + -------- + numpy.zeros : Equivalent array function. + matlib.ones : Return a matrix of ones. + + Notes + ----- + If `shape` has length one i.e. ``(N,)``, or is a scalar ``N``, + `out` becomes a single row matrix of shape ``(1,N)``. + + Examples + -------- + >>> import numpy.matlib + >>> np.matlib.zeros((2, 3)) + matrix([[0., 0., 0.], + [0., 0., 0.]]) + + >>> np.matlib.zeros(2) + matrix([[0., 0.]]) + + """ + ... + +def identity(n, dtype=...): # -> matrix[Unknown, Unknown]: + """ + Returns the square identity matrix of given size. + + Parameters + ---------- + n : int + Size of the returned identity matrix. + dtype : data-type, optional + Data-type of the output. Defaults to ``float``. + + Returns + ------- + out : matrix + `n` x `n` matrix with its main diagonal set to one, + and all other elements zero. + + See Also + -------- + numpy.identity : Equivalent array function. + matlib.eye : More general matrix identity function. + + Examples + -------- + >>> import numpy.matlib + >>> np.matlib.identity(3, dtype=int) + matrix([[1, 0, 0], + [0, 1, 0], + [0, 0, 1]]) + + """ + ... + +def eye(n, M=..., k=..., dtype=..., order=...): # -> matrix[Any, Any]: + """ + Return a matrix with ones on the diagonal and zeros elsewhere. + + Parameters + ---------- + n : int + Number of rows in the output. + M : int, optional + Number of columns in the output, defaults to `n`. + k : int, optional + Index of the diagonal: 0 refers to the main diagonal, + a positive value refers to an upper diagonal, + and a negative value to a lower diagonal. + dtype : dtype, optional + Data-type of the returned matrix. + order : {'C', 'F'}, optional + Whether the output should be stored in row-major (C-style) or + column-major (Fortran-style) order in memory. + + .. versionadded:: 1.14.0 + + Returns + ------- + I : matrix + A `n` x `M` matrix where all elements are equal to zero, + except for the `k`-th diagonal, whose values are equal to one. + + See Also + -------- + numpy.eye : Equivalent array function. + identity : Square identity matrix. + + Examples + -------- + >>> import numpy.matlib + >>> np.matlib.eye(3, k=1, dtype=float) + matrix([[0., 1., 0.], + [0., 0., 1.], + [0., 0., 0.]]) + + """ + ... + +def rand(*args): # -> matrix[Any, Any]: + """ + Return a matrix of random values with given shape. + + Create a matrix of the given shape and propagate it with + random samples from a uniform distribution over ``[0, 1)``. + + Parameters + ---------- + \\*args : Arguments + Shape of the output. + If given as N integers, each integer specifies the size of one + dimension. + If given as a tuple, this tuple gives the complete shape. + + Returns + ------- + out : ndarray + The matrix of random values with shape given by `\\*args`. + + See Also + -------- + randn, numpy.random.RandomState.rand + + Examples + -------- + >>> np.random.seed(123) + >>> import numpy.matlib + >>> np.matlib.rand(2, 3) + matrix([[0.69646919, 0.28613933, 0.22685145], + [0.55131477, 0.71946897, 0.42310646]]) + >>> np.matlib.rand((2, 3)) + matrix([[0.9807642 , 0.68482974, 0.4809319 ], + [0.39211752, 0.34317802, 0.72904971]]) + + If the first argument is a tuple, other arguments are ignored: + + >>> np.matlib.rand((2, 3), 4) + matrix([[0.43857224, 0.0596779 , 0.39804426], + [0.73799541, 0.18249173, 0.17545176]]) + + """ + ... + +def randn(*args): # -> matrix[Any, Any]: + """ + Return a random matrix with data from the "standard normal" distribution. + + `randn` generates a matrix filled with random floats sampled from a + univariate "normal" (Gaussian) distribution of mean 0 and variance 1. + + Parameters + ---------- + \\*args : Arguments + Shape of the output. + If given as N integers, each integer specifies the size of one + dimension. If given as a tuple, this tuple gives the complete shape. + + Returns + ------- + Z : matrix of floats + A matrix of floating-point samples drawn from the standard normal + distribution. + + See Also + -------- + rand, numpy.random.RandomState.randn + + Notes + ----- + For random samples from the normal distribution with mean ``mu`` and + standard deviation ``sigma``, use:: + + sigma * np.matlib.randn(...) + mu + + Examples + -------- + >>> np.random.seed(123) + >>> import numpy.matlib + >>> np.matlib.randn(1) + matrix([[-1.0856306]]) + >>> np.matlib.randn(1, 2, 3) + matrix([[ 0.99734545, 0.2829785 , -1.50629471], + [-0.57860025, 1.65143654, -2.42667924]]) + + Two-by-four matrix of samples from the normal distribution with + mean 3 and standard deviation 2.5: + + >>> 2.5 * np.matlib.randn((2, 4)) + 3 + matrix([[1.92771843, 6.16484065, 0.83314899, 1.30278462], + [2.76322758, 6.72847407, 1.40274501, 1.8900451 ]]) + + """ + ... + +def repmat(a, m, n): + """ + Repeat a 0-D to 2-D array or matrix MxN times. + + Parameters + ---------- + a : array_like + The array or matrix to be repeated. + m, n : int + The number of times `a` is repeated along the first and second axes. + + Returns + ------- + out : ndarray + The result of repeating `a`. + + Examples + -------- + >>> import numpy.matlib + >>> a0 = np.array(1) + >>> np.matlib.repmat(a0, 2, 3) + array([[1, 1, 1], + [1, 1, 1]]) + + >>> a1 = np.arange(4) + >>> np.matlib.repmat(a1, 2, 2) + array([[0, 1, 2, 3, 0, 1, 2, 3], + [0, 1, 2, 3, 0, 1, 2, 3]]) + + >>> a2 = np.asmatrix(np.arange(6).reshape(2, 3)) + >>> np.matlib.repmat(a2, 2, 3) + matrix([[0, 1, 2, 0, 1, 2, 0, 1, 2], + [3, 4, 5, 3, 4, 5, 3, 4, 5], + [0, 1, 2, 0, 1, 2, 0, 1, 2], + [3, 4, 5, 3, 4, 5, 3, 4, 5]]) + + """ + ... + diff --git a/typings/numpy/matrixlib/__init__.pyi b/typings/numpy/matrixlib/__init__.pyi new file mode 100644 index 0000000..b0a23bf --- /dev/null +++ b/typings/numpy/matrixlib/__init__.pyi @@ -0,0 +1,11 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy._pytesttester import PytestTester +from numpy import matrix as matrix +from numpy.matrixlib.defmatrix import asmatrix as asmatrix, bmat as bmat, mat as mat + +__all__: list[str] +__path__: list[str] +test: PytestTester diff --git a/typings/numpy/matrixlib/defmatrix.pyi b/typings/numpy/matrixlib/defmatrix.pyi new file mode 100644 index 0000000..da0cb4e --- /dev/null +++ b/typings/numpy/matrixlib/defmatrix.pyi @@ -0,0 +1,17 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Mapping, Sequence +from typing import Any +from numpy import matrix as matrix +from numpy._typing import ArrayLike, DTypeLike, NDArray + +__all__: list[str] +def bmat(obj: str | Sequence[ArrayLike] | NDArray[Any], ldict: None | Mapping[str, Any] = ..., gdict: None | Mapping[str, Any] = ...) -> matrix[Any, Any]: + ... + +def asmatrix(data: ArrayLike, dtype: DTypeLike = ...) -> matrix[Any, Any]: + ... + +mat = ... diff --git a/typings/numpy/polynomial/__init__.pyi b/typings/numpy/polynomial/__init__.pyi new file mode 100644 index 0000000..f996860 --- /dev/null +++ b/typings/numpy/polynomial/__init__.pyi @@ -0,0 +1,19 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy._pytesttester import PytestTester +from numpy.polynomial import chebyshev as chebyshev, hermite as hermite, hermite_e as hermite_e, laguerre as laguerre, legendre as legendre, polynomial as polynomial +from numpy.polynomial.chebyshev import Chebyshev as Chebyshev +from numpy.polynomial.hermite import Hermite as Hermite +from numpy.polynomial.hermite_e import HermiteE as HermiteE +from numpy.polynomial.laguerre import Laguerre as Laguerre +from numpy.polynomial.legendre import Legendre as Legendre +from numpy.polynomial.polynomial import Polynomial as Polynomial + +__all__: list[str] +__path__: list[str] +test: PytestTester +def set_default_printstyle(style): + ... + diff --git a/typings/numpy/polynomial/_polybase.pyi b/typings/numpy/polynomial/_polybase.pyi new file mode 100644 index 0000000..8be9d3e --- /dev/null +++ b/typings/numpy/polynomial/_polybase.pyi @@ -0,0 +1,174 @@ +""" +This type stub file was generated by pyright. +""" + +import abc +from typing import Any, ClassVar + +__all__: list[str] +class ABCPolyBase(abc.ABC): + __hash__: ClassVar[None] + __array_ufunc__: ClassVar[None] + maxpower: ClassVar[int] + coef: Any + @property + def symbol(self) -> str: + ... + + @property + @abc.abstractmethod + def domain(self): + ... + + @property + @abc.abstractmethod + def window(self): + ... + + @property + @abc.abstractmethod + def basis_name(self): + ... + + def has_samecoef(self, other): + ... + + def has_samedomain(self, other): + ... + + def has_samewindow(self, other): + ... + + def has_sametype(self, other): + ... + + def __init__(self, coef, domain=..., window=..., symbol: str = ...) -> None: + ... + + def __format__(self, fmt_str): + ... + + def __call__(self, arg): + ... + + def __iter__(self): + ... + + def __len__(self): + ... + + def __neg__(self): + ... + + def __pos__(self): + ... + + def __add__(self, other): + ... + + def __sub__(self, other): + ... + + def __mul__(self, other): + ... + + def __truediv__(self, other): + ... + + def __floordiv__(self, other): + ... + + def __mod__(self, other): + ... + + def __divmod__(self, other): + ... + + def __pow__(self, other): + ... + + def __radd__(self, other): + ... + + def __rsub__(self, other): + ... + + def __rmul__(self, other): + ... + + def __rdiv__(self, other): + ... + + def __rtruediv__(self, other): + ... + + def __rfloordiv__(self, other): + ... + + def __rmod__(self, other): + ... + + def __rdivmod__(self, other): + ... + + def __eq__(self, other) -> bool: + ... + + def __ne__(self, other) -> bool: + ... + + def copy(self): + ... + + def degree(self): + ... + + def cutdeg(self, deg): + ... + + def trim(self, tol=...): + ... + + def truncate(self, size): + ... + + def convert(self, domain=..., kind=..., window=...): + ... + + def mapparms(self): + ... + + def integ(self, m=..., k=..., lbnd=...): + ... + + def deriv(self, m=...): + ... + + def roots(self): + ... + + def linspace(self, n=..., domain=...): + ... + + @classmethod + def fit(cls, x, y, deg, domain=..., rcond=..., full=..., w=..., window=...): + ... + + @classmethod + def fromroots(cls, roots, domain=..., window=...): + ... + + @classmethod + def identity(cls, domain=..., window=...): + ... + + @classmethod + def basis(cls, deg, domain=..., window=...): + ... + + @classmethod + def cast(cls, series, domain=..., window=...): + ... + + + diff --git a/typings/numpy/polynomial/chebyshev.pyi b/typings/numpy/polynomial/chebyshev.pyi new file mode 100644 index 0000000..926cd15 --- /dev/null +++ b/typings/numpy/polynomial/chebyshev.pyi @@ -0,0 +1,108 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any +from numpy import dtype, int_, ndarray +from numpy.polynomial._polybase import ABCPolyBase + +__all__: list[str] +chebtrim = ... +def poly2cheb(pol): + ... + +def cheb2poly(c): + ... + +chebdomain: ndarray[Any, dtype[int_]] +chebzero: ndarray[Any, dtype[int_]] +chebone: ndarray[Any, dtype[int_]] +chebx: ndarray[Any, dtype[int_]] +def chebline(off, scl): + ... + +def chebfromroots(roots): + ... + +def chebadd(c1, c2): + ... + +def chebsub(c1, c2): + ... + +def chebmulx(c): + ... + +def chebmul(c1, c2): + ... + +def chebdiv(c1, c2): + ... + +def chebpow(c, pow, maxpower=...): + ... + +def chebder(c, m=..., scl=..., axis=...): + ... + +def chebint(c, m=..., k=..., lbnd=..., scl=..., axis=...): + ... + +def chebval(x, c, tensor=...): + ... + +def chebval2d(x, y, c): + ... + +def chebgrid2d(x, y, c): + ... + +def chebval3d(x, y, z, c): + ... + +def chebgrid3d(x, y, z, c): + ... + +def chebvander(x, deg): + ... + +def chebvander2d(x, y, deg): + ... + +def chebvander3d(x, y, z, deg): + ... + +def chebfit(x, y, deg, rcond=..., full=..., w=...): + ... + +def chebcompanion(c): + ... + +def chebroots(c): + ... + +def chebinterpolate(func, deg, args=...): + ... + +def chebgauss(deg): + ... + +def chebweight(x): + ... + +def chebpts1(npts): + ... + +def chebpts2(npts): + ... + +class Chebyshev(ABCPolyBase): + @classmethod + def interpolate(cls, func, deg, domain=..., args=...): + ... + + domain: Any + window: Any + basis_name: Any + + diff --git a/typings/numpy/polynomial/hermite.pyi b/typings/numpy/polynomial/hermite.pyi new file mode 100644 index 0000000..41ad22e --- /dev/null +++ b/typings/numpy/polynomial/hermite.pyi @@ -0,0 +1,96 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any +from numpy import dtype, float_, int_, ndarray +from numpy.polynomial._polybase import ABCPolyBase + +__all__: list[str] +hermtrim = ... +def poly2herm(pol): + ... + +def herm2poly(c): + ... + +hermdomain: ndarray[Any, dtype[int_]] +hermzero: ndarray[Any, dtype[int_]] +hermone: ndarray[Any, dtype[int_]] +hermx: ndarray[Any, dtype[float_]] +def hermline(off, scl): + ... + +def hermfromroots(roots): + ... + +def hermadd(c1, c2): + ... + +def hermsub(c1, c2): + ... + +def hermmulx(c): + ... + +def hermmul(c1, c2): + ... + +def hermdiv(c1, c2): + ... + +def hermpow(c, pow, maxpower=...): + ... + +def hermder(c, m=..., scl=..., axis=...): + ... + +def hermint(c, m=..., k=..., lbnd=..., scl=..., axis=...): + ... + +def hermval(x, c, tensor=...): + ... + +def hermval2d(x, y, c): + ... + +def hermgrid2d(x, y, c): + ... + +def hermval3d(x, y, z, c): + ... + +def hermgrid3d(x, y, z, c): + ... + +def hermvander(x, deg): + ... + +def hermvander2d(x, y, deg): + ... + +def hermvander3d(x, y, z, deg): + ... + +def hermfit(x, y, deg, rcond=..., full=..., w=...): + ... + +def hermcompanion(c): + ... + +def hermroots(c): + ... + +def hermgauss(deg): + ... + +def hermweight(x): + ... + +class Hermite(ABCPolyBase): + domain: Any + window: Any + basis_name: Any + ... + + diff --git a/typings/numpy/polynomial/hermite_e.pyi b/typings/numpy/polynomial/hermite_e.pyi new file mode 100644 index 0000000..4127138 --- /dev/null +++ b/typings/numpy/polynomial/hermite_e.pyi @@ -0,0 +1,96 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any +from numpy import dtype, int_, ndarray +from numpy.polynomial._polybase import ABCPolyBase + +__all__: list[str] +hermetrim = ... +def poly2herme(pol): + ... + +def herme2poly(c): + ... + +hermedomain: ndarray[Any, dtype[int_]] +hermezero: ndarray[Any, dtype[int_]] +hermeone: ndarray[Any, dtype[int_]] +hermex: ndarray[Any, dtype[int_]] +def hermeline(off, scl): + ... + +def hermefromroots(roots): + ... + +def hermeadd(c1, c2): + ... + +def hermesub(c1, c2): + ... + +def hermemulx(c): + ... + +def hermemul(c1, c2): + ... + +def hermediv(c1, c2): + ... + +def hermepow(c, pow, maxpower=...): + ... + +def hermeder(c, m=..., scl=..., axis=...): + ... + +def hermeint(c, m=..., k=..., lbnd=..., scl=..., axis=...): + ... + +def hermeval(x, c, tensor=...): + ... + +def hermeval2d(x, y, c): + ... + +def hermegrid2d(x, y, c): + ... + +def hermeval3d(x, y, z, c): + ... + +def hermegrid3d(x, y, z, c): + ... + +def hermevander(x, deg): + ... + +def hermevander2d(x, y, deg): + ... + +def hermevander3d(x, y, z, deg): + ... + +def hermefit(x, y, deg, rcond=..., full=..., w=...): + ... + +def hermecompanion(c): + ... + +def hermeroots(c): + ... + +def hermegauss(deg): + ... + +def hermeweight(x): + ... + +class HermiteE(ABCPolyBase): + domain: Any + window: Any + basis_name: Any + ... + + diff --git a/typings/numpy/polynomial/laguerre.pyi b/typings/numpy/polynomial/laguerre.pyi new file mode 100644 index 0000000..483902c --- /dev/null +++ b/typings/numpy/polynomial/laguerre.pyi @@ -0,0 +1,96 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any +from numpy import dtype, int_, ndarray +from numpy.polynomial._polybase import ABCPolyBase + +__all__: list[str] +lagtrim = ... +def poly2lag(pol): + ... + +def lag2poly(c): + ... + +lagdomain: ndarray[Any, dtype[int_]] +lagzero: ndarray[Any, dtype[int_]] +lagone: ndarray[Any, dtype[int_]] +lagx: ndarray[Any, dtype[int_]] +def lagline(off, scl): + ... + +def lagfromroots(roots): + ... + +def lagadd(c1, c2): + ... + +def lagsub(c1, c2): + ... + +def lagmulx(c): + ... + +def lagmul(c1, c2): + ... + +def lagdiv(c1, c2): + ... + +def lagpow(c, pow, maxpower=...): + ... + +def lagder(c, m=..., scl=..., axis=...): + ... + +def lagint(c, m=..., k=..., lbnd=..., scl=..., axis=...): + ... + +def lagval(x, c, tensor=...): + ... + +def lagval2d(x, y, c): + ... + +def laggrid2d(x, y, c): + ... + +def lagval3d(x, y, z, c): + ... + +def laggrid3d(x, y, z, c): + ... + +def lagvander(x, deg): + ... + +def lagvander2d(x, y, deg): + ... + +def lagvander3d(x, y, z, deg): + ... + +def lagfit(x, y, deg, rcond=..., full=..., w=...): + ... + +def lagcompanion(c): + ... + +def lagroots(c): + ... + +def laggauss(deg): + ... + +def lagweight(x): + ... + +class Laguerre(ABCPolyBase): + domain: Any + window: Any + basis_name: Any + ... + + diff --git a/typings/numpy/polynomial/legendre.pyi b/typings/numpy/polynomial/legendre.pyi new file mode 100644 index 0000000..288aa26 --- /dev/null +++ b/typings/numpy/polynomial/legendre.pyi @@ -0,0 +1,96 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any +from numpy import dtype, int_, ndarray +from numpy.polynomial._polybase import ABCPolyBase + +__all__: list[str] +legtrim = ... +def poly2leg(pol): + ... + +def leg2poly(c): + ... + +legdomain: ndarray[Any, dtype[int_]] +legzero: ndarray[Any, dtype[int_]] +legone: ndarray[Any, dtype[int_]] +legx: ndarray[Any, dtype[int_]] +def legline(off, scl): + ... + +def legfromroots(roots): + ... + +def legadd(c1, c2): + ... + +def legsub(c1, c2): + ... + +def legmulx(c): + ... + +def legmul(c1, c2): + ... + +def legdiv(c1, c2): + ... + +def legpow(c, pow, maxpower=...): + ... + +def legder(c, m=..., scl=..., axis=...): + ... + +def legint(c, m=..., k=..., lbnd=..., scl=..., axis=...): + ... + +def legval(x, c, tensor=...): + ... + +def legval2d(x, y, c): + ... + +def leggrid2d(x, y, c): + ... + +def legval3d(x, y, z, c): + ... + +def leggrid3d(x, y, z, c): + ... + +def legvander(x, deg): + ... + +def legvander2d(x, y, deg): + ... + +def legvander3d(x, y, z, deg): + ... + +def legfit(x, y, deg, rcond=..., full=..., w=...): + ... + +def legcompanion(c): + ... + +def legroots(c): + ... + +def leggauss(deg): + ... + +def legweight(x): + ... + +class Legendre(ABCPolyBase): + domain: Any + window: Any + basis_name: Any + ... + + diff --git a/typings/numpy/polynomial/polynomial.pyi b/typings/numpy/polynomial/polynomial.pyi new file mode 100644 index 0000000..ad1d457 --- /dev/null +++ b/typings/numpy/polynomial/polynomial.pyi @@ -0,0 +1,84 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any +from numpy import dtype, int_, ndarray +from numpy.polynomial._polybase import ABCPolyBase + +__all__: list[str] +polytrim = ... +polydomain: ndarray[Any, dtype[int_]] +polyzero: ndarray[Any, dtype[int_]] +polyone: ndarray[Any, dtype[int_]] +polyx: ndarray[Any, dtype[int_]] +def polyline(off, scl): + ... + +def polyfromroots(roots): + ... + +def polyadd(c1, c2): + ... + +def polysub(c1, c2): + ... + +def polymulx(c): + ... + +def polymul(c1, c2): + ... + +def polydiv(c1, c2): + ... + +def polypow(c, pow, maxpower=...): + ... + +def polyder(c, m=..., scl=..., axis=...): + ... + +def polyint(c, m=..., k=..., lbnd=..., scl=..., axis=...): + ... + +def polyval(x, c, tensor=...): + ... + +def polyvalfromroots(x, r, tensor=...): + ... + +def polyval2d(x, y, c): + ... + +def polygrid2d(x, y, c): + ... + +def polyval3d(x, y, z, c): + ... + +def polygrid3d(x, y, z, c): + ... + +def polyvander(x, deg): + ... + +def polyvander2d(x, y, deg): + ... + +def polyvander3d(x, y, z, deg): + ... + +def polyfit(x, y, deg, rcond=..., full=..., w=...): + ... + +def polyroots(c): + ... + +class Polynomial(ABCPolyBase): + domain: Any + window: Any + basis_name: Any + ... + + diff --git a/typings/numpy/polynomial/polyutils.pyi b/typings/numpy/polynomial/polyutils.pyi new file mode 100644 index 0000000..359de71 --- /dev/null +++ b/typings/numpy/polynomial/polyutils.pyi @@ -0,0 +1,30 @@ +""" +This type stub file was generated by pyright. +""" + +__all__: list[str] +class RankWarning(UserWarning): + ... + + +def trimseq(seq): + ... + +def as_series(alist, trim=...): + ... + +def trimcoef(c, tol=...): + ... + +def getdomain(x): + ... + +def mapparms(old, new): + ... + +def mapdomain(x, old, new): + ... + +def format_float(x, parens=...): + ... + diff --git a/typings/numpy/random/__init__.pyi b/typings/numpy/random/__init__.pyi new file mode 100644 index 0000000..8bc5463 --- /dev/null +++ b/typings/numpy/random/__init__.pyi @@ -0,0 +1,16 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy._pytesttester import PytestTester +from numpy.random._generator import Generator as Generator, default_rng as default_rng +from numpy.random._mt19937 import MT19937 as MT19937 +from numpy.random._pcg64 import PCG64 as PCG64, PCG64DXSM as PCG64DXSM +from numpy.random._philox import Philox as Philox +from numpy.random._sfc64 import SFC64 as SFC64 +from numpy.random.bit_generator import BitGenerator as BitGenerator, SeedSequence as SeedSequence +from numpy.random.mtrand import RandomState as RandomState, beta as beta, binomial as binomial, bytes as bytes, chisquare as chisquare, choice as choice, dirichlet as dirichlet, exponential as exponential, f as f, gamma as gamma, geometric as geometric, get_bit_generator as get_bit_generator, get_state as get_state, gumbel as gumbel, hypergeometric as hypergeometric, laplace as laplace, logistic as logistic, lognormal as lognormal, logseries as logseries, multinomial as multinomial, multivariate_normal as multivariate_normal, negative_binomial as negative_binomial, noncentral_chisquare as noncentral_chisquare, noncentral_f as noncentral_f, normal as normal, pareto as pareto, permutation as permutation, poisson as poisson, power as power, rand as rand, randint as randint, randn as randn, random as random, random_integers as random_integers, random_sample as random_sample, ranf as ranf, rayleigh as rayleigh, sample as sample, seed as seed, set_bit_generator as set_bit_generator, set_state as set_state, shuffle as shuffle, standard_cauchy as standard_cauchy, standard_exponential as standard_exponential, standard_gamma as standard_gamma, standard_normal as standard_normal, standard_t as standard_t, triangular as triangular, uniform as uniform, vonmises as vonmises, wald as wald, weibull as weibull, zipf as zipf + +__all__: list[str] +__path__: list[str] +test: PytestTester diff --git a/typings/numpy/random/_generator.pyi b/typings/numpy/random/_generator.pyi new file mode 100644 index 0000000..35bd52e --- /dev/null +++ b/typings/numpy/random/_generator.pyi @@ -0,0 +1,469 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Callable +from typing import Any, Literal, TypeVar, Union, overload +from numpy import bool_, dtype, float32, float64, int16, int32, int64, int8, int_, ndarray, uint, uint16, uint32, uint64, uint8 +from numpy.random import BitGenerator, SeedSequence +from numpy._typing import ArrayLike, _ArrayLikeFloat_co, _ArrayLikeInt_co, _DTypeLikeBool, _DTypeLikeInt, _DTypeLikeUInt, _DoubleCodes, _Float32Codes, _Float64Codes, _FloatLike_co, _Int16Codes, _Int32Codes, _Int64Codes, _Int8Codes, _IntCodes, _ShapeLike, _SingleCodes, _SupportsDType, _UInt16Codes, _UInt32Codes, _UInt64Codes, _UInt8Codes, _UIntCodes + +_ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, Any]) +_DTypeLikeFloat32 = Union[dtype[float32], _SupportsDType[dtype[float32]], type[float32], _Float32Codes, _SingleCodes,] +_DTypeLikeFloat64 = Union[dtype[float64], _SupportsDType[dtype[float64]], type[float], type[float64], _Float64Codes, _DoubleCodes,] +class Generator: + def __init__(self, bit_generator: BitGenerator) -> None: + ... + + def __repr__(self) -> str: + ... + + def __str__(self) -> str: + ... + + def __getstate__(self) -> dict[str, Any]: + ... + + def __setstate__(self, state: dict[str, Any]) -> None: + ... + + def __reduce__(self) -> tuple[Callable[[str], Generator], tuple[str], dict[str, Any]]: + ... + + @property + def bit_generator(self) -> BitGenerator: + ... + + def spawn(self, n_children: int) -> list[Generator]: + ... + + def bytes(self, length: int) -> bytes: + ... + + @overload + def standard_normal(self, size: None = ..., dtype: _DTypeLikeFloat32 | _DTypeLikeFloat64 = ..., out: None = ...) -> float: + ... + + @overload + def standard_normal(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_normal(self, *, out: ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_normal(self, size: _ShapeLike = ..., dtype: _DTypeLikeFloat32 = ..., out: None | ndarray[Any, dtype[float32]] = ...) -> ndarray[Any, dtype[float32]]: + ... + + @overload + def standard_normal(self, size: _ShapeLike = ..., dtype: _DTypeLikeFloat64 = ..., out: None | ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def permutation(self, x: int, axis: int = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def permutation(self, x: ArrayLike, axis: int = ...) -> ndarray[Any, Any]: + ... + + @overload + def standard_exponential(self, size: None = ..., dtype: _DTypeLikeFloat32 | _DTypeLikeFloat64 = ..., method: Literal["zig", "inv"] = ..., out: None = ...) -> float: + ... + + @overload + def standard_exponential(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_exponential(self, *, out: ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_exponential(self, size: _ShapeLike = ..., *, method: Literal["zig", "inv"] = ..., out: None | ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_exponential(self, size: _ShapeLike = ..., dtype: _DTypeLikeFloat32 = ..., method: Literal["zig", "inv"] = ..., out: None | ndarray[Any, dtype[float32]] = ...) -> ndarray[Any, dtype[float32]]: + ... + + @overload + def standard_exponential(self, size: _ShapeLike = ..., dtype: _DTypeLikeFloat64 = ..., method: Literal["zig", "inv"] = ..., out: None | ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def random(self, size: None = ..., dtype: _DTypeLikeFloat32 | _DTypeLikeFloat64 = ..., out: None = ...) -> float: + ... + + @overload + def random(self, *, out: ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def random(self, size: _ShapeLike = ..., *, out: None | ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def random(self, size: _ShapeLike = ..., dtype: _DTypeLikeFloat32 = ..., out: None | ndarray[Any, dtype[float32]] = ...) -> ndarray[Any, dtype[float32]]: + ... + + @overload + def random(self, size: _ShapeLike = ..., dtype: _DTypeLikeFloat64 = ..., out: None | ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def beta(self, a: _FloatLike_co, b: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def beta(self, a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def exponential(self, scale: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def exponential(self, scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def integers(self, low: int, high: None | int = ...) -> int: + ... + + @overload + def integers(self, low: int, high: None | int = ..., size: None = ..., dtype: _DTypeLikeBool = ..., endpoint: bool = ...) -> bool: + ... + + @overload + def integers(self, low: int, high: None | int = ..., size: None = ..., dtype: _DTypeLikeInt | _DTypeLikeUInt = ..., endpoint: bool = ...) -> int: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: _DTypeLikeBool = ..., endpoint: bool = ...) -> ndarray[Any, dtype[bool_]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int8] | type[int8] | _Int8Codes | _SupportsDType[dtype[int8]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[int8]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int16] | type[int16] | _Int16Codes | _SupportsDType[dtype[int16]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[int16]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int32] | type[int32] | _Int32Codes | _SupportsDType[dtype[int32]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[int32]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: None | dtype[int64] | type[int64] | _Int64Codes | _SupportsDType[dtype[int64]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint8] | type[uint8] | _UInt8Codes | _SupportsDType[dtype[uint8]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[uint8]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint16] | type[uint16] | _UInt16Codes | _SupportsDType[dtype[uint16]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[uint16]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint32] | type[uint32] | _UInt32Codes | _SupportsDType[dtype[uint32]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[uint32]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint64] | type[uint64] | _UInt64Codes | _SupportsDType[dtype[uint64]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[uint64]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int_] | type[int] | type[int_] | _IntCodes | _SupportsDType[dtype[int_]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint] | type[uint] | _UIntCodes | _SupportsDType[dtype[uint]] = ..., endpoint: bool = ...) -> ndarray[Any, dtype[uint]]: + ... + + @overload + def choice(self, a: int, size: None = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ..., axis: int = ..., shuffle: bool = ...) -> int: + ... + + @overload + def choice(self, a: int, size: _ShapeLike = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ..., axis: int = ..., shuffle: bool = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def choice(self, a: ArrayLike, size: None = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ..., axis: int = ..., shuffle: bool = ...) -> Any: + ... + + @overload + def choice(self, a: ArrayLike, size: _ShapeLike = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ..., axis: int = ..., shuffle: bool = ...) -> ndarray[Any, Any]: + ... + + @overload + def uniform(self, low: _FloatLike_co = ..., high: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def uniform(self, low: _ArrayLikeFloat_co = ..., high: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def normal(self, loc: _FloatLike_co = ..., scale: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def normal(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_gamma(self, shape: _FloatLike_co, size: None = ..., dtype: _DTypeLikeFloat32 | _DTypeLikeFloat64 = ..., out: None = ...) -> float: + ... + + @overload + def standard_gamma(self, shape: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_gamma(self, shape: _ArrayLikeFloat_co, *, out: ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_gamma(self, shape: _ArrayLikeFloat_co, size: None | _ShapeLike = ..., dtype: _DTypeLikeFloat32 = ..., out: None | ndarray[Any, dtype[float32]] = ...) -> ndarray[Any, dtype[float32]]: + ... + + @overload + def standard_gamma(self, shape: _ArrayLikeFloat_co, size: None | _ShapeLike = ..., dtype: _DTypeLikeFloat64 = ..., out: None | ndarray[Any, dtype[float64]] = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def gamma(self, shape: _FloatLike_co, scale: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def gamma(self, shape: _ArrayLikeFloat_co, scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def f(self, dfnum: _FloatLike_co, dfden: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def f(self, dfnum: _ArrayLikeFloat_co, dfden: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def noncentral_f(self, dfnum: _FloatLike_co, dfden: _FloatLike_co, nonc: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def noncentral_f(self, dfnum: _ArrayLikeFloat_co, dfden: _ArrayLikeFloat_co, nonc: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def chisquare(self, df: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def chisquare(self, df: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def noncentral_chisquare(self, df: _FloatLike_co, nonc: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def noncentral_chisquare(self, df: _ArrayLikeFloat_co, nonc: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_t(self, df: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def standard_t(self, df: _ArrayLikeFloat_co, size: None = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_t(self, df: _ArrayLikeFloat_co, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def vonmises(self, mu: _FloatLike_co, kappa: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def vonmises(self, mu: _ArrayLikeFloat_co, kappa: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def pareto(self, a: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def pareto(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def weibull(self, a: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def weibull(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def power(self, a: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def power(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_cauchy(self, size: None = ...) -> float: + ... + + @overload + def standard_cauchy(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def laplace(self, loc: _FloatLike_co = ..., scale: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def laplace(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def gumbel(self, loc: _FloatLike_co = ..., scale: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def gumbel(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def logistic(self, loc: _FloatLike_co = ..., scale: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def logistic(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def lognormal(self, mean: _FloatLike_co = ..., sigma: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def lognormal(self, mean: _ArrayLikeFloat_co = ..., sigma: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def rayleigh(self, scale: _FloatLike_co = ..., size: None = ...) -> float: + ... + + @overload + def rayleigh(self, scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def wald(self, mean: _FloatLike_co, scale: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def wald(self, mean: _ArrayLikeFloat_co, scale: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def triangular(self, left: _FloatLike_co, mode: _FloatLike_co, right: _FloatLike_co, size: None = ...) -> float: + ... + + @overload + def triangular(self, left: _ArrayLikeFloat_co, mode: _ArrayLikeFloat_co, right: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def binomial(self, n: int, p: _FloatLike_co, size: None = ...) -> int: + ... + + @overload + def binomial(self, n: _ArrayLikeInt_co, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def negative_binomial(self, n: _FloatLike_co, p: _FloatLike_co, size: None = ...) -> int: + ... + + @overload + def negative_binomial(self, n: _ArrayLikeFloat_co, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def poisson(self, lam: _FloatLike_co = ..., size: None = ...) -> int: + ... + + @overload + def poisson(self, lam: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def zipf(self, a: _FloatLike_co, size: None = ...) -> int: + ... + + @overload + def zipf(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def geometric(self, p: _FloatLike_co, size: None = ...) -> int: + ... + + @overload + def geometric(self, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def hypergeometric(self, ngood: int, nbad: int, nsample: int, size: None = ...) -> int: + ... + + @overload + def hypergeometric(self, ngood: _ArrayLikeInt_co, nbad: _ArrayLikeInt_co, nsample: _ArrayLikeInt_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def logseries(self, p: _FloatLike_co, size: None = ...) -> int: + ... + + @overload + def logseries(self, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + def multivariate_normal(self, mean: _ArrayLikeFloat_co, cov: _ArrayLikeFloat_co, size: None | _ShapeLike = ..., check_valid: Literal["warn", "raise", "ignore"] = ..., tol: float = ..., *, method: Literal["svd", "eigh", "cholesky"] = ...) -> ndarray[Any, dtype[float64]]: + ... + + def multinomial(self, n: _ArrayLikeInt_co, pvals: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int64]]: + ... + + def multivariate_hypergeometric(self, colors: _ArrayLikeInt_co, nsample: int, size: None | _ShapeLike = ..., method: Literal["marginals", "count"] = ...) -> ndarray[Any, dtype[int64]]: + ... + + def dirichlet(self, alpha: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + def permuted(self, x: ArrayLike, *, axis: None | int = ..., out: None | ndarray[Any, Any] = ...) -> ndarray[Any, Any]: + ... + + def shuffle(self, x: ArrayLike, axis: int = ...) -> None: + ... + + + +def default_rng(seed: None | _ArrayLikeInt_co | SeedSequence | BitGenerator | Generator = ...) -> Generator: + ... + diff --git a/typings/numpy/random/_mt19937.pyi b/typings/numpy/random/_mt19937.pyi new file mode 100644 index 0000000..d47d0e1 --- /dev/null +++ b/typings/numpy/random/_mt19937.pyi @@ -0,0 +1,38 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, TypedDict +from numpy import dtype, ndarray, uint32 +from numpy.random.bit_generator import BitGenerator, SeedSequence +from numpy._typing import _ArrayLikeInt_co + +class _MT19937Internal(TypedDict): + key: ndarray[Any, dtype[uint32]] + pos: int + ... + + +class _MT19937State(TypedDict): + bit_generator: str + state: _MT19937Internal + ... + + +class MT19937(BitGenerator): + def __init__(self, seed: None | _ArrayLikeInt_co | SeedSequence = ...) -> None: + ... + + def jumped(self, jumps: int = ...) -> MT19937: + ... + + @property + def state(self) -> _MT19937State: + ... + + @state.setter + def state(self, value: _MT19937State) -> None: + ... + + + diff --git a/typings/numpy/random/_pcg64.pyi b/typings/numpy/random/_pcg64.pyi new file mode 100644 index 0000000..cef90b7 --- /dev/null +++ b/typings/numpy/random/_pcg64.pyi @@ -0,0 +1,62 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import TypedDict +from numpy.random.bit_generator import BitGenerator, SeedSequence +from numpy._typing import _ArrayLikeInt_co + +class _PCG64Internal(TypedDict): + state: int + inc: int + ... + + +class _PCG64State(TypedDict): + bit_generator: str + state: _PCG64Internal + has_uint32: int + uinteger: int + ... + + +class PCG64(BitGenerator): + def __init__(self, seed: None | _ArrayLikeInt_co | SeedSequence = ...) -> None: + ... + + def jumped(self, jumps: int = ...) -> PCG64: + ... + + @property + def state(self) -> _PCG64State: + ... + + @state.setter + def state(self, value: _PCG64State) -> None: + ... + + def advance(self, delta: int) -> PCG64: + ... + + + +class PCG64DXSM(BitGenerator): + def __init__(self, seed: None | _ArrayLikeInt_co | SeedSequence = ...) -> None: + ... + + def jumped(self, jumps: int = ...) -> PCG64DXSM: + ... + + @property + def state(self) -> _PCG64State: + ... + + @state.setter + def state(self, value: _PCG64State) -> None: + ... + + def advance(self, delta: int) -> PCG64DXSM: + ... + + + diff --git a/typings/numpy/random/_philox.pyi b/typings/numpy/random/_philox.pyi new file mode 100644 index 0000000..be50983 --- /dev/null +++ b/typings/numpy/random/_philox.pyi @@ -0,0 +1,45 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, TypedDict +from numpy import dtype, ndarray, uint64 +from numpy.random.bit_generator import BitGenerator, SeedSequence +from numpy._typing import _ArrayLikeInt_co + +class _PhiloxInternal(TypedDict): + counter: ndarray[Any, dtype[uint64]] + key: ndarray[Any, dtype[uint64]] + ... + + +class _PhiloxState(TypedDict): + bit_generator: str + state: _PhiloxInternal + buffer: ndarray[Any, dtype[uint64]] + buffer_pos: int + has_uint32: int + uinteger: int + ... + + +class Philox(BitGenerator): + def __init__(self, seed: None | _ArrayLikeInt_co | SeedSequence = ..., counter: None | _ArrayLikeInt_co = ..., key: None | _ArrayLikeInt_co = ...) -> None: + ... + + @property + def state(self) -> _PhiloxState: + ... + + @state.setter + def state(self, value: _PhiloxState) -> None: + ... + + def jumped(self, jumps: int = ...) -> Philox: + ... + + def advance(self, delta: int) -> Philox: + ... + + + diff --git a/typings/numpy/random/_sfc64.pyi b/typings/numpy/random/_sfc64.pyi new file mode 100644 index 0000000..80907dc --- /dev/null +++ b/typings/numpy/random/_sfc64.pyi @@ -0,0 +1,36 @@ +""" +This type stub file was generated by pyright. +""" + +from typing import Any, TypedDict +from numpy import dtype as dtype, ndarray as ndarray, uint64 +from numpy.random.bit_generator import BitGenerator, SeedSequence +from numpy._typing import _ArrayLikeInt_co + +class _SFC64Internal(TypedDict): + state: ndarray[Any, dtype[uint64]] + ... + + +class _SFC64State(TypedDict): + bit_generator: str + state: _SFC64Internal + has_uint32: int + uinteger: int + ... + + +class SFC64(BitGenerator): + def __init__(self, seed: None | _ArrayLikeInt_co | SeedSequence = ...) -> None: + ... + + @property + def state(self) -> _SFC64State: + ... + + @state.setter + def state(self, value: _SFC64State) -> None: + ... + + + diff --git a/typings/numpy/random/bit_generator.pyi b/typings/numpy/random/bit_generator.pyi new file mode 100644 index 0000000..30ab035 --- /dev/null +++ b/typings/numpy/random/bit_generator.pyi @@ -0,0 +1,131 @@ +""" +This type stub file was generated by pyright. +""" + +import abc +from threading import Lock +from collections.abc import Callable, Mapping, Sequence +from typing import Any, Literal, NamedTuple, TypeVar, TypedDict, Union, overload +from numpy import dtype, ndarray, uint32, uint64 +from numpy._typing import _ArrayLikeInt_co, _ShapeLike, _SupportsDType, _UInt32Codes, _UInt64Codes + +_T = TypeVar("_T") +_DTypeLikeUint32 = Union[dtype[uint32], _SupportsDType[dtype[uint32]], type[uint32], _UInt32Codes,] +_DTypeLikeUint64 = Union[dtype[uint64], _SupportsDType[dtype[uint64]], type[uint64], _UInt64Codes,] +class _SeedSeqState(TypedDict): + entropy: None | int | Sequence[int] + spawn_key: tuple[int, ...] + pool_size: int + n_children_spawned: int + ... + + +class _Interface(NamedTuple): + state_address: Any + state: Any + next_uint64: Any + next_uint32: Any + next_double: Any + bit_generator: Any + ... + + +class ISeedSequence(abc.ABC): + @abc.abstractmethod + def generate_state(self, n_words: int, dtype: _DTypeLikeUint32 | _DTypeLikeUint64 = ...) -> ndarray[Any, dtype[uint32 | uint64]]: + ... + + + +class ISpawnableSeedSequence(ISeedSequence): + @abc.abstractmethod + def spawn(self: _T, n_children: int) -> list[_T]: + ... + + + +class SeedlessSeedSequence(ISpawnableSeedSequence): + def generate_state(self, n_words: int, dtype: _DTypeLikeUint32 | _DTypeLikeUint64 = ...) -> ndarray[Any, dtype[uint32 | uint64]]: + ... + + def spawn(self: _T, n_children: int) -> list[_T]: + ... + + + +class SeedSequence(ISpawnableSeedSequence): + entropy: None | int | Sequence[int] + spawn_key: tuple[int, ...] + pool_size: int + n_children_spawned: int + pool: ndarray[Any, dtype[uint32]] + def __init__(self, entropy: None | int | Sequence[int] | _ArrayLikeInt_co = ..., *, spawn_key: Sequence[int] = ..., pool_size: int = ..., n_children_spawned: int = ...) -> None: + ... + + def __repr__(self) -> str: + ... + + @property + def state(self) -> _SeedSeqState: + ... + + def generate_state(self, n_words: int, dtype: _DTypeLikeUint32 | _DTypeLikeUint64 = ...) -> ndarray[Any, dtype[uint32 | uint64]]: + ... + + def spawn(self, n_children: int) -> list[SeedSequence]: + ... + + + +class BitGenerator(abc.ABC): + lock: Lock + def __init__(self, seed: None | _ArrayLikeInt_co | SeedSequence = ...) -> None: + ... + + def __getstate__(self) -> dict[str, Any]: + ... + + def __setstate__(self, state: dict[str, Any]) -> None: + ... + + def __reduce__(self) -> tuple[Callable[[str], BitGenerator], tuple[str], tuple[dict[str, Any]]]: + ... + + @abc.abstractmethod + @property + def state(self) -> Mapping[str, Any]: + ... + + @state.setter + def state(self, value: Mapping[str, Any]) -> None: + ... + + @property + def seed_seq(self) -> ISeedSequence: + ... + + def spawn(self, n_children: int) -> list[BitGenerator]: + ... + + @overload + def random_raw(self, size: None = ..., output: Literal[True] = ...) -> int: + ... + + @overload + def random_raw(self, size: _ShapeLike = ..., output: Literal[True] = ...) -> ndarray[Any, dtype[uint64]]: + ... + + @overload + def random_raw(self, size: None | _ShapeLike = ..., output: Literal[False] = ...) -> None: + ... + + @property + def ctypes(self) -> _Interface: + ... + + @property + def cffi(self) -> _Interface: + ... + + + diff --git a/typings/numpy/random/mtrand.pyi b/typings/numpy/random/mtrand.pyi new file mode 100644 index 0000000..1c03db6 --- /dev/null +++ b/typings/numpy/random/mtrand.pyi @@ -0,0 +1,513 @@ +""" +This type stub file was generated by pyright. +""" + +import builtins +from collections.abc import Callable +from typing import Any, Literal, Union, overload +from numpy import bool_, dtype, float32, float64, int16, int32, int64, int8, int_, ndarray, uint, uint16, uint32, uint64, uint8 +from numpy.random.bit_generator import BitGenerator +from numpy._typing import ArrayLike, _ArrayLikeFloat_co, _ArrayLikeInt_co, _DTypeLikeBool, _DTypeLikeInt, _DTypeLikeUInt, _DoubleCodes, _Float32Codes, _Float64Codes, _Int16Codes, _Int32Codes, _Int64Codes, _Int8Codes, _IntCodes, _ShapeLike, _SingleCodes, _SupportsDType, _UInt16Codes, _UInt32Codes, _UInt64Codes, _UInt8Codes, _UIntCodes + +_DTypeLikeFloat32 = Union[dtype[float32], _SupportsDType[dtype[float32]], type[float32], _Float32Codes, _SingleCodes,] +_DTypeLikeFloat64 = Union[dtype[float64], _SupportsDType[dtype[float64]], type[float], type[float64], _Float64Codes, _DoubleCodes,] +class RandomState: + _bit_generator: BitGenerator + def __init__(self, seed: None | _ArrayLikeInt_co | BitGenerator = ...) -> None: + ... + + def __repr__(self) -> str: + ... + + def __str__(self) -> str: + ... + + def __getstate__(self) -> dict[str, Any]: + ... + + def __setstate__(self, state: dict[str, Any]) -> None: + ... + + def __reduce__(self) -> tuple[Callable[[str], RandomState], tuple[str], dict[str, Any]]: + ... + + def seed(self, seed: None | _ArrayLikeFloat_co = ...) -> None: + ... + + @overload + def get_state(self, legacy: Literal[False] = ...) -> dict[str, Any]: + ... + + @overload + def get_state(self, legacy: Literal[True] = ...) -> dict[str, Any] | tuple[str, ndarray[Any, dtype[uint32]], int, int, float]: + ... + + def set_state(self, state: dict[str, Any] | tuple[str, ndarray[Any, dtype[uint32]], int, int, float]) -> None: + ... + + @overload + def random_sample(self, size: None = ...) -> float: + ... + + @overload + def random_sample(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def random(self, size: None = ...) -> float: + ... + + @overload + def random(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def beta(self, a: float, b: float, size: None = ...) -> float: + ... + + @overload + def beta(self, a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def exponential(self, scale: float = ..., size: None = ...) -> float: + ... + + @overload + def exponential(self, scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_exponential(self, size: None = ...) -> float: + ... + + @overload + def standard_exponential(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def tomaxint(self, size: None = ...) -> int: + ... + + @overload + def tomaxint(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def randint(self, low: int, high: None | int = ...) -> int: + ... + + @overload + def randint(self, low: int, high: None | int = ..., size: None = ..., dtype: _DTypeLikeBool = ...) -> bool: + ... + + @overload + def randint(self, low: int, high: None | int = ..., size: None = ..., dtype: _DTypeLikeInt | _DTypeLikeUInt = ...) -> int: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: _DTypeLikeBool = ...) -> ndarray[Any, dtype[bool_]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int8] | type[int8] | _Int8Codes | _SupportsDType[dtype[int8]] = ...) -> ndarray[Any, dtype[int8]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int16] | type[int16] | _Int16Codes | _SupportsDType[dtype[int16]] = ...) -> ndarray[Any, dtype[int16]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int32] | type[int32] | _Int32Codes | _SupportsDType[dtype[int32]] = ...) -> ndarray[Any, dtype[int32]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: None | dtype[int64] | type[int64] | _Int64Codes | _SupportsDType[dtype[int64]] = ...) -> ndarray[Any, dtype[int64]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint8] | type[uint8] | _UInt8Codes | _SupportsDType[dtype[uint8]] = ...) -> ndarray[Any, dtype[uint8]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint16] | type[uint16] | _UInt16Codes | _SupportsDType[dtype[uint16]] = ...) -> ndarray[Any, dtype[uint16]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint32] | type[uint32] | _UInt32Codes | _SupportsDType[dtype[uint32]] = ...) -> ndarray[Any, dtype[uint32]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint64] | type[uint64] | _UInt64Codes | _SupportsDType[dtype[uint64]] = ...) -> ndarray[Any, dtype[uint64]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[int_] | type[int] | type[int_] | _IntCodes | _SupportsDType[dtype[int_]] = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def randint(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ..., dtype: dtype[uint] | type[uint] | _UIntCodes | _SupportsDType[dtype[uint]] = ...) -> ndarray[Any, dtype[uint]]: + ... + + def bytes(self, length: int) -> builtins.bytes: + ... + + @overload + def choice(self, a: int, size: None = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ...) -> int: + ... + + @overload + def choice(self, a: int, size: _ShapeLike = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def choice(self, a: ArrayLike, size: None = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ...) -> Any: + ... + + @overload + def choice(self, a: ArrayLike, size: _ShapeLike = ..., replace: bool = ..., p: None | _ArrayLikeFloat_co = ...) -> ndarray[Any, Any]: + ... + + @overload + def uniform(self, low: float = ..., high: float = ..., size: None = ...) -> float: + ... + + @overload + def uniform(self, low: _ArrayLikeFloat_co = ..., high: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def rand(self) -> float: + ... + + @overload + def rand(self, *args: int) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def randn(self) -> float: + ... + + @overload + def randn(self, *args: int) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def random_integers(self, low: int, high: None | int = ..., size: None = ...) -> int: + ... + + @overload + def random_integers(self, low: _ArrayLikeInt_co, high: None | _ArrayLikeInt_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def standard_normal(self, size: None = ...) -> float: + ... + + @overload + def standard_normal(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def normal(self, loc: float = ..., scale: float = ..., size: None = ...) -> float: + ... + + @overload + def normal(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_gamma(self, shape: float, size: None = ...) -> float: + ... + + @overload + def standard_gamma(self, shape: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def gamma(self, shape: float, scale: float = ..., size: None = ...) -> float: + ... + + @overload + def gamma(self, shape: _ArrayLikeFloat_co, scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def f(self, dfnum: float, dfden: float, size: None = ...) -> float: + ... + + @overload + def f(self, dfnum: _ArrayLikeFloat_co, dfden: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def noncentral_f(self, dfnum: float, dfden: float, nonc: float, size: None = ...) -> float: + ... + + @overload + def noncentral_f(self, dfnum: _ArrayLikeFloat_co, dfden: _ArrayLikeFloat_co, nonc: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def chisquare(self, df: float, size: None = ...) -> float: + ... + + @overload + def chisquare(self, df: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def noncentral_chisquare(self, df: float, nonc: float, size: None = ...) -> float: + ... + + @overload + def noncentral_chisquare(self, df: _ArrayLikeFloat_co, nonc: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_t(self, df: float, size: None = ...) -> float: + ... + + @overload + def standard_t(self, df: _ArrayLikeFloat_co, size: None = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_t(self, df: _ArrayLikeFloat_co, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def vonmises(self, mu: float, kappa: float, size: None = ...) -> float: + ... + + @overload + def vonmises(self, mu: _ArrayLikeFloat_co, kappa: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def pareto(self, a: float, size: None = ...) -> float: + ... + + @overload + def pareto(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def weibull(self, a: float, size: None = ...) -> float: + ... + + @overload + def weibull(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def power(self, a: float, size: None = ...) -> float: + ... + + @overload + def power(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def standard_cauchy(self, size: None = ...) -> float: + ... + + @overload + def standard_cauchy(self, size: _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def laplace(self, loc: float = ..., scale: float = ..., size: None = ...) -> float: + ... + + @overload + def laplace(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def gumbel(self, loc: float = ..., scale: float = ..., size: None = ...) -> float: + ... + + @overload + def gumbel(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def logistic(self, loc: float = ..., scale: float = ..., size: None = ...) -> float: + ... + + @overload + def logistic(self, loc: _ArrayLikeFloat_co = ..., scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def lognormal(self, mean: float = ..., sigma: float = ..., size: None = ...) -> float: + ... + + @overload + def lognormal(self, mean: _ArrayLikeFloat_co = ..., sigma: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def rayleigh(self, scale: float = ..., size: None = ...) -> float: + ... + + @overload + def rayleigh(self, scale: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def wald(self, mean: float, scale: float, size: None = ...) -> float: + ... + + @overload + def wald(self, mean: _ArrayLikeFloat_co, scale: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def triangular(self, left: float, mode: float, right: float, size: None = ...) -> float: + ... + + @overload + def triangular(self, left: _ArrayLikeFloat_co, mode: _ArrayLikeFloat_co, right: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + @overload + def binomial(self, n: int, p: float, size: None = ...) -> int: + ... + + @overload + def binomial(self, n: _ArrayLikeInt_co, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def negative_binomial(self, n: float, p: float, size: None = ...) -> int: + ... + + @overload + def negative_binomial(self, n: _ArrayLikeFloat_co, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def poisson(self, lam: float = ..., size: None = ...) -> int: + ... + + @overload + def poisson(self, lam: _ArrayLikeFloat_co = ..., size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def zipf(self, a: float, size: None = ...) -> int: + ... + + @overload + def zipf(self, a: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def geometric(self, p: float, size: None = ...) -> int: + ... + + @overload + def geometric(self, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def hypergeometric(self, ngood: int, nbad: int, nsample: int, size: None = ...) -> int: + ... + + @overload + def hypergeometric(self, ngood: _ArrayLikeInt_co, nbad: _ArrayLikeInt_co, nsample: _ArrayLikeInt_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def logseries(self, p: float, size: None = ...) -> int: + ... + + @overload + def logseries(self, p: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + def multivariate_normal(self, mean: _ArrayLikeFloat_co, cov: _ArrayLikeFloat_co, size: None | _ShapeLike = ..., check_valid: Literal["warn", "raise", "ignore"] = ..., tol: float = ...) -> ndarray[Any, dtype[float64]]: + ... + + def multinomial(self, n: _ArrayLikeInt_co, pvals: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[int_]]: + ... + + def dirichlet(self, alpha: _ArrayLikeFloat_co, size: None | _ShapeLike = ...) -> ndarray[Any, dtype[float64]]: + ... + + def shuffle(self, x: ArrayLike) -> None: + ... + + @overload + def permutation(self, x: int) -> ndarray[Any, dtype[int_]]: + ... + + @overload + def permutation(self, x: ArrayLike) -> ndarray[Any, Any]: + ... + + + +_rand: RandomState +beta = ... +binomial = ... +bytes = ... +chisquare = ... +choice = ... +dirichlet = ... +exponential = ... +f = ... +gamma = ... +get_state = ... +geometric = ... +gumbel = ... +hypergeometric = ... +laplace = ... +logistic = ... +lognormal = ... +logseries = ... +multinomial = ... +multivariate_normal = ... +negative_binomial = ... +noncentral_chisquare = ... +noncentral_f = ... +normal = ... +pareto = ... +permutation = ... +poisson = ... +power = ... +rand = ... +randint = ... +randn = ... +random = ... +random_integers = ... +random_sample = ... +rayleigh = ... +seed = ... +set_state = ... +shuffle = ... +standard_cauchy = ... +standard_exponential = ... +standard_gamma = ... +standard_normal = ... +standard_t = ... +triangular = ... +uniform = ... +vonmises = ... +wald = ... +weibull = ... +zipf = ... +sample = ... +ranf = ... +def set_bit_generator(bitgen: BitGenerator) -> None: + ... + +def get_bit_generator() -> BitGenerator: + ... + diff --git a/typings/numpy/testing/__init__.pyi b/typings/numpy/testing/__init__.pyi new file mode 100644 index 0000000..7426a5f --- /dev/null +++ b/typings/numpy/testing/__init__.pyi @@ -0,0 +1,11 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy._pytesttester import PytestTester +from unittest import TestCase as TestCase +from numpy.testing._private.utils import HAS_LAPACK64 as HAS_LAPACK64, HAS_REFCOUNT as HAS_REFCOUNT, IS_PYPY as IS_PYPY, IS_PYSTON as IS_PYSTON, IgnoreException as IgnoreException, KnownFailureException as KnownFailureException, SkipTest as SkipTest, assert_ as assert_, assert_allclose as assert_allclose, assert_almost_equal as assert_almost_equal, assert_approx_equal as assert_approx_equal, assert_array_almost_equal as assert_array_almost_equal, assert_array_almost_equal_nulp as assert_array_almost_equal_nulp, assert_array_compare as assert_array_compare, assert_array_equal as assert_array_equal, assert_array_less as assert_array_less, assert_array_max_ulp as assert_array_max_ulp, assert_equal as assert_equal, assert_no_gc_cycles as assert_no_gc_cycles, assert_no_warnings as assert_no_warnings, assert_raises as assert_raises, assert_raises_regex as assert_raises_regex, assert_string_equal as assert_string_equal, assert_warns as assert_warns, break_cycles as break_cycles, build_err_msg as build_err_msg, clear_and_catch_warnings as clear_and_catch_warnings, decorate_methods as decorate_methods, jiffies as jiffies, measure as measure, memusage as memusage, print_assert_equal as print_assert_equal, rundocs as rundocs, runstring as runstring, suppress_warnings as suppress_warnings, tempdir as tempdir, temppath as temppath, verbose as verbose + +__all__: list[str] +__path__: list[str] +test: PytestTester diff --git a/typings/numpy/testing/_private/utils.pyi b/typings/numpy/testing/_private/utils.pyi new file mode 100644 index 0000000..4c1b100 --- /dev/null +++ b/typings/numpy/testing/_private/utils.pyi @@ -0,0 +1,241 @@ +""" +This type stub file was generated by pyright. +""" + +import os +import sys +import ast +import types +import warnings +import unittest +import contextlib +from re import Pattern +from collections.abc import Callable, Iterable, Sequence +from typing import Any, AnyStr, ClassVar, Final, Literal as L, ParamSpec, SupportsIndex, TypeVar, Union, overload, type_check_only +from numpy import _FloatValue, bool_, number, object_ +from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLikeDT64_co, _ArrayLikeNumber_co, _ArrayLikeObject_co, _ArrayLikeTD64_co + +if sys.version_info >= (3, 10): + ... +else: + ... +_P = ParamSpec("_P") +_T = TypeVar("_T") +_ET = TypeVar("_ET", bound=BaseException) +_FT = TypeVar("_FT", bound=Callable[..., Any]) +_ComparisonFunc = Callable[[NDArray[Any], NDArray[Any]], Union[bool, bool_, number[Any], NDArray[Union[bool_, number[Any], object_]],],] +__all__: list[str] +class KnownFailureException(Exception): + ... + + +class IgnoreException(Exception): + ... + + +class clear_and_catch_warnings(warnings.catch_warnings): + class_modules: ClassVar[tuple[types.ModuleType, ...]] + modules: set[types.ModuleType] + @overload + def __new__(cls, record: L[False] = ..., modules: Iterable[types.ModuleType] = ...) -> _clear_and_catch_warnings_without_records: + ... + + @overload + def __new__(cls, record: L[True], modules: Iterable[types.ModuleType] = ...) -> _clear_and_catch_warnings_with_records: + ... + + @overload + def __new__(cls, record: bool, modules: Iterable[types.ModuleType] = ...) -> clear_and_catch_warnings: + ... + + def __enter__(self) -> None | list[warnings.WarningMessage]: + ... + + def __exit__(self, __exc_type: None | type[BaseException] = ..., __exc_val: None | BaseException = ..., __exc_tb: None | types.TracebackType = ...) -> None: + ... + + + +@type_check_only +class _clear_and_catch_warnings_with_records(clear_and_catch_warnings): + def __enter__(self) -> list[warnings.WarningMessage]: + ... + + + +@type_check_only +class _clear_and_catch_warnings_without_records(clear_and_catch_warnings): + def __enter__(self) -> None: + ... + + + +class suppress_warnings: + log: list[warnings.WarningMessage] + def __init__(self, forwarding_rule: L["always", "module", "once", "location"] = ...) -> None: + ... + + def filter(self, category: type[Warning] = ..., message: str = ..., module: None | types.ModuleType = ...) -> None: + ... + + def record(self, category: type[Warning] = ..., message: str = ..., module: None | types.ModuleType = ...) -> list[warnings.WarningMessage]: + ... + + def __enter__(self: _T) -> _T: + ... + + def __exit__(self, __exc_type: None | type[BaseException] = ..., __exc_val: None | BaseException = ..., __exc_tb: None | types.TracebackType = ...) -> None: + ... + + def __call__(self, func: _FT) -> _FT: + ... + + + +verbose: int +IS_PYPY: Final[bool] +IS_PYSTON: Final[bool] +HAS_REFCOUNT: Final[bool] +HAS_LAPACK64: Final[bool] +def assert_(val: object, msg: str | Callable[[], str] = ...) -> None: + ... + +if sys.platform == "win32" or sys.platform == "cygwin": + ... +else: + def memusage(_proc_pid_stat: str | bytes | os.PathLike[Any] = ...) -> None | int: + ... + +if sys.platform == "linux": + def jiffies(_proc_pid_stat: str | bytes | os.PathLike[Any] = ..., _load_time: list[float] = ...) -> int: + ... + +else: + ... +def build_err_msg(arrays: Iterable[object], err_msg: str, header: str = ..., verbose: bool = ..., names: Sequence[str] = ..., precision: None | SupportsIndex = ...) -> str: + ... + +def assert_equal(actual: object, desired: object, err_msg: str = ..., verbose: bool = ...) -> None: + ... + +def print_assert_equal(test_string: str, actual: object, desired: object) -> None: + ... + +def assert_almost_equal(actual: _ArrayLikeNumber_co | _ArrayLikeObject_co, desired: _ArrayLikeNumber_co | _ArrayLikeObject_co, decimal: int = ..., err_msg: str = ..., verbose: bool = ...) -> None: + ... + +def assert_approx_equal(actual: _FloatValue, desired: _FloatValue, significant: int = ..., err_msg: str = ..., verbose: bool = ...) -> None: + ... + +def assert_array_compare(comparison: _ComparisonFunc, x: ArrayLike, y: ArrayLike, err_msg: str = ..., verbose: bool = ..., header: str = ..., precision: SupportsIndex = ..., equal_nan: bool = ..., equal_inf: bool = ..., *, strict: bool = ...) -> None: + ... + +def assert_array_equal(x: ArrayLike, y: ArrayLike, err_msg: str = ..., verbose: bool = ..., *, strict: bool = ...) -> None: + ... + +def assert_array_almost_equal(x: _ArrayLikeNumber_co | _ArrayLikeObject_co, y: _ArrayLikeNumber_co | _ArrayLikeObject_co, decimal: float = ..., err_msg: str = ..., verbose: bool = ...) -> None: + ... + +@overload +def assert_array_less(x: _ArrayLikeNumber_co | _ArrayLikeObject_co, y: _ArrayLikeNumber_co | _ArrayLikeObject_co, err_msg: str = ..., verbose: bool = ...) -> None: + ... + +@overload +def assert_array_less(x: _ArrayLikeTD64_co, y: _ArrayLikeTD64_co, err_msg: str = ..., verbose: bool = ...) -> None: + ... + +@overload +def assert_array_less(x: _ArrayLikeDT64_co, y: _ArrayLikeDT64_co, err_msg: str = ..., verbose: bool = ...) -> None: + ... + +def runstring(astr: str | bytes | types.CodeType, dict: None | dict[str, Any]) -> Any: + ... + +def assert_string_equal(actual: str, desired: str) -> None: + ... + +def rundocs(filename: None | str | os.PathLike[str] = ..., raise_on_error: bool = ...) -> None: + ... + +def raises(*args: type[BaseException]) -> Callable[[_FT], _FT]: + ... + +@overload +def assert_raises(expected_exception: type[BaseException] | tuple[type[BaseException], ...], callable: Callable[_P, Any], /, *args: _P.args, **kwargs: _P.kwargs) -> None: + ... + +@overload +def assert_raises(expected_exception: type[_ET] | tuple[type[_ET], ...], *, msg: None | str = ...) -> unittest.case._AssertRaisesContext[_ET]: + ... + +@overload +def assert_raises_regex(expected_exception: type[BaseException] | tuple[type[BaseException], ...], expected_regex: str | bytes | Pattern[Any], callable: Callable[_P, Any], /, *args: _P.args, **kwargs: _P.kwargs) -> None: + ... + +@overload +def assert_raises_regex(expected_exception: type[_ET] | tuple[type[_ET], ...], expected_regex: str | bytes | Pattern[Any], *, msg: None | str = ...) -> unittest.case._AssertRaisesContext[_ET]: + ... + +def decorate_methods(cls: type[Any], decorator: Callable[[Callable[..., Any]], Any], testmatch: None | str | bytes | Pattern[Any] = ...) -> None: + ... + +def measure(code_str: str | bytes | ast.mod | ast.AST, times: int = ..., label: None | str = ...) -> float: + ... + +@overload +def assert_allclose(actual: _ArrayLikeNumber_co | _ArrayLikeObject_co, desired: _ArrayLikeNumber_co | _ArrayLikeObject_co, rtol: float = ..., atol: float = ..., equal_nan: bool = ..., err_msg: str = ..., verbose: bool = ...) -> None: + ... + +@overload +def assert_allclose(actual: _ArrayLikeTD64_co, desired: _ArrayLikeTD64_co, rtol: float = ..., atol: float = ..., equal_nan: bool = ..., err_msg: str = ..., verbose: bool = ...) -> None: + ... + +def assert_array_almost_equal_nulp(x: _ArrayLikeNumber_co, y: _ArrayLikeNumber_co, nulp: float = ...) -> None: + ... + +def assert_array_max_ulp(a: _ArrayLikeNumber_co, b: _ArrayLikeNumber_co, maxulp: float = ..., dtype: DTypeLike = ...) -> NDArray[Any]: + ... + +@overload +def assert_warns(warning_class: type[Warning]) -> contextlib._GeneratorContextManager[None]: + ... + +@overload +def assert_warns(warning_class: type[Warning], func: Callable[_P, _T], /, *args: _P.args, **kwargs: _P.kwargs) -> _T: + ... + +@overload +def assert_no_warnings() -> contextlib._GeneratorContextManager[None]: + ... + +@overload +def assert_no_warnings(func: Callable[_P, _T], /, *args: _P.args, **kwargs: _P.kwargs) -> _T: + ... + +@overload +def tempdir(suffix: None = ..., prefix: None = ..., dir: None = ...) -> contextlib._GeneratorContextManager[str]: + ... + +@overload +def tempdir(suffix: None | AnyStr = ..., prefix: None | AnyStr = ..., dir: None | AnyStr | os.PathLike[AnyStr] = ...) -> contextlib._GeneratorContextManager[AnyStr]: + ... + +@overload +def temppath(suffix: None = ..., prefix: None = ..., dir: None = ..., text: bool = ...) -> contextlib._GeneratorContextManager[str]: + ... + +@overload +def temppath(suffix: None | AnyStr = ..., prefix: None | AnyStr = ..., dir: None | AnyStr | os.PathLike[AnyStr] = ..., text: bool = ...) -> contextlib._GeneratorContextManager[AnyStr]: + ... + +@overload +def assert_no_gc_cycles() -> contextlib._GeneratorContextManager[None]: + ... + +@overload +def assert_no_gc_cycles(func: Callable[_P, Any], /, *args: _P.args, **kwargs: _P.kwargs) -> None: + ... + +def break_cycles() -> None: + ... + diff --git a/typings/numpy/tests/__init__.pyi b/typings/numpy/tests/__init__.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/numpy/tests/__init__.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/numpy/typing/__init__.pyi b/typings/numpy/typing/__init__.pyi new file mode 100644 index 0000000..12f659f --- /dev/null +++ b/typings/numpy/typing/__init__.pyi @@ -0,0 +1,166 @@ +""" +This type stub file was generated by pyright. +""" + +from numpy._typing import ArrayLike, DTypeLike, NBitBase, NDArray +from numpy._typing._add_docstring import _docstrings +from numpy._pytesttester import PytestTester + +""" +============================ +Typing (:mod:`numpy.typing`) +============================ + +.. versionadded:: 1.20 + +Large parts of the NumPy API have :pep:`484`-style type annotations. In +addition a number of type aliases are available to users, most prominently +the two below: + +- `ArrayLike`: objects that can be converted to arrays +- `DTypeLike`: objects that can be converted to dtypes + +.. _typing-extensions: https://pypi.org/project/typing-extensions/ + +Mypy plugin +----------- + +.. versionadded:: 1.21 + +.. automodule:: numpy.typing.mypy_plugin + +.. currentmodule:: numpy.typing + +Differences from the runtime NumPy API +-------------------------------------- + +NumPy is very flexible. Trying to describe the full range of +possibilities statically would result in types that are not very +helpful. For that reason, the typed NumPy API is often stricter than +the runtime NumPy API. This section describes some notable +differences. + +ArrayLike +~~~~~~~~~ + +The `ArrayLike` type tries to avoid creating object arrays. For +example, + +.. code-block:: python + + >>> np.array(x**2 for x in range(10)) + array( at ...>, dtype=object) + +is valid NumPy code which will create a 0-dimensional object +array. Type checkers will complain about the above example when using +the NumPy types however. If you really intended to do the above, then +you can either use a ``# type: ignore`` comment: + +.. code-block:: python + + >>> np.array(x**2 for x in range(10)) # type: ignore + +or explicitly type the array like object as `~typing.Any`: + +.. code-block:: python + + >>> from typing import Any + >>> array_like: Any = (x**2 for x in range(10)) + >>> np.array(array_like) + array( at ...>, dtype=object) + +ndarray +~~~~~~~ + +It's possible to mutate the dtype of an array at runtime. For example, +the following code is valid: + +.. code-block:: python + + >>> x = np.array([1, 2]) + >>> x.dtype = np.bool_ + +This sort of mutation is not allowed by the types. Users who want to +write statically typed code should instead use the `numpy.ndarray.view` +method to create a view of the array with a different dtype. + +DTypeLike +~~~~~~~~~ + +The `DTypeLike` type tries to avoid creation of dtype objects using +dictionary of fields like below: + +.. code-block:: python + + >>> x = np.dtype({"field1": (float, 1), "field2": (int, 3)}) + +Although this is valid NumPy code, the type checker will complain about it, +since its usage is discouraged. +Please see : :ref:`Data type objects ` + +Number precision +~~~~~~~~~~~~~~~~ + +The precision of `numpy.number` subclasses is treated as a covariant generic +parameter (see :class:`~NBitBase`), simplifying the annotating of processes +involving precision-based casting. + +.. code-block:: python + + >>> from typing import TypeVar + >>> import numpy as np + >>> import numpy.typing as npt + + >>> T = TypeVar("T", bound=npt.NBitBase) + >>> def func(a: "np.floating[T]", b: "np.floating[T]") -> "np.floating[T]": + ... ... + +Consequently, the likes of `~numpy.float16`, `~numpy.float32` and +`~numpy.float64` are still sub-types of `~numpy.floating`, but, contrary to +runtime, they're not necessarily considered as sub-classes. + +Timedelta64 +~~~~~~~~~~~ + +The `~numpy.timedelta64` class is not considered a subclass of +`~numpy.signedinteger`, the former only inheriting from `~numpy.generic` +while static type checking. + +0D arrays +~~~~~~~~~ + +During runtime numpy aggressively casts any passed 0D arrays into their +corresponding `~numpy.generic` instance. Until the introduction of shape +typing (see :pep:`646`) it is unfortunately not possible to make the +necessary distinction between 0D and >0D arrays. While thus not strictly +correct, all operations are that can potentially perform a 0D-array -> scalar +cast are currently annotated as exclusively returning an `ndarray`. + +If it is known in advance that an operation _will_ perform a +0D-array -> scalar cast, then one can consider manually remedying the +situation with either `typing.cast` or a ``# type: ignore`` comment. + +Record array dtypes +~~~~~~~~~~~~~~~~~~~ + +The dtype of `numpy.recarray`, and the `numpy.rec` functions in general, +can be specified in one of two ways: + +* Directly via the ``dtype`` argument. +* With up to five helper arguments that operate via `numpy.format_parser`: + ``formats``, ``names``, ``titles``, ``aligned`` and ``byteorder``. + +These two approaches are currently typed as being mutually exclusive, +*i.e.* if ``dtype`` is specified than one may not specify ``formats``. +While this mutual exclusivity is not (strictly) enforced during runtime, +combining both dtype specifiers can lead to unexpected or even downright +buggy behavior. + +API +--- + +""" +__all__ = ["ArrayLike", "DTypeLike", "NBitBase", "NDArray"] +if __doc__ is not None: + ... +test = ... diff --git a/typings/numpy/version.pyi b/typings/numpy/version.pyi new file mode 100644 index 0000000..4d3d54f --- /dev/null +++ b/typings/numpy/version.pyi @@ -0,0 +1,10 @@ +""" +This type stub file was generated by pyright. +""" + +version = ... +__version__ = ... +full_version = ... +git_revision = ... +release = ... +short_version = ... diff --git a/typings/seaborn/__init__.pyi b/typings/seaborn/__init__.pyi new file mode 100644 index 0000000..646fb7c --- /dev/null +++ b/typings/seaborn/__init__.pyi @@ -0,0 +1,21 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib as mpl +from .rcmod import * +from .utils import * +from .palettes import * +from .relational import * +from .regression import * +from .categorical import * +from .distributions import * +from .matrix import * +from .miscplot import * +from .axisgrid import * +from .widgets import * +from .colors import crayons, xkcd_rgb +from . import cm + +_orig_rc_params = ... +__version__ = ... diff --git a/typings/seaborn/_core.pyi b/typings/seaborn/_core.pyi new file mode 100644 index 0000000..ca4b046 --- /dev/null +++ b/typings/seaborn/_core.pyi @@ -0,0 +1,275 @@ +""" +This type stub file was generated by pyright. +""" + +from ._decorators import share_init_params_with_map + +class SemanticMapping: + """Base class for mapping data values to plot attributes.""" + map_type = ... + levels = ... + lookup_table = ... + def __init__(self, plotter) -> None: + ... + + def map(cls, plotter, *args, **kwargs): + ... + + def __call__(self, key, *args, **kwargs): # -> list[Unknown]: + """Get the attribute(s) values for the data key.""" + ... + + + +@share_init_params_with_map +class HueMapping(SemanticMapping): + """Mapping that sets artist colors according to data values.""" + palette = ... + norm = ... + cmap = ... + def __init__(self, plotter, palette=..., order=..., norm=...) -> None: + """Map the levels of the `hue` variable to distinct colors. + + Parameters + ---------- + # TODO add generic parameters + + """ + ... + + def infer_map_type(self, palette, norm, input_format, var_type): # -> Literal['categorical', 'numeric']: + """Determine how to implement the mapping.""" + ... + + def categorical_mapping(self, data, palette, order): # -> tuple[list[Any], dict[Unknown, Unknown] | dict[Any, str | tuple[float, float, float]]]: + """Determine colors when the hue mapping is categorical.""" + ... + + def numeric_mapping(self, data, palette, norm): # -> tuple[list[Unknown] | list[Any], dict[Unknown, Unknown], Unknown, Unknown | _ColorPalette | list[tuple[float, float, float]] | Any | list[str] | Literal['ch:']]: + """Determine colors when the hue variable is quantitative.""" + ... + + + +@share_init_params_with_map +class SizeMapping(SemanticMapping): + """Mapping that sets artist sizes according to data values.""" + norm = ... + def __init__(self, plotter, sizes=..., order=..., norm=...) -> None: + """Map the levels of the `size` variable to distinct values. + + Parameters + ---------- + # TODO add generic parameters + + """ + ... + + def infer_map_type(self, norm, sizes, var_type): # -> Literal['numeric', 'categorical']: + ... + + def categorical_mapping(self, data, sizes, order): # -> tuple[list[Any], dict[Unknown, Unknown] | dict[Any, Unknown]]: + ... + + def numeric_mapping(self, data, sizes, norm): # -> tuple[list[Any], dict[Unknown, Unknown] | dict[Any, Unknown], Unknown]: + ... + + + +@share_init_params_with_map +class StyleMapping(SemanticMapping): + """Mapping that sets artist style according to data values.""" + map_type = ... + def __init__(self, plotter, markers=..., dashes=..., order=...) -> None: + """Map the levels of the `style` variable to distinct values. + + Parameters + ---------- + # TODO add generic parameters + + """ + ... + + + +class VectorPlotter: + """Base class for objects underlying *plot functions.""" + _semantic_mappings = ... + semantics = ... + wide_structure = ... + flat_structure = ... + _default_size_range = ... + def __init__(self, data=..., variables=...) -> None: + ... + + @classmethod + def get_semantics(cls, kwargs, semantics=...): # -> dict[Unknown, Unknown]: + """Subset a dictionary` arguments with known semantic variables.""" + ... + + @property + def has_xy_data(self): # -> bool: + """Return True at least one of x or y is defined.""" + ... + + @property + def var_levels(self): # -> dict[Unknown, Unknown]: + """Property interface to ordered list of variables levels. + + Each time it's accessed, it updates the var_levels dictionary with the + list of levels in the current semantic mappers. But it also allows the + dictionary to persist, so it can be used to set levels by a key. This is + used to track the list of col/row levels using an attached FacetGrid + object, but it's kind of messy and ideally fixed by improving the + faceting logic so it interfaces better with the modern approach to + tracking plot variables. + + """ + ... + + def assign_variables(self, data=..., variables=...): # -> Self@VectorPlotter: + """Define plot variables, optionally using lookup from `data`.""" + ... + + def iter_data(self, grouping_vars=..., reverse=..., from_comp_data=...): # -> Generator[tuple[dict[str | Unknown, Any], DataFrame | Series | Unknown] | tuple[dict[Unknown, Unknown], DataFrame | Unknown], Any, None]: + """Generator for getting subsets of data defined by semantic variables. + + Also injects "col" and "row" into grouping semantics. + + Parameters + ---------- + grouping_vars : string or list of strings + Semantic variables that define the subsets of data. + reverse : bool, optional + If True, reverse the order of iteration. + from_comp_data : bool, optional + If True, use self.comp_data rather than self.plot_data + + Yields + ------ + sub_vars : dict + Keys are semantic names, values are the level of that semantic. + sub_data : :class:`pandas.DataFrame` + Subset of ``plot_data`` for this combination of semantic values. + + """ + ... + + @property + def comp_data(self): # -> DataFrame: + """Dataframe with numeric x and y, after unit conversion and log scaling.""" + ... + + + +def variable_type(vector, boolean_type=...): # -> str: + """ + Determine whether a vector contains numeric, categorical, or datetime data. + + This function differs from the pandas typing API in two ways: + + - Python sequences or object-typed PyData objects are considered numeric if + all of their entries are numeric. + - String or mixed-type data are considered categorical even if not + explicitly represented as a :class:`pandas.api.types.CategoricalDtype`. + + Parameters + ---------- + vector : :func:`pandas.Series`, :func:`numpy.ndarray`, or Python sequence + Input data to test. + boolean_type : 'numeric' or 'categorical' + Type to use for vectors containing only 0s and 1s (and NAs). + + Returns + ------- + var_type : 'numeric', 'categorical', or 'datetime' + Name identifying the type of data in the vector. + """ + ... + +def infer_orient(x=..., y=..., orient=..., require_numeric=...): # -> Literal['v', 'h']: + """Determine how the plot should be oriented based on the data. + + For historical reasons, the convention is to call a plot "horizontally" + or "vertically" oriented based on the axis representing its dependent + variable. Practically, this is used when determining the axis for + numerical aggregation. + + Paramters + --------- + x, y : Vector data or None + Positional data vectors for the plot. + orient : string or None + Specified orientation, which must start with "v" or "h" if not None. + require_numeric : bool + If set, raise when the implied dependent variable is not numeric. + + Returns + ------- + orient : "v" or "h" + + Raises + ------ + ValueError: When `orient` is not None and does not start with "h" or "v" + TypeError: When dependant variable is not numeric, with `require_numeric` + + """ + ... + +def unique_dashes(n): # -> list[Unknown]: + """Build an arbitrarily long list of unique dash styles for lines. + + Parameters + ---------- + n : int + Number of unique dash specs to generate. + + Returns + ------- + dashes : list of strings or tuples + Valid arguments for the ``dashes`` parameter on + :class:`matplotlib.lines.Line2D`. The first spec is a solid + line (``""``), the remainder are sequences of long and short + dashes. + + """ + ... + +def unique_markers(n): # -> list[Unknown]: + """Build an arbitrarily long list of unique marker styles for points. + + Parameters + ---------- + n : int + Number of unique marker specs to generate. + + Returns + ------- + markers : list of string or tuples + Values for defining :class:`matplotlib.markers.MarkerStyle` objects. + All markers will be filled. + + """ + ... + +def categorical_order(vector, order=...): # -> list[Any]: + """Return a list of unique data values. + + Determine an ordered list of levels in ``values``. + + Parameters + ---------- + vector : list, array, Categorical, or Series + Vector of "categorical" values + order : list-like, optional + Desired order of category levels to override the order determined + from the ``values`` object. + + Returns + ------- + order : list + Ordered list of category levels not including null values. + + """ + ... + diff --git a/typings/seaborn/_decorators.pyi b/typings/seaborn/_decorators.pyi new file mode 100644 index 0000000..f411dc4 --- /dev/null +++ b/typings/seaborn/_decorators.pyi @@ -0,0 +1,8 @@ +""" +This type stub file was generated by pyright. +""" + +def share_init_params_with_map(cls): + """Make cls.map a classmethod with same signature as cls.__init__.""" + ... + diff --git a/typings/seaborn/_docstrings.pyi b/typings/seaborn/_docstrings.pyi new file mode 100644 index 0000000..cbeee67 --- /dev/null +++ b/typings/seaborn/_docstrings.pyi @@ -0,0 +1,30 @@ +""" +This type stub file was generated by pyright. +""" + +class DocstringComponents: + regexp = ... + def __init__(self, comp_dict, strip_whitespace=...) -> None: + """Read entries from a dict, optionally stripping outer whitespace.""" + ... + + def __getattr__(self, attr): # -> Any: + """Provided dot access to entries.""" + ... + + @classmethod + def from_nested_components(cls, **kwargs): # -> Self@DocstringComponents: + """Add multiple sub-sets of components.""" + ... + + @classmethod + def from_function_params(cls, func): # -> Self@DocstringComponents: + """Use the numpydoc parser to extract components from existing func.""" + ... + + + +_core_params = ... +_core_returns = ... +_seealso_blurbs = ... +_core_docs = ... diff --git a/typings/seaborn/_statistics.pyi b/typings/seaborn/_statistics.pyi new file mode 100644 index 0000000..5471d4b --- /dev/null +++ b/typings/seaborn/_statistics.pyi @@ -0,0 +1,132 @@ +""" +This type stub file was generated by pyright. +""" + +"""Statistical transformations for visualization. + +This module is currently private, but is being written to eventually form part +of the public API. + +The classes should behave roughly in the style of scikit-learn. + +- All data-independent parameters should be passed to the class constructor. +- Each class should impelment a default transformation that is exposed through + __call__. These are currently written for vector arguements, but I think + consuming a whole `plot_data` DataFrame and return it with transformed + variables would make more sense. +- Some class have data-dependent preprocessing that should be cached and used + multiple times (think defining histogram bins off all data and then counting + observations within each bin multiple times per data subsets). These currently + have unique names, but it would be good to have a common name. Not quite + `fit`, but something similar. +- Alternatively, the transform interface could take some information about grouping + variables and do a groupby internally. +- Some classes should define alternate transforms that might make the most sense + with a different function. For example, KDE usually evaluates the distribution + on a regular grid, but it would be useful for it to transform at the actual + datapoints. Then again, this could be controlled by a parameter at the time of + class instantiation. + +""" +class KDE: + """Univariate and bivariate kernel density estimator.""" + def __init__(self, *, bw_method=..., bw_adjust=..., gridsize=..., cut=..., clip=..., cumulative=...) -> None: + """Initialize the estimator with its parameters. + + Parameters + ---------- + bw_method : string, scalar, or callable, optional + Method for determining the smoothing bandwidth to use; passed to + :class:`scipy.stats.gaussian_kde`. + bw_adjust : number, optional + Factor that multiplicatively scales the value chosen using + ``bw_method``. Increasing will make the curve smoother. See Notes. + gridsize : int, optional + Number of points on each dimension of the evaluation grid. + cut : number, optional + Factor, multiplied by the smoothing bandwidth, that determines how + far the evaluation grid extends past the extreme datapoints. When + set to 0, truncate the curve at the data limits. + clip : pair of numbers None, or a pair of such pairs + Do not evaluate the density outside of these limits. + cumulative : bool, optional + If True, estimate a cumulative distribution function. + + """ + ... + + def define_support(self, x1, x2=..., weights=..., cache=...): # -> NDArray[floating[Any]] | tuple[NDArray[floating[Any]], NDArray[floating[Any]]]: + """Create the evaluation grid for a given data set.""" + ... + + def __call__(self, x1, x2=..., weights=...): # -> tuple[NDArray[Unknown] | Unknown, NDArray[floating[Any]] | tuple[NDArray[floating[Any]], NDArray[floating[Any]]]] | tuple[NDArray[float64] | Unknown, NDArray[floating[Any]] | tuple[NDArray[floating[Any]], NDArray[floating[Any]]]]: + """Fit and evaluate on univariate or bivariate data.""" + ... + + + +class Histogram: + """Univariate and bivariate histogram estimator.""" + def __init__(self, stat=..., bins=..., binwidth=..., binrange=..., discrete=..., cumulative=...) -> None: + """Initialize the estimator with its parameters. + + Parameters + ---------- + stat : {"count", "frequency", "density", "probability"} + Aggregate statistic to compute in each bin. + + - ``count`` shows the number of observations + - ``frequency`` shows the number of observations divided by the bin width + - ``density`` normalizes counts so that the area of the histogram is 1 + - ``probability`` normalizes counts so that the sum of the bar heights is 1 + + bins : str, number, vector, or a pair of such values + Generic bin parameter that can be the name of a reference rule, + the number of bins, or the breaks of the bins. + Passed to :func:`numpy.histogram_bin_edges`. + binwidth : number or pair of numbers + Width of each bin, overrides ``bins`` but can be used with + ``binrange``. + binrange : pair of numbers or a pair of pairs + Lowest and highest value for bin edges; can be used either + with ``bins`` or ``binwidth``. Defaults to data extremes. + discrete : bool or pair of bools + If True, set ``binwidth`` and ``binrange`` such that bin + edges cover integer values in the dataset. + cumulative : bool + If True, return the cumulative statistic. + + """ + ... + + def define_bin_edges(self, x1, x2=..., weights=..., cache=...): # -> NDArray[Any] | tuple[Unknown, ...]: + """Given data, return the edges of the histogram bins.""" + ... + + def __call__(self, x1, x2=..., weights=...): # -> tuple[Any | ndarray[Any, Any] | NDArray[float64] | NDArray[Any], Unknown | NDArray[Any] | tuple[Unknown, ...]] | tuple[Unknown, Unknown | NDArray[Any] | tuple[Unknown, ...]]: + """Count the occurrances in each bin, maybe normalize.""" + ... + + + +class ECDF: + """Univariate empirical cumulative distribution estimator.""" + def __init__(self, stat=..., complementary=...) -> None: + """Initialize the class with its paramters + + Parameters + ---------- + stat : {{"proportion", "count"}} + Distribution statistic to compute. + complementary : bool + If True, use the complementary CDF (1 - CDF) + + """ + ... + + def __call__(self, x1, x2=..., weights=...): # -> tuple[Any, Any]: + """Return proportion or count of observations below each sorted datapoint.""" + ... + + + diff --git a/typings/seaborn/_testing.pyi b/typings/seaborn/_testing.pyi new file mode 100644 index 0000000..71299a2 --- /dev/null +++ b/typings/seaborn/_testing.pyi @@ -0,0 +1,16 @@ +""" +This type stub file was generated by pyright. +""" + +LINE_PROPS = ... +COLLECTION_PROPS = ... +BAR_PROPS = ... +def assert_artists_equal(list1, list2, properties): # -> None: + ... + +def assert_legends_equal(leg1, leg2): # -> None: + ... + +def assert_plots_equal(ax1, ax2, labels=...): # -> None: + ... + diff --git a/typings/seaborn/algorithms.pyi b/typings/seaborn/algorithms.pyi new file mode 100644 index 0000000..fee7dc3 --- /dev/null +++ b/typings/seaborn/algorithms.pyi @@ -0,0 +1,35 @@ +""" +This type stub file was generated by pyright. +""" + +"""Algorithms to support fitting routines in seaborn plotting functions.""" +def bootstrap(*args, **kwargs): # -> NDArray[Unknown]: + """Resample one or more arrays with replacement and store aggregate values. + + Positional arguments are a sequence of arrays to bootstrap along the first + axis and pass to a summary function. + + Keyword arguments: + n_boot : int, default 10000 + Number of iterations + axis : int, default None + Will pass axis to ``func`` as a keyword argument. + units : array, default None + Array of sampling unit IDs. When used the bootstrap resamples units + and then observations within units instead of individual + datapoints. + func : string or callable, default np.mean + Function to call on the args that are passed in. If string, tries + to use as named method on numpy array. + seed : Generator | SeedSequence | RandomState | int | None + Seed for the random number generator; useful if you want + reproducible resamples. + + Returns + ------- + boot_dist: array + array of bootstrapped statistic values + + """ + ... + diff --git a/typings/seaborn/axisgrid.pyi b/typings/seaborn/axisgrid.pyi new file mode 100644 index 0000000..87880c3 --- /dev/null +++ b/typings/seaborn/axisgrid.pyi @@ -0,0 +1,548 @@ +""" +This type stub file was generated by pyright. +""" + +from ._decorators import _deprecate_positional_args + +__all__ = ["FacetGrid", "PairGrid", "JointGrid", "pairplot", "jointplot"] +_param_docs = ... +class Grid: + """Base class for grids of subplots.""" + _margin_titles = ... + _legend_out = ... + def __init__(self) -> None: + ... + + def set(self, **kwargs): # -> Self@Grid: + """Set attributes on each subplot Axes.""" + ... + + def savefig(self, *args, **kwargs): # -> None: + """Save the figure.""" + ... + + def tight_layout(self, *args, **kwargs): # -> None: + """Call fig.tight_layout within rect that exclude the legend.""" + ... + + def add_legend(self, legend_data=..., title=..., label_order=..., adjust_subtitles=..., **kwargs): # -> Self@Grid: + """Draw a legend, maybe placing it outside axes and resizing the figure. + + Parameters + ---------- + legend_data : dict + Dictionary mapping label names (or two-element tuples where the + second element is a label name) to matplotlib artist handles. The + default reads from ``self._legend_data``. + title : string + Title for the legend. The default reads from ``self._hue_var``. + label_order : list of labels + The order that the legend entries should appear in. The default + reads from ``self.hue_names``. + adjust_subtitles : bool + If True, modify entries with invisible artists to left-align + the labels and set the font size to that of a title. + kwargs : key, value pairings + Other keyword arguments are passed to the underlying legend methods + on the Figure or Axes object. + + Returns + ------- + self : Grid instance + Returns self for easy chaining. + + """ + ... + + @property + def legend(self): # -> None: + """The :class:`matplotlib.legend.Legend` object, if present.""" + ... + + + +_facet_docs = ... +class FacetGrid(Grid): + """Multi-plot grid for plotting conditional relationships.""" + @_deprecate_positional_args + def __init__(self, data, *, row=..., col=..., hue=..., col_wrap=..., sharex=..., sharey=..., height=..., aspect=..., palette=..., row_order=..., col_order=..., hue_order=..., hue_kws=..., dropna=..., legend_out=..., despine=..., margin_titles=..., xlim=..., ylim=..., subplot_kws=..., gridspec_kws=..., size=...) -> None: + ... + + def facet_data(self): # -> Generator[tuple[tuple[int, int, int], Unknown], Any, None]: + """Generator for name indices and data subsets for each facet. + + Yields + ------ + (i, j, k), data_ijk : tuple of ints, DataFrame + The ints provide an index into the {row, col, hue}_names attribute, + and the dataframe contains a subset of the full data corresponding + to each facet. The generator yields subsets that correspond with + the self.axes.flat iterator, or self.axes[i, j] when `col_wrap` + is None. + + """ + ... + + def map(self, func, *args, **kwargs): # -> Self@FacetGrid: + """Apply a plotting function to each facet's subset of the data. + + Parameters + ---------- + func : callable + A plotting function that takes data and keyword arguments. It + must plot to the currently active matplotlib Axes and take a + `color` keyword argument. If faceting on the `hue` dimension, + it must also take a `label` keyword argument. + args : strings + Column names in self.data that identify variables with data to + plot. The data for each variable is passed to `func` in the + order the variables are specified in the call. + kwargs : keyword arguments + All keyword arguments are passed to the plotting function. + + Returns + ------- + self : object + Returns self. + + """ + ... + + def map_dataframe(self, func, *args, **kwargs): # -> Self@FacetGrid: + """Like ``.map`` but passes args as strings and inserts data in kwargs. + + This method is suitable for plotting with functions that accept a + long-form DataFrame as a `data` keyword argument and access the + data in that DataFrame using string variable names. + + Parameters + ---------- + func : callable + A plotting function that takes data and keyword arguments. Unlike + the `map` method, a function used here must "understand" Pandas + objects. It also must plot to the currently active matplotlib Axes + and take a `color` keyword argument. If faceting on the `hue` + dimension, it must also take a `label` keyword argument. + args : strings + Column names in self.data that identify variables with data to + plot. The data for each variable is passed to `func` in the + order the variables are specified in the call. + kwargs : keyword arguments + All keyword arguments are passed to the plotting function. + + Returns + ------- + self : object + Returns self. + + """ + ... + + def facet_axis(self, row_i, col_j, modify_state=...): # -> Any | ndarray[Any, dtype[Any]]: + """Make the axis identified by these indices active and return it.""" + ... + + def despine(self, **kwargs): # -> Self@FacetGrid: + """Remove axis spines from the facets.""" + ... + + def set_axis_labels(self, x_var=..., y_var=..., clear_inner=..., **kwargs): # -> Self@FacetGrid: + """Set axis labels on the left column and bottom row of the grid.""" + ... + + def set_xlabels(self, label=..., clear_inner=..., **kwargs): # -> Self@FacetGrid: + """Label the x axis on the bottom row of the grid.""" + ... + + def set_ylabels(self, label=..., clear_inner=..., **kwargs): # -> Self@FacetGrid: + """Label the y axis on the left column of the grid.""" + ... + + def set_xticklabels(self, labels=..., step=..., **kwargs): # -> Self@FacetGrid: + """Set x axis tick labels of the grid.""" + ... + + def set_yticklabels(self, labels=..., **kwargs): # -> Self@FacetGrid: + """Set y axis tick labels on the left column of the grid.""" + ... + + def set_titles(self, template=..., row_template=..., col_template=..., **kwargs): # -> Self@FacetGrid: + """Draw titles either above each facet or on the grid margins. + + Parameters + ---------- + template : string + Template for all titles with the formatting keys {col_var} and + {col_name} (if using a `col` faceting variable) and/or {row_var} + and {row_name} (if using a `row` faceting variable). + row_template: + Template for the row variable when titles are drawn on the grid + margins. Must have {row_var} and {row_name} formatting keys. + col_template: + Template for the row variable when titles are drawn on the grid + margins. Must have {col_var} and {col_name} formatting keys. + + Returns + ------- + self: object + Returns self. + + """ + ... + + @property + def fig(self): # -> Figure: + """The :class:`matplotlib.figure.Figure` with the plot.""" + ... + + @property + def axes(self): # -> Any | NDArray[Any]: + """An array of the :class:`matplotlib.axes.Axes` objects in the grid.""" + ... + + @property + def ax(self): # -> Any: + """The :class:`matplotlib.axes.Axes` when no faceting variables are assigned.""" + ... + + @property + def axes_dict(self): # -> dict[Any, Any] | dict[tuple[Any, Any], Any]: + """A mapping of facet names to corresponding :class:`matplotlib.axes.Axes`. + + If only one of ``row`` or ``col`` is assigned, each key is a string + representing a level of that variable. If both facet dimensions are + assigned, each key is a ``({row_level}, {col_level})`` tuple. + + """ + ... + + + +class PairGrid(Grid): + """Subplot grid for plotting pairwise relationships in a dataset. + + This object maps each variable in a dataset onto a column and row in a + grid of multiple axes. Different axes-level plotting functions can be + used to draw bivariate plots in the upper and lower triangles, and the + the marginal distribution of each variable can be shown on the diagonal. + + Several different common plots can be generated in a single line using + :func:`pairplot`. Use :class:`PairGrid` when you need more flexibility. + + See the :ref:`tutorial ` for more information. + + """ + @_deprecate_positional_args + def __init__(self, data, *, hue=..., hue_order=..., palette=..., hue_kws=..., vars=..., x_vars=..., y_vars=..., corner=..., diag_sharey=..., height=..., aspect=..., layout_pad=..., despine=..., dropna=..., size=...) -> None: + """Initialize the plot figure and PairGrid object. + + Parameters + ---------- + data : DataFrame + Tidy (long-form) dataframe where each column is a variable and + each row is an observation. + hue : string (variable name) + Variable in ``data`` to map plot aspects to different colors. This + variable will be excluded from the default x and y variables. + hue_order : list of strings + Order for the levels of the hue variable in the palette + palette : dict or seaborn color palette + Set of colors for mapping the ``hue`` variable. If a dict, keys + should be values in the ``hue`` variable. + hue_kws : dictionary of param -> list of values mapping + Other keyword arguments to insert into the plotting call to let + other plot attributes vary across levels of the hue variable (e.g. + the markers in a scatterplot). + vars : list of variable names + Variables within ``data`` to use, otherwise use every column with + a numeric datatype. + {x, y}_vars : lists of variable names + Variables within ``data`` to use separately for the rows and + columns of the figure; i.e. to make a non-square plot. + corner : bool + If True, don't add axes to the upper (off-diagonal) triangle of the + grid, making this a "corner" plot. + height : scalar + Height (in inches) of each facet. + aspect : scalar + Aspect * height gives the width (in inches) of each facet. + layout_pad : scalar + Padding between axes; passed to ``fig.tight_layout``. + despine : boolean + Remove the top and right spines from the plots. + dropna : boolean + Drop missing values from the data before plotting. + + See Also + -------- + pairplot : Easily drawing common uses of :class:`PairGrid`. + FacetGrid : Subplot grid for plotting conditional relationships. + + Examples + -------- + + .. include:: ../docstrings/PairGrid.rst + + """ + ... + + def map(self, func, **kwargs): # -> Self@PairGrid: + """Plot with the same function in every subplot. + + Parameters + ---------- + func : callable plotting function + Must take x, y arrays as positional arguments and draw onto the + "currently active" matplotlib Axes. Also needs to accept kwargs + called ``color`` and ``label``. + + """ + ... + + def map_lower(self, func, **kwargs): # -> Self@PairGrid: + """Plot with a bivariate function on the lower diagonal subplots. + + Parameters + ---------- + func : callable plotting function + Must take x, y arrays as positional arguments and draw onto the + "currently active" matplotlib Axes. Also needs to accept kwargs + called ``color`` and ``label``. + + """ + ... + + def map_upper(self, func, **kwargs): # -> Self@PairGrid: + """Plot with a bivariate function on the upper diagonal subplots. + + Parameters + ---------- + func : callable plotting function + Must take x, y arrays as positional arguments and draw onto the + "currently active" matplotlib Axes. Also needs to accept kwargs + called ``color`` and ``label``. + + """ + ... + + def map_offdiag(self, func, **kwargs): # -> Self@PairGrid: + """Plot with a bivariate function on the off-diagonal subplots. + + Parameters + ---------- + func : callable plotting function + Must take x, y arrays as positional arguments and draw onto the + "currently active" matplotlib Axes. Also needs to accept kwargs + called ``color`` and ``label``. + + """ + ... + + def map_diag(self, func, **kwargs): # -> Self@PairGrid: + """Plot with a univariate function on each diagonal subplot. + + Parameters + ---------- + func : callable plotting function + Must take an x array as a positional argument and draw onto the + "currently active" matplotlib Axes. Also needs to accept kwargs + called ``color`` and ``label``. + + """ + ... + + + +class JointGrid: + """Grid for drawing a bivariate plot with marginal univariate plots. + + Many plots can be drawn by using the figure-level interface :func:`jointplot`. + Use this class directly when you need more flexibility. + + """ + @_deprecate_positional_args + def __init__(self, *, x=..., y=..., data=..., height=..., ratio=..., space=..., dropna=..., xlim=..., ylim=..., size=..., marginal_ticks=..., hue=..., palette=..., hue_order=..., hue_norm=...) -> None: + ... + + def plot(self, joint_func, marginal_func, **kwargs): # -> Self@JointGrid: + """Draw the plot by passing functions for joint and marginal axes. + + This method passes the ``kwargs`` dictionary to both functions. If you + need more control, call :meth:`JointGrid.plot_joint` and + :meth:`JointGrid.plot_marginals` directly with specific parameters. + + Parameters + ---------- + joint_func, marginal_func: callables + Functions to draw the bivariate and univariate plots. See methods + referenced above for information about the required characteristics + of these functions. + kwargs + Additional keyword arguments are passed to both functions. + + Returns + ------- + :class:`JointGrid` instance + Returns ``self`` for easy method chaining. + + """ + ... + + def plot_joint(self, func, **kwargs): # -> Self@JointGrid: + """Draw a bivariate plot on the joint axes of the grid. + + Parameters + ---------- + func : plotting callable + If a seaborn function, it should accept ``x`` and ``y``. Otherwise, + it must accept ``x`` and ``y`` vectors of data as the first two + positional arguments, and it must plot on the "current" axes. + If ``hue`` was defined in the class constructor, the function must + accept ``hue`` as a parameter. + kwargs + Keyword argument are passed to the plotting function. + + Returns + ------- + :class:`JointGrid` instance + Returns ``self`` for easy method chaining. + + """ + ... + + def plot_marginals(self, func, **kwargs): # -> Self@JointGrid: + """Draw univariate plots on each marginal axes. + + Parameters + ---------- + func : plotting callable + If a seaborn function, it should accept ``x`` and ``y`` and plot + when only one of them is defined. Otherwise, it must accept a vector + of data as the first positional argument and determine its orientation + using the ``vertical`` parameter, and it must plot on the "current" axes. + If ``hue`` was defined in the class constructor, it must accept ``hue`` + as a parameter. + kwargs + Keyword argument are passed to the plotting function. + + Returns + ------- + :class:`JointGrid` instance + Returns ``self`` for easy method chaining. + + """ + ... + + def set_axis_labels(self, xlabel=..., ylabel=..., **kwargs): # -> Self@JointGrid: + """Set axis labels on the bivariate axes. + + Parameters + ---------- + xlabel, ylabel : strings + Label names for the x and y variables. + kwargs : key, value mappings + Other keyword arguments are passed to the following functions: + + - :meth:`matplotlib.axes.Axes.set_xlabel` + - :meth:`matplotlib.axes.Axes.set_ylabel` + + Returns + ------- + :class:`JointGrid` instance + Returns ``self`` for easy method chaining. + + """ + ... + + def savefig(self, *args, **kwargs): # -> None: + """Save the figure using a "tight" bounding box by default. + + Wraps :meth:`matplotlib.figure.Figure.savefig`. + + """ + ... + + + +@_deprecate_positional_args +def pairplot(data, *, hue=..., hue_order=..., palette=..., vars=..., x_vars=..., y_vars=..., kind=..., diag_kind=..., markers=..., height=..., aspect=..., corner=..., dropna=..., plot_kws=..., diag_kws=..., grid_kws=..., size=...): + """Plot pairwise relationships in a dataset. + + By default, this function will create a grid of Axes such that each numeric + variable in ``data`` will by shared across the y-axes across a single row and + the x-axes across a single column. The diagonal plots are treated + differently: a univariate distribution plot is drawn to show the marginal + distribution of the data in each column. + + It is also possible to show a subset of variables or plot different + variables on the rows and columns. + + This is a high-level interface for :class:`PairGrid` that is intended to + make it easy to draw a few common styles. You should use :class:`PairGrid` + directly if you need more flexibility. + + Parameters + ---------- + data : `pandas.DataFrame` + Tidy (long-form) dataframe where each column is a variable and + each row is an observation. + hue : name of variable in ``data`` + Variable in ``data`` to map plot aspects to different colors. + hue_order : list of strings + Order for the levels of the hue variable in the palette + palette : dict or seaborn color palette + Set of colors for mapping the ``hue`` variable. If a dict, keys + should be values in the ``hue`` variable. + vars : list of variable names + Variables within ``data`` to use, otherwise use every column with + a numeric datatype. + {x, y}_vars : lists of variable names + Variables within ``data`` to use separately for the rows and + columns of the figure; i.e. to make a non-square plot. + kind : {'scatter', 'kde', 'hist', 'reg'} + Kind of plot to make. + diag_kind : {'auto', 'hist', 'kde', None} + Kind of plot for the diagonal subplots. If 'auto', choose based on + whether or not ``hue`` is used. + markers : single matplotlib marker code or list + Either the marker to use for all scatterplot points or a list of markers + with a length the same as the number of levels in the hue variable so that + differently colored points will also have different scatterplot + markers. + height : scalar + Height (in inches) of each facet. + aspect : scalar + Aspect * height gives the width (in inches) of each facet. + corner : bool + If True, don't add axes to the upper (off-diagonal) triangle of the + grid, making this a "corner" plot. + dropna : boolean + Drop missing values from the data before plotting. + {plot, diag, grid}_kws : dicts + Dictionaries of keyword arguments. ``plot_kws`` are passed to the + bivariate plotting function, ``diag_kws`` are passed to the univariate + plotting function, and ``grid_kws`` are passed to the :class:`PairGrid` + constructor. + + Returns + ------- + grid : :class:`PairGrid` + Returns the underlying :class:`PairGrid` instance for further tweaking. + + See Also + -------- + PairGrid : Subplot grid for more flexible plotting of pairwise relationships. + JointGrid : Grid for plotting joint and marginal distributions of two variables. + + Examples + -------- + + .. include:: ../docstrings/pairplot.rst + + """ + ... + +@_deprecate_positional_args +def jointplot(*, x=..., y=..., data=..., kind=..., color=..., height=..., ratio=..., space=..., dropna=..., xlim=..., ylim=..., marginal_ticks=..., joint_kws=..., marginal_kws=..., hue=..., palette=..., hue_order=..., hue_norm=..., **kwargs): + ... + diff --git a/typings/seaborn/categorical.pyi b/typings/seaborn/categorical.pyi new file mode 100644 index 0000000..c4fbe74 --- /dev/null +++ b/typings/seaborn/categorical.pyi @@ -0,0 +1,312 @@ +""" +This type stub file was generated by pyright. +""" + +from ._decorators import _deprecate_positional_args + +__all__ = ["catplot", "factorplot", "stripplot", "swarmplot", "boxplot", "violinplot", "boxenplot", "pointplot", "barplot", "countplot"] +class _CategoricalPlotter: + width = ... + default_palette = ... + require_numeric = ... + def establish_variables(self, x=..., y=..., hue=..., data=..., orient=..., order=..., hue_order=..., units=...): + """Convert input specification into a common representation.""" + ... + + def establish_colors(self, color, palette, saturation): # -> None: + """Get a list of colors for the main component of the plots.""" + ... + + @property + def hue_offsets(self): # -> Any | NDArray[float64]: + """A list of center positions for plots when hue nesting is used.""" + ... + + @property + def nested_width(self): # -> float: + """A float with the width of plot elements when hue nesting is used.""" + ... + + def annotate_axes(self, ax): # -> None: + """Add descriptive labels to an Axes object.""" + ... + + def add_legend_data(self, ax, color, label): # -> None: + """Add a dummy patch object so we can get legend data.""" + ... + + + +class _BoxPlotter(_CategoricalPlotter): + def __init__(self, x, y, hue, data, order, hue_order, orient, color, palette, saturation, width, dodge, fliersize, linewidth) -> None: + ... + + def draw_boxplot(self, ax, kws): # -> None: + """Use matplotlib to draw a boxplot on an Axes.""" + ... + + def restyle_boxplot(self, artist_dict, color, props): # -> None: + """Take a drawn matplotlib boxplot and make it look nice.""" + ... + + def plot(self, ax, boxplot_kws): # -> None: + """Make the plot.""" + ... + + + +class _ViolinPlotter(_CategoricalPlotter): + def __init__(self, x, y, hue, data, order, hue_order, bw, cut, scale, scale_hue, gridsize, width, inner, split, dodge, orient, linewidth, color, palette, saturation) -> None: + ... + + def estimate_densities(self, bw, cut, scale, scale_hue, gridsize): # -> None: + """Find the support and density for all of the data.""" + ... + + def fit_kde(self, x, bw): # -> tuple[gaussian_kde, Unknown]: + """Estimate a KDE for a vector of data with flexible bandwidth.""" + ... + + def kde_support(self, x, bw, cut, gridsize): + """Define a grid of support for the violin.""" + ... + + def scale_area(self, density, max_density, scale_hue): # -> None: + """Scale the relative area under the KDE curve. + + This essentially preserves the "standard" KDE scaling, but the + resulting maximum density will be 1 so that the curve can be + properly multiplied by the violin width. + + """ + ... + + def scale_width(self, density): # -> None: + """Scale each density curve to the same height.""" + ... + + def scale_count(self, density, counts, scale_hue): # -> None: + """Scale each density curve by the number of observations.""" + ... + + @property + def dwidth(self): + ... + + def draw_violins(self, ax): # -> None: + """Draw the violins onto `ax`.""" + ... + + def draw_single_observation(self, ax, at_group, at_quant, density): # -> None: + """Draw a line to mark a single observation.""" + ... + + def draw_box_lines(self, ax, data, support, density, center): # -> None: + """Draw boxplot information at center of the density.""" + ... + + def draw_quartiles(self, ax, data, support, density, center, split=...): # -> None: + """Draw the quartiles as lines at width of density.""" + ... + + def draw_points(self, ax, data, center): # -> None: + """Draw individual observations as points at middle of the violin.""" + ... + + def draw_stick_lines(self, ax, data, support, density, center, split=...): # -> None: + """Draw individual observations as sticks at width of density.""" + ... + + def draw_to_density(self, ax, center, val, support, density, split, **kws): # -> None: + """Draw a line orthogonal to the value axis at width of density.""" + ... + + def plot(self, ax): # -> None: + """Make the violin plot.""" + ... + + + +class _CategoricalScatterPlotter(_CategoricalPlotter): + default_palette = ... + require_numeric = ... + @property + def point_colors(self): # -> list[Unknown]: + """Return an index into the palette for each scatter point.""" + ... + + def add_legend_data(self, ax): # -> None: + """Add empty scatterplot artists with labels for the legend.""" + ... + + + +class _StripPlotter(_CategoricalScatterPlotter): + """1-d scatterplot with categorical organization.""" + def __init__(self, x, y, hue, data, order, hue_order, jitter, dodge, orient, color, palette) -> None: + """Initialize the plotter.""" + ... + + def draw_stripplot(self, ax, kws): # -> None: + """Draw the points onto `ax`.""" + ... + + def plot(self, ax, kws): # -> None: + """Make the plot.""" + ... + + + +class _SwarmPlotter(_CategoricalScatterPlotter): + def __init__(self, x, y, hue, data, order, hue_order, dodge, orient, color, palette) -> None: + """Initialize the plotter.""" + ... + + def could_overlap(self, xy_i, swarm, d): # -> NDArray[Unknown]: + """Return a list of all swarm points that could overlap with target. + + Assumes that swarm is a sorted list of all points below xy_i. + """ + ... + + def position_candidates(self, xy_i, neighbors, d): # -> NDArray[Unknown]: + """Return a list of (x, y) coordinates that might be valid.""" + ... + + def first_non_overlapping_candidate(self, candidates, neighbors, d): + """Remove candidates from the list if they overlap with the swarm.""" + ... + + def beeswarm(self, orig_xy, d): # -> NDArray[Unknown]: + """Adjust x position of points to avoid overlaps.""" + ... + + def add_gutters(self, points, center, width): + """Stop points from extending beyond their territory.""" + ... + + def swarm_points(self, ax, points, center, width, s, **kws): # -> None: + """Find new positions on the categorical axis for each point.""" + ... + + def draw_swarmplot(self, ax, kws): # -> None: + """Plot the data.""" + ... + + def plot(self, ax, kws): # -> None: + """Make the full plot.""" + ... + + + +class _CategoricalStatPlotter(_CategoricalPlotter): + require_numeric = ... + @property + def nested_width(self): # -> float: + """A float with the width of plot elements when hue nesting is used.""" + ... + + def estimate_statistic(self, estimator, ci, n_boot, seed): # -> None: + ... + + def draw_confints(self, ax, at_group, confint, colors, errwidth=..., capsize=..., **kws): # -> None: + ... + + + +class _BarPlotter(_CategoricalStatPlotter): + """Show point estimates and confidence intervals with bars.""" + def __init__(self, x, y, hue, data, order, hue_order, estimator, ci, n_boot, units, seed, orient, color, palette, saturation, errcolor, errwidth, capsize, dodge) -> None: + """Initialize the plotter.""" + ... + + def draw_bars(self, ax, kws): # -> None: + """Draw the bars onto `ax`.""" + ... + + def plot(self, ax, bar_kws): # -> None: + """Make the plot.""" + ... + + + +class _PointPlotter(_CategoricalStatPlotter): + default_palette = ... + def __init__(self, x, y, hue, data, order, hue_order, estimator, ci, n_boot, units, seed, markers, linestyles, dodge, join, scale, orient, color, palette, errwidth=..., capsize=...) -> None: + """Initialize the plotter.""" + ... + + @property + def hue_offsets(self): # -> NDArray[float64]: + """Offsets relative to the center position for each hue level.""" + ... + + def draw_points(self, ax): # -> None: + """Draw the main data components of the plot.""" + ... + + def plot(self, ax): # -> None: + """Make the plot.""" + ... + + + +class _CountPlotter(_BarPlotter): + require_numeric = ... + + +class _LVPlotter(_CategoricalPlotter): + def __init__(self, x, y, hue, data, order, hue_order, orient, color, palette, saturation, width, dodge, k_depth, linewidth, scale, outlier_prop, trust_alpha, showfliers=...) -> None: + ... + + def draw_letter_value_plot(self, ax, kws): # -> None: + """Use matplotlib to draw a letter value plot on an Axes.""" + ... + + def plot(self, ax, boxplot_kws): # -> None: + """Make the plot.""" + ... + + + +_categorical_docs = ... +@_deprecate_positional_args +def boxplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., orient=..., color=..., palette=..., saturation=..., width=..., dodge=..., fliersize=..., linewidth=..., whis=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def violinplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., bw=..., cut=..., scale=..., scale_hue=..., gridsize=..., width=..., inner=..., split=..., dodge=..., orient=..., linewidth=..., color=..., palette=..., saturation=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def boxenplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., orient=..., color=..., palette=..., saturation=..., width=..., dodge=..., k_depth=..., linewidth=..., scale=..., outlier_prop=..., trust_alpha=..., showfliers=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def stripplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., jitter=..., dodge=..., orient=..., color=..., palette=..., size=..., edgecolor=..., linewidth=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def swarmplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., dodge=..., orient=..., color=..., palette=..., size=..., edgecolor=..., linewidth=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def barplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., estimator=..., ci=..., n_boot=..., units=..., seed=..., orient=..., color=..., palette=..., saturation=..., errcolor=..., errwidth=..., capsize=..., dodge=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def pointplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., estimator=..., ci=..., n_boot=..., units=..., seed=..., markers=..., linestyles=..., dodge=..., join=..., scale=..., orient=..., color=..., palette=..., errwidth=..., capsize=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def countplot(*, x=..., y=..., hue=..., data=..., order=..., hue_order=..., orient=..., color=..., palette=..., saturation=..., dodge=..., ax=..., **kwargs): # -> Axes: + ... + +def factorplot(*args, **kwargs): + """Deprecated; please use `catplot` instead.""" + ... + +@_deprecate_positional_args +def catplot(*, x=..., y=..., hue=..., data=..., row=..., col=..., col_wrap=..., estimator=..., ci=..., n_boot=..., units=..., seed=..., order=..., hue_order=..., row_order=..., col_order=..., kind=..., height=..., aspect=..., orient=..., color=..., palette=..., legend=..., legend_out=..., sharex=..., sharey=..., margin_titles=..., facet_kws=..., **kwargs): + ... + diff --git a/typings/seaborn/cm.pyi b/typings/seaborn/cm.pyi new file mode 100644 index 0000000..f9abe2c --- /dev/null +++ b/typings/seaborn/cm.pyi @@ -0,0 +1,11 @@ +""" +This type stub file was generated by pyright. +""" + +_rocket_lut = ... +_mako_lut = ... +_vlag_lut = ... +_icefire_lut = ... +_flare_lut = ... +_crest_lut = ... +_lut_dict = ... diff --git a/typings/seaborn/colors/__init__.pyi b/typings/seaborn/colors/__init__.pyi new file mode 100644 index 0000000..0233e53 --- /dev/null +++ b/typings/seaborn/colors/__init__.pyi @@ -0,0 +1,7 @@ +""" +This type stub file was generated by pyright. +""" + +from .xkcd_rgb import xkcd_rgb +from .crayons import crayons + diff --git a/typings/seaborn/colors/crayons.pyi b/typings/seaborn/colors/crayons.pyi new file mode 100644 index 0000000..5acb7a4 --- /dev/null +++ b/typings/seaborn/colors/crayons.pyi @@ -0,0 +1,5 @@ +""" +This type stub file was generated by pyright. +""" + +crayons = ... diff --git a/typings/seaborn/colors/xkcd_rgb.pyi b/typings/seaborn/colors/xkcd_rgb.pyi new file mode 100644 index 0000000..5bc7ac5 --- /dev/null +++ b/typings/seaborn/colors/xkcd_rgb.pyi @@ -0,0 +1,5 @@ +""" +This type stub file was generated by pyright. +""" + +xkcd_rgb = ... diff --git a/typings/seaborn/conftest.pyi b/typings/seaborn/conftest.pyi new file mode 100644 index 0000000..29cc1bd --- /dev/null +++ b/typings/seaborn/conftest.pyi @@ -0,0 +1,98 @@ +""" +This type stub file was generated by pyright. +""" + +import pytest + +def has_verdana(): # -> bool: + """Helper to verify if Verdana font is present""" + ... + +@pytest.fixture(scope="session", autouse=True) +def remove_pandas_unit_conversion(): # -> None: + ... + +@pytest.fixture(autouse=True) +def close_figs(): # -> Generator[None, Any, None]: + ... + +@pytest.fixture(autouse=True) +def random_seed(): # -> None: + ... + +@pytest.fixture() +def rng(): # -> RandomState: + ... + +@pytest.fixture +def wide_df(rng): # -> DataFrame: + ... + +@pytest.fixture +def wide_array(wide_df): # -> NDArray[Unknown]: + ... + +@pytest.fixture +def flat_series(rng): # -> Series: + ... + +@pytest.fixture +def flat_array(flat_series): # -> NDArray[Unknown]: + ... + +@pytest.fixture +def flat_list(flat_series): + ... + +@pytest.fixture(params=["series", "array", "list"]) +def flat_data(rng, request): # -> Series | ndarray[Unknown, Unknown] | NDArray[Unknown] | list[Unknown] | Any: + ... + +@pytest.fixture +def wide_list_of_series(rng): # -> list[Series]: + ... + +@pytest.fixture +def wide_list_of_arrays(wide_list_of_series): # -> list[NDArray[Unknown]]: + ... + +@pytest.fixture +def wide_list_of_lists(wide_list_of_series): # -> list[Unknown]: + ... + +@pytest.fixture +def wide_dict_of_series(wide_list_of_series): # -> dict[Unknown, Unknown]: + ... + +@pytest.fixture +def wide_dict_of_arrays(wide_list_of_series): # -> dict[Unknown, NDArray[Unknown]]: + ... + +@pytest.fixture +def wide_dict_of_lists(wide_list_of_series): # -> dict[Unknown, Unknown]: + ... + +@pytest.fixture +def long_df(rng): # -> DataFrame: + ... + +@pytest.fixture +def long_dict(long_df): + ... + +@pytest.fixture +def repeated_df(rng): # -> DataFrame: + ... + +@pytest.fixture +def missing_df(rng, long_df): + ... + +@pytest.fixture +def object_df(rng, long_df): + ... + +@pytest.fixture +def null_series(flat_series): # -> Series: + ... + diff --git a/typings/seaborn/distributions.pyi b/typings/seaborn/distributions.pyi new file mode 100644 index 0000000..83099a3 --- /dev/null +++ b/typings/seaborn/distributions.pyi @@ -0,0 +1,209 @@ +""" +This type stub file was generated by pyright. +""" + +from ._core import VectorPlotter +from ._decorators import _deprecate_positional_args + +"""Plotting functions for visualizing distributions.""" +__all__ = ["displot", "histplot", "kdeplot", "ecdfplot", "rugplot", "distplot"] +_dist_params = ... +_param_docs = ... +class _DistributionPlotter(VectorPlotter): + semantics = ... + wide_structure = ... + flat_structure = ... + def __init__(self, data=..., variables=...) -> None: + ... + + @property + def univariate(self): # -> bool: + """Return True if only x or y are used.""" + ... + + @property + def data_variable(self): # -> str: + """Return the variable with data for univariate plots.""" + ... + + @property + def has_xy_data(self): # -> bool: + """Return True at least one of x or y is defined.""" + ... + + def plot_univariate_histogram(self, multiple, element, fill, common_norm, common_bins, shrink, kde, kde_kws, color, legend, line_kws, estimate_kws, **plot_kws): + ... + + def plot_bivariate_histogram(self, common_bins, common_norm, thresh, pthresh, pmax, color, legend, cbar, cbar_ax, cbar_kws, estimate_kws, **plot_kws): + ... + + def plot_univariate_density(self, multiple, common_norm, common_grid, fill, legend, estimate_kws, **plot_kws): + ... + + def plot_bivariate_density(self, common_norm, fill, levels, thresh, color, legend, cbar, cbar_ax, cbar_kws, estimate_kws, **contour_kws): + ... + + def plot_univariate_ecdf(self, estimate_kws, legend, **plot_kws): # -> None: + ... + + def plot_rug(self, height, expand_margins, legend, **kws): # -> None: + ... + + + +class _DistributionFacetPlotter(_DistributionPlotter): + semantics = ... + + +def histplot(data=..., *, x=..., y=..., hue=..., weights=..., stat=..., bins=..., binwidth=..., binrange=..., discrete=..., cumulative=..., common_bins=..., common_norm=..., multiple=..., element=..., fill=..., shrink=..., kde=..., kde_kws=..., line_kws=..., thresh=..., pthresh=..., pmax=..., cbar=..., cbar_ax=..., cbar_kws=..., palette=..., hue_order=..., hue_norm=..., color=..., log_scale=..., legend=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def kdeplot(x=..., *, y=..., shade=..., vertical=..., kernel=..., bw=..., gridsize=..., cut=..., clip=..., legend=..., cumulative=..., shade_lowest=..., cbar=..., cbar_ax=..., cbar_kws=..., ax=..., weights=..., hue=..., palette=..., hue_order=..., hue_norm=..., multiple=..., common_norm=..., common_grid=..., levels=..., thresh=..., bw_method=..., bw_adjust=..., log_scale=..., color=..., fill=..., data=..., data2=..., **kwargs): # -> Axes: + ... + +def ecdfplot(data=..., *, x=..., y=..., hue=..., weights=..., stat=..., complementary=..., palette=..., hue_order=..., hue_norm=..., log_scale=..., legend=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def rugplot(x=..., *, height=..., axis=..., ax=..., data=..., y=..., hue=..., palette=..., hue_order=..., hue_norm=..., expand_margins=..., legend=..., a=..., **kwargs): # -> Axes: + ... + +def displot(data=..., *, x=..., y=..., hue=..., row=..., col=..., weights=..., kind=..., rug=..., rug_kws=..., log_scale=..., legend=..., palette=..., hue_order=..., hue_norm=..., color=..., col_wrap=..., row_order=..., col_order=..., height=..., aspect=..., facet_kws=..., **kwargs): # -> FacetGrid: + ... + +def distplot(a=..., bins=..., hist=..., kde=..., rug=..., fit=..., hist_kws=..., kde_kws=..., rug_kws=..., fit_kws=..., color=..., vertical=..., norm_hist=..., axlabel=..., label=..., ax=..., x=...): + """DEPRECATED: Flexibly plot a univariate distribution of observations. + + .. warning:: + This function is deprecated and will be removed in a future version. + Please adapt your code to use one of two new functions: + + - :func:`displot`, a figure-level function with a similar flexibility + over the kind of plot to draw + - :func:`histplot`, an axes-level function for plotting histograms, + including with kernel density smoothing + + This function combines the matplotlib ``hist`` function (with automatic + calculation of a good default bin size) with the seaborn :func:`kdeplot` + and :func:`rugplot` functions. It can also fit ``scipy.stats`` + distributions and plot the estimated PDF over the data. + + Parameters + ---------- + a : Series, 1d-array, or list. + Observed data. If this is a Series object with a ``name`` attribute, + the name will be used to label the data axis. + bins : argument for matplotlib hist(), or None, optional + Specification of hist bins. If unspecified, as reference rule is used + that tries to find a useful default. + hist : bool, optional + Whether to plot a (normed) histogram. + kde : bool, optional + Whether to plot a gaussian kernel density estimate. + rug : bool, optional + Whether to draw a rugplot on the support axis. + fit : random variable object, optional + An object with `fit` method, returning a tuple that can be passed to a + `pdf` method a positional arguments following a grid of values to + evaluate the pdf on. + hist_kws : dict, optional + Keyword arguments for :meth:`matplotlib.axes.Axes.hist`. + kde_kws : dict, optional + Keyword arguments for :func:`kdeplot`. + rug_kws : dict, optional + Keyword arguments for :func:`rugplot`. + color : matplotlib color, optional + Color to plot everything but the fitted curve in. + vertical : bool, optional + If True, observed values are on y-axis. + norm_hist : bool, optional + If True, the histogram height shows a density rather than a count. + This is implied if a KDE or fitted density is plotted. + axlabel : string, False, or None, optional + Name for the support axis label. If None, will try to get it + from a.name if False, do not set a label. + label : string, optional + Legend label for the relevant component of the plot. + ax : matplotlib axis, optional + If provided, plot on this axis. + + Returns + ------- + ax : matplotlib Axes + Returns the Axes object with the plot for further tweaking. + + See Also + -------- + kdeplot : Show a univariate or bivariate distribution with a kernel + density estimate. + rugplot : Draw small vertical lines to show each observation in a + distribution. + + Examples + -------- + + Show a default plot with a kernel density estimate and histogram with bin + size determined automatically with a reference rule: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns, numpy as np + >>> sns.set_theme(); np.random.seed(0) + >>> x = np.random.randn(100) + >>> ax = sns.distplot(x) + + Use Pandas objects to get an informative axis label: + + .. plot:: + :context: close-figs + + >>> import pandas as pd + >>> x = pd.Series(x, name="x variable") + >>> ax = sns.distplot(x) + + Plot the distribution with a kernel density estimate and rug plot: + + .. plot:: + :context: close-figs + + >>> ax = sns.distplot(x, rug=True, hist=False) + + Plot the distribution with a histogram and maximum likelihood gaussian + distribution fit: + + .. plot:: + :context: close-figs + + >>> from scipy.stats import norm + >>> ax = sns.distplot(x, fit=norm, kde=False) + + Plot the distribution on the vertical axis: + + .. plot:: + :context: close-figs + + >>> ax = sns.distplot(x, vertical=True) + + Change the color of all the plot elements: + + .. plot:: + :context: close-figs + + >>> sns.set_color_codes() + >>> ax = sns.distplot(x, color="y") + + Pass specific parameters to the underlying plot functions: + + .. plot:: + :context: close-figs + + >>> ax = sns.distplot(x, rug=True, rug_kws={"color": "g"}, + ... kde_kws={"color": "k", "lw": 3, "label": "KDE"}, + ... hist_kws={"histtype": "step", "linewidth": 3, + ... "alpha": 1, "color": "g"}) + + """ + ... + diff --git a/typings/seaborn/external/__init__.pyi b/typings/seaborn/external/__init__.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/seaborn/external/__init__.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/seaborn/external/docscrape.pyi b/typings/seaborn/external/docscrape.pyi new file mode 100644 index 0000000..68c0bb8 --- /dev/null +++ b/typings/seaborn/external/docscrape.pyi @@ -0,0 +1,165 @@ +""" +This type stub file was generated by pyright. +""" + +from collections.abc import Mapping + +"""Extract reference documentation from the NumPy source tree. + +Copyright (C) 2008 Stefan van der Walt , Pauli Virtanen + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +""" +def strip_blank_lines(l): + "Remove leading and trailing blank lines from a list of lines" + ... + +class Reader: + """A line-based string reader. + + """ + def __init__(self, data) -> None: + """ + Parameters + ---------- + data : str + String with lines separated by '\n'. + + """ + ... + + def __getitem__(self, n): + ... + + def reset(self): # -> None: + ... + + def read(self): # -> Literal['']: + ... + + def seek_next_non_empty_line(self): # -> None: + ... + + def eof(self): # -> bool: + ... + + def read_to_condition(self, condition_func): # -> list[Unknown]: + ... + + def read_to_next_empty_line(self): # -> list[Unknown]: + ... + + def read_to_next_unindented_line(self): # -> list[Unknown]: + ... + + def peek(self, n=...): # -> Literal['']: + ... + + def is_empty(self): # -> bool: + ... + + + +class ParseError(Exception): + def __str__(self) -> str: + ... + + + +Parameter = ... +class NumpyDocString(Mapping): + """Parses a numpydoc string to an abstract representation + + Instances define a mapping from section title to structured data. + + """ + sections = ... + def __init__(self, docstring, config=...) -> None: + ... + + def __getitem__(self, key): + ... + + def __setitem__(self, key, val): # -> None: + ... + + def __iter__(self): # -> Iterator[str]: + ... + + def __len__(self): # -> int: + ... + + _role = ... + _funcbacktick = ... + _funcplain = ... + _funcname = ... + _funcnamenext = ... + _funcnamenext = ... + _description = ... + _func_rgx = ... + _line_rgx = ... + empty_description = ... + def __str__(self, func_role=...) -> str: + ... + + + +def indent(str, indent=...): # -> LiteralString: + ... + +def dedent_lines(lines): # -> list[str]: + """Deindent a list of lines maximally""" + ... + +def header(text, style=...): + ... + +class FunctionDoc(NumpyDocString): + def __init__(self, func, role=..., doc=..., config=...) -> None: + ... + + def get_func(self): # -> tuple[Any | Overload[(__o: object, /) -> None, (__name: str, __bases: tuple[type, ...], __dict: dict[str, Any], **kwds: Any) -> None] | Unknown, Any | str]: + ... + + def __str__(self) -> str: + ... + + + +class ClassDoc(NumpyDocString): + extra_public_methods = ... + def __init__(self, cls, doc=..., modulename=..., func_doc=..., config=...) -> None: + ... + + @property + def methods(self): # -> list[Unknown] | list[str]: + ... + + @property + def properties(self): # -> list[Unknown] | list[str]: + ... + + + diff --git a/typings/seaborn/external/husl.pyi b/typings/seaborn/external/husl.pyi new file mode 100644 index 0000000..abd7f73 --- /dev/null +++ b/typings/seaborn/external/husl.pyi @@ -0,0 +1,104 @@ +""" +This type stub file was generated by pyright. +""" + +__version__ = ... +m = ... +m_inv = ... +refX = ... +refY = ... +refZ = ... +refU = ... +refV = ... +lab_e = ... +lab_k = ... +def husl_to_rgb(h, s, l): # -> list[Unknown | float]: + ... + +def husl_to_hex(h, s, l): # -> LiteralString: + ... + +def rgb_to_husl(r, g, b): # -> list[Unknown]: + ... + +def hex_to_husl(hex): # -> list[Unknown]: + ... + +def huslp_to_rgb(h, s, l): # -> list[Unknown | float]: + ... + +def huslp_to_hex(h, s, l): # -> LiteralString: + ... + +def rgb_to_huslp(r, g, b): # -> list[Unknown]: + ... + +def hex_to_huslp(hex): # -> list[Unknown]: + ... + +def lch_to_rgb(l, c, h): # -> list[Unknown | float]: + ... + +def rgb_to_lch(r, g, b): # -> list[Unknown]: + ... + +def max_chroma(L, H): # -> float: + ... + +def max_chroma_pastel(L): # -> float: + ... + +def dot_product(a, b): # -> int: + ... + +def f(t): # -> float: + ... + +def f_inv(t): # -> float: + ... + +def from_linear(c): # -> float: + ... + +def to_linear(c): # -> float: + ... + +def rgb_prepare(triple): # -> list[Unknown]: + ... + +def hex_to_rgb(hex): # -> list[float]: + ... + +def rgb_to_hex(triple): # -> LiteralString: + ... + +def xyz_to_rgb(triple): # -> list[Unknown | float]: + ... + +def rgb_to_xyz(triple): # -> list[int]: + ... + +def xyz_to_luv(triple): # -> list[float] | list[Unknown]: + ... + +def luv_to_xyz(triple): # -> list[float] | list[Unknown]: + ... + +def luv_to_lch(triple): # -> list[Unknown]: + ... + +def lch_to_luv(triple): # -> list[Unknown]: + ... + +def husl_to_lch(triple): # -> list[Unknown]: + ... + +def lch_to_husl(triple): # -> list[Unknown]: + ... + +def huslp_to_lch(triple): # -> list[Unknown]: + ... + +def lch_to_huslp(triple): # -> list[Unknown]: + ... + diff --git a/typings/seaborn/matrix.pyi b/typings/seaborn/matrix.pyi new file mode 100644 index 0000000..b93e086 --- /dev/null +++ b/typings/seaborn/matrix.pyi @@ -0,0 +1,557 @@ +""" +This type stub file was generated by pyright. +""" + +from .axisgrid import Grid +from ._decorators import _deprecate_positional_args + +"""Functions to visualize matrices of data.""" +__all__ = ["heatmap", "clustermap"] +class _HeatMapper: + """Draw a heatmap plot of a matrix with nice labels and colormaps.""" + def __init__(self, data, vmin, vmax, cmap, center, robust, annot, fmt, annot_kws, cbar, cbar_kws, xticklabels=..., yticklabels=..., mask=...) -> None: + """Initialize the plotting object.""" + ... + + def plot(self, ax, cax, kws): # -> None: + """Draw the heatmap on the provided Axes.""" + ... + + + +@_deprecate_positional_args +def heatmap(data, *, vmin=..., vmax=..., cmap=..., center=..., robust=..., annot=..., fmt=..., annot_kws=..., linewidths=..., linecolor=..., cbar=..., cbar_kws=..., cbar_ax=..., square=..., xticklabels=..., yticklabels=..., mask=..., ax=..., **kwargs): # -> Axes: + """Plot rectangular data as a color-encoded matrix. + + This is an Axes-level function and will draw the heatmap into the + currently-active Axes if none is provided to the ``ax`` argument. Part of + this Axes space will be taken and used to plot a colormap, unless ``cbar`` + is False or a separate Axes is provided to ``cbar_ax``. + + Parameters + ---------- + data : rectangular dataset + 2D dataset that can be coerced into an ndarray. If a Pandas DataFrame + is provided, the index/column information will be used to label the + columns and rows. + vmin, vmax : floats, optional + Values to anchor the colormap, otherwise they are inferred from the + data and other keyword arguments. + cmap : matplotlib colormap name or object, or list of colors, optional + The mapping from data values to color space. If not provided, the + default will depend on whether ``center`` is set. + center : float, optional + The value at which to center the colormap when plotting divergant data. + Using this parameter will change the default ``cmap`` if none is + specified. + robust : bool, optional + If True and ``vmin`` or ``vmax`` are absent, the colormap range is + computed with robust quantiles instead of the extreme values. + annot : bool or rectangular dataset, optional + If True, write the data value in each cell. If an array-like with the + same shape as ``data``, then use this to annotate the heatmap instead + of the data. Note that DataFrames will match on position, not index. + fmt : str, optional + String formatting code to use when adding annotations. + annot_kws : dict of key, value mappings, optional + Keyword arguments for :meth:`matplotlib.axes.Axes.text` when ``annot`` + is True. + linewidths : float, optional + Width of the lines that will divide each cell. + linecolor : color, optional + Color of the lines that will divide each cell. + cbar : bool, optional + Whether to draw a colorbar. + cbar_kws : dict of key, value mappings, optional + Keyword arguments for :meth:`matplotlib.figure.Figure.colorbar`. + cbar_ax : matplotlib Axes, optional + Axes in which to draw the colorbar, otherwise take space from the + main Axes. + square : bool, optional + If True, set the Axes aspect to "equal" so each cell will be + square-shaped. + xticklabels, yticklabels : "auto", bool, list-like, or int, optional + If True, plot the column names of the dataframe. If False, don't plot + the column names. If list-like, plot these alternate labels as the + xticklabels. If an integer, use the column names but plot only every + n label. If "auto", try to densely plot non-overlapping labels. + mask : bool array or DataFrame, optional + If passed, data will not be shown in cells where ``mask`` is True. + Cells with missing values are automatically masked. + ax : matplotlib Axes, optional + Axes in which to draw the plot, otherwise use the currently-active + Axes. + kwargs : other keyword arguments + All other keyword arguments are passed to + :meth:`matplotlib.axes.Axes.pcolormesh`. + + Returns + ------- + ax : matplotlib Axes + Axes object with the heatmap. + + See Also + -------- + clustermap : Plot a matrix using hierachical clustering to arrange the + rows and columns. + + Examples + -------- + + Plot a heatmap for a numpy array: + + .. plot:: + :context: close-figs + + >>> import numpy as np; np.random.seed(0) + >>> import seaborn as sns; sns.set_theme() + >>> uniform_data = np.random.rand(10, 12) + >>> ax = sns.heatmap(uniform_data) + + Change the limits of the colormap: + + .. plot:: + :context: close-figs + + >>> ax = sns.heatmap(uniform_data, vmin=0, vmax=1) + + Plot a heatmap for data centered on 0 with a diverging colormap: + + .. plot:: + :context: close-figs + + >>> normal_data = np.random.randn(10, 12) + >>> ax = sns.heatmap(normal_data, center=0) + + Plot a dataframe with meaningful row and column labels: + + .. plot:: + :context: close-figs + + >>> flights = sns.load_dataset("flights") + >>> flights = flights.pivot("month", "year", "passengers") + >>> ax = sns.heatmap(flights) + + Annotate each cell with the numeric value using integer formatting: + + .. plot:: + :context: close-figs + + >>> ax = sns.heatmap(flights, annot=True, fmt="d") + + Add lines between each cell: + + .. plot:: + :context: close-figs + + >>> ax = sns.heatmap(flights, linewidths=.5) + + Use a different colormap: + + .. plot:: + :context: close-figs + + >>> ax = sns.heatmap(flights, cmap="YlGnBu") + + Center the colormap at a specific value: + + .. plot:: + :context: close-figs + + >>> ax = sns.heatmap(flights, center=flights.loc["Jan", 1955]) + + Plot every other column label and don't plot row labels: + + .. plot:: + :context: close-figs + + >>> data = np.random.randn(50, 20) + >>> ax = sns.heatmap(data, xticklabels=2, yticklabels=False) + + Don't draw a colorbar: + + .. plot:: + :context: close-figs + + >>> ax = sns.heatmap(flights, cbar=False) + + Use different axes for the colorbar: + + .. plot:: + :context: close-figs + + >>> grid_kws = {"height_ratios": (.9, .05), "hspace": .3} + >>> f, (ax, cbar_ax) = plt.subplots(2, gridspec_kw=grid_kws) + >>> ax = sns.heatmap(flights, ax=ax, + ... cbar_ax=cbar_ax, + ... cbar_kws={"orientation": "horizontal"}) + + Use a mask to plot only part of a matrix + + .. plot:: + :context: close-figs + + >>> corr = np.corrcoef(np.random.randn(10, 200)) + >>> mask = np.zeros_like(corr) + >>> mask[np.triu_indices_from(mask)] = True + >>> with sns.axes_style("white"): + ... f, ax = plt.subplots(figsize=(7, 5)) + ... ax = sns.heatmap(corr, mask=mask, vmax=.3, square=True) + """ + ... + +class _DendrogramPlotter: + """Object for drawing tree of similarities between data rows/columns""" + def __init__(self, data, linkage, metric, method, axis, label, rotate) -> None: + """Plot a dendrogram of the relationships between the columns of data + + Parameters + ---------- + data : pandas.DataFrame + Rectangular data + """ + ... + + @property + def calculated_linkage(self): + ... + + def calculate_dendrogram(self): # -> dict[str, Unknown]: + """Calculates a dendrogram based on the linkage matrix + + Made a separate function, not a property because don't want to + recalculate the dendrogram every time it is accessed. + + Returns + ------- + dendrogram : dict + Dendrogram dictionary as returned by scipy.cluster.hierarchy + .dendrogram. The important key-value pairing is + "reordered_ind" which indicates the re-ordering of the matrix + """ + ... + + @property + def reordered_ind(self): + """Indices of the matrix, reordered by the dendrogram""" + ... + + def plot(self, ax, tree_kws): # -> Self@_DendrogramPlotter: + """Plots a dendrogram of the similarities between data on the axes + + Parameters + ---------- + ax : matplotlib.axes.Axes + Axes object upon which the dendrogram is plotted + + """ + ... + + + +@_deprecate_positional_args +def dendrogram(data, *, linkage=..., axis=..., label=..., metric=..., method=..., rotate=..., tree_kws=..., ax=...): # -> _DendrogramPlotter: + """Draw a tree diagram of relationships within a matrix + + Parameters + ---------- + data : pandas.DataFrame + Rectangular data + linkage : numpy.array, optional + Linkage matrix + axis : int, optional + Which axis to use to calculate linkage. 0 is rows, 1 is columns. + label : bool, optional + If True, label the dendrogram at leaves with column or row names + metric : str, optional + Distance metric. Anything valid for scipy.spatial.distance.pdist + method : str, optional + Linkage method to use. Anything valid for + scipy.cluster.hierarchy.linkage + rotate : bool, optional + When plotting the matrix, whether to rotate it 90 degrees + counter-clockwise, so the leaves face right + tree_kws : dict, optional + Keyword arguments for the ``matplotlib.collections.LineCollection`` + that is used for plotting the lines of the dendrogram tree. + ax : matplotlib axis, optional + Axis to plot on, otherwise uses current axis + + Returns + ------- + dendrogramplotter : _DendrogramPlotter + A Dendrogram plotter object. + + Notes + ----- + Access the reordered dendrogram indices with + dendrogramplotter.reordered_ind + + """ + ... + +class ClusterGrid(Grid): + def __init__(self, data, pivot_kws=..., z_score=..., standard_scale=..., figsize=..., row_colors=..., col_colors=..., mask=..., dendrogram_ratio=..., colors_ratio=..., cbar_pos=...) -> None: + """Grid object for organizing clustered heatmap input on to axes""" + ... + + def format_data(self, data, pivot_kws, z_score=..., standard_scale=...): + """Extract variables from data or use directly.""" + ... + + @staticmethod + def z_score(data2d, axis=...): + """Standarize the mean and variance of the data axis + + Parameters + ---------- + data2d : pandas.DataFrame + Data to normalize + axis : int + Which axis to normalize across. If 0, normalize across rows, if 1, + normalize across columns. + + Returns + ------- + normalized : pandas.DataFrame + Noramlized data with a mean of 0 and variance of 1 across the + specified axis. + """ + ... + + @staticmethod + def standard_scale(data2d, axis=...): + """Divide the data by the difference between the max and min + + Parameters + ---------- + data2d : pandas.DataFrame + Data to normalize + axis : int + Which axis to normalize across. If 0, normalize across rows, if 1, + normalize across columns. + vmin : int + If 0, then subtract the minimum of the data before dividing by + the range. + + Returns + ------- + standardized : pandas.DataFrame + Noramlized data with a mean of 0 and variance of 1 across the + specified axis. + + """ + ... + + def dim_ratios(self, colors, dendrogram_ratio, colors_ratio): # -> list[Unknown]: + """Get the proportions of the figure taken up by each axes.""" + ... + + @staticmethod + def color_list_to_matrix_and_cmap(colors, ind, axis=...): # -> tuple[ndarray[Any, dtype[Any]], Unknown]: + """Turns a list of colors into a numpy matrix and matplotlib colormap + + These arguments can now be plotted using heatmap(matrix, cmap) + and the provided colors will be plotted. + + Parameters + ---------- + colors : list of matplotlib colors + Colors to label the rows or columns of a dataframe. + ind : list of ints + Ordering of the rows or columns, to reorder the original colors + by the clustered dendrogram order + axis : int + Which axis this is labeling + + Returns + ------- + matrix : numpy.array + A numpy array of integer values, where each corresponds to a color + from the originally provided list of colors + cmap : matplotlib.colors.ListedColormap + + """ + ... + + def savefig(self, *args, **kwargs): # -> None: + ... + + def plot_dendrograms(self, row_cluster, col_cluster, metric, method, row_linkage, col_linkage, tree_kws): # -> None: + ... + + def plot_colors(self, xind, yind, **kws): # -> None: + """Plots color labels between the dendrogram and the heatmap + + Parameters + ---------- + heatmap_kws : dict + Keyword arguments heatmap + + """ + ... + + def plot_matrix(self, colorbar_kws, xind, yind, **kws): # -> None: + ... + + def plot(self, metric, method, colorbar_kws, row_cluster, col_cluster, row_linkage, col_linkage, tree_kws, **kws): # -> Self@ClusterGrid: + ... + + + +@_deprecate_positional_args +def clustermap(data, *, pivot_kws=..., method=..., metric=..., z_score=..., standard_scale=..., figsize=..., cbar_kws=..., row_cluster=..., col_cluster=..., row_linkage=..., col_linkage=..., row_colors=..., col_colors=..., mask=..., dendrogram_ratio=..., colors_ratio=..., cbar_pos=..., tree_kws=..., **kwargs): # -> ClusterGrid: + """ + Plot a matrix dataset as a hierarchically-clustered heatmap. + + Parameters + ---------- + data : 2D array-like + Rectangular data for clustering. Cannot contain NAs. + pivot_kws : dict, optional + If `data` is a tidy dataframe, can provide keyword arguments for + pivot to create a rectangular dataframe. + method : str, optional + Linkage method to use for calculating clusters. See + :func:`scipy.cluster.hierarchy.linkage` documentation for more + information. + metric : str, optional + Distance metric to use for the data. See + :func:`scipy.spatial.distance.pdist` documentation for more options. + To use different metrics (or methods) for rows and columns, you may + construct each linkage matrix yourself and provide them as + `{row,col}_linkage`. + z_score : int or None, optional + Either 0 (rows) or 1 (columns). Whether or not to calculate z-scores + for the rows or the columns. Z scores are: z = (x - mean)/std, so + values in each row (column) will get the mean of the row (column) + subtracted, then divided by the standard deviation of the row (column). + This ensures that each row (column) has mean of 0 and variance of 1. + standard_scale : int or None, optional + Either 0 (rows) or 1 (columns). Whether or not to standardize that + dimension, meaning for each row or column, subtract the minimum and + divide each by its maximum. + figsize : tuple of (width, height), optional + Overall size of the figure. + cbar_kws : dict, optional + Keyword arguments to pass to `cbar_kws` in :func:`heatmap`, e.g. to + add a label to the colorbar. + {row,col}_cluster : bool, optional + If ``True``, cluster the {rows, columns}. + {row,col}_linkage : :class:`numpy.ndarray`, optional + Precomputed linkage matrix for the rows or columns. See + :func:`scipy.cluster.hierarchy.linkage` for specific formats. + {row,col}_colors : list-like or pandas DataFrame/Series, optional + List of colors to label for either the rows or columns. Useful to evaluate + whether samples within a group are clustered together. Can use nested lists or + DataFrame for multiple color levels of labeling. If given as a + :class:`pandas.DataFrame` or :class:`pandas.Series`, labels for the colors are + extracted from the DataFrames column names or from the name of the Series. + DataFrame/Series colors are also matched to the data by their index, ensuring + colors are drawn in the correct order. + mask : bool array or DataFrame, optional + If passed, data will not be shown in cells where `mask` is True. + Cells with missing values are automatically masked. Only used for + visualizing, not for calculating. + {dendrogram,colors}_ratio : float, or pair of floats, optional + Proportion of the figure size devoted to the two marginal elements. If + a pair is given, they correspond to (row, col) ratios. + cbar_pos : tuple of (left, bottom, width, height), optional + Position of the colorbar axes in the figure. Setting to ``None`` will + disable the colorbar. + tree_kws : dict, optional + Parameters for the :class:`matplotlib.collections.LineCollection` + that is used to plot the lines of the dendrogram tree. + kwargs : other keyword arguments + All other keyword arguments are passed to :func:`heatmap`. + + Returns + ------- + :class:`ClusterGrid` + A :class:`ClusterGrid` instance. + + See Also + -------- + heatmap : Plot rectangular data as a color-encoded matrix. + + Notes + ----- + The returned object has a ``savefig`` method that should be used if you + want to save the figure object without clipping the dendrograms. + + To access the reordered row indices, use: + ``clustergrid.dendrogram_row.reordered_ind`` + + Column indices, use: + ``clustergrid.dendrogram_col.reordered_ind`` + + Examples + -------- + + Plot a clustered heatmap: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme(color_codes=True) + >>> iris = sns.load_dataset("iris") + >>> species = iris.pop("species") + >>> g = sns.clustermap(iris) + + Change the size and layout of the figure: + + .. plot:: + :context: close-figs + + >>> g = sns.clustermap(iris, + ... figsize=(7, 5), + ... row_cluster=False, + ... dendrogram_ratio=(.1, .2), + ... cbar_pos=(0, .2, .03, .4)) + + Add colored labels to identify observations: + + .. plot:: + :context: close-figs + + >>> lut = dict(zip(species.unique(), "rbg")) + >>> row_colors = species.map(lut) + >>> g = sns.clustermap(iris, row_colors=row_colors) + + Use a different colormap and adjust the limits of the color range: + + .. plot:: + :context: close-figs + + >>> g = sns.clustermap(iris, cmap="mako", vmin=0, vmax=10) + + Use a different similarity metric: + + .. plot:: + :context: close-figs + + >>> g = sns.clustermap(iris, metric="correlation") + + Use a different clustering method: + + .. plot:: + :context: close-figs + + >>> g = sns.clustermap(iris, method="single") + + Standardize the data within the columns: + + .. plot:: + :context: close-figs + + >>> g = sns.clustermap(iris, standard_scale=1) + + Normalize the data within the rows: + + .. plot:: + :context: close-figs + + >>> g = sns.clustermap(iris, z_score=0, cmap="vlag") + """ + ... + diff --git a/typings/seaborn/miscplot.pyi b/typings/seaborn/miscplot.pyi new file mode 100644 index 0000000..e2b5504 --- /dev/null +++ b/typings/seaborn/miscplot.pyi @@ -0,0 +1,22 @@ +""" +This type stub file was generated by pyright. +""" + +__all__ = ["palplot", "dogplot"] +def palplot(pal, size=...): # -> None: + """Plot the values in a color palette as a horizontal array. + + Parameters + ---------- + pal : sequence of matplotlib colors + colors, i.e. as returned by seaborn.color_palette() + size : + scaling factor for size of plot + + """ + ... + +def dogplot(*_, **__): # -> None: + """Who's a good boy?""" + ... + diff --git a/typings/seaborn/palettes.pyi b/typings/seaborn/palettes.pyi new file mode 100644 index 0000000..2644183 --- /dev/null +++ b/typings/seaborn/palettes.pyi @@ -0,0 +1,706 @@ +""" +This type stub file was generated by pyright. +""" + +__all__ = ["color_palette", "hls_palette", "husl_palette", "mpl_palette", "dark_palette", "light_palette", "diverging_palette", "blend_palette", "xkcd_palette", "crayon_palette", "cubehelix_palette", "set_color_codes"] +SEABORN_PALETTES = ... +MPL_QUAL_PALS = ... +QUAL_PALETTE_SIZES = ... +QUAL_PALETTES = ... +class _ColorPalette(list): + """Set the color palette in a with statement, otherwise be a list.""" + def __enter__(self): # -> Self@_ColorPalette: + """Open the context.""" + ... + + def __exit__(self, *args): # -> None: + """Close the context.""" + ... + + def as_hex(self): # -> _ColorPalette: + """Return a color palette with hex codes instead of RGB values.""" + ... + + + +def color_palette(palette=..., n_colors=..., desat=..., as_cmap=...): # -> _ColorPalette | list[tuple[float, float, float]] | Any | list[str]: + """Return a list of colors or continuous colormap defining a palette. + + Possible ``palette`` values include: + - Name of a seaborn palette (deep, muted, bright, pastel, dark, colorblind) + - Name of matplotlib colormap + - 'husl' or 'hls' + - 'ch:' + - 'light:', 'dark:', 'blend:,', + - A sequence of colors in any format matplotlib accepts + + Calling this function with ``palette=None`` will return the current + matplotlib color cycle. + + This function can also be used in a ``with`` statement to temporarily + set the color cycle for a plot or set of plots. + + See the :ref:`tutorial ` for more information. + + Parameters + ---------- + palette: None, string, or sequence, optional + Name of palette or None to return current palette. If a sequence, input + colors are used but possibly cycled and desaturated. + n_colors : int, optional + Number of colors in the palette. If ``None``, the default will depend + on how ``palette`` is specified. Named palettes default to 6 colors, + but grabbing the current palette or passing in a list of colors will + not change the number of colors unless this is specified. Asking for + more colors than exist in the palette will cause it to cycle. Ignored + when ``as_cmap`` is True. + desat : float, optional + Proportion to desaturate each color by. + as_cmap : bool + If True, return a :class:`matplotlib.colors.Colormap`. + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + See Also + -------- + set_palette : Set the default color cycle for all plots. + set_color_codes : Reassign color codes like ``"b"``, ``"g"``, etc. to + colors from one of the seaborn palettes. + + Examples + -------- + + .. include:: ../docstrings/color_palette.rst + + """ + ... + +def hls_palette(n_colors=..., h=..., l=..., s=..., as_cmap=...): # -> _ColorPalette: + """Get a set of evenly spaced colors in HLS hue space. + + h, l, and s should be between 0 and 1 + + Parameters + ---------- + + n_colors : int + number of colors in the palette + h : float + first hue + l : float + lightness + s : float + saturation + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + See Also + -------- + husl_palette : Make a palette using evenly spaced hues in the HUSL system. + + Examples + -------- + + Create a palette of 10 colors with the default parameters: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme() + >>> sns.palplot(sns.hls_palette(10)) + + Create a palette of 10 colors that begins at a different hue value: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.hls_palette(10, h=.5)) + + Create a palette of 10 colors that are darker than the default: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.hls_palette(10, l=.4)) + + Create a palette of 10 colors that are less saturated than the default: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.hls_palette(10, s=.4)) + + """ + ... + +def husl_palette(n_colors=..., h=..., s=..., l=..., as_cmap=...): # -> _ColorPalette: + """Get a set of evenly spaced colors in HUSL hue space. + + h, s, and l should be between 0 and 1 + + Parameters + ---------- + + n_colors : int + number of colors in the palette + h : float + first hue + s : float + saturation + l : float + lightness + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + See Also + -------- + hls_palette : Make a palette using evently spaced circular hues in the + HSL system. + + Examples + -------- + + Create a palette of 10 colors with the default parameters: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme() + >>> sns.palplot(sns.husl_palette(10)) + + Create a palette of 10 colors that begins at a different hue value: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.husl_palette(10, h=.5)) + + Create a palette of 10 colors that are darker than the default: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.husl_palette(10, l=.4)) + + Create a palette of 10 colors that are less saturated than the default: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.husl_palette(10, s=.4)) + + """ + ... + +def mpl_palette(name, n_colors=..., as_cmap=...): # -> _ColorPalette: + """Return discrete colors from a matplotlib palette. + + Note that this handles the qualitative colorbrewer palettes + properly, although if you ask for more colors than a particular + qualitative palette can provide you will get fewer than you are + expecting. In contrast, asking for qualitative color brewer palettes + using :func:`color_palette` will return the expected number of colors, + but they will cycle. + + If you are using the IPython notebook, you can also use the function + :func:`choose_colorbrewer_palette` to interactively select palettes. + + Parameters + ---------- + name : string + Name of the palette. This should be a named matplotlib colormap. + n_colors : int + Number of discrete colors in the palette. + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + Examples + -------- + + Create a qualitative colorbrewer palette with 8 colors: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme() + >>> sns.palplot(sns.mpl_palette("Set2", 8)) + + Create a sequential colorbrewer palette: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.mpl_palette("Blues")) + + Create a diverging palette: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.mpl_palette("seismic", 8)) + + Create a "dark" sequential palette: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.mpl_palette("GnBu_d")) + + """ + ... + +def dark_palette(color, n_colors=..., reverse=..., as_cmap=..., input=...): # -> _ColorPalette: + """Make a sequential palette that blends from dark to ``color``. + + This kind of palette is good for data that range between relatively + uninteresting low values and interesting high values. + + The ``color`` parameter can be specified in a number of ways, including + all options for defining a color in matplotlib and several additional + color spaces that are handled by seaborn. You can also use the database + of named colors from the XKCD color survey. + + If you are using the IPython notebook, you can also choose this palette + interactively with the :func:`choose_dark_palette` function. + + Parameters + ---------- + color : base color for high values + hex, rgb-tuple, or html color name + n_colors : int, optional + number of colors in the palette + reverse : bool, optional + if True, reverse the direction of the blend + as_cmap : bool, optional + If True, return a :class:`matplotlib.colors.Colormap`. + input : {'rgb', 'hls', 'husl', xkcd'} + Color space to interpret the input color. The first three options + apply to tuple inputs and the latter applies to string inputs. + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + See Also + -------- + light_palette : Create a sequential palette with bright low values. + diverging_palette : Create a diverging palette with two colors. + + Examples + -------- + + Generate a palette from an HTML color: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme() + >>> sns.palplot(sns.dark_palette("purple")) + + Generate a palette that decreases in lightness: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.dark_palette("seagreen", reverse=True)) + + Generate a palette from an HUSL-space seed: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.dark_palette((260, 75, 60), input="husl")) + + Generate a colormap object: + + .. plot:: + :context: close-figs + + >>> from numpy import arange + >>> x = arange(25).reshape(5, 5) + >>> cmap = sns.dark_palette("#2ecc71", as_cmap=True) + >>> ax = sns.heatmap(x, cmap=cmap) + + """ + ... + +def light_palette(color, n_colors=..., reverse=..., as_cmap=..., input=...): # -> _ColorPalette: + """Make a sequential palette that blends from light to ``color``. + + This kind of palette is good for data that range between relatively + uninteresting low values and interesting high values. + + The ``color`` parameter can be specified in a number of ways, including + all options for defining a color in matplotlib and several additional + color spaces that are handled by seaborn. You can also use the database + of named colors from the XKCD color survey. + + If you are using the IPython notebook, you can also choose this palette + interactively with the :func:`choose_light_palette` function. + + Parameters + ---------- + color : base color for high values + hex code, html color name, or tuple in ``input`` space. + n_colors : int, optional + number of colors in the palette + reverse : bool, optional + if True, reverse the direction of the blend + as_cmap : bool, optional + If True, return a :class:`matplotlib.colors.Colormap`. + input : {'rgb', 'hls', 'husl', xkcd'} + Color space to interpret the input color. The first three options + apply to tuple inputs and the latter applies to string inputs. + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + See Also + -------- + dark_palette : Create a sequential palette with dark low values. + diverging_palette : Create a diverging palette with two colors. + + Examples + -------- + + Generate a palette from an HTML color: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme() + >>> sns.palplot(sns.light_palette("purple")) + + Generate a palette that increases in lightness: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.light_palette("seagreen", reverse=True)) + + Generate a palette from an HUSL-space seed: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.light_palette((260, 75, 60), input="husl")) + + Generate a colormap object: + + .. plot:: + :context: close-figs + + >>> from numpy import arange + >>> x = arange(25).reshape(5, 5) + >>> cmap = sns.light_palette("#2ecc71", as_cmap=True) + >>> ax = sns.heatmap(x, cmap=cmap) + + """ + ... + +def diverging_palette(h_neg, h_pos, s=..., l=..., sep=..., n=..., center=..., as_cmap=...): # -> _ColorPalette: + """Make a diverging palette between two HUSL colors. + + If you are using the IPython notebook, you can also choose this palette + interactively with the :func:`choose_diverging_palette` function. + + Parameters + ---------- + h_neg, h_pos : float in [0, 359] + Anchor hues for negative and positive extents of the map. + s : float in [0, 100], optional + Anchor saturation for both extents of the map. + l : float in [0, 100], optional + Anchor lightness for both extents of the map. + sep : int, optional + Size of the intermediate region. + n : int, optional + Number of colors in the palette (if not returning a cmap) + center : {"light", "dark"}, optional + Whether the center of the palette is light or dark + as_cmap : bool, optional + If True, return a :class:`matplotlib.colors.Colormap`. + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + See Also + -------- + dark_palette : Create a sequential palette with dark values. + light_palette : Create a sequential palette with light values. + + Examples + -------- + + Generate a blue-white-red palette: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme() + >>> sns.palplot(sns.diverging_palette(240, 10, n=9)) + + Generate a brighter green-white-purple palette: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.diverging_palette(150, 275, s=80, l=55, n=9)) + + Generate a blue-black-red palette: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.diverging_palette(250, 15, s=75, l=40, + ... n=9, center="dark")) + + Generate a colormap object: + + .. plot:: + :context: close-figs + + >>> from numpy import arange + >>> x = arange(25).reshape(5, 5) + >>> cmap = sns.diverging_palette(220, 20, as_cmap=True) + >>> ax = sns.heatmap(x, cmap=cmap) + + """ + ... + +def blend_palette(colors, n_colors=..., as_cmap=..., input=...): # -> _ColorPalette: + """Make a palette that blends between a list of colors. + + Parameters + ---------- + colors : sequence of colors in various formats interpreted by ``input`` + hex code, html color name, or tuple in ``input`` space. + n_colors : int, optional + Number of colors in the palette. + as_cmap : bool, optional + If True, return a :class:`matplotlib.colors.Colormap`. + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + """ + ... + +def xkcd_palette(colors): # -> _ColorPalette | list[tuple[float, float, float]] | Any | list[str]: + """Make a palette with color names from the xkcd color survey. + + See xkcd for the full list of colors: https://xkcd.com/color/rgb/ + + This is just a simple wrapper around the ``seaborn.xkcd_rgb`` dictionary. + + Parameters + ---------- + colors : list of strings + List of keys in the ``seaborn.xkcd_rgb`` dictionary. + + Returns + ------- + palette : seaborn color palette + Returns the list of colors as RGB tuples in an object that behaves like + other seaborn color palettes. + + See Also + -------- + crayon_palette : Make a palette with Crayola crayon colors. + + """ + ... + +def crayon_palette(colors): # -> _ColorPalette | list[tuple[float, float, float]] | Any | list[str]: + """Make a palette with color names from Crayola crayons. + + Colors are taken from here: + https://en.wikipedia.org/wiki/List_of_Crayola_crayon_colors + + This is just a simple wrapper around the ``seaborn.crayons`` dictionary. + + Parameters + ---------- + colors : list of strings + List of keys in the ``seaborn.crayons`` dictionary. + + Returns + ------- + palette : seaborn color palette + Returns the list of colors as rgb tuples in an object that behaves like + other seaborn color palettes. + + See Also + -------- + xkcd_palette : Make a palette with named colors from the XKCD color survey. + + """ + ... + +def cubehelix_palette(n_colors=..., start=..., rot=..., gamma=..., hue=..., light=..., dark=..., reverse=..., as_cmap=...): # -> _ColorPalette: + """Make a sequential palette from the cubehelix system. + + This produces a colormap with linearly-decreasing (or increasing) + brightness. That means that information will be preserved if printed to + black and white or viewed by someone who is colorblind. "cubehelix" is + also available as a matplotlib-based palette, but this function gives the + user more control over the look of the palette and has a different set of + defaults. + + In addition to using this function, it is also possible to generate a + cubehelix palette generally in seaborn using a string-shorthand; see the + example below. + + Parameters + ---------- + n_colors : int + Number of colors in the palette. + start : float, 0 <= start <= 3 + The hue at the start of the helix. + rot : float + Rotations around the hue wheel over the range of the palette. + gamma : float 0 <= gamma + Gamma factor to emphasize darker (gamma < 1) or lighter (gamma > 1) + colors. + hue : float, 0 <= hue <= 1 + Saturation of the colors. + dark : float 0 <= dark <= 1 + Intensity of the darkest color in the palette. + light : float 0 <= light <= 1 + Intensity of the lightest color in the palette. + reverse : bool + If True, the palette will go from dark to light. + as_cmap : bool + If True, return a :class:`matplotlib.colors.Colormap`. + + Returns + ------- + list of RGB tuples or :class:`matplotlib.colors.Colormap` + + See Also + -------- + choose_cubehelix_palette : Launch an interactive widget to select cubehelix + palette parameters. + dark_palette : Create a sequential palette with dark low values. + light_palette : Create a sequential palette with bright low values. + + References + ---------- + Green, D. A. (2011). "A colour scheme for the display of astronomical + intensity images". Bulletin of the Astromical Society of India, Vol. 39, + p. 289-295. + + Examples + -------- + + Generate the default palette: + + .. plot:: + :context: close-figs + + >>> import seaborn as sns; sns.set_theme() + >>> sns.palplot(sns.cubehelix_palette()) + + Rotate backwards from the same starting location: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.cubehelix_palette(rot=-.4)) + + Use a different starting point and shorter rotation: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.cubehelix_palette(start=2.8, rot=.1)) + + Reverse the direction of the lightness ramp: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.cubehelix_palette(reverse=True)) + + Generate a colormap object: + + .. plot:: + :context: close-figs + + >>> from numpy import arange + >>> x = arange(25).reshape(5, 5) + >>> cmap = sns.cubehelix_palette(as_cmap=True) + >>> ax = sns.heatmap(x, cmap=cmap) + + Use the full lightness range: + + .. plot:: + :context: close-figs + + >>> cmap = sns.cubehelix_palette(dark=0, light=1, as_cmap=True) + >>> ax = sns.heatmap(x, cmap=cmap) + + Use through the :func:`color_palette` interface: + + .. plot:: + :context: close-figs + + >>> sns.palplot(sns.color_palette("ch:2,r=.2,l=.6")) + + """ + ... + +def set_color_codes(palette=...): # -> None: + """Change how matplotlib color shorthands are interpreted. + + Calling this will change how shorthand codes like "b" or "g" + are interpreted by matplotlib in subsequent plots. + + Parameters + ---------- + palette : {deep, muted, pastel, dark, bright, colorblind} + Named seaborn palette to use as the source of colors. + + See Also + -------- + set : Color codes can be set through the high-level seaborn style + manager. + set_palette : Color codes can also be set through the function that + sets the matplotlib color cycle. + + Examples + -------- + + Map matplotlib color codes to the default seaborn palette. + + .. plot:: + :context: close-figs + + >>> import matplotlib.pyplot as plt + >>> import seaborn as sns; sns.set_theme() + >>> sns.set_color_codes() + >>> _ = plt.plot([0, 1], color="r") + + Use a different seaborn palette. + + .. plot:: + :context: close-figs + + >>> sns.set_color_codes("dark") + >>> _ = plt.plot([0, 1], color="g") + >>> _ = plt.plot([0, 2], color="m") + + """ + ... + diff --git a/typings/seaborn/rcmod.pyi b/typings/seaborn/rcmod.pyi new file mode 100644 index 0000000..41193b9 --- /dev/null +++ b/typings/seaborn/rcmod.pyi @@ -0,0 +1,265 @@ +""" +This type stub file was generated by pyright. +""" + +import matplotlib as mpl +from distutils.version import LooseVersion + +"""Control plot style and scaling using the matplotlib rcParams interface.""" +__all__ = ["set_theme", "set", "reset_defaults", "reset_orig", "axes_style", "set_style", "plotting_context", "set_context", "set_palette"] +_style_keys = ... +_context_keys = ... +if LooseVersion(mpl.__version__) >= "3.0": + ... +def set_theme(context=..., style=..., palette=..., font=..., font_scale=..., color_codes=..., rc=...): # -> None: + """Set multiple theme parameters in one step. + + Each set of parameters can be set directly or temporarily, see the + referenced functions below for more information. + + Parameters + ---------- + context : string or dict + Plotting context parameters, see :func:`plotting_context`. + style : string or dict + Axes style parameters, see :func:`axes_style`. + palette : string or sequence + Color palette, see :func:`color_palette`. + font : string + Font family, see matplotlib font manager. + font_scale : float, optional + Separate scaling factor to independently scale the size of the + font elements. + color_codes : bool + If ``True`` and ``palette`` is a seaborn palette, remap the shorthand + color codes (e.g. "b", "g", "r", etc.) to the colors from this palette. + rc : dict or None + Dictionary of rc parameter mappings to override the above. + + """ + ... + +def set(*args, **kwargs): # -> None: + """Alias for :func:`set_theme`, which is the preferred interface.""" + ... + +def reset_defaults(): # -> None: + """Restore all RC params to default settings.""" + ... + +def reset_orig(): # -> None: + """Restore all RC params to original settings (respects custom rc).""" + ... + +def axes_style(style=..., rc=...): # -> _AxesStyle: + """Return a parameter dict for the aesthetic style of the plots. + + This affects things like the color of the axes, whether a grid is + enabled by default, and other aesthetic elements. + + This function returns an object that can be used in a ``with`` statement + to temporarily change the style parameters. + + Parameters + ---------- + style : dict, None, or one of {darkgrid, whitegrid, dark, white, ticks} + A dictionary of parameters or the name of a preconfigured set. + rc : dict, optional + Parameter mappings to override the values in the preset seaborn + style dictionaries. This only updates parameters that are + considered part of the style definition. + + Examples + -------- + >>> st = axes_style("whitegrid") + + >>> set_style("ticks", {"xtick.major.size": 8, "ytick.major.size": 8}) + + >>> import matplotlib.pyplot as plt + >>> with axes_style("white"): + ... f, ax = plt.subplots() + ... ax.plot(x, y) # doctest: +SKIP + + See Also + -------- + set_style : set the matplotlib parameters for a seaborn theme + plotting_context : return a parameter dict to to scale plot elements + color_palette : define the color palette for a plot + + """ + ... + +def set_style(style=..., rc=...): # -> None: + """Set the aesthetic style of the plots. + + This affects things like the color of the axes, whether a grid is + enabled by default, and other aesthetic elements. + + Parameters + ---------- + style : dict, None, or one of {darkgrid, whitegrid, dark, white, ticks} + A dictionary of parameters or the name of a preconfigured set. + rc : dict, optional + Parameter mappings to override the values in the preset seaborn + style dictionaries. This only updates parameters that are + considered part of the style definition. + + Examples + -------- + >>> set_style("whitegrid") + + >>> set_style("ticks", {"xtick.major.size": 8, "ytick.major.size": 8}) + + See Also + -------- + axes_style : return a dict of parameters or use in a ``with`` statement + to temporarily set the style. + set_context : set parameters to scale plot elements + set_palette : set the default color palette for figures + + """ + ... + +def plotting_context(context=..., font_scale=..., rc=...): # -> _PlottingContext: + """Return a parameter dict to scale elements of the figure. + + This affects things like the size of the labels, lines, and other + elements of the plot, but not the overall style. The base context + is "notebook", and the other contexts are "paper", "talk", and "poster", + which are version of the notebook parameters scaled by .8, 1.3, and 1.6, + respectively. + + This function returns an object that can be used in a ``with`` statement + to temporarily change the context parameters. + + Parameters + ---------- + context : dict, None, or one of {paper, notebook, talk, poster} + A dictionary of parameters or the name of a preconfigured set. + font_scale : float, optional + Separate scaling factor to independently scale the size of the + font elements. + rc : dict, optional + Parameter mappings to override the values in the preset seaborn + context dictionaries. This only updates parameters that are + considered part of the context definition. + + Examples + -------- + >>> c = plotting_context("poster") + + >>> c = plotting_context("notebook", font_scale=1.5) + + >>> c = plotting_context("talk", rc={"lines.linewidth": 2}) + + >>> import matplotlib.pyplot as plt + >>> with plotting_context("paper"): + ... f, ax = plt.subplots() + ... ax.plot(x, y) # doctest: +SKIP + + See Also + -------- + set_context : set the matplotlib parameters to scale plot elements + axes_style : return a dict of parameters defining a figure style + color_palette : define the color palette for a plot + + """ + ... + +def set_context(context=..., font_scale=..., rc=...): # -> None: + """Set the plotting context parameters. + + This affects things like the size of the labels, lines, and other + elements of the plot, but not the overall style. The base context + is "notebook", and the other contexts are "paper", "talk", and "poster", + which are version of the notebook parameters scaled by .8, 1.3, and 1.6, + respectively. + + Parameters + ---------- + context : dict, None, or one of {paper, notebook, talk, poster} + A dictionary of parameters or the name of a preconfigured set. + font_scale : float, optional + Separate scaling factor to independently scale the size of the + font elements. + rc : dict, optional + Parameter mappings to override the values in the preset seaborn + context dictionaries. This only updates parameters that are + considered part of the context definition. + + Examples + -------- + >>> set_context("paper") + + >>> set_context("talk", font_scale=1.4) + + >>> set_context("talk", rc={"lines.linewidth": 2}) + + See Also + -------- + plotting_context : return a dictionary of rc parameters, or use in + a ``with`` statement to temporarily set the context. + set_style : set the default parameters for figure style + set_palette : set the default color palette for figures + + """ + ... + +class _RCAesthetics(dict): + def __enter__(self): # -> None: + ... + + def __exit__(self, exc_type, exc_value, exc_tb): # -> None: + ... + + def __call__(self, func): # -> _Wrapped[..., Unknown, (*args: Unknown, **kwargs: Unknown), Unknown]: + ... + + + +class _AxesStyle(_RCAesthetics): + """Light wrapper on a dict to set style temporarily.""" + _keys = ... + _set = ... + + +class _PlottingContext(_RCAesthetics): + """Light wrapper on a dict to set context temporarily.""" + _keys = ... + _set = ... + + +def set_palette(palette, n_colors=..., desat=..., color_codes=...): # -> None: + """Set the matplotlib color cycle using a seaborn palette. + + Parameters + ---------- + palette : seaborn color paltte | matplotlib colormap | hls | husl + Palette definition. Should be something that :func:`color_palette` + can process. + n_colors : int + Number of colors in the cycle. The default number of colors will depend + on the format of ``palette``, see the :func:`color_palette` + documentation for more information. + desat : float + Proportion to desaturate each color by. + color_codes : bool + If ``True`` and ``palette`` is a seaborn palette, remap the shorthand + color codes (e.g. "b", "g", "r", etc.) to the colors from this palette. + + Examples + -------- + >>> set_palette("Reds") + + >>> set_palette("Set1", 8, .75) + + See Also + -------- + color_palette : build a color palette or set the color cycle temporarily + in a ``with`` statement. + set_context : set parameters to scale plot elements + set_style : set the default parameters for figure style + + """ + ... + diff --git a/typings/seaborn/regression.pyi b/typings/seaborn/regression.pyi new file mode 100644 index 0000000..c1a8ffe --- /dev/null +++ b/typings/seaborn/regression.pyi @@ -0,0 +1,158 @@ +""" +This type stub file was generated by pyright. +""" + +from ._decorators import _deprecate_positional_args + +"""Plotting functions for linear models (broadly construed).""" +_has_statsmodels = ... +__all__ = ["lmplot", "regplot", "residplot"] +class _LinearPlotter: + """Base class for plotting relational data in tidy format. + + To get anything useful done you'll have to inherit from this, but setup + code that can be abstracted out should be put here. + + """ + def establish_variables(self, data, **kws): # -> None: + """Extract variables from data or use directly.""" + ... + + def dropna(self, *vars): # -> None: + """Remove observations with missing data.""" + ... + + def plot(self, ax): + ... + + + +class _RegressionPlotter(_LinearPlotter): + """Plotter for numeric independent variables with regression model. + + This does the computations and drawing for the `regplot` function, and + is thus also used indirectly by `lmplot`. + """ + def __init__(self, x, y, data=..., x_estimator=..., x_bins=..., x_ci=..., scatter=..., fit_reg=..., ci=..., n_boot=..., units=..., seed=..., order=..., logistic=..., lowess=..., robust=..., logx=..., x_partial=..., y_partial=..., truncate=..., dropna=..., x_jitter=..., y_jitter=..., color=..., label=...) -> None: + ... + + @property + def scatter_data(self): # -> tuple[ndarray[Any, dtype[Unknown]] | NDArray[floating[Any]], ndarray[Any, dtype[Unknown]] | NDArray[floating[Any]]]: + """Data where each observation is a point.""" + ... + + @property + def estimate_data(self): # -> tuple[list[Any], list[Unknown], list[Unknown]]: + """Data with a point estimate and CI for each discrete x value.""" + ... + + def fit_regression(self, ax=..., x_range=..., grid=...): # -> tuple[Unknown, Unknown | NDArray[float64] | Any, Unknown | None]: + """Fit the regression model.""" + ... + + def fit_fast(self, grid): # -> tuple[Any, None] | tuple[Any, Any]: + """Low-level regression and prediction using linear algebra.""" + ... + + def fit_poly(self, grid, order): # -> tuple[Unknown, None] | tuple[Unknown, NDArray[Unknown]]: + """Regression using numpy polyfit for higher-order trends.""" + ... + + def fit_statsmodels(self, grid, model, **kwargs): # -> tuple[Unknown | NDArray[float64], None] | tuple[Unknown | NDArray[float64], NDArray[Unknown]]: + """More general regression function using statsmodels objects.""" + ... + + def fit_lowess(self): # -> tuple[Unknown, Unknown]: + """Fit a locally-weighted regression, which returns its own grid.""" + ... + + def fit_logx(self, grid): # -> tuple[Any, None] | tuple[Any, Any]: + """Fit the model in log-space.""" + ... + + def bin_predictor(self, bins): # -> tuple[Any, Any]: + """Discretize a predictor by assigning value to closest bin.""" + ... + + def regress_out(self, a, b): # -> ndarray[Any, dtype[Unknown]]: + """Regress b from a keeping a's original mean.""" + ... + + def plot(self, ax, scatter_kws, line_kws): # -> None: + """Draw the full plot.""" + ... + + def scatterplot(self, ax, kws): # -> None: + """Draw the data.""" + ... + + def lineplot(self, ax, kws): # -> None: + """Draw the model.""" + ... + + + +_regression_docs = ... +@_deprecate_positional_args +def lmplot(*, x=..., y=..., data=..., hue=..., col=..., row=..., palette=..., col_wrap=..., height=..., aspect=..., markers=..., sharex=..., sharey=..., hue_order=..., col_order=..., row_order=..., legend=..., legend_out=..., x_estimator=..., x_bins=..., x_ci=..., scatter=..., fit_reg=..., ci=..., n_boot=..., units=..., seed=..., order=..., logistic=..., lowess=..., robust=..., logx=..., x_partial=..., y_partial=..., truncate=..., x_jitter=..., y_jitter=..., scatter_kws=..., line_kws=..., size=...): # -> FacetGrid: + ... + +@_deprecate_positional_args +def regplot(*, x=..., y=..., data=..., x_estimator=..., x_bins=..., x_ci=..., scatter=..., fit_reg=..., ci=..., n_boot=..., units=..., seed=..., order=..., logistic=..., lowess=..., robust=..., logx=..., x_partial=..., y_partial=..., truncate=..., dropna=..., x_jitter=..., y_jitter=..., label=..., color=..., marker=..., scatter_kws=..., line_kws=..., ax=...): # -> Axes: + ... + +@_deprecate_positional_args +def residplot(*, x=..., y=..., data=..., lowess=..., x_partial=..., y_partial=..., order=..., robust=..., dropna=..., label=..., color=..., scatter_kws=..., line_kws=..., ax=...): # -> Axes: + """Plot the residuals of a linear regression. + + This function will regress y on x (possibly as a robust or polynomial + regression) and then draw a scatterplot of the residuals. You can + optionally fit a lowess smoother to the residual plot, which can + help in determining if there is structure to the residuals. + + Parameters + ---------- + x : vector or string + Data or column name in `data` for the predictor variable. + y : vector or string + Data or column name in `data` for the response variable. + data : DataFrame, optional + DataFrame to use if `x` and `y` are column names. + lowess : boolean, optional + Fit a lowess smoother to the residual scatterplot. + {x, y}_partial : matrix or string(s) , optional + Matrix with same first dimension as `x`, or column name(s) in `data`. + These variables are treated as confounding and are removed from + the `x` or `y` variables before plotting. + order : int, optional + Order of the polynomial to fit when calculating the residuals. + robust : boolean, optional + Fit a robust linear regression when calculating the residuals. + dropna : boolean, optional + If True, ignore observations with missing data when fitting and + plotting. + label : string, optional + Label that will be used in any plot legends. + color : matplotlib color, optional + Color to use for all elements of the plot. + {scatter, line}_kws : dictionaries, optional + Additional keyword arguments passed to scatter() and plot() for drawing + the components of the plot. + ax : matplotlib axis, optional + Plot into this axis, otherwise grab the current axis or make a new + one if not existing. + + Returns + ------- + ax: matplotlib axes + Axes with the regression plot. + + See Also + -------- + regplot : Plot a simple linear regression model. + jointplot : Draw a :func:`residplot` with univariate marginal distributions + (when used with ``kind="resid"``). + + """ + ... + diff --git a/typings/seaborn/relational.pyi b/typings/seaborn/relational.pyi new file mode 100644 index 0000000..f952891 --- /dev/null +++ b/typings/seaborn/relational.pyi @@ -0,0 +1,59 @@ +""" +This type stub file was generated by pyright. +""" + +from ._core import VectorPlotter +from ._decorators import _deprecate_positional_args + +__all__ = ["relplot", "scatterplot", "lineplot"] +_relational_narrative = ... +_relational_docs = ... +_param_docs = ... +class _RelationalPlotter(VectorPlotter): + wide_structure = ... + sort = ... + def add_legend_data(self, ax): + """Add labeled artists to represent the different plot semantics.""" + ... + + + +class _LinePlotter(_RelationalPlotter): + _legend_attributes = ... + _legend_func = ... + def __init__(self, *, data=..., variables=..., estimator=..., ci=..., n_boot=..., seed=..., sort=..., err_style=..., err_kws=..., legend=...) -> None: + ... + + def aggregate(self, vals, grouper, units=...): # -> tuple[Unknown, Unknown, None] | tuple[Unknown, Unknown, Series | DataFrame | Unknown | None]: + """Compute an estimate and confidence interval using grouper.""" + ... + + def plot(self, ax, kws): # -> None: + """Draw the plot onto an axes, passing matplotlib kwargs.""" + ... + + + +class _ScatterPlotter(_RelationalPlotter): + _legend_attributes = ... + _legend_func = ... + def __init__(self, *, data=..., variables=..., x_bins=..., y_bins=..., estimator=..., ci=..., n_boot=..., alpha=..., x_jitter=..., y_jitter=..., legend=...) -> None: + ... + + def plot(self, ax, kws): # -> None: + ... + + + +@_deprecate_positional_args +def lineplot(*, x=..., y=..., hue=..., size=..., style=..., data=..., palette=..., hue_order=..., hue_norm=..., sizes=..., size_order=..., size_norm=..., dashes=..., markers=..., style_order=..., units=..., estimator=..., ci=..., n_boot=..., seed=..., sort=..., err_style=..., err_kws=..., legend=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def scatterplot(*, x=..., y=..., hue=..., style=..., size=..., data=..., palette=..., hue_order=..., hue_norm=..., sizes=..., size_order=..., size_norm=..., markers=..., style_order=..., x_bins=..., y_bins=..., units=..., estimator=..., ci=..., n_boot=..., alpha=..., x_jitter=..., y_jitter=..., legend=..., ax=..., **kwargs): # -> Axes: + ... + +@_deprecate_positional_args +def relplot(*, x=..., y=..., hue=..., size=..., style=..., data=..., row=..., col=..., col_wrap=..., row_order=..., col_order=..., palette=..., hue_order=..., hue_norm=..., sizes=..., size_order=..., size_norm=..., markers=..., dashes=..., style_order=..., legend=..., kind=..., height=..., aspect=..., facet_kws=..., units=..., **kwargs): # -> FacetGrid: + ... + diff --git a/typings/seaborn/tests/__init__.pyi b/typings/seaborn/tests/__init__.pyi new file mode 100644 index 0000000..006bc27 --- /dev/null +++ b/typings/seaborn/tests/__init__.pyi @@ -0,0 +1,4 @@ +""" +This type stub file was generated by pyright. +""" + diff --git a/typings/seaborn/utils.pyi b/typings/seaborn/utils.pyi new file mode 100644 index 0000000..d3178e2 --- /dev/null +++ b/typings/seaborn/utils.pyi @@ -0,0 +1,344 @@ +""" +This type stub file was generated by pyright. +""" + +"""Utility functions, mostly for internal use.""" +__all__ = ["desaturate", "saturate", "set_hls_values", "despine", "get_dataset_names", "get_data_home", "load_dataset"] +def sort_df(df, *args, **kwargs): + """Wrapper to handle different pandas sorting API pre/post 0.17.""" + ... + +def ci_to_errsize(cis, heights): # -> NDArray[Unknown]: + """Convert intervals to error arguments relative to plot heights. + + Parameters + ---------- + cis: 2 x n sequence + sequence of confidence interval limits + heights : n sequence + sequence of plot heights + + Returns + ------- + errsize : 2 x n array + sequence of error size relative to height values in correct + format as argument for plt.bar + + """ + ... + +def pmf_hist(a, bins=...): # -> tuple[ndarray[Any, dtype[Any]], Any, Any]: + """Return arguments to plt.bar for pmf-like histogram of an array. + + DEPRECATED: will be removed in a future version. + + Parameters + ---------- + a: array-like + array to make histogram of + bins: int + number of bins + + Returns + ------- + x: array + left x position of bars + h: array + height of bars + w: float + width of bars + + """ + ... + +def desaturate(color, prop): # -> tuple[float, float, float]: + """Decrease the saturation channel of a color by some percent. + + Parameters + ---------- + color : matplotlib color + hex, rgb-tuple, or html color name + prop : float + saturation channel of color will be multiplied by this value + + Returns + ------- + new_color : rgb tuple + desaturated color code in RGB tuple representation + + """ + ... + +def saturate(color): # -> tuple[float, float, float]: + """Return a fully saturated color with the same hue. + + Parameters + ---------- + color : matplotlib color + hex, rgb-tuple, or html color name + + Returns + ------- + new_color : rgb tuple + saturated color code in RGB tuple representation + + """ + ... + +def set_hls_values(color, h=..., l=..., s=...): # -> tuple[float, float, float]: + """Independently manipulate the h, l, or s channels of a color. + + Parameters + ---------- + color : matplotlib color + hex, rgb-tuple, or html color name + h, l, s : floats between 0 and 1, or None + new values for each channel in hls space + + Returns + ------- + new_color : rgb tuple + new color code in RGB tuple representation + + """ + ... + +def axlabel(xlabel, ylabel, **kwargs): # -> None: + """Grab current axis and label it. + + DEPRECATED: will be removed in a future version. + + """ + ... + +def remove_na(vector): + """Helper method for removing null values from data vectors. + + Parameters + ---------- + vector : vector object + Must implement boolean masking with [] subscript syntax. + + Returns + ------- + clean_clean : same type as ``vector`` + Vector of data with null values removed. May be a copy or a view. + + """ + ... + +def get_color_cycle(): # -> Any | list[str]: + """Return the list of colors in the current matplotlib color cycle + + Parameters + ---------- + None + + Returns + ------- + colors : list + List of matplotlib colors in the current cycle, or dark gray if + the current color cycle is empty. + """ + ... + +def despine(fig=..., ax=..., top=..., right=..., left=..., bottom=..., offset=..., trim=...): # -> None: + """Remove the top and right spines from plot(s). + + fig : matplotlib figure, optional + Figure to despine all axes of, defaults to the current figure. + ax : matplotlib axes, optional + Specific axes object to despine. Ignored if fig is provided. + top, right, left, bottom : boolean, optional + If True, remove that spine. + offset : int or dict, optional + Absolute distance, in points, spines should be moved away + from the axes (negative values move spines inward). A single value + applies to all spines; a dict can be used to set offset values per + side. + trim : bool, optional + If True, limit spines to the smallest and largest major tick + on each non-despined axis. + + Returns + ------- + None + + """ + ... + +def percentiles(a, pcts, axis=...): # -> ndarray[Any, dtype[Unknown]]: + """Like scoreatpercentile but can take and return array of percentiles. + + DEPRECATED: will be removed in a future version. + + Parameters + ---------- + a : array + data + pcts : sequence of percentile values + percentile or percentiles to find score at + axis : int or None + if not None, computes scores over this axis + + Returns + ------- + scores: array + array of scores at requested percentiles + first dimension is length of object passed to ``pcts`` + + """ + ... + +def ci(a, which=..., axis=...): + """Return a percentile range from an array of values.""" + ... + +def sig_stars(p): # -> Literal['***', '**', '*', '.', '']: + """Return a R-style significance string corresponding to p values. + + DEPRECATED: will be removed in a future version. + + """ + ... + +def iqr(a): # -> float | NDArray[floating[Any]] | Any | NDArray[Any]: + """Calculate the IQR for an array of numbers. + + DEPRECATED: will be removed in a future version. + + """ + ... + +def get_dataset_names(): # -> list[Any]: + """Report available example datasets, useful for reporting issues. + + Requires an internet connection. + + """ + ... + +def get_data_home(data_home=...): # -> str: + """Return a path to the cache directory for example datasets. + + This directory is then used by :func:`load_dataset`. + + If the ``data_home`` argument is not specified, it tries to read from the + ``SEABORN_DATA`` environment variable and defaults to ``~/seaborn-data``. + + """ + ... + +def load_dataset(name, cache=..., data_home=..., **kws): + """Load an example dataset from the online repository (requires internet). + + This function provides quick access to a small number of example datasets + that are useful for documenting seaborn or generating reproducible examples + for bug reports. It is not necessary for normal usage. + + Note that some of the datasets have a small amount of preprocessing applied + to define a proper ordering for categorical variables. + + Use :func:`get_dataset_names` to see a list of available datasets. + + Parameters + ---------- + name : str + Name of the dataset (``{name}.csv`` on + https://github.com/mwaskom/seaborn-data). + cache : boolean, optional + If True, try to load from the local cache first, and save to the cache + if a download is required. + data_home : string, optional + The directory in which to cache data; see :func:`get_data_home`. + kws : keys and values, optional + Additional keyword arguments are passed to passed through to + :func:`pandas.read_csv`. + + Returns + ------- + df : :class:`pandas.DataFrame` + Tabular data, possibly with some preprocessing applied. + + """ + ... + +def axis_ticklabels_overlap(labels): # -> Literal[False]: + """Return a boolean for whether the list of ticklabels have overlaps. + + Parameters + ---------- + labels : list of matplotlib ticklabels + + Returns + ------- + overlap : boolean + True if any of the labels overlap. + + """ + ... + +def axes_ticklabels_overlap(ax): # -> tuple[Unknown | Literal[False], Unknown | Literal[False]]: + """Return booleans for whether the x and y ticklabels on an Axes overlap. + + Parameters + ---------- + ax : matplotlib Axes + + Returns + ------- + x_overlap, y_overlap : booleans + True when the labels on that axis overlap. + + """ + ... + +def locator_to_legend_entries(locator, limits, dtype): # -> tuple[list[Unknown], list[Unknown]]: + """Return levels and formatted levels for brief numeric legends.""" + class dummy_axis: + ... + + + +def relative_luminance(color): # -> Any: + """Calculate the relative luminance of a color according to W3C standards + + Parameters + ---------- + color : matplotlib color or sequence of matplotlib colors + Hex code, rgb-tuple, or html color name. + + Returns + ------- + luminance : float(s) between 0 and 1 + + """ + ... + +def to_utf8(obj): # -> str: + """Return a string representing a Python object. + + Strings (i.e. type ``str``) are returned unchanged. + + Byte strings (i.e. type ``bytes``) are returned as UTF-8-decoded strings. + + For other objects, the method ``__str__()`` is called, and the result is + returned as a string. + + Parameters + ---------- + obj : object + Any Python object + + Returns + ------- + s : str + UTF-8-decoded string representation of ``obj`` + + """ + ... + +def adjust_legend_subtitles(legend): # -> None: + """Make invisible-handle "subtitles" entries look more like titles.""" + ... + diff --git a/typings/seaborn/widgets.pyi b/typings/seaborn/widgets.pyi new file mode 100644 index 0000000..122da5b --- /dev/null +++ b/typings/seaborn/widgets.pyi @@ -0,0 +1,165 @@ +""" +This type stub file was generated by pyright. +""" + +__all__ = ["choose_colorbrewer_palette", "choose_cubehelix_palette", "choose_dark_palette", "choose_light_palette", "choose_diverging_palette"] +def choose_colorbrewer_palette(data_type, as_cmap=...): # -> LinearSegmentedColormap | list[Unknown]: + """Select a palette from the ColorBrewer set. + + These palettes are built into matplotlib and can be used by name in + many seaborn functions, or by passing the object returned by this function. + + Parameters + ---------- + data_type : {'sequential', 'diverging', 'qualitative'} + This describes the kind of data you want to visualize. See the seaborn + color palette docs for more information about how to choose this value. + Note that you can pass substrings (e.g. 'q' for 'qualitative. + + as_cmap : bool + If True, the return value is a matplotlib colormap rather than a + list of discrete colors. + + Returns + ------- + pal or cmap : list of colors or matplotlib colormap + Object that can be passed to plotting functions. + + See Also + -------- + dark_palette : Create a sequential palette with dark low values. + light_palette : Create a sequential palette with bright low values. + diverging_palette : Create a diverging palette from selected colors. + cubehelix_palette : Create a sequential palette or colormap using the + cubehelix system. + + + """ + ... + +def choose_dark_palette(input=..., as_cmap=...): # -> LinearSegmentedColormap | list[Unknown]: + """Launch an interactive widget to create a dark sequential palette. + + This corresponds with the :func:`dark_palette` function. This kind + of palette is good for data that range between relatively uninteresting + low values and interesting high values. + + Requires IPython 2+ and must be used in the notebook. + + Parameters + ---------- + input : {'husl', 'hls', 'rgb'} + Color space for defining the seed value. Note that the default is + different than the default input for :func:`dark_palette`. + as_cmap : bool + If True, the return value is a matplotlib colormap rather than a + list of discrete colors. + + Returns + ------- + pal or cmap : list of colors or matplotlib colormap + Object that can be passed to plotting functions. + + See Also + -------- + dark_palette : Create a sequential palette with dark low values. + light_palette : Create a sequential palette with bright low values. + cubehelix_palette : Create a sequential palette or colormap using the + cubehelix system. + + """ + ... + +def choose_light_palette(input=..., as_cmap=...): # -> LinearSegmentedColormap | list[Unknown]: + """Launch an interactive widget to create a light sequential palette. + + This corresponds with the :func:`light_palette` function. This kind + of palette is good for data that range between relatively uninteresting + low values and interesting high values. + + Requires IPython 2+ and must be used in the notebook. + + Parameters + ---------- + input : {'husl', 'hls', 'rgb'} + Color space for defining the seed value. Note that the default is + different than the default input for :func:`light_palette`. + as_cmap : bool + If True, the return value is a matplotlib colormap rather than a + list of discrete colors. + + Returns + ------- + pal or cmap : list of colors or matplotlib colormap + Object that can be passed to plotting functions. + + See Also + -------- + light_palette : Create a sequential palette with bright low values. + dark_palette : Create a sequential palette with dark low values. + cubehelix_palette : Create a sequential palette or colormap using the + cubehelix system. + + """ + ... + +def choose_diverging_palette(as_cmap=...): # -> LinearSegmentedColormap | list[Unknown]: + """Launch an interactive widget to choose a diverging color palette. + + This corresponds with the :func:`diverging_palette` function. This kind + of palette is good for data that range between interesting low values + and interesting high values with a meaningful midpoint. (For example, + change scores relative to some baseline value). + + Requires IPython 2+ and must be used in the notebook. + + Parameters + ---------- + as_cmap : bool + If True, the return value is a matplotlib colormap rather than a + list of discrete colors. + + Returns + ------- + pal or cmap : list of colors or matplotlib colormap + Object that can be passed to plotting functions. + + See Also + -------- + diverging_palette : Create a diverging color palette or colormap. + choose_colorbrewer_palette : Interactively choose palettes from the + colorbrewer set, including diverging palettes. + + """ + ... + +def choose_cubehelix_palette(as_cmap=...): # -> LinearSegmentedColormap | list[Unknown]: + """Launch an interactive widget to create a sequential cubehelix palette. + + This corresponds with the :func:`cubehelix_palette` function. This kind + of palette is good for data that range between relatively uninteresting + low values and interesting high values. The cubehelix system allows the + palette to have more hue variance across the range, which can be helpful + for distinguishing a wider range of values. + + Requires IPython 2+ and must be used in the notebook. + + Parameters + ---------- + as_cmap : bool + If True, the return value is a matplotlib colormap rather than a + list of discrete colors. + + Returns + ------- + pal or cmap : list of colors or matplotlib colormap + Object that can be passed to plotting functions. + + See Also + -------- + cubehelix_palette : Create a sequential palette or colormap using the + cubehelix system. + + """ + ... +

      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 z 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 ( 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 #ms_eT-*R4lSK4Oh-n(j@A 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