codekingpro/portable-devtools
115k
1"""
2NumPy
3=====
4
5Provides
6 1. An array object of arbitrary homogeneous items
7 2. Fast mathematical operations over arrays
8 3. Linear Algebra, Fourier Transforms, Random Number Generation
9
10How to use the documentation
11----------------------------
12Documentation is available in two forms: docstrings provided
13with the code, and a loose standing reference guide, available from
14`the NumPy homepage <https://numpy.org>`_.
15
16We recommend exploring the docstrings using
17`IPython <https://ipython.org>`_, an advanced Python shell with
18TAB-completion and introspection capabilities. See below for further
19instructions.
20
21The docstring examples assume that `numpy` has been imported as ``np``::
22
23 >>> import numpy as np
24
25Code snippets are indicated by three greater-than signs::
26
27 >>> x = 42
28 >>> x = x + 1
29
30Use the built-in ``help`` function to view a function's docstring::
31
32 >>> help(np.sort)
33 ... # doctest: +SKIP
34
35For some objects, ``np.info(obj)`` may provide additional help. This is
36particularly true if you see the line "Help on ufunc object:" at the top
37of the help() page. Ufuncs are implemented in C, not Python, for speed.
38The native Python help() does not know how to view their help, but our
39np.info() function does.
40
41Available subpackages
42---------------------
43lib
44 Basic functions used by several sub-packages.
45random
46 Core Random Tools
47linalg
48 Core Linear Algebra Tools
49fft
50 Core FFT routines
51polynomial
52 Polynomial tools
53testing
54 NumPy testing tools
55distutils
56 Enhancements to distutils with support for
57 Fortran compilers support and more (for Python <= 3.11)
58
59Utilities
60---------
61test
62 Run numpy unittests
63show_config
64 Show numpy build configuration
65__version__
66 NumPy version string
67
68Viewing documentation using IPython
69-----------------------------------
70
71Start IPython and import `numpy` usually under the alias ``np``: `import
72numpy as np`. Then, directly past or use the ``%cpaste`` magic to paste
73examples into the shell. To see which functions are available in `numpy`,
74type ``np.<TAB>`` (where ``<TAB>`` refers to the TAB key), or use
75``np.*cos*?<ENTER>`` (where ``<ENTER>`` refers to the ENTER key) to narrow
76down the list. To view the docstring for a function, use
77``np.cos?<ENTER>`` (to view the docstring) and ``np.cos??<ENTER>`` (to view
78the source code).
79
80Copies vs. in-place operation
81-----------------------------
82Most of the functions in `numpy` return a copy of the array argument
83(e.g., `np.sort`). In-place versions of these functions are often
84available as array methods, i.e. ``x = np.array([1,2,3]); x.sort()``.
85Exceptions to this rule are documented.
86
87"""
88
89
90# start delvewheel patch
91def _delvewheel_patch_1_11_2():
92 import os
93 if os.path.isdir(libs_dir := os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'numpy.libs'))):
94 os.add_dll_directory(libs_dir)
95
96
97_delvewheel_patch_1_11_2()
98del _delvewheel_patch_1_11_2
99# end delvewheel patch
100
101import os
102import sys
103import warnings
104
105# If a version with git hash was stored, use that instead
106from . import version
107from ._expired_attrs_2_0 import __expired_attributes__
108from ._globals import _CopyMode, _NoValue
109from .version import __version__
110
111# We first need to detect if we're being called as part of the numpy setup
112# procedure itself in a reliable manner.
113try:
114 __NUMPY_SETUP__ # noqa: B018
115except NameError:
116 __NUMPY_SETUP__ = False
117
118if __NUMPY_SETUP__:
119 sys.stderr.write('Running from numpy source directory.\n')
120else:
121 # Allow distributors to run custom init code before importing numpy._core
122 from . import _distributor_init
123
124 try:
125 from numpy.__config__ import show_config
126 except ImportError as e:
127 if isinstance(e, ModuleNotFoundError) and e.name == "numpy.__config__":
128 # The __config__ module itself was not found, so add this info:
129 msg = """Error importing numpy: you should not try to import numpy from
130 its source directory; please exit the numpy source tree, and relaunch
131 your python interpreter from there."""
132 raise ImportError(msg) from e
133 raise
134
135 from . import _core
136 from ._core import (
137 False_,
138 ScalarType,
139 True_,
140 abs,
141 absolute,
142 acos,
143 acosh,
144 add,
145 all,
146 allclose,
147 amax,
148 amin,
149 any,
150 arange,
151 arccos,
152 arccosh,
153 arcsin,
154 arcsinh,
155 arctan,
156 arctan2,
157 arctanh,
158 argmax,
159 argmin,
160 argpartition,
161 argsort,
162 argwhere,
163 around,
164 array,
165 array2string,
166 array_equal,
167 array_equiv,
168 array_repr,
169 array_str,
170 asanyarray,
171 asarray,
172 ascontiguousarray,
173 asfortranarray,
174 asin,
175 asinh,
176 astype,
177 atan,
178 atan2,
179 atanh,
180 atleast_1d,
181 atleast_2d,
182 atleast_3d,
183 base_repr,
184 binary_repr,
185 bitwise_and,
186 bitwise_count,
187 bitwise_invert,
188 bitwise_left_shift,
189 bitwise_not,
190 bitwise_or,
191 bitwise_right_shift,
192 bitwise_xor,
193 block,
194 bool,
195 bool_,
196 broadcast,
197 busday_count,
198 busday_offset,
199 busdaycalendar,
200 byte,
201 bytes_,
202 can_cast,
203 cbrt,
204 cdouble,
205 ceil,
206 character,
207 choose,
208 clip,
209 clongdouble,
210 complex64,
211 complex128,
212 complexfloating,
213 compress,
214 concat,
215 concatenate,
216 conj,
217 conjugate,
218 convolve,
219 copysign,
220 copyto,
221 correlate,
222 cos,
223 cosh,
224 count_nonzero,
225 cross,
226 csingle,
227 cumprod,
228 cumsum,
229 cumulative_prod,
230 cumulative_sum,
231 datetime64,
232 datetime_as_string,
233 datetime_data,
234 deg2rad,
235 degrees,
236 diagonal,
237 divide,
238 divmod,
239 dot,
240 double,
241 dtype,
242 e,
243 einsum,
244 einsum_path,
245 empty,
246 empty_like,
247 equal,
248 errstate,
249 euler_gamma,
250 exp,
251 exp2,
252 expm1,
253 fabs,
254 finfo,
255 flatiter,
256 flatnonzero,
257 flexible,
258 float16,
259 float32,
260 float64,
261 float_power,
262 floating,
263 floor,
264 floor_divide,
265 fmax,
266 fmin,
267 fmod,
268 format_float_positional,
269 format_float_scientific,
270 frexp,
271 from_dlpack,
272 frombuffer,
273 fromfile,
274 fromfunction,
275 fromiter,
276 frompyfunc,
277 fromstring,
278 full,
279 full_like,
280 gcd,
281 generic,
282 geomspace,
283 get_printoptions,
284 getbufsize,
285 geterr,
286 geterrcall,
287 greater,
288 greater_equal,
289 half,
290 heaviside,
291 hstack,
292 hypot,
293 identity,
294 iinfo,
295 indices,
296 inexact,
297 inf,
298 inner,
299 int8,
300 int16,
301 int32,
302 int64,
303 int_,
304 intc,
305 integer,
306 intp,
307 invert,
308 is_busday,
309 isclose,
310 isdtype,
311 isfinite,
312 isfortran,
313 isinf,
314 isnan,
315 isnat,
316 isscalar,
317 issubdtype,
318 lcm,
319 ldexp,
320 left_shift,
321 less,
322 less_equal,
323 lexsort,
324 linspace,
325 little_endian,
326 log,
327 log1p,
328 log2,
329 log10,
330 logaddexp,
331 logaddexp2,
332 logical_and,
333 logical_not,
334 logical_or,
335 logical_xor,
336 logspace,
337 long,
338 longdouble,
339 longlong,
340 matmul,
341 matrix_transpose,
342 matvec,
343 max,
344 maximum,
345 may_share_memory,
346 mean,
347 memmap,
348 min,
349 min_scalar_type,
350 minimum,
351 mod,
352 modf,
353 moveaxis,
354 multiply,
355 nan,
356 ndarray,
357 ndim,
358 nditer,
359 negative,
360 nested_iters,
361 newaxis,
362 nextafter,
363 nonzero,
364 not_equal,
365 number,
366 object_,
367 ones,
368 ones_like,
369 outer,
370 partition,
371 permute_dims,
372 pi,
373 positive,
374 pow,
375 power,
376 printoptions,
377 prod,
378 promote_types,
379 ptp,
380 put,
381 putmask,
382 rad2deg,
383 radians,
384 ravel,
385 recarray,
386 reciprocal,
387 record,
388 remainder,
389 repeat,
390 require,
391 reshape,
392 resize,
393 result_type,
394 right_shift,
395 rint,
396 roll,
397 rollaxis,
398 round,
399 sctypeDict,
400 searchsorted,
401 set_printoptions,
402 setbufsize,
403 seterr,
404 seterrcall,
405 shape,
406 shares_memory,
407 short,
408 sign,
409 signbit,
410 signedinteger,
411 sin,
412 single,
413 sinh,
414 size,
415 sort,
416 spacing,
417 sqrt,
418 square,
419 squeeze,
420 stack,
421 std,
422 str_,
423 subtract,
424 sum,
425 swapaxes,
426 take,
427 tan,
428 tanh,
429 tensordot,
430 timedelta64,
431 trace,
432 transpose,
433 true_divide,
434 trunc,
435 typecodes,
436 ubyte,
437 ufunc,
438 uint,
439 uint8,
440 uint16,
441 uint32,
442 uint64,
443 uintc,
444 uintp,
445 ulong,
446 ulonglong,
447 unsignedinteger,
448 unstack,
449 ushort,
450 var,
451 vdot,
452 vecdot,
453 vecmat,
454 void,
455 vstack,
456 where,
457 zeros,
458 zeros_like,
459 )
460
461 # NOTE: It's still under discussion whether these aliases
462 # should be removed.
463 for ta in ["float96", "float128", "complex192", "complex256"]:
464 try:
465 globals()[ta] = getattr(_core, ta)
466 except AttributeError:
467 pass
468 del ta
469
470 from . import lib, matrixlib as _mat
471 from .lib import scimath as emath
472 from .lib._arraypad_impl import pad
473 from .lib._arraysetops_impl import (
474 ediff1d,
475 intersect1d,
476 isin,
477 setdiff1d,
478 setxor1d,
479 union1d,
480 unique,
481 unique_all,
482 unique_counts,
483 unique_inverse,
484 unique_values,
485 )
486 from .lib._function_base_impl import (
487 angle,
488 append,
489 asarray_chkfinite,
490 average,
491 bartlett,
492 bincount,
493 blackman,
494 copy,
495 corrcoef,
496 cov,
497 delete,
498 diff,
499 digitize,
500 extract,
501 flip,
502 gradient,
503 hamming,
504 hanning,
505 i0,
506 insert,
507 interp,
508 iterable,
509 kaiser,
510 median,
511 meshgrid,
512 percentile,
513 piecewise,
514 place,
515 quantile,
516 rot90,
517 select,
518 sinc,
519 sort_complex,
520 trapezoid,
521 trim_zeros,
522 unwrap,
523 vectorize,
524 )
525 from .lib._histograms_impl import histogram, histogram_bin_edges, histogramdd
526 from .lib._index_tricks_impl import (
527 c_,
528 diag_indices,
529 diag_indices_from,
530 fill_diagonal,
531 index_exp,
532 ix_,
533 mgrid,
534 ndenumerate,
535 ndindex,
536 ogrid,
537 r_,
538 ravel_multi_index,
539 s_,
540 unravel_index,
541 )
542 from .lib._nanfunctions_impl import (
543 nanargmax,
544 nanargmin,
545 nancumprod,
546 nancumsum,
547 nanmax,
548 nanmean,
549 nanmedian,
550 nanmin,
551 nanpercentile,
552 nanprod,
553 nanquantile,
554 nanstd,
555 nansum,
556 nanvar,
557 )
558 from .lib._npyio_impl import (
559 fromregex,
560 genfromtxt,
561 load,
562 loadtxt,
563 packbits,
564 save,
565 savetxt,
566 savez,
567 savez_compressed,
568 unpackbits,
569 )
570 from .lib._polynomial_impl import (
571 poly,
572 poly1d,
573 polyadd,
574 polyder,
575 polydiv,
576 polyfit,
577 polyint,
578 polymul,
579 polysub,
580 polyval,
581 roots,
582 )
583 from .lib._shape_base_impl import (
584 apply_along_axis,
585 apply_over_axes,
586 array_split,
587 column_stack,
588 dsplit,
589 dstack,
590 expand_dims,
591 hsplit,
592 kron,
593 put_along_axis,
594 row_stack,
595 split,
596 take_along_axis,
597 tile,
598 vsplit,
599 )
600 from .lib._stride_tricks_impl import (
601 broadcast_arrays,
602 broadcast_shapes,
603 broadcast_to,
604 )
605 from .lib._twodim_base_impl import (
606 diag,
607 diagflat,
608 eye,
609 fliplr,
610 flipud,
611 histogram2d,
612 mask_indices,
613 tri,
614 tril,
615 tril_indices,
616 tril_indices_from,
617 triu,
618 triu_indices,
619 triu_indices_from,
620 vander,
621 )
622 from .lib._type_check_impl import (
623 common_type,
624 imag,
625 iscomplex,
626 iscomplexobj,
627 isreal,
628 isrealobj,
629 mintypecode,
630 nan_to_num,
631 real,
632 real_if_close,
633 typename,
634 )
635 from .lib._ufunclike_impl import fix, isneginf, isposinf
636 from .lib._utils_impl import get_include, info, show_runtime
637 from .matrixlib import asmatrix, bmat, matrix
638
639 # public submodules are imported lazily, therefore are accessible from
640 # __getattr__. Note that `distutils` (deprecated) and `array_api`
641 # (experimental label) are not added here, because `from numpy import *`
642 # must not raise any warnings - that's too disruptive.
643 __numpy_submodules__ = {
644 "linalg", "fft", "dtypes", "random", "polynomial", "ma",
645 "exceptions", "lib", "ctypeslib", "testing", "typing",
646 "f2py", "test", "rec", "char", "core", "strings",
647 }
648
649 # We build warning messages for former attributes
650 _msg = (
651 "module 'numpy' has no attribute '{n}'.\n"
652 "`np.{n}` was a deprecated alias for the builtin `{n}`. "
653 "To avoid this error in existing code, use `{n}` by itself. "
654 "Doing this will not modify any behavior and is safe. {extended_msg}\n"
655 "The aliases was originally deprecated in NumPy 1.20; for more "
656 "details and guidance see the original release note at:\n"
657 " https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations")
658
659 _specific_msg = (
660 "If you specifically wanted the numpy scalar type, use `np.{}` here.")
661
662 _int_extended_msg = (
663 "When replacing `np.{}`, you may wish to use e.g. `np.int64` "
664 "or `np.int32` to specify the precision. If you wish to review "
665 "your current use, check the release note link for "
666 "additional information.")
667
668 _type_info = [
669 ("object", ""), # The NumPy scalar only exists by name.
670 ("float", _specific_msg.format("float64")),
671 ("complex", _specific_msg.format("complex128")),
672 ("str", _specific_msg.format("str_")),
673 ("int", _int_extended_msg.format("int"))]
674
675 __former_attrs__ = {
676 n: _msg.format(n=n, extended_msg=extended_msg)
677 for n, extended_msg in _type_info
678 }
679
680 # Some of these could be defined right away, but most were aliases to
681 # the Python objects and only removed in NumPy 1.24. Defining them should
682 # probably wait for NumPy 1.26 or 2.0.
683 # When defined, these should possibly not be added to `__all__` to avoid
684 # import with `from numpy import *`.
685 __future_scalars__ = {"str", "bytes", "object"}
686
687 __array_api_version__ = "2024.12"
688
689 from ._array_api_info import __array_namespace_info__
690
691 __all__ = list(
692 __numpy_submodules__ |
693 set(_core.__all__) |
694 set(_mat.__all__) |
695 set(lib._histograms_impl.__all__) |
696 set(lib._nanfunctions_impl.__all__) |
697 set(lib._function_base_impl.__all__) |
698 set(lib._twodim_base_impl.__all__) |
699 set(lib._shape_base_impl.__all__) |
700 set(lib._type_check_impl.__all__) |
701 set(lib._arraysetops_impl.__all__) |
702 set(lib._ufunclike_impl.__all__) |
703 set(lib._arraypad_impl.__all__) |
704 set(lib._utils_impl.__all__) |
705 set(lib._stride_tricks_impl.__all__) |
706 set(lib._polynomial_impl.__all__) |
707 set(lib._npyio_impl.__all__) |
708 set(lib._index_tricks_impl.__all__) |
709 {"emath", "show_config", "__version__", "__array_namespace_info__"}
710 )
711
712 # Filter out Cython harmless warnings
713 warnings.filterwarnings("ignore", message="numpy.dtype size changed")
714 warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
715 warnings.filterwarnings("ignore", message="numpy.ndarray size changed")
716
717 def __getattr__(attr):
718 # Warn for expired attributes
719 import warnings
720
721 if attr == "linalg":
722 import numpy.linalg as linalg
723 return linalg
724 elif attr == "fft":
725 import numpy.fft as fft
726 return fft
727 elif attr == "dtypes":
728 import numpy.dtypes as dtypes
729 return dtypes
730 elif attr == "random":
731 import numpy.random as random
732 return random
733 elif attr == "polynomial":
734 import numpy.polynomial as polynomial
735 return polynomial
736 elif attr == "ma":
737 import numpy.ma as ma
738 return ma
739 elif attr == "ctypeslib":
740 import numpy.ctypeslib as ctypeslib
741 return ctypeslib
742 elif attr == "exceptions":
743 import numpy.exceptions as exceptions
744 return exceptions
745 elif attr == "testing":
746 import numpy.testing as testing
747 return testing
748 elif attr == "matlib":
749 import numpy.matlib as matlib
750 return matlib
751 elif attr == "f2py":
752 import numpy.f2py as f2py
753 return f2py
754 elif attr == "typing":
755 import numpy.typing as typing
756 return typing
757 elif attr == "rec":
758 import numpy.rec as rec
759 return rec
760 elif attr == "char":
761 import numpy.char as char
762 return char
763 elif attr == "array_api":
764 raise AttributeError("`numpy.array_api` is not available from "
765 "numpy 2.0 onwards", name=None)
766 elif attr == "core":
767 import numpy.core as core
768 return core
769 elif attr == "strings":
770 import numpy.strings as strings
771 return strings
772 elif attr == "distutils":
773 if 'distutils' in __numpy_submodules__:
774 import numpy.distutils as distutils
775 return distutils
776 else:
777 raise AttributeError("`numpy.distutils` is not available from "
778 "Python 3.12 onwards", name=None)
779
780 if attr in __future_scalars__:
781 # And future warnings for those that will change, but also give
782 # the AttributeError
783 warnings.warn(
784 f"In the future `np.{attr}` will be defined as the "
785 "corresponding NumPy scalar.", FutureWarning, stacklevel=2)
786
787 if attr in __former_attrs__:
788 raise AttributeError(__former_attrs__[attr], name=None)
789
790 if attr in __expired_attributes__:
791 raise AttributeError(
792 f"`np.{attr}` was removed in the NumPy 2.0 release. "
793 f"{__expired_attributes__[attr]}",
794 name=None
795 )
796
797 if attr == "chararray":
798 warnings.warn(
799 "`np.chararray` is deprecated and will be removed from "
800 "the main namespace in the future. Use an array with a string "
801 "or bytes dtype instead.", DeprecationWarning, stacklevel=2)
802 import numpy.char as char
803 return char.chararray
804
805 raise AttributeError(f"module {__name__!r} has no attribute {attr!r}")
806
807 def __dir__():
808 public_symbols = (
809 globals().keys() | __numpy_submodules__
810 )
811 public_symbols -= {
812 "matrixlib", "matlib", "tests", "conftest", "version",
813 "distutils", "array_api"
814 }
815 return list(public_symbols)
816
817 # Pytest testing
818 from numpy._pytesttester import PytestTester
819 test = PytestTester(__name__)
820 del PytestTester
821
822 def _sanity_check():
823 """
824 Quick sanity checks for common bugs caused by environment.
825 There are some cases e.g. with wrong BLAS ABI that cause wrong
826 results under specific runtime conditions that are not necessarily
827 achieved during test suite runs, and it is useful to catch those early.
828
829 See https://github.com/numpy/numpy/issues/8577 and other
830 similar bug reports.
831
832 """
833 try:
834 x = ones(2, dtype=float32)
835 if not abs(x.dot(x) - float32(2.0)) < 1e-5:
836 raise AssertionError
837 except AssertionError:
838 msg = ("The current Numpy installation ({!r}) fails to "
839 "pass simple sanity checks. This can be caused for example "
840 "by incorrect BLAS library being linked in, or by mixing "
841 "package managers (pip, conda, apt, ...). Search closed "
842 "numpy issues for similar problems.")
843 raise RuntimeError(msg.format(__file__)) from None
844
845 _sanity_check()
846 del _sanity_check
847
848 def _mac_os_check():
849 """
850 Quick Sanity check for Mac OS look for accelerate build bugs.
851 Testing numpy polyfit calls init_dgelsd(LAPACK)
852 """
853 try:
854 c = array([3., 2., 1.])
855 x = linspace(0, 2, 5)
856 y = polyval(c, x)
857 _ = polyfit(x, y, 2, cov=True)
858 except ValueError:
859 pass
860
861 if sys.platform == "darwin":
862 from . import exceptions
863 with warnings.catch_warnings(record=True) as w:
864 _mac_os_check()
865 # Throw runtime error, if the test failed
866 # Check for warning and report the error_message
867 if len(w) > 0:
868 for _wn in w:
869 if _wn.category is exceptions.RankWarning:
870 # Ignore other warnings, they may not be relevant (see gh-25433)
871 error_message = (
872 f"{_wn.category.__name__}: {_wn.message}"
873 )
874 msg = (
875 "Polyfit sanity test emitted a warning, most likely due "
876 "to using a buggy Accelerate backend."
877 "\nIf you compiled yourself, more information is available at:" # noqa: E501
878 "\nhttps://numpy.org/devdocs/building/index.html"
879 "\nOtherwise report this to the vendor "
880 f"that provided NumPy.\n\n{error_message}\n")
881 raise RuntimeError(msg)
882 del _wn
883 del w
884 del _mac_os_check
885
886 def blas_fpe_check():
887 # Check if BLAS adds spurious FPEs, mostly seen on M4 arms with Accelerate.
888 with errstate(all='raise'):
889 x = ones((20, 20))
890 try:
891 x @ x
892 except FloatingPointError:
893 res = _core._multiarray_umath._blas_supports_fpe(False)
894 if res: # res was not modified (hardcoded to True for now)
895 warnings.warn(
896 "Spurious warnings given by blas but suppression not "
897 "set up on this platform. Please open a NumPy issue.",
898 UserWarning, stacklevel=2)
899
900 blas_fpe_check()
901 del blas_fpe_check
902
903 def hugepage_setup():
904 """
905 We usually use madvise hugepages support, but on some old kernels it
906 is slow and thus better avoided. Specifically kernel version 4.6
907 had a bug fix which probably fixed this:
908 https://github.com/torvalds/linux/commit/7cf91a98e607c2f935dbcc177d70011e95b8faff
909 """
910 use_hugepage = os.environ.get("NUMPY_MADVISE_HUGEPAGE", None)
911 if sys.platform == "linux" and use_hugepage is None:
912 # If there is an issue with parsing the kernel version,
913 # set use_hugepage to 0. Usage of LooseVersion will handle
914 # the kernel version parsing better, but avoided since it
915 # will increase the import time.
916 # See: #16679 for related discussion.
917 try:
918 use_hugepage = 1
919 kernel_version = os.uname().release.split(".")[:2]
920 kernel_version = tuple(int(v) for v in kernel_version)
921 if kernel_version < (4, 6):
922 use_hugepage = 0
923 except ValueError:
924 use_hugepage = 0
925 elif use_hugepage is None:
926 # This is not Linux, so it should not matter, just enable anyway
927 use_hugepage = 1
928 else:
929 use_hugepage = int(use_hugepage)
930 return use_hugepage
931
932 # Note that this will currently only make a difference on Linux
933 _core.multiarray._set_madvise_hugepage(hugepage_setup())
934 del hugepage_setup
935
936 # Give a warning if NumPy is reloaded or imported on a sub-interpreter
937 # We do this from python, since the C-module may not be reloaded and
938 # it is tidier organized.
939 _core.multiarray._multiarray_umath._reload_guard()
940
941 # TODO: Remove the environment variable entirely now that it is "weak"
942 if (os.environ.get("NPY_PROMOTION_STATE", "weak") != "weak"):
943 warnings.warn(
944 "NPY_PROMOTION_STATE was a temporary feature for NumPy 2.0 "
945 "transition and is ignored after NumPy 2.2.",
946 UserWarning, stacklevel=2)
947
948 # Tell PyInstaller where to find hook-numpy.py
949 def _pyinstaller_hooks_dir():
950 from pathlib import Path
951 return [str(Path(__file__).with_name("_pyinstaller").resolve())]
952
953
954# Remove symbols imported for internal use
955del os, sys, warnings
956 