numpy 2.4.1__pp311-pypy311_pp73-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1039) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +108 -0
  3. numpy/__init__.cython-30.pxd +1242 -0
  4. numpy/__init__.pxd +1155 -0
  5. numpy/__init__.py +942 -0
  6. numpy/__init__.pyi +6202 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +206 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +201 -0
  12. numpy/_core/__init__.pyi +666 -0
  13. numpy/_core/_add_newdocs.py +7151 -0
  14. numpy/_core/_add_newdocs.pyi +2 -0
  15. numpy/_core/_add_newdocs_scalars.py +381 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +130 -0
  18. numpy/_core/_asarray.pyi +43 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +56 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +54 -0
  25. numpy/_core/_internal.py +968 -0
  26. numpy/_core/_internal.pyi +61 -0
  27. numpy/_core/_methods.py +252 -0
  28. numpy/_core/_methods.pyi +22 -0
  29. numpy/_core/_multiarray_tests.pypy311-pp73-darwin.so +0 -0
  30. numpy/_core/_multiarray_umath.pypy311-pp73-darwin.so +0 -0
  31. numpy/_core/_operand_flag_tests.pypy311-pp73-darwin.so +0 -0
  32. numpy/_core/_rational_tests.pypy311-pp73-darwin.so +0 -0
  33. numpy/_core/_simd.pyi +35 -0
  34. numpy/_core/_simd.pypy311-pp73-darwin.so +0 -0
  35. numpy/_core/_string_helpers.py +100 -0
  36. numpy/_core/_string_helpers.pyi +12 -0
  37. numpy/_core/_struct_ufunc_tests.pypy311-pp73-darwin.so +0 -0
  38. numpy/_core/_type_aliases.py +131 -0
  39. numpy/_core/_type_aliases.pyi +86 -0
  40. numpy/_core/_ufunc_config.py +515 -0
  41. numpy/_core/_ufunc_config.pyi +69 -0
  42. numpy/_core/_umath_tests.pyi +47 -0
  43. numpy/_core/_umath_tests.pypy311-pp73-darwin.so +0 -0
  44. numpy/_core/arrayprint.py +1779 -0
  45. numpy/_core/arrayprint.pyi +158 -0
  46. numpy/_core/cversions.py +13 -0
  47. numpy/_core/defchararray.py +1414 -0
  48. numpy/_core/defchararray.pyi +1150 -0
  49. numpy/_core/einsumfunc.py +1650 -0
  50. numpy/_core/einsumfunc.pyi +184 -0
  51. numpy/_core/fromnumeric.py +4233 -0
  52. numpy/_core/fromnumeric.pyi +1735 -0
  53. numpy/_core/function_base.py +547 -0
  54. numpy/_core/function_base.pyi +276 -0
  55. numpy/_core/getlimits.py +462 -0
  56. numpy/_core/getlimits.pyi +124 -0
  57. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  58. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  59. numpy/_core/include/numpy/__ufunc_api.c +55 -0
  60. numpy/_core/include/numpy/__ufunc_api.h +349 -0
  61. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  62. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  63. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  64. numpy/_core/include/numpy/arrayobject.h +7 -0
  65. numpy/_core/include/numpy/arrayscalars.h +198 -0
  66. numpy/_core/include/numpy/dtype_api.h +547 -0
  67. numpy/_core/include/numpy/halffloat.h +70 -0
  68. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  69. numpy/_core/include/numpy/ndarraytypes.h +1982 -0
  70. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  71. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  72. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  73. numpy/_core/include/numpy/npy_common.h +989 -0
  74. numpy/_core/include/numpy/npy_cpu.h +126 -0
  75. numpy/_core/include/numpy/npy_endian.h +79 -0
  76. numpy/_core/include/numpy/npy_math.h +602 -0
  77. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  78. numpy/_core/include/numpy/npy_os.h +42 -0
  79. numpy/_core/include/numpy/numpyconfig.h +185 -0
  80. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  81. numpy/_core/include/numpy/random/bitgen.h +20 -0
  82. numpy/_core/include/numpy/random/distributions.h +209 -0
  83. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  84. numpy/_core/include/numpy/ufuncobject.h +343 -0
  85. numpy/_core/include/numpy/utils.h +37 -0
  86. numpy/_core/lib/libnpymath.a +0 -0
  87. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  88. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  89. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  90. numpy/_core/memmap.py +363 -0
  91. numpy/_core/memmap.pyi +3 -0
  92. numpy/_core/multiarray.py +1740 -0
  93. numpy/_core/multiarray.pyi +1316 -0
  94. numpy/_core/numeric.py +2758 -0
  95. numpy/_core/numeric.pyi +1276 -0
  96. numpy/_core/numerictypes.py +633 -0
  97. numpy/_core/numerictypes.pyi +196 -0
  98. numpy/_core/overrides.py +188 -0
  99. numpy/_core/overrides.pyi +47 -0
  100. numpy/_core/printoptions.py +32 -0
  101. numpy/_core/printoptions.pyi +28 -0
  102. numpy/_core/records.py +1088 -0
  103. numpy/_core/records.pyi +340 -0
  104. numpy/_core/shape_base.py +996 -0
  105. numpy/_core/shape_base.pyi +182 -0
  106. numpy/_core/strings.py +1813 -0
  107. numpy/_core/strings.pyi +536 -0
  108. numpy/_core/tests/_locales.py +72 -0
  109. numpy/_core/tests/_natype.py +144 -0
  110. numpy/_core/tests/data/astype_copy.pkl +0 -0
  111. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  112. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  113. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  114. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  115. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  122. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  123. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  124. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  125. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  127. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  128. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  129. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  130. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  131. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  132. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  134. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  135. numpy/_core/tests/examples/cython/meson.build +43 -0
  136. numpy/_core/tests/examples/cython/setup.py +39 -0
  137. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  138. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  139. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  140. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  141. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  142. numpy/_core/tests/test__exceptions.py +90 -0
  143. numpy/_core/tests/test_abc.py +54 -0
  144. numpy/_core/tests/test_api.py +655 -0
  145. numpy/_core/tests/test_argparse.py +90 -0
  146. numpy/_core/tests/test_array_api_info.py +113 -0
  147. numpy/_core/tests/test_array_coercion.py +928 -0
  148. numpy/_core/tests/test_array_interface.py +222 -0
  149. numpy/_core/tests/test_arraymethod.py +84 -0
  150. numpy/_core/tests/test_arrayobject.py +75 -0
  151. numpy/_core/tests/test_arrayprint.py +1324 -0
  152. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  153. numpy/_core/tests/test_casting_unittests.py +955 -0
  154. numpy/_core/tests/test_conversion_utils.py +209 -0
  155. numpy/_core/tests/test_cpu_dispatcher.py +48 -0
  156. numpy/_core/tests/test_cpu_features.py +450 -0
  157. numpy/_core/tests/test_custom_dtypes.py +393 -0
  158. numpy/_core/tests/test_cython.py +352 -0
  159. numpy/_core/tests/test_datetime.py +2792 -0
  160. numpy/_core/tests/test_defchararray.py +858 -0
  161. numpy/_core/tests/test_deprecations.py +460 -0
  162. numpy/_core/tests/test_dlpack.py +190 -0
  163. numpy/_core/tests/test_dtype.py +2110 -0
  164. numpy/_core/tests/test_einsum.py +1351 -0
  165. numpy/_core/tests/test_errstate.py +131 -0
  166. numpy/_core/tests/test_extint128.py +217 -0
  167. numpy/_core/tests/test_finfo.py +86 -0
  168. numpy/_core/tests/test_function_base.py +504 -0
  169. numpy/_core/tests/test_getlimits.py +171 -0
  170. numpy/_core/tests/test_half.py +593 -0
  171. numpy/_core/tests/test_hashtable.py +36 -0
  172. numpy/_core/tests/test_indexerrors.py +122 -0
  173. numpy/_core/tests/test_indexing.py +1692 -0
  174. numpy/_core/tests/test_item_selection.py +167 -0
  175. numpy/_core/tests/test_limited_api.py +102 -0
  176. numpy/_core/tests/test_longdouble.py +370 -0
  177. numpy/_core/tests/test_mem_overlap.py +933 -0
  178. numpy/_core/tests/test_mem_policy.py +453 -0
  179. numpy/_core/tests/test_memmap.py +248 -0
  180. numpy/_core/tests/test_multiarray.py +11008 -0
  181. numpy/_core/tests/test_multiprocessing.py +55 -0
  182. numpy/_core/tests/test_multithreading.py +377 -0
  183. numpy/_core/tests/test_nditer.py +3533 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4295 -0
  186. numpy/_core/tests/test_numerictypes.py +650 -0
  187. numpy/_core/tests/test_overrides.py +800 -0
  188. numpy/_core/tests/test_print.py +202 -0
  189. numpy/_core/tests/test_protocols.py +46 -0
  190. numpy/_core/tests/test_records.py +544 -0
  191. numpy/_core/tests/test_regression.py +2677 -0
  192. numpy/_core/tests/test_scalar_ctors.py +203 -0
  193. numpy/_core/tests/test_scalar_methods.py +328 -0
  194. numpy/_core/tests/test_scalarbuffer.py +153 -0
  195. numpy/_core/tests/test_scalarinherit.py +105 -0
  196. numpy/_core/tests/test_scalarmath.py +1168 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +904 -0
  199. numpy/_core/tests/test_simd.py +1345 -0
  200. numpy/_core/tests/test_simd_module.py +105 -0
  201. numpy/_core/tests/test_stringdtype.py +1855 -0
  202. numpy/_core/tests/test_strings.py +1523 -0
  203. numpy/_core/tests/test_ufunc.py +3405 -0
  204. numpy/_core/tests/test_umath.py +4962 -0
  205. numpy/_core/tests/test_umath_accuracy.py +132 -0
  206. numpy/_core/tests/test_umath_complex.py +631 -0
  207. numpy/_core/tests/test_unicode.py +369 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +232 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +78 -0
  213. numpy/_expired_attrs_2_0.pyi +61 -0
  214. numpy/_globals.py +121 -0
  215. numpy/_globals.pyi +17 -0
  216. numpy/_pyinstaller/__init__.py +0 -0
  217. numpy/_pyinstaller/__init__.pyi +0 -0
  218. numpy/_pyinstaller/hook-numpy.py +36 -0
  219. numpy/_pyinstaller/hook-numpy.pyi +6 -0
  220. numpy/_pyinstaller/tests/__init__.py +16 -0
  221. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  222. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  223. numpy/_pytesttester.py +201 -0
  224. numpy/_pytesttester.pyi +18 -0
  225. numpy/_typing/__init__.py +173 -0
  226. numpy/_typing/_add_docstring.py +153 -0
  227. numpy/_typing/_array_like.py +106 -0
  228. numpy/_typing/_char_codes.py +213 -0
  229. numpy/_typing/_dtype_like.py +114 -0
  230. numpy/_typing/_extended_precision.py +15 -0
  231. numpy/_typing/_nbit.py +19 -0
  232. numpy/_typing/_nbit_base.py +94 -0
  233. numpy/_typing/_nbit_base.pyi +39 -0
  234. numpy/_typing/_nested_sequence.py +79 -0
  235. numpy/_typing/_scalars.py +20 -0
  236. numpy/_typing/_shape.py +8 -0
  237. numpy/_typing/_ufunc.py +7 -0
  238. numpy/_typing/_ufunc.pyi +975 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +28 -0
  241. numpy/_utils/_convertions.py +18 -0
  242. numpy/_utils/_convertions.pyi +4 -0
  243. numpy/_utils/_inspect.py +192 -0
  244. numpy/_utils/_inspect.pyi +70 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +118 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +248 -0
  250. numpy/core/__init__.py +33 -0
  251. numpy/core/__init__.pyi +0 -0
  252. numpy/core/_dtype.py +10 -0
  253. numpy/core/_dtype.pyi +0 -0
  254. numpy/core/_dtype_ctypes.py +10 -0
  255. numpy/core/_dtype_ctypes.pyi +0 -0
  256. numpy/core/_internal.py +27 -0
  257. numpy/core/_multiarray_umath.py +57 -0
  258. numpy/core/_utils.py +21 -0
  259. numpy/core/arrayprint.py +10 -0
  260. numpy/core/defchararray.py +10 -0
  261. numpy/core/einsumfunc.py +10 -0
  262. numpy/core/fromnumeric.py +10 -0
  263. numpy/core/function_base.py +10 -0
  264. numpy/core/getlimits.py +10 -0
  265. numpy/core/multiarray.py +25 -0
  266. numpy/core/numeric.py +12 -0
  267. numpy/core/numerictypes.py +10 -0
  268. numpy/core/overrides.py +10 -0
  269. numpy/core/overrides.pyi +7 -0
  270. numpy/core/records.py +10 -0
  271. numpy/core/shape_base.py +10 -0
  272. numpy/core/umath.py +10 -0
  273. numpy/ctypeslib/__init__.py +13 -0
  274. numpy/ctypeslib/__init__.pyi +15 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +236 -0
  277. numpy/distutils/__init__.py +64 -0
  278. numpy/distutils/__init__.pyi +4 -0
  279. numpy/distutils/__pycache__/conv_template.pypy311.pyc +0 -0
  280. numpy/distutils/_shell_utils.py +87 -0
  281. numpy/distutils/armccompiler.py +26 -0
  282. numpy/distutils/ccompiler.py +826 -0
  283. numpy/distutils/ccompiler_opt.py +2668 -0
  284. numpy/distutils/checks/cpu_asimd.c +27 -0
  285. numpy/distutils/checks/cpu_asimddp.c +16 -0
  286. numpy/distutils/checks/cpu_asimdfhm.c +19 -0
  287. numpy/distutils/checks/cpu_asimdhp.c +15 -0
  288. numpy/distutils/checks/cpu_avx.c +20 -0
  289. numpy/distutils/checks/cpu_avx2.c +20 -0
  290. numpy/distutils/checks/cpu_avx512_clx.c +22 -0
  291. numpy/distutils/checks/cpu_avx512_cnl.c +24 -0
  292. numpy/distutils/checks/cpu_avx512_icl.c +26 -0
  293. numpy/distutils/checks/cpu_avx512_knl.c +25 -0
  294. numpy/distutils/checks/cpu_avx512_knm.c +30 -0
  295. numpy/distutils/checks/cpu_avx512_skx.c +26 -0
  296. numpy/distutils/checks/cpu_avx512_spr.c +26 -0
  297. numpy/distutils/checks/cpu_avx512cd.c +20 -0
  298. numpy/distutils/checks/cpu_avx512f.c +20 -0
  299. numpy/distutils/checks/cpu_f16c.c +22 -0
  300. numpy/distutils/checks/cpu_fma3.c +22 -0
  301. numpy/distutils/checks/cpu_fma4.c +13 -0
  302. numpy/distutils/checks/cpu_lsx.c +11 -0
  303. numpy/distutils/checks/cpu_neon.c +19 -0
  304. numpy/distutils/checks/cpu_neon_fp16.c +11 -0
  305. numpy/distutils/checks/cpu_neon_vfpv4.c +21 -0
  306. numpy/distutils/checks/cpu_popcnt.c +32 -0
  307. numpy/distutils/checks/cpu_rvv.c +13 -0
  308. numpy/distutils/checks/cpu_sse.c +20 -0
  309. numpy/distutils/checks/cpu_sse2.c +20 -0
  310. numpy/distutils/checks/cpu_sse3.c +20 -0
  311. numpy/distutils/checks/cpu_sse41.c +20 -0
  312. numpy/distutils/checks/cpu_sse42.c +20 -0
  313. numpy/distutils/checks/cpu_ssse3.c +20 -0
  314. numpy/distutils/checks/cpu_sve.c +14 -0
  315. numpy/distutils/checks/cpu_vsx.c +21 -0
  316. numpy/distutils/checks/cpu_vsx2.c +13 -0
  317. numpy/distutils/checks/cpu_vsx3.c +13 -0
  318. numpy/distutils/checks/cpu_vsx4.c +14 -0
  319. numpy/distutils/checks/cpu_vx.c +16 -0
  320. numpy/distutils/checks/cpu_vxe.c +25 -0
  321. numpy/distutils/checks/cpu_vxe2.c +21 -0
  322. numpy/distutils/checks/cpu_xop.c +12 -0
  323. numpy/distutils/checks/extra_avx512bw_mask.c +18 -0
  324. numpy/distutils/checks/extra_avx512dq_mask.c +16 -0
  325. numpy/distutils/checks/extra_avx512f_reduce.c +41 -0
  326. numpy/distutils/checks/extra_vsx3_half_double.c +12 -0
  327. numpy/distutils/checks/extra_vsx4_mma.c +21 -0
  328. numpy/distutils/checks/extra_vsx_asm.c +36 -0
  329. numpy/distutils/checks/test_flags.c +1 -0
  330. numpy/distutils/command/__init__.py +41 -0
  331. numpy/distutils/command/autodist.py +148 -0
  332. numpy/distutils/command/bdist_rpm.py +22 -0
  333. numpy/distutils/command/build.py +62 -0
  334. numpy/distutils/command/build_clib.py +469 -0
  335. numpy/distutils/command/build_ext.py +752 -0
  336. numpy/distutils/command/build_py.py +31 -0
  337. numpy/distutils/command/build_scripts.py +49 -0
  338. numpy/distutils/command/build_src.py +773 -0
  339. numpy/distutils/command/config.py +516 -0
  340. numpy/distutils/command/config_compiler.py +126 -0
  341. numpy/distutils/command/develop.py +15 -0
  342. numpy/distutils/command/egg_info.py +25 -0
  343. numpy/distutils/command/install.py +79 -0
  344. numpy/distutils/command/install_clib.py +40 -0
  345. numpy/distutils/command/install_data.py +24 -0
  346. numpy/distutils/command/install_headers.py +25 -0
  347. numpy/distutils/command/sdist.py +27 -0
  348. numpy/distutils/conv_template.py +329 -0
  349. numpy/distutils/core.py +215 -0
  350. numpy/distutils/cpuinfo.py +683 -0
  351. numpy/distutils/exec_command.py +315 -0
  352. numpy/distutils/extension.py +101 -0
  353. numpy/distutils/fcompiler/__init__.py +1035 -0
  354. numpy/distutils/fcompiler/absoft.py +158 -0
  355. numpy/distutils/fcompiler/arm.py +71 -0
  356. numpy/distutils/fcompiler/compaq.py +120 -0
  357. numpy/distutils/fcompiler/environment.py +88 -0
  358. numpy/distutils/fcompiler/fujitsu.py +46 -0
  359. numpy/distutils/fcompiler/g95.py +42 -0
  360. numpy/distutils/fcompiler/gnu.py +555 -0
  361. numpy/distutils/fcompiler/hpux.py +41 -0
  362. numpy/distutils/fcompiler/ibm.py +97 -0
  363. numpy/distutils/fcompiler/intel.py +211 -0
  364. numpy/distutils/fcompiler/lahey.py +45 -0
  365. numpy/distutils/fcompiler/mips.py +54 -0
  366. numpy/distutils/fcompiler/nag.py +87 -0
  367. numpy/distutils/fcompiler/none.py +28 -0
  368. numpy/distutils/fcompiler/nv.py +53 -0
  369. numpy/distutils/fcompiler/pathf95.py +33 -0
  370. numpy/distutils/fcompiler/pg.py +128 -0
  371. numpy/distutils/fcompiler/sun.py +51 -0
  372. numpy/distutils/fcompiler/vast.py +52 -0
  373. numpy/distutils/from_template.py +261 -0
  374. numpy/distutils/fujitsuccompiler.py +28 -0
  375. numpy/distutils/intelccompiler.py +106 -0
  376. numpy/distutils/lib2def.py +116 -0
  377. numpy/distutils/line_endings.py +77 -0
  378. numpy/distutils/log.py +111 -0
  379. numpy/distutils/mingw/gfortran_vs2003_hack.c +6 -0
  380. numpy/distutils/mingw32ccompiler.py +620 -0
  381. numpy/distutils/misc_util.py +2484 -0
  382. numpy/distutils/msvc9compiler.py +63 -0
  383. numpy/distutils/msvccompiler.py +76 -0
  384. numpy/distutils/npy_pkg_config.py +441 -0
  385. numpy/distutils/numpy_distribution.py +17 -0
  386. numpy/distutils/pathccompiler.py +21 -0
  387. numpy/distutils/system_info.py +3267 -0
  388. numpy/distutils/tests/__init__.py +0 -0
  389. numpy/distutils/tests/test_build_ext.py +74 -0
  390. numpy/distutils/tests/test_ccompiler_opt.py +808 -0
  391. numpy/distutils/tests/test_ccompiler_opt_conf.py +176 -0
  392. numpy/distutils/tests/test_exec_command.py +217 -0
  393. numpy/distutils/tests/test_fcompiler.py +43 -0
  394. numpy/distutils/tests/test_fcompiler_gnu.py +55 -0
  395. numpy/distutils/tests/test_fcompiler_intel.py +30 -0
  396. numpy/distutils/tests/test_fcompiler_nagfor.py +22 -0
  397. numpy/distutils/tests/test_from_template.py +44 -0
  398. numpy/distutils/tests/test_log.py +34 -0
  399. numpy/distutils/tests/test_mingw32ccompiler.py +47 -0
  400. numpy/distutils/tests/test_misc_util.py +88 -0
  401. numpy/distutils/tests/test_npy_pkg_config.py +84 -0
  402. numpy/distutils/tests/test_shell_utils.py +79 -0
  403. numpy/distutils/tests/test_system_info.py +334 -0
  404. numpy/distutils/tests/utilities.py +90 -0
  405. numpy/distutils/unixccompiler.py +141 -0
  406. numpy/doc/ufuncs.py +138 -0
  407. numpy/dtypes.py +41 -0
  408. numpy/dtypes.pyi +630 -0
  409. numpy/exceptions.py +246 -0
  410. numpy/exceptions.pyi +27 -0
  411. numpy/f2py/__init__.py +86 -0
  412. numpy/f2py/__init__.pyi +5 -0
  413. numpy/f2py/__main__.py +5 -0
  414. numpy/f2py/__version__.py +1 -0
  415. numpy/f2py/__version__.pyi +1 -0
  416. numpy/f2py/_backends/__init__.py +9 -0
  417. numpy/f2py/_backends/__init__.pyi +5 -0
  418. numpy/f2py/_backends/_backend.py +44 -0
  419. numpy/f2py/_backends/_backend.pyi +46 -0
  420. numpy/f2py/_backends/_distutils.py +76 -0
  421. numpy/f2py/_backends/_distutils.pyi +13 -0
  422. numpy/f2py/_backends/_meson.py +244 -0
  423. numpy/f2py/_backends/_meson.pyi +62 -0
  424. numpy/f2py/_backends/meson.build.template +58 -0
  425. numpy/f2py/_isocbind.py +62 -0
  426. numpy/f2py/_isocbind.pyi +13 -0
  427. numpy/f2py/_src_pyf.py +247 -0
  428. numpy/f2py/_src_pyf.pyi +28 -0
  429. numpy/f2py/auxfuncs.py +1004 -0
  430. numpy/f2py/auxfuncs.pyi +262 -0
  431. numpy/f2py/capi_maps.py +811 -0
  432. numpy/f2py/capi_maps.pyi +33 -0
  433. numpy/f2py/cb_rules.py +665 -0
  434. numpy/f2py/cb_rules.pyi +17 -0
  435. numpy/f2py/cfuncs.py +1563 -0
  436. numpy/f2py/cfuncs.pyi +31 -0
  437. numpy/f2py/common_rules.py +143 -0
  438. numpy/f2py/common_rules.pyi +9 -0
  439. numpy/f2py/crackfortran.py +3725 -0
  440. numpy/f2py/crackfortran.pyi +266 -0
  441. numpy/f2py/diagnose.py +149 -0
  442. numpy/f2py/diagnose.pyi +1 -0
  443. numpy/f2py/f2py2e.py +788 -0
  444. numpy/f2py/f2py2e.pyi +74 -0
  445. numpy/f2py/f90mod_rules.py +269 -0
  446. numpy/f2py/f90mod_rules.pyi +16 -0
  447. numpy/f2py/func2subr.py +329 -0
  448. numpy/f2py/func2subr.pyi +7 -0
  449. numpy/f2py/rules.py +1629 -0
  450. numpy/f2py/rules.pyi +41 -0
  451. numpy/f2py/setup.cfg +3 -0
  452. numpy/f2py/src/fortranobject.c +1436 -0
  453. numpy/f2py/src/fortranobject.h +173 -0
  454. numpy/f2py/symbolic.py +1518 -0
  455. numpy/f2py/symbolic.pyi +219 -0
  456. numpy/f2py/tests/__init__.py +16 -0
  457. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  458. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  459. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  460. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  461. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  462. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  463. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  464. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  465. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  466. numpy/f2py/tests/src/callback/foo.f +62 -0
  467. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  468. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  469. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  470. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  471. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  472. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  473. numpy/f2py/tests/src/cli/hi77.f +3 -0
  474. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  475. numpy/f2py/tests/src/common/block.f +11 -0
  476. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  477. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  478. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  479. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  480. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  481. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  482. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  483. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  484. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  485. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  486. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  487. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  488. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  489. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  490. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  491. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  492. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  493. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  494. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  495. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  496. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  497. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  498. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  499. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  500. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  501. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  502. numpy/f2py/tests/src/mixed/foo.f +5 -0
  503. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  504. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  505. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  506. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  507. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  508. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  509. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  510. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  511. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  512. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  513. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  514. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  515. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  516. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  517. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  518. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  519. numpy/f2py/tests/src/regression/AB.inc +1 -0
  520. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  521. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  522. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  523. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  524. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  525. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  526. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  527. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  528. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  529. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  530. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  531. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  532. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  533. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  534. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  535. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  536. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  537. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  538. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  539. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  540. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  541. numpy/f2py/tests/src/routines/subrout.f +4 -0
  542. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  543. numpy/f2py/tests/src/size/foo.f90 +44 -0
  544. numpy/f2py/tests/src/string/char.f90 +29 -0
  545. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  546. numpy/f2py/tests/src/string/gh24008.f +8 -0
  547. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  548. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  549. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  550. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  551. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  552. numpy/f2py/tests/src/string/string.f +12 -0
  553. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  554. numpy/f2py/tests/test_abstract_interface.py +26 -0
  555. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  556. numpy/f2py/tests/test_assumed_shape.py +50 -0
  557. numpy/f2py/tests/test_block_docstring.py +20 -0
  558. numpy/f2py/tests/test_callback.py +263 -0
  559. numpy/f2py/tests/test_character.py +641 -0
  560. numpy/f2py/tests/test_common.py +23 -0
  561. numpy/f2py/tests/test_crackfortran.py +421 -0
  562. numpy/f2py/tests/test_data.py +71 -0
  563. numpy/f2py/tests/test_docs.py +66 -0
  564. numpy/f2py/tests/test_f2cmap.py +17 -0
  565. numpy/f2py/tests/test_f2py2e.py +983 -0
  566. numpy/f2py/tests/test_isoc.py +56 -0
  567. numpy/f2py/tests/test_kind.py +52 -0
  568. numpy/f2py/tests/test_mixed.py +35 -0
  569. numpy/f2py/tests/test_modules.py +83 -0
  570. numpy/f2py/tests/test_parameter.py +129 -0
  571. numpy/f2py/tests/test_pyf_src.py +43 -0
  572. numpy/f2py/tests/test_quoted_character.py +18 -0
  573. numpy/f2py/tests/test_regression.py +187 -0
  574. numpy/f2py/tests/test_return_character.py +48 -0
  575. numpy/f2py/tests/test_return_complex.py +67 -0
  576. numpy/f2py/tests/test_return_integer.py +55 -0
  577. numpy/f2py/tests/test_return_logical.py +65 -0
  578. numpy/f2py/tests/test_return_real.py +109 -0
  579. numpy/f2py/tests/test_routines.py +29 -0
  580. numpy/f2py/tests/test_semicolon_split.py +75 -0
  581. numpy/f2py/tests/test_size.py +45 -0
  582. numpy/f2py/tests/test_string.py +100 -0
  583. numpy/f2py/tests/test_symbolic.py +500 -0
  584. numpy/f2py/tests/test_value_attrspec.py +15 -0
  585. numpy/f2py/tests/util.py +442 -0
  586. numpy/f2py/use_rules.py +99 -0
  587. numpy/f2py/use_rules.pyi +9 -0
  588. numpy/fft/__init__.py +213 -0
  589. numpy/fft/__init__.pyi +38 -0
  590. numpy/fft/_helper.py +235 -0
  591. numpy/fft/_helper.pyi +44 -0
  592. numpy/fft/_pocketfft.py +1693 -0
  593. numpy/fft/_pocketfft.pyi +137 -0
  594. numpy/fft/_pocketfft_umath.pypy311-pp73-darwin.so +0 -0
  595. numpy/fft/tests/__init__.py +0 -0
  596. numpy/fft/tests/test_helper.py +167 -0
  597. numpy/fft/tests/test_pocketfft.py +589 -0
  598. numpy/lib/__init__.py +97 -0
  599. numpy/lib/__init__.pyi +52 -0
  600. numpy/lib/_array_utils_impl.py +62 -0
  601. numpy/lib/_array_utils_impl.pyi +10 -0
  602. numpy/lib/_arraypad_impl.py +926 -0
  603. numpy/lib/_arraypad_impl.pyi +88 -0
  604. numpy/lib/_arraysetops_impl.py +1158 -0
  605. numpy/lib/_arraysetops_impl.pyi +462 -0
  606. numpy/lib/_arrayterator_impl.py +224 -0
  607. numpy/lib/_arrayterator_impl.pyi +45 -0
  608. numpy/lib/_datasource.py +700 -0
  609. numpy/lib/_datasource.pyi +30 -0
  610. numpy/lib/_format_impl.py +1036 -0
  611. numpy/lib/_format_impl.pyi +56 -0
  612. numpy/lib/_function_base_impl.py +5760 -0
  613. numpy/lib/_function_base_impl.pyi +2324 -0
  614. numpy/lib/_histograms_impl.py +1085 -0
  615. numpy/lib/_histograms_impl.pyi +40 -0
  616. numpy/lib/_index_tricks_impl.py +1048 -0
  617. numpy/lib/_index_tricks_impl.pyi +267 -0
  618. numpy/lib/_iotools.py +900 -0
  619. numpy/lib/_iotools.pyi +116 -0
  620. numpy/lib/_nanfunctions_impl.py +2006 -0
  621. numpy/lib/_nanfunctions_impl.pyi +48 -0
  622. numpy/lib/_npyio_impl.py +2583 -0
  623. numpy/lib/_npyio_impl.pyi +299 -0
  624. numpy/lib/_polynomial_impl.py +1465 -0
  625. numpy/lib/_polynomial_impl.pyi +338 -0
  626. numpy/lib/_scimath_impl.py +642 -0
  627. numpy/lib/_scimath_impl.pyi +93 -0
  628. numpy/lib/_shape_base_impl.py +1289 -0
  629. numpy/lib/_shape_base_impl.pyi +236 -0
  630. numpy/lib/_stride_tricks_impl.py +582 -0
  631. numpy/lib/_stride_tricks_impl.pyi +73 -0
  632. numpy/lib/_twodim_base_impl.py +1201 -0
  633. numpy/lib/_twodim_base_impl.pyi +408 -0
  634. numpy/lib/_type_check_impl.py +710 -0
  635. numpy/lib/_type_check_impl.pyi +348 -0
  636. numpy/lib/_ufunclike_impl.py +199 -0
  637. numpy/lib/_ufunclike_impl.pyi +60 -0
  638. numpy/lib/_user_array_impl.py +310 -0
  639. numpy/lib/_user_array_impl.pyi +226 -0
  640. numpy/lib/_utils_impl.py +784 -0
  641. numpy/lib/_utils_impl.pyi +22 -0
  642. numpy/lib/_version.py +153 -0
  643. numpy/lib/_version.pyi +17 -0
  644. numpy/lib/array_utils.py +7 -0
  645. numpy/lib/array_utils.pyi +6 -0
  646. numpy/lib/format.py +24 -0
  647. numpy/lib/format.pyi +24 -0
  648. numpy/lib/introspect.py +94 -0
  649. numpy/lib/introspect.pyi +3 -0
  650. numpy/lib/mixins.py +180 -0
  651. numpy/lib/mixins.pyi +78 -0
  652. numpy/lib/npyio.py +1 -0
  653. numpy/lib/npyio.pyi +5 -0
  654. numpy/lib/recfunctions.py +1681 -0
  655. numpy/lib/recfunctions.pyi +444 -0
  656. numpy/lib/scimath.py +13 -0
  657. numpy/lib/scimath.pyi +12 -0
  658. numpy/lib/stride_tricks.py +1 -0
  659. numpy/lib/stride_tricks.pyi +4 -0
  660. numpy/lib/tests/__init__.py +0 -0
  661. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  662. numpy/lib/tests/data/py2-objarr.npy +0 -0
  663. numpy/lib/tests/data/py2-objarr.npz +0 -0
  664. numpy/lib/tests/data/py3-objarr.npy +0 -0
  665. numpy/lib/tests/data/py3-objarr.npz +0 -0
  666. numpy/lib/tests/data/python3.npy +0 -0
  667. numpy/lib/tests/data/win64python2.npy +0 -0
  668. numpy/lib/tests/test__datasource.py +328 -0
  669. numpy/lib/tests/test__iotools.py +358 -0
  670. numpy/lib/tests/test__version.py +64 -0
  671. numpy/lib/tests/test_array_utils.py +32 -0
  672. numpy/lib/tests/test_arraypad.py +1427 -0
  673. numpy/lib/tests/test_arraysetops.py +1302 -0
  674. numpy/lib/tests/test_arrayterator.py +45 -0
  675. numpy/lib/tests/test_format.py +1054 -0
  676. numpy/lib/tests/test_function_base.py +4750 -0
  677. numpy/lib/tests/test_histograms.py +855 -0
  678. numpy/lib/tests/test_index_tricks.py +693 -0
  679. numpy/lib/tests/test_io.py +2857 -0
  680. numpy/lib/tests/test_loadtxt.py +1099 -0
  681. numpy/lib/tests/test_mixins.py +215 -0
  682. numpy/lib/tests/test_nanfunctions.py +1438 -0
  683. numpy/lib/tests/test_packbits.py +376 -0
  684. numpy/lib/tests/test_polynomial.py +325 -0
  685. numpy/lib/tests/test_recfunctions.py +1042 -0
  686. numpy/lib/tests/test_regression.py +231 -0
  687. numpy/lib/tests/test_shape_base.py +813 -0
  688. numpy/lib/tests/test_stride_tricks.py +655 -0
  689. numpy/lib/tests/test_twodim_base.py +559 -0
  690. numpy/lib/tests/test_type_check.py +473 -0
  691. numpy/lib/tests/test_ufunclike.py +97 -0
  692. numpy/lib/tests/test_utils.py +80 -0
  693. numpy/lib/user_array.py +1 -0
  694. numpy/lib/user_array.pyi +1 -0
  695. numpy/linalg/__init__.py +95 -0
  696. numpy/linalg/__init__.pyi +71 -0
  697. numpy/linalg/_linalg.py +3657 -0
  698. numpy/linalg/_linalg.pyi +548 -0
  699. numpy/linalg/_umath_linalg.pyi +60 -0
  700. numpy/linalg/_umath_linalg.pypy311-pp73-darwin.so +0 -0
  701. numpy/linalg/lapack_lite.pyi +143 -0
  702. numpy/linalg/lapack_lite.pypy311-pp73-darwin.so +0 -0
  703. numpy/linalg/tests/__init__.py +0 -0
  704. numpy/linalg/tests/test_deprecations.py +21 -0
  705. numpy/linalg/tests/test_linalg.py +2442 -0
  706. numpy/linalg/tests/test_regression.py +182 -0
  707. numpy/ma/API_CHANGES.txt +135 -0
  708. numpy/ma/LICENSE +24 -0
  709. numpy/ma/README.rst +236 -0
  710. numpy/ma/__init__.py +53 -0
  711. numpy/ma/__init__.pyi +458 -0
  712. numpy/ma/core.py +8929 -0
  713. numpy/ma/core.pyi +3720 -0
  714. numpy/ma/extras.py +2266 -0
  715. numpy/ma/extras.pyi +297 -0
  716. numpy/ma/mrecords.py +762 -0
  717. numpy/ma/mrecords.pyi +96 -0
  718. numpy/ma/tests/__init__.py +0 -0
  719. numpy/ma/tests/test_arrayobject.py +40 -0
  720. numpy/ma/tests/test_core.py +6008 -0
  721. numpy/ma/tests/test_deprecations.py +65 -0
  722. numpy/ma/tests/test_extras.py +1945 -0
  723. numpy/ma/tests/test_mrecords.py +495 -0
  724. numpy/ma/tests/test_old_ma.py +939 -0
  725. numpy/ma/tests/test_regression.py +83 -0
  726. numpy/ma/tests/test_subclassing.py +469 -0
  727. numpy/ma/testutils.py +294 -0
  728. numpy/ma/testutils.pyi +69 -0
  729. numpy/matlib.py +380 -0
  730. numpy/matlib.pyi +580 -0
  731. numpy/matrixlib/__init__.py +12 -0
  732. numpy/matrixlib/__init__.pyi +3 -0
  733. numpy/matrixlib/defmatrix.py +1119 -0
  734. numpy/matrixlib/defmatrix.pyi +218 -0
  735. numpy/matrixlib/tests/__init__.py +0 -0
  736. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  737. numpy/matrixlib/tests/test_interaction.py +360 -0
  738. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  739. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  740. numpy/matrixlib/tests/test_multiarray.py +17 -0
  741. numpy/matrixlib/tests/test_numeric.py +18 -0
  742. numpy/matrixlib/tests/test_regression.py +31 -0
  743. numpy/polynomial/__init__.py +187 -0
  744. numpy/polynomial/__init__.pyi +31 -0
  745. numpy/polynomial/_polybase.py +1191 -0
  746. numpy/polynomial/_polybase.pyi +262 -0
  747. numpy/polynomial/_polytypes.pyi +501 -0
  748. numpy/polynomial/chebyshev.py +2001 -0
  749. numpy/polynomial/chebyshev.pyi +180 -0
  750. numpy/polynomial/hermite.py +1738 -0
  751. numpy/polynomial/hermite.pyi +106 -0
  752. numpy/polynomial/hermite_e.py +1640 -0
  753. numpy/polynomial/hermite_e.pyi +106 -0
  754. numpy/polynomial/laguerre.py +1673 -0
  755. numpy/polynomial/laguerre.pyi +100 -0
  756. numpy/polynomial/legendre.py +1603 -0
  757. numpy/polynomial/legendre.pyi +100 -0
  758. numpy/polynomial/polynomial.py +1625 -0
  759. numpy/polynomial/polynomial.pyi +109 -0
  760. numpy/polynomial/polyutils.py +759 -0
  761. numpy/polynomial/polyutils.pyi +307 -0
  762. numpy/polynomial/tests/__init__.py +0 -0
  763. numpy/polynomial/tests/test_chebyshev.py +618 -0
  764. numpy/polynomial/tests/test_classes.py +613 -0
  765. numpy/polynomial/tests/test_hermite.py +553 -0
  766. numpy/polynomial/tests/test_hermite_e.py +554 -0
  767. numpy/polynomial/tests/test_laguerre.py +535 -0
  768. numpy/polynomial/tests/test_legendre.py +566 -0
  769. numpy/polynomial/tests/test_polynomial.py +691 -0
  770. numpy/polynomial/tests/test_polyutils.py +123 -0
  771. numpy/polynomial/tests/test_printing.py +557 -0
  772. numpy/polynomial/tests/test_symbol.py +217 -0
  773. numpy/py.typed +0 -0
  774. numpy/random/LICENSE.md +71 -0
  775. numpy/random/__init__.pxd +14 -0
  776. numpy/random/__init__.py +213 -0
  777. numpy/random/__init__.pyi +124 -0
  778. numpy/random/_bounded_integers.pxd +29 -0
  779. numpy/random/_bounded_integers.pyi +1 -0
  780. numpy/random/_bounded_integers.pypy311-pp73-darwin.so +0 -0
  781. numpy/random/_common.pxd +110 -0
  782. numpy/random/_common.pyi +16 -0
  783. numpy/random/_common.pypy311-pp73-darwin.so +0 -0
  784. numpy/random/_examples/cffi/extending.py +44 -0
  785. numpy/random/_examples/cffi/parse.py +53 -0
  786. numpy/random/_examples/cython/extending.pyx +77 -0
  787. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  788. numpy/random/_examples/cython/meson.build +53 -0
  789. numpy/random/_examples/numba/extending.py +86 -0
  790. numpy/random/_examples/numba/extending_distributions.py +67 -0
  791. numpy/random/_generator.pyi +862 -0
  792. numpy/random/_generator.pypy311-pp73-darwin.so +0 -0
  793. numpy/random/_mt19937.pyi +27 -0
  794. numpy/random/_mt19937.pypy311-pp73-darwin.so +0 -0
  795. numpy/random/_pcg64.pyi +41 -0
  796. numpy/random/_pcg64.pypy311-pp73-darwin.so +0 -0
  797. numpy/random/_philox.pyi +36 -0
  798. numpy/random/_philox.pypy311-pp73-darwin.so +0 -0
  799. numpy/random/_pickle.py +88 -0
  800. numpy/random/_pickle.pyi +43 -0
  801. numpy/random/_sfc64.pyi +25 -0
  802. numpy/random/_sfc64.pypy311-pp73-darwin.so +0 -0
  803. numpy/random/bit_generator.pxd +40 -0
  804. numpy/random/bit_generator.pyi +123 -0
  805. numpy/random/bit_generator.pypy311-pp73-darwin.so +0 -0
  806. numpy/random/c_distributions.pxd +119 -0
  807. numpy/random/lib/libnpyrandom.a +0 -0
  808. numpy/random/mtrand.pyi +759 -0
  809. numpy/random/mtrand.pypy311-pp73-darwin.so +0 -0
  810. numpy/random/tests/__init__.py +0 -0
  811. numpy/random/tests/data/__init__.py +0 -0
  812. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  813. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  814. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  815. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  816. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  817. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  818. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  819. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  820. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  821. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  822. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  823. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  824. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  825. numpy/random/tests/test_direct.py +595 -0
  826. numpy/random/tests/test_extending.py +131 -0
  827. numpy/random/tests/test_generator_mt19937.py +2825 -0
  828. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  829. numpy/random/tests/test_random.py +1724 -0
  830. numpy/random/tests/test_randomstate.py +2099 -0
  831. numpy/random/tests/test_randomstate_regression.py +213 -0
  832. numpy/random/tests/test_regression.py +175 -0
  833. numpy/random/tests/test_seed_sequence.py +79 -0
  834. numpy/random/tests/test_smoke.py +882 -0
  835. numpy/rec/__init__.py +2 -0
  836. numpy/rec/__init__.pyi +23 -0
  837. numpy/strings/__init__.py +2 -0
  838. numpy/strings/__init__.pyi +97 -0
  839. numpy/testing/__init__.py +22 -0
  840. numpy/testing/__init__.pyi +107 -0
  841. numpy/testing/_private/__init__.py +0 -0
  842. numpy/testing/_private/__init__.pyi +0 -0
  843. numpy/testing/_private/extbuild.py +250 -0
  844. numpy/testing/_private/extbuild.pyi +25 -0
  845. numpy/testing/_private/utils.py +2830 -0
  846. numpy/testing/_private/utils.pyi +505 -0
  847. numpy/testing/overrides.py +84 -0
  848. numpy/testing/overrides.pyi +10 -0
  849. numpy/testing/print_coercion_tables.py +207 -0
  850. numpy/testing/print_coercion_tables.pyi +26 -0
  851. numpy/testing/tests/__init__.py +0 -0
  852. numpy/testing/tests/test_utils.py +2123 -0
  853. numpy/tests/__init__.py +0 -0
  854. numpy/tests/test__all__.py +10 -0
  855. numpy/tests/test_configtool.py +51 -0
  856. numpy/tests/test_ctypeslib.py +383 -0
  857. numpy/tests/test_lazyloading.py +42 -0
  858. numpy/tests/test_matlib.py +59 -0
  859. numpy/tests/test_numpy_config.py +47 -0
  860. numpy/tests/test_numpy_version.py +54 -0
  861. numpy/tests/test_public_api.py +807 -0
  862. numpy/tests/test_reloading.py +76 -0
  863. numpy/tests/test_scripts.py +48 -0
  864. numpy/tests/test_warnings.py +79 -0
  865. numpy/typing/__init__.py +233 -0
  866. numpy/typing/__init__.pyi +3 -0
  867. numpy/typing/mypy_plugin.py +200 -0
  868. numpy/typing/tests/__init__.py +0 -0
  869. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  870. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  871. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  872. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  873. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  874. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  875. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  876. numpy/typing/tests/data/fail/char.pyi +63 -0
  877. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  878. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  879. numpy/typing/tests/data/fail/constants.pyi +3 -0
  880. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  881. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  882. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  883. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  884. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  885. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  886. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  887. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  888. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  889. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  890. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  891. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  892. numpy/typing/tests/data/fail/ma.pyi +155 -0
  893. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  894. numpy/typing/tests/data/fail/modules.pyi +17 -0
  895. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  896. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  897. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  898. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  899. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  900. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  901. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  902. numpy/typing/tests/data/fail/random.pyi +62 -0
  903. numpy/typing/tests/data/fail/rec.pyi +17 -0
  904. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  905. numpy/typing/tests/data/fail/shape.pyi +7 -0
  906. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  907. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  908. numpy/typing/tests/data/fail/strings.pyi +52 -0
  909. numpy/typing/tests/data/fail/testing.pyi +28 -0
  910. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  911. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  912. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  913. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  914. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  915. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  916. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  917. numpy/typing/tests/data/mypy.ini +8 -0
  918. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  919. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  920. numpy/typing/tests/data/pass/array_like.py +43 -0
  921. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  922. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  923. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  924. numpy/typing/tests/data/pass/comparisons.py +316 -0
  925. numpy/typing/tests/data/pass/dtype.py +57 -0
  926. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  927. numpy/typing/tests/data/pass/flatiter.py +26 -0
  928. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  929. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  930. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  931. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  932. numpy/typing/tests/data/pass/lib_version.py +18 -0
  933. numpy/typing/tests/data/pass/literal.py +52 -0
  934. numpy/typing/tests/data/pass/ma.py +199 -0
  935. numpy/typing/tests/data/pass/mod.py +149 -0
  936. numpy/typing/tests/data/pass/modules.py +45 -0
  937. numpy/typing/tests/data/pass/multiarray.py +77 -0
  938. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  939. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  940. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  941. numpy/typing/tests/data/pass/nditer.py +4 -0
  942. numpy/typing/tests/data/pass/numeric.py +90 -0
  943. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  944. numpy/typing/tests/data/pass/random.py +1498 -0
  945. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  946. numpy/typing/tests/data/pass/scalars.py +249 -0
  947. numpy/typing/tests/data/pass/shape.py +19 -0
  948. numpy/typing/tests/data/pass/simple.py +170 -0
  949. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  950. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  951. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  952. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  953. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  954. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  955. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  956. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  957. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  958. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  959. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  960. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  961. numpy/typing/tests/data/reveal/char.pyi +225 -0
  962. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  963. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  964. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  965. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  966. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  967. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  968. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  969. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  970. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  971. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  972. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  973. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  974. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  975. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  976. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  977. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  978. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  979. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  980. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  981. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  982. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  983. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  984. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  985. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  986. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  987. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  988. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  989. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  990. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  991. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  992. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  993. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  994. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  995. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  996. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  997. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  998. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  999. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  1000. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  1001. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  1002. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  1003. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  1004. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  1005. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  1006. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  1007. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  1008. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  1009. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  1010. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  1011. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  1012. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  1013. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  1014. numpy/typing/tests/test_isfile.py +38 -0
  1015. numpy/typing/tests/test_runtime.py +110 -0
  1016. numpy/typing/tests/test_typing.py +205 -0
  1017. numpy/version.py +11 -0
  1018. numpy/version.pyi +9 -0
  1019. numpy-2.4.1.dist-info/METADATA +139 -0
  1020. numpy-2.4.1.dist-info/RECORD +1039 -0
  1021. numpy-2.4.1.dist-info/WHEEL +6 -0
  1022. numpy-2.4.1.dist-info/entry_points.txt +13 -0
  1023. numpy-2.4.1.dist-info/licenses/LICENSE.txt +935 -0
  1024. numpy-2.4.1.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  1025. numpy-2.4.1.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  1026. numpy-2.4.1.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  1027. numpy-2.4.1.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  1028. numpy-2.4.1.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  1029. numpy-2.4.1.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  1030. numpy-2.4.1.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  1031. numpy-2.4.1.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  1032. numpy-2.4.1.dist-info/licenses/numpy/ma/LICENSE +24 -0
  1033. numpy-2.4.1.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  1034. numpy-2.4.1.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  1035. numpy-2.4.1.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  1036. numpy-2.4.1.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  1037. numpy-2.4.1.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  1038. numpy-2.4.1.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  1039. numpy-2.4.1.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
@@ -0,0 +1,1603 @@
1
+ """
2
+ ==================================================
3
+ Legendre Series (:mod:`numpy.polynomial.legendre`)
4
+ ==================================================
5
+
6
+ This module provides a number of objects (mostly functions) useful for
7
+ dealing with Legendre series, including a `Legendre` class that
8
+ encapsulates the usual arithmetic operations. (General information
9
+ on how this module represents and works with such polynomials is in the
10
+ docstring for its "parent" sub-package, `numpy.polynomial`).
11
+
12
+ Classes
13
+ -------
14
+ .. autosummary::
15
+ :toctree: generated/
16
+
17
+ Legendre
18
+
19
+ Constants
20
+ ---------
21
+
22
+ .. autosummary::
23
+ :toctree: generated/
24
+
25
+ legdomain
26
+ legzero
27
+ legone
28
+ legx
29
+
30
+ Arithmetic
31
+ ----------
32
+
33
+ .. autosummary::
34
+ :toctree: generated/
35
+
36
+ legadd
37
+ legsub
38
+ legmulx
39
+ legmul
40
+ legdiv
41
+ legpow
42
+ legval
43
+ legval2d
44
+ legval3d
45
+ leggrid2d
46
+ leggrid3d
47
+
48
+ Calculus
49
+ --------
50
+
51
+ .. autosummary::
52
+ :toctree: generated/
53
+
54
+ legder
55
+ legint
56
+
57
+ Misc Functions
58
+ --------------
59
+
60
+ .. autosummary::
61
+ :toctree: generated/
62
+
63
+ legfromroots
64
+ legroots
65
+ legvander
66
+ legvander2d
67
+ legvander3d
68
+ leggauss
69
+ legweight
70
+ legcompanion
71
+ legfit
72
+ legtrim
73
+ legline
74
+ leg2poly
75
+ poly2leg
76
+
77
+ See also
78
+ --------
79
+ numpy.polynomial
80
+
81
+ """
82
+ import numpy as np
83
+
84
+ from . import polyutils as pu
85
+ from ._polybase import ABCPolyBase
86
+
87
+ __all__ = [
88
+ 'legzero', 'legone', 'legx', 'legdomain', 'legline', 'legadd',
89
+ 'legsub', 'legmulx', 'legmul', 'legdiv', 'legpow', 'legval', 'legder',
90
+ 'legint', 'leg2poly', 'poly2leg', 'legfromroots', 'legvander',
91
+ 'legfit', 'legtrim', 'legroots', 'Legendre', 'legval2d', 'legval3d',
92
+ 'leggrid2d', 'leggrid3d', 'legvander2d', 'legvander3d', 'legcompanion',
93
+ 'leggauss', 'legweight']
94
+
95
+ legtrim = pu.trimcoef
96
+
97
+
98
+ def poly2leg(pol):
99
+ """
100
+ Convert a polynomial to a Legendre series.
101
+
102
+ Convert an array representing the coefficients of a polynomial (relative
103
+ to the "standard" basis) ordered from lowest degree to highest, to an
104
+ array of the coefficients of the equivalent Legendre series, ordered
105
+ from lowest to highest degree.
106
+
107
+ Parameters
108
+ ----------
109
+ pol : array_like
110
+ 1-D array containing the polynomial coefficients
111
+
112
+ Returns
113
+ -------
114
+ c : ndarray
115
+ 1-D array containing the coefficients of the equivalent Legendre
116
+ series.
117
+
118
+ See Also
119
+ --------
120
+ leg2poly
121
+
122
+ Notes
123
+ -----
124
+ The easy way to do conversions between polynomial basis sets
125
+ is to use the convert method of a class instance.
126
+
127
+ Examples
128
+ --------
129
+ >>> import numpy as np
130
+ >>> from numpy import polynomial as P
131
+ >>> p = P.Polynomial(np.arange(4))
132
+ >>> p
133
+ Polynomial([0., 1., 2., 3.], domain=[-1., 1.], window=[-1., 1.], ...
134
+ >>> c = P.Legendre(P.legendre.poly2leg(p.coef))
135
+ >>> c
136
+ Legendre([ 1. , 3.25, 1. , 0.75], domain=[-1, 1], window=[-1, 1]) # may vary
137
+
138
+ """
139
+ [pol] = pu.as_series([pol])
140
+ deg = len(pol) - 1
141
+ res = 0
142
+ for i in range(deg, -1, -1):
143
+ res = legadd(legmulx(res), pol[i])
144
+ return res
145
+
146
+
147
+ def leg2poly(c):
148
+ """
149
+ Convert a Legendre series to a polynomial.
150
+
151
+ Convert an array representing the coefficients of a Legendre series,
152
+ ordered from lowest degree to highest, to an array of the coefficients
153
+ of the equivalent polynomial (relative to the "standard" basis) ordered
154
+ from lowest to highest degree.
155
+
156
+ Parameters
157
+ ----------
158
+ c : array_like
159
+ 1-D array containing the Legendre series coefficients, ordered
160
+ from lowest order term to highest.
161
+
162
+ Returns
163
+ -------
164
+ pol : ndarray
165
+ 1-D array containing the coefficients of the equivalent polynomial
166
+ (relative to the "standard" basis) ordered from lowest order term
167
+ to highest.
168
+
169
+ See Also
170
+ --------
171
+ poly2leg
172
+
173
+ Notes
174
+ -----
175
+ The easy way to do conversions between polynomial basis sets
176
+ is to use the convert method of a class instance.
177
+
178
+ Examples
179
+ --------
180
+ >>> from numpy import polynomial as P
181
+ >>> c = P.Legendre(range(4))
182
+ >>> c
183
+ Legendre([0., 1., 2., 3.], domain=[-1., 1.], window=[-1., 1.], symbol='x')
184
+ >>> p = c.convert(kind=P.Polynomial)
185
+ >>> p
186
+ Polynomial([-1. , -3.5, 3. , 7.5], domain=[-1., 1.], window=[-1., ...
187
+ >>> P.legendre.leg2poly(range(4))
188
+ array([-1. , -3.5, 3. , 7.5])
189
+
190
+
191
+ """
192
+ from .polynomial import polyadd, polymulx, polysub
193
+
194
+ [c] = pu.as_series([c])
195
+ n = len(c)
196
+ if n < 3:
197
+ return c
198
+ else:
199
+ c0 = c[-2]
200
+ c1 = c[-1]
201
+ # i is the current degree of c1
202
+ for i in range(n - 1, 1, -1):
203
+ tmp = c0
204
+ c0 = polysub(c[i - 2], (c1 * (i - 1)) / i)
205
+ c1 = polyadd(tmp, (polymulx(c1) * (2 * i - 1)) / i)
206
+ return polyadd(c0, polymulx(c1))
207
+
208
+
209
+ #
210
+ # These are constant arrays are of integer type so as to be compatible
211
+ # with the widest range of other types, such as Decimal.
212
+ #
213
+
214
+ # Legendre
215
+ legdomain = np.array([-1., 1.])
216
+
217
+ # Legendre coefficients representing zero.
218
+ legzero = np.array([0])
219
+
220
+ # Legendre coefficients representing one.
221
+ legone = np.array([1])
222
+
223
+ # Legendre coefficients representing the identity x.
224
+ legx = np.array([0, 1])
225
+
226
+
227
+ def legline(off, scl):
228
+ """
229
+ Legendre series whose graph is a straight line.
230
+
231
+
232
+
233
+ Parameters
234
+ ----------
235
+ off, scl : scalars
236
+ The specified line is given by ``off + scl*x``.
237
+
238
+ Returns
239
+ -------
240
+ y : ndarray
241
+ This module's representation of the Legendre series for
242
+ ``off + scl*x``.
243
+
244
+ See Also
245
+ --------
246
+ numpy.polynomial.polynomial.polyline
247
+ numpy.polynomial.chebyshev.chebline
248
+ numpy.polynomial.laguerre.lagline
249
+ numpy.polynomial.hermite.hermline
250
+ numpy.polynomial.hermite_e.hermeline
251
+
252
+ Examples
253
+ --------
254
+ >>> import numpy.polynomial.legendre as L
255
+ >>> L.legline(3,2)
256
+ array([3, 2])
257
+ >>> L.legval(-3, L.legline(3,2)) # should be -3
258
+ -3.0
259
+
260
+ """
261
+ if scl != 0:
262
+ return np.array([off, scl])
263
+ else:
264
+ return np.array([off])
265
+
266
+
267
+ def legfromroots(roots):
268
+ """
269
+ Generate a Legendre series with given roots.
270
+
271
+ The function returns the coefficients of the polynomial
272
+
273
+ .. math:: p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),
274
+
275
+ in Legendre form, where the :math:`r_n` are the roots specified in `roots`.
276
+ If a zero has multiplicity n, then it must appear in `roots` n times.
277
+ For instance, if 2 is a root of multiplicity three and 3 is a root of
278
+ multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3]. The
279
+ roots can appear in any order.
280
+
281
+ If the returned coefficients are `c`, then
282
+
283
+ .. math:: p(x) = c_0 + c_1 * L_1(x) + ... + c_n * L_n(x)
284
+
285
+ The coefficient of the last term is not generally 1 for monic
286
+ polynomials in Legendre form.
287
+
288
+ Parameters
289
+ ----------
290
+ roots : array_like
291
+ Sequence containing the roots.
292
+
293
+ Returns
294
+ -------
295
+ out : ndarray
296
+ 1-D array of coefficients. If all roots are real then `out` is a
297
+ real array, if some of the roots are complex, then `out` is complex
298
+ even if all the coefficients in the result are real (see Examples
299
+ below).
300
+
301
+ See Also
302
+ --------
303
+ numpy.polynomial.polynomial.polyfromroots
304
+ numpy.polynomial.chebyshev.chebfromroots
305
+ numpy.polynomial.laguerre.lagfromroots
306
+ numpy.polynomial.hermite.hermfromroots
307
+ numpy.polynomial.hermite_e.hermefromroots
308
+
309
+ Examples
310
+ --------
311
+ >>> import numpy.polynomial.legendre as L
312
+ >>> L.legfromroots((-1,0,1)) # x^3 - x relative to the standard basis
313
+ array([ 0. , -0.4, 0. , 0.4])
314
+ >>> j = complex(0,1)
315
+ >>> L.legfromroots((-j,j)) # x^2 + 1 relative to the standard basis
316
+ array([ 1.33333333+0.j, 0.00000000+0.j, 0.66666667+0.j]) # may vary
317
+
318
+ """
319
+ return pu._fromroots(legline, legmul, roots)
320
+
321
+
322
+ def legadd(c1, c2):
323
+ """
324
+ Add one Legendre series to another.
325
+
326
+ Returns the sum of two Legendre series `c1` + `c2`. The arguments
327
+ are sequences of coefficients ordered from lowest order term to
328
+ highest, i.e., [1,2,3] represents the series ``P_0 + 2*P_1 + 3*P_2``.
329
+
330
+ Parameters
331
+ ----------
332
+ c1, c2 : array_like
333
+ 1-D arrays of Legendre series coefficients ordered from low to
334
+ high.
335
+
336
+ Returns
337
+ -------
338
+ out : ndarray
339
+ Array representing the Legendre series of their sum.
340
+
341
+ See Also
342
+ --------
343
+ legsub, legmulx, legmul, legdiv, legpow
344
+
345
+ Notes
346
+ -----
347
+ Unlike multiplication, division, etc., the sum of two Legendre series
348
+ is a Legendre series (without having to "reproject" the result onto
349
+ the basis set) so addition, just like that of "standard" polynomials,
350
+ is simply "component-wise."
351
+
352
+ Examples
353
+ --------
354
+ >>> from numpy.polynomial import legendre as L
355
+ >>> c1 = (1,2,3)
356
+ >>> c2 = (3,2,1)
357
+ >>> L.legadd(c1,c2)
358
+ array([4., 4., 4.])
359
+
360
+ """
361
+ return pu._add(c1, c2)
362
+
363
+
364
+ def legsub(c1, c2):
365
+ """
366
+ Subtract one Legendre series from another.
367
+
368
+ Returns the difference of two Legendre series `c1` - `c2`. The
369
+ sequences of coefficients are from lowest order term to highest, i.e.,
370
+ [1,2,3] represents the series ``P_0 + 2*P_1 + 3*P_2``.
371
+
372
+ Parameters
373
+ ----------
374
+ c1, c2 : array_like
375
+ 1-D arrays of Legendre series coefficients ordered from low to
376
+ high.
377
+
378
+ Returns
379
+ -------
380
+ out : ndarray
381
+ Of Legendre series coefficients representing their difference.
382
+
383
+ See Also
384
+ --------
385
+ legadd, legmulx, legmul, legdiv, legpow
386
+
387
+ Notes
388
+ -----
389
+ Unlike multiplication, division, etc., the difference of two Legendre
390
+ series is a Legendre series (without having to "reproject" the result
391
+ onto the basis set) so subtraction, just like that of "standard"
392
+ polynomials, is simply "component-wise."
393
+
394
+ Examples
395
+ --------
396
+ >>> from numpy.polynomial import legendre as L
397
+ >>> c1 = (1,2,3)
398
+ >>> c2 = (3,2,1)
399
+ >>> L.legsub(c1,c2)
400
+ array([-2., 0., 2.])
401
+ >>> L.legsub(c2,c1) # -C.legsub(c1,c2)
402
+ array([ 2., 0., -2.])
403
+
404
+ """
405
+ return pu._sub(c1, c2)
406
+
407
+
408
+ def legmulx(c):
409
+ """Multiply a Legendre series by x.
410
+
411
+ Multiply the Legendre series `c` by x, where x is the independent
412
+ variable.
413
+
414
+
415
+ Parameters
416
+ ----------
417
+ c : array_like
418
+ 1-D array of Legendre series coefficients ordered from low to
419
+ high.
420
+
421
+ Returns
422
+ -------
423
+ out : ndarray
424
+ Array representing the result of the multiplication.
425
+
426
+ See Also
427
+ --------
428
+ legadd, legsub, legmul, legdiv, legpow
429
+
430
+ Notes
431
+ -----
432
+ The multiplication uses the recursion relationship for Legendre
433
+ polynomials in the form
434
+
435
+ .. math::
436
+
437
+ xP_i(x) = ((i + 1)*P_{i + 1}(x) + i*P_{i - 1}(x))/(2i + 1)
438
+
439
+ Examples
440
+ --------
441
+ >>> from numpy.polynomial import legendre as L
442
+ >>> L.legmulx([1,2,3])
443
+ array([ 0.66666667, 2.2, 1.33333333, 1.8]) # may vary
444
+
445
+ """
446
+ # c is a trimmed copy
447
+ [c] = pu.as_series([c])
448
+ # The zero series needs special treatment
449
+ if len(c) == 1 and c[0] == 0:
450
+ return c
451
+
452
+ prd = np.empty(len(c) + 1, dtype=c.dtype)
453
+ prd[0] = c[0] * 0
454
+ prd[1] = c[0]
455
+ for i in range(1, len(c)):
456
+ j = i + 1
457
+ k = i - 1
458
+ s = i + j
459
+ prd[j] = (c[i] * j) / s
460
+ prd[k] += (c[i] * i) / s
461
+ return prd
462
+
463
+
464
+ def legmul(c1, c2):
465
+ """
466
+ Multiply one Legendre series by another.
467
+
468
+ Returns the product of two Legendre series `c1` * `c2`. The arguments
469
+ are sequences of coefficients, from lowest order "term" to highest,
470
+ e.g., [1,2,3] represents the series ``P_0 + 2*P_1 + 3*P_2``.
471
+
472
+ Parameters
473
+ ----------
474
+ c1, c2 : array_like
475
+ 1-D arrays of Legendre series coefficients ordered from low to
476
+ high.
477
+
478
+ Returns
479
+ -------
480
+ out : ndarray
481
+ Of Legendre series coefficients representing their product.
482
+
483
+ See Also
484
+ --------
485
+ legadd, legsub, legmulx, legdiv, legpow
486
+
487
+ Notes
488
+ -----
489
+ In general, the (polynomial) product of two C-series results in terms
490
+ that are not in the Legendre polynomial basis set. Thus, to express
491
+ the product as a Legendre series, it is necessary to "reproject" the
492
+ product onto said basis set, which may produce "unintuitive" (but
493
+ correct) results; see Examples section below.
494
+
495
+ Examples
496
+ --------
497
+ >>> from numpy.polynomial import legendre as L
498
+ >>> c1 = (1,2,3)
499
+ >>> c2 = (3,2)
500
+ >>> L.legmul(c1,c2) # multiplication requires "reprojection"
501
+ array([ 4.33333333, 10.4 , 11.66666667, 3.6 ]) # may vary
502
+
503
+ """
504
+ # s1, s2 are trimmed copies
505
+ [c1, c2] = pu.as_series([c1, c2])
506
+
507
+ if len(c1) > len(c2):
508
+ c = c2
509
+ xs = c1
510
+ else:
511
+ c = c1
512
+ xs = c2
513
+
514
+ if len(c) == 1:
515
+ c0 = c[0] * xs
516
+ c1 = 0
517
+ elif len(c) == 2:
518
+ c0 = c[0] * xs
519
+ c1 = c[1] * xs
520
+ else:
521
+ nd = len(c)
522
+ c0 = c[-2] * xs
523
+ c1 = c[-1] * xs
524
+ for i in range(3, len(c) + 1):
525
+ tmp = c0
526
+ nd = nd - 1
527
+ c0 = legsub(c[-i] * xs, (c1 * (nd - 1)) / nd)
528
+ c1 = legadd(tmp, (legmulx(c1) * (2 * nd - 1)) / nd)
529
+ return legadd(c0, legmulx(c1))
530
+
531
+
532
+ def legdiv(c1, c2):
533
+ """
534
+ Divide one Legendre series by another.
535
+
536
+ Returns the quotient-with-remainder of two Legendre series
537
+ `c1` / `c2`. The arguments are sequences of coefficients from lowest
538
+ order "term" to highest, e.g., [1,2,3] represents the series
539
+ ``P_0 + 2*P_1 + 3*P_2``.
540
+
541
+ Parameters
542
+ ----------
543
+ c1, c2 : array_like
544
+ 1-D arrays of Legendre series coefficients ordered from low to
545
+ high.
546
+
547
+ Returns
548
+ -------
549
+ quo, rem : ndarrays
550
+ Of Legendre series coefficients representing the quotient and
551
+ remainder.
552
+
553
+ See Also
554
+ --------
555
+ legadd, legsub, legmulx, legmul, legpow
556
+
557
+ Notes
558
+ -----
559
+ In general, the (polynomial) division of one Legendre series by another
560
+ results in quotient and remainder terms that are not in the Legendre
561
+ polynomial basis set. Thus, to express these results as a Legendre
562
+ series, it is necessary to "reproject" the results onto the Legendre
563
+ basis set, which may produce "unintuitive" (but correct) results; see
564
+ Examples section below.
565
+
566
+ Examples
567
+ --------
568
+ >>> from numpy.polynomial import legendre as L
569
+ >>> c1 = (1,2,3)
570
+ >>> c2 = (3,2,1)
571
+ >>> L.legdiv(c1,c2) # quotient "intuitive," remainder not
572
+ (array([3.]), array([-8., -4.]))
573
+ >>> c2 = (0,1,2,3)
574
+ >>> L.legdiv(c2,c1) # neither "intuitive"
575
+ (array([-0.07407407, 1.66666667]), array([-1.03703704, -2.51851852])) # may vary
576
+
577
+ """
578
+ return pu._div(legmul, c1, c2)
579
+
580
+
581
+ def legpow(c, pow, maxpower=16):
582
+ """Raise a Legendre series to a power.
583
+
584
+ Returns the Legendre series `c` raised to the power `pow`. The
585
+ argument `c` is a sequence of coefficients ordered from low to high.
586
+ i.e., [1,2,3] is the series ``P_0 + 2*P_1 + 3*P_2.``
587
+
588
+ Parameters
589
+ ----------
590
+ c : array_like
591
+ 1-D array of Legendre series coefficients ordered from low to
592
+ high.
593
+ pow : integer
594
+ Power to which the series will be raised
595
+ maxpower : integer, optional
596
+ Maximum power allowed. This is mainly to limit growth of the series
597
+ to unmanageable size. Default is 16
598
+
599
+ Returns
600
+ -------
601
+ coef : ndarray
602
+ Legendre series of power.
603
+
604
+ See Also
605
+ --------
606
+ legadd, legsub, legmulx, legmul, legdiv
607
+
608
+ """
609
+ return pu._pow(legmul, c, pow, maxpower)
610
+
611
+
612
+ def legder(c, m=1, scl=1, axis=0):
613
+ """
614
+ Differentiate a Legendre series.
615
+
616
+ Returns the Legendre series coefficients `c` differentiated `m` times
617
+ along `axis`. At each iteration the result is multiplied by `scl` (the
618
+ scaling factor is for use in a linear change of variable). The argument
619
+ `c` is an array of coefficients from low to high degree along each
620
+ axis, e.g., [1,2,3] represents the series ``1*L_0 + 2*L_1 + 3*L_2``
621
+ while [[1,2],[1,2]] represents ``1*L_0(x)*L_0(y) + 1*L_1(x)*L_0(y) +
622
+ 2*L_0(x)*L_1(y) + 2*L_1(x)*L_1(y)`` if axis=0 is ``x`` and axis=1 is
623
+ ``y``.
624
+
625
+ Parameters
626
+ ----------
627
+ c : array_like
628
+ Array of Legendre series coefficients. If c is multidimensional the
629
+ different axis correspond to different variables with the degree in
630
+ each axis given by the corresponding index.
631
+ m : int, optional
632
+ Number of derivatives taken, must be non-negative. (Default: 1)
633
+ scl : scalar, optional
634
+ Each differentiation is multiplied by `scl`. The end result is
635
+ multiplication by ``scl**m``. This is for use in a linear change of
636
+ variable. (Default: 1)
637
+ axis : int, optional
638
+ Axis over which the derivative is taken. (Default: 0).
639
+
640
+ Returns
641
+ -------
642
+ der : ndarray
643
+ Legendre series of the derivative.
644
+
645
+ See Also
646
+ --------
647
+ legint
648
+
649
+ Notes
650
+ -----
651
+ In general, the result of differentiating a Legendre series does not
652
+ resemble the same operation on a power series. Thus the result of this
653
+ function may be "unintuitive," albeit correct; see Examples section
654
+ below.
655
+
656
+ Examples
657
+ --------
658
+ >>> from numpy.polynomial import legendre as L
659
+ >>> c = (1,2,3,4)
660
+ >>> L.legder(c)
661
+ array([ 6., 9., 20.])
662
+ >>> L.legder(c, 3)
663
+ array([60.])
664
+ >>> L.legder(c, scl=-1)
665
+ array([ -6., -9., -20.])
666
+ >>> L.legder(c, 2,-1)
667
+ array([ 9., 60.])
668
+
669
+ """
670
+ c = np.array(c, ndmin=1, copy=True)
671
+ if c.dtype.char in '?bBhHiIlLqQpP':
672
+ c = c.astype(np.double)
673
+ cnt = pu._as_int(m, "the order of derivation")
674
+ iaxis = pu._as_int(axis, "the axis")
675
+ if cnt < 0:
676
+ raise ValueError("The order of derivation must be non-negative")
677
+ iaxis = np.lib.array_utils.normalize_axis_index(iaxis, c.ndim)
678
+
679
+ if cnt == 0:
680
+ return c
681
+
682
+ c = np.moveaxis(c, iaxis, 0)
683
+ n = len(c)
684
+ if cnt >= n:
685
+ c = c[:1] * 0
686
+ else:
687
+ for i in range(cnt):
688
+ n = n - 1
689
+ c *= scl
690
+ der = np.empty((n,) + c.shape[1:], dtype=c.dtype)
691
+ for j in range(n, 2, -1):
692
+ der[j - 1] = (2 * j - 1) * c[j]
693
+ c[j - 2] += c[j]
694
+ if n > 1:
695
+ der[1] = 3 * c[2]
696
+ der[0] = c[1]
697
+ c = der
698
+ c = np.moveaxis(c, 0, iaxis)
699
+ return c
700
+
701
+
702
+ def legint(c, m=1, k=[], lbnd=0, scl=1, axis=0):
703
+ """
704
+ Integrate a Legendre series.
705
+
706
+ Returns the Legendre series coefficients `c` integrated `m` times from
707
+ `lbnd` along `axis`. At each iteration the resulting series is
708
+ **multiplied** by `scl` and an integration constant, `k`, is added.
709
+ The scaling factor is for use in a linear change of variable. ("Buyer
710
+ beware": note that, depending on what one is doing, one may want `scl`
711
+ to be the reciprocal of what one might expect; for more information,
712
+ see the Notes section below.) The argument `c` is an array of
713
+ coefficients from low to high degree along each axis, e.g., [1,2,3]
714
+ represents the series ``L_0 + 2*L_1 + 3*L_2`` while [[1,2],[1,2]]
715
+ represents ``1*L_0(x)*L_0(y) + 1*L_1(x)*L_0(y) + 2*L_0(x)*L_1(y) +
716
+ 2*L_1(x)*L_1(y)`` if axis=0 is ``x`` and axis=1 is ``y``.
717
+
718
+ Parameters
719
+ ----------
720
+ c : array_like
721
+ Array of Legendre series coefficients. If c is multidimensional the
722
+ different axis correspond to different variables with the degree in
723
+ each axis given by the corresponding index.
724
+ m : int, optional
725
+ Order of integration, must be positive. (Default: 1)
726
+ k : {[], list, scalar}, optional
727
+ Integration constant(s). The value of the first integral at
728
+ ``lbnd`` is the first value in the list, the value of the second
729
+ integral at ``lbnd`` is the second value, etc. If ``k == []`` (the
730
+ default), all constants are set to zero. If ``m == 1``, a single
731
+ scalar can be given instead of a list.
732
+ lbnd : scalar, optional
733
+ The lower bound of the integral. (Default: 0)
734
+ scl : scalar, optional
735
+ Following each integration the result is *multiplied* by `scl`
736
+ before the integration constant is added. (Default: 1)
737
+ axis : int, optional
738
+ Axis over which the integral is taken. (Default: 0).
739
+
740
+ Returns
741
+ -------
742
+ S : ndarray
743
+ Legendre series coefficient array of the integral.
744
+
745
+ Raises
746
+ ------
747
+ ValueError
748
+ If ``m < 0``, ``len(k) > m``, ``np.ndim(lbnd) != 0``, or
749
+ ``np.ndim(scl) != 0``.
750
+
751
+ See Also
752
+ --------
753
+ legder
754
+
755
+ Notes
756
+ -----
757
+ Note that the result of each integration is *multiplied* by `scl`.
758
+ Why is this important to note? Say one is making a linear change of
759
+ variable :math:`u = ax + b` in an integral relative to `x`. Then
760
+ :math:`dx = du/a`, so one will need to set `scl` equal to
761
+ :math:`1/a` - perhaps not what one would have first thought.
762
+
763
+ Also note that, in general, the result of integrating a C-series needs
764
+ to be "reprojected" onto the C-series basis set. Thus, typically,
765
+ the result of this function is "unintuitive," albeit correct; see
766
+ Examples section below.
767
+
768
+ Examples
769
+ --------
770
+ >>> from numpy.polynomial import legendre as L
771
+ >>> c = (1,2,3)
772
+ >>> L.legint(c)
773
+ array([ 0.33333333, 0.4 , 0.66666667, 0.6 ]) # may vary
774
+ >>> L.legint(c, 3)
775
+ array([ 1.66666667e-02, -1.78571429e-02, 4.76190476e-02, # may vary
776
+ -1.73472348e-18, 1.90476190e-02, 9.52380952e-03])
777
+ >>> L.legint(c, k=3)
778
+ array([ 3.33333333, 0.4 , 0.66666667, 0.6 ]) # may vary
779
+ >>> L.legint(c, lbnd=-2)
780
+ array([ 7.33333333, 0.4 , 0.66666667, 0.6 ]) # may vary
781
+ >>> L.legint(c, scl=2)
782
+ array([ 0.66666667, 0.8 , 1.33333333, 1.2 ]) # may vary
783
+
784
+ """
785
+ c = np.array(c, ndmin=1, copy=True)
786
+ if c.dtype.char in '?bBhHiIlLqQpP':
787
+ c = c.astype(np.double)
788
+ if not np.iterable(k):
789
+ k = [k]
790
+ cnt = pu._as_int(m, "the order of integration")
791
+ iaxis = pu._as_int(axis, "the axis")
792
+ if cnt < 0:
793
+ raise ValueError("The order of integration must be non-negative")
794
+ if len(k) > cnt:
795
+ raise ValueError("Too many integration constants")
796
+ if np.ndim(lbnd) != 0:
797
+ raise ValueError("lbnd must be a scalar.")
798
+ if np.ndim(scl) != 0:
799
+ raise ValueError("scl must be a scalar.")
800
+ iaxis = np.lib.array_utils.normalize_axis_index(iaxis, c.ndim)
801
+
802
+ if cnt == 0:
803
+ return c
804
+
805
+ c = np.moveaxis(c, iaxis, 0)
806
+ k = list(k) + [0] * (cnt - len(k))
807
+ for i in range(cnt):
808
+ n = len(c)
809
+ c *= scl
810
+ if n == 1 and np.all(c[0] == 0):
811
+ c[0] += k[i]
812
+ else:
813
+ tmp = np.empty((n + 1,) + c.shape[1:], dtype=c.dtype)
814
+ tmp[0] = c[0] * 0
815
+ tmp[1] = c[0]
816
+ if n > 1:
817
+ tmp[2] = c[1] / 3
818
+ for j in range(2, n):
819
+ t = c[j] / (2 * j + 1)
820
+ tmp[j + 1] = t
821
+ tmp[j - 1] -= t
822
+ tmp[0] += k[i] - legval(lbnd, tmp)
823
+ c = tmp
824
+ c = np.moveaxis(c, 0, iaxis)
825
+ return c
826
+
827
+
828
+ def legval(x, c, tensor=True):
829
+ """
830
+ Evaluate a Legendre series at points x.
831
+
832
+ If `c` is of length ``n + 1``, this function returns the value:
833
+
834
+ .. math:: p(x) = c_0 * L_0(x) + c_1 * L_1(x) + ... + c_n * L_n(x)
835
+
836
+ The parameter `x` is converted to an array only if it is a tuple or a
837
+ list, otherwise it is treated as a scalar. In either case, either `x`
838
+ or its elements must support multiplication and addition both with
839
+ themselves and with the elements of `c`.
840
+
841
+ If `c` is a 1-D array, then ``p(x)`` will have the same shape as `x`. If
842
+ `c` is multidimensional, then the shape of the result depends on the
843
+ value of `tensor`. If `tensor` is true the shape will be c.shape[1:] +
844
+ x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that
845
+ scalars have shape (,).
846
+
847
+ Trailing zeros in the coefficients will be used in the evaluation, so
848
+ they should be avoided if efficiency is a concern.
849
+
850
+ Parameters
851
+ ----------
852
+ x : array_like, compatible object
853
+ If `x` is a list or tuple, it is converted to an ndarray, otherwise
854
+ it is left unchanged and treated as a scalar. In either case, `x`
855
+ or its elements must support addition and multiplication with
856
+ themselves and with the elements of `c`.
857
+ c : array_like
858
+ Array of coefficients ordered so that the coefficients for terms of
859
+ degree n are contained in c[n]. If `c` is multidimensional the
860
+ remaining indices enumerate multiple polynomials. In the two
861
+ dimensional case the coefficients may be thought of as stored in
862
+ the columns of `c`.
863
+ tensor : boolean, optional
864
+ If True, the shape of the coefficient array is extended with ones
865
+ on the right, one for each dimension of `x`. Scalars have dimension 0
866
+ for this action. The result is that every column of coefficients in
867
+ `c` is evaluated for every element of `x`. If False, `x` is broadcast
868
+ over the columns of `c` for the evaluation. This keyword is useful
869
+ when `c` is multidimensional. The default value is True.
870
+
871
+ Returns
872
+ -------
873
+ values : ndarray, algebra_like
874
+ The shape of the return value is described above.
875
+
876
+ See Also
877
+ --------
878
+ legval2d, leggrid2d, legval3d, leggrid3d
879
+
880
+ Notes
881
+ -----
882
+ The evaluation uses Clenshaw recursion, aka synthetic division.
883
+
884
+ """
885
+ c = np.array(c, ndmin=1, copy=None)
886
+ if c.dtype.char in '?bBhHiIlLqQpP':
887
+ c = c.astype(np.double)
888
+ if isinstance(x, (tuple, list)):
889
+ x = np.asarray(x)
890
+ if isinstance(x, np.ndarray) and tensor:
891
+ c = c.reshape(c.shape + (1,) * x.ndim)
892
+
893
+ if len(c) == 1:
894
+ c0 = c[0]
895
+ c1 = 0
896
+ elif len(c) == 2:
897
+ c0 = c[0]
898
+ c1 = c[1]
899
+ else:
900
+ nd = len(c)
901
+ c0 = c[-2]
902
+ c1 = c[-1]
903
+ for i in range(3, len(c) + 1):
904
+ tmp = c0
905
+ nd = nd - 1
906
+ c0 = c[-i] - c1 * ((nd - 1) / nd)
907
+ c1 = tmp + c1 * x * ((2 * nd - 1) / nd)
908
+ return c0 + c1 * x
909
+
910
+
911
+ def legval2d(x, y, c):
912
+ """
913
+ Evaluate a 2-D Legendre series at points (x, y).
914
+
915
+ This function returns the values:
916
+
917
+ .. math:: p(x,y) = \\sum_{i,j} c_{i,j} * L_i(x) * L_j(y)
918
+
919
+ The parameters `x` and `y` are converted to arrays only if they are
920
+ tuples or a lists, otherwise they are treated as a scalars and they
921
+ must have the same shape after conversion. In either case, either `x`
922
+ and `y` or their elements must support multiplication and addition both
923
+ with themselves and with the elements of `c`.
924
+
925
+ If `c` is a 1-D array a one is implicitly appended to its shape to make
926
+ it 2-D. The shape of the result will be c.shape[2:] + x.shape.
927
+
928
+ Parameters
929
+ ----------
930
+ x, y : array_like, compatible objects
931
+ The two dimensional series is evaluated at the points ``(x, y)``,
932
+ where `x` and `y` must have the same shape. If `x` or `y` is a list
933
+ or tuple, it is first converted to an ndarray, otherwise it is left
934
+ unchanged and if it isn't an ndarray it is treated as a scalar.
935
+ c : array_like
936
+ Array of coefficients ordered so that the coefficient of the term
937
+ of multi-degree i,j is contained in ``c[i,j]``. If `c` has
938
+ dimension greater than two the remaining indices enumerate multiple
939
+ sets of coefficients.
940
+
941
+ Returns
942
+ -------
943
+ values : ndarray, compatible object
944
+ The values of the two dimensional Legendre series at points formed
945
+ from pairs of corresponding values from `x` and `y`.
946
+
947
+ See Also
948
+ --------
949
+ legval, leggrid2d, legval3d, leggrid3d
950
+ """
951
+ return pu._valnd(legval, c, x, y)
952
+
953
+
954
+ def leggrid2d(x, y, c):
955
+ """
956
+ Evaluate a 2-D Legendre series on the Cartesian product of x and y.
957
+
958
+ This function returns the values:
959
+
960
+ .. math:: p(a,b) = \\sum_{i,j} c_{i,j} * L_i(a) * L_j(b)
961
+
962
+ where the points ``(a, b)`` consist of all pairs formed by taking
963
+ `a` from `x` and `b` from `y`. The resulting points form a grid with
964
+ `x` in the first dimension and `y` in the second.
965
+
966
+ The parameters `x` and `y` are converted to arrays only if they are
967
+ tuples or a lists, otherwise they are treated as a scalars. In either
968
+ case, either `x` and `y` or their elements must support multiplication
969
+ and addition both with themselves and with the elements of `c`.
970
+
971
+ If `c` has fewer than two dimensions, ones are implicitly appended to
972
+ its shape to make it 2-D. The shape of the result will be c.shape[2:] +
973
+ x.shape + y.shape.
974
+
975
+ Parameters
976
+ ----------
977
+ x, y : array_like, compatible objects
978
+ The two dimensional series is evaluated at the points in the
979
+ Cartesian product of `x` and `y`. If `x` or `y` is a list or
980
+ tuple, it is first converted to an ndarray, otherwise it is left
981
+ unchanged and, if it isn't an ndarray, it is treated as a scalar.
982
+ c : array_like
983
+ Array of coefficients ordered so that the coefficient of the term of
984
+ multi-degree i,j is contained in ``c[i,j]``. If `c` has dimension
985
+ greater than two the remaining indices enumerate multiple sets of
986
+ coefficients.
987
+
988
+ Returns
989
+ -------
990
+ values : ndarray, compatible object
991
+ The values of the two dimensional Chebyshev series at points in the
992
+ Cartesian product of `x` and `y`.
993
+
994
+ See Also
995
+ --------
996
+ legval, legval2d, legval3d, leggrid3d
997
+ """
998
+ return pu._gridnd(legval, c, x, y)
999
+
1000
+
1001
+ def legval3d(x, y, z, c):
1002
+ """
1003
+ Evaluate a 3-D Legendre series at points (x, y, z).
1004
+
1005
+ This function returns the values:
1006
+
1007
+ .. math:: p(x,y,z) = \\sum_{i,j,k} c_{i,j,k} * L_i(x) * L_j(y) * L_k(z)
1008
+
1009
+ The parameters `x`, `y`, and `z` are converted to arrays only if
1010
+ they are tuples or a lists, otherwise they are treated as a scalars and
1011
+ they must have the same shape after conversion. In either case, either
1012
+ `x`, `y`, and `z` or their elements must support multiplication and
1013
+ addition both with themselves and with the elements of `c`.
1014
+
1015
+ If `c` has fewer than 3 dimensions, ones are implicitly appended to its
1016
+ shape to make it 3-D. The shape of the result will be c.shape[3:] +
1017
+ x.shape.
1018
+
1019
+ Parameters
1020
+ ----------
1021
+ x, y, z : array_like, compatible object
1022
+ The three dimensional series is evaluated at the points
1023
+ ``(x, y, z)``, where `x`, `y`, and `z` must have the same shape. If
1024
+ any of `x`, `y`, or `z` is a list or tuple, it is first converted
1025
+ to an ndarray, otherwise it is left unchanged and if it isn't an
1026
+ ndarray it is treated as a scalar.
1027
+ c : array_like
1028
+ Array of coefficients ordered so that the coefficient of the term of
1029
+ multi-degree i,j,k is contained in ``c[i,j,k]``. If `c` has dimension
1030
+ greater than 3 the remaining indices enumerate multiple sets of
1031
+ coefficients.
1032
+
1033
+ Returns
1034
+ -------
1035
+ values : ndarray, compatible object
1036
+ The values of the multidimensional polynomial on points formed with
1037
+ triples of corresponding values from `x`, `y`, and `z`.
1038
+
1039
+ See Also
1040
+ --------
1041
+ legval, legval2d, leggrid2d, leggrid3d
1042
+ """
1043
+ return pu._valnd(legval, c, x, y, z)
1044
+
1045
+
1046
+ def leggrid3d(x, y, z, c):
1047
+ """
1048
+ Evaluate a 3-D Legendre series on the Cartesian product of x, y, and z.
1049
+
1050
+ This function returns the values:
1051
+
1052
+ .. math:: p(a,b,c) = \\sum_{i,j,k} c_{i,j,k} * L_i(a) * L_j(b) * L_k(c)
1053
+
1054
+ where the points ``(a, b, c)`` consist of all triples formed by taking
1055
+ `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form
1056
+ a grid with `x` in the first dimension, `y` in the second, and `z` in
1057
+ the third.
1058
+
1059
+ The parameters `x`, `y`, and `z` are converted to arrays only if they
1060
+ are tuples or a lists, otherwise they are treated as a scalars. In
1061
+ either case, either `x`, `y`, and `z` or their elements must support
1062
+ multiplication and addition both with themselves and with the elements
1063
+ of `c`.
1064
+
1065
+ If `c` has fewer than three dimensions, ones are implicitly appended to
1066
+ its shape to make it 3-D. The shape of the result will be c.shape[3:] +
1067
+ x.shape + y.shape + z.shape.
1068
+
1069
+ Parameters
1070
+ ----------
1071
+ x, y, z : array_like, compatible objects
1072
+ The three dimensional series is evaluated at the points in the
1073
+ Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a
1074
+ list or tuple, it is first converted to an ndarray, otherwise it is
1075
+ left unchanged and, if it isn't an ndarray, it is treated as a
1076
+ scalar.
1077
+ c : array_like
1078
+ Array of coefficients ordered so that the coefficients for terms of
1079
+ degree i,j are contained in ``c[i,j]``. If `c` has dimension
1080
+ greater than two the remaining indices enumerate multiple sets of
1081
+ coefficients.
1082
+
1083
+ Returns
1084
+ -------
1085
+ values : ndarray, compatible object
1086
+ The values of the two dimensional polynomial at points in the Cartesian
1087
+ product of `x` and `y`.
1088
+
1089
+ See Also
1090
+ --------
1091
+ legval, legval2d, leggrid2d, legval3d
1092
+ """
1093
+ return pu._gridnd(legval, c, x, y, z)
1094
+
1095
+
1096
+ def legvander(x, deg):
1097
+ """Pseudo-Vandermonde matrix of given degree.
1098
+
1099
+ Returns the pseudo-Vandermonde matrix of degree `deg` and sample points
1100
+ `x`. The pseudo-Vandermonde matrix is defined by
1101
+
1102
+ .. math:: V[..., i] = L_i(x)
1103
+
1104
+ where ``0 <= i <= deg``. The leading indices of `V` index the elements of
1105
+ `x` and the last index is the degree of the Legendre polynomial.
1106
+
1107
+ If `c` is a 1-D array of coefficients of length ``n + 1`` and `V` is the
1108
+ array ``V = legvander(x, n)``, then ``np.dot(V, c)`` and
1109
+ ``legval(x, c)`` are the same up to roundoff. This equivalence is
1110
+ useful both for least squares fitting and for the evaluation of a large
1111
+ number of Legendre series of the same degree and sample points.
1112
+
1113
+ Parameters
1114
+ ----------
1115
+ x : array_like
1116
+ Array of points. The dtype is converted to float64 or complex128
1117
+ depending on whether any of the elements are complex. If `x` is
1118
+ scalar it is converted to a 1-D array.
1119
+ deg : int
1120
+ Degree of the resulting matrix.
1121
+
1122
+ Returns
1123
+ -------
1124
+ vander : ndarray
1125
+ The pseudo-Vandermonde matrix. The shape of the returned matrix is
1126
+ ``x.shape + (deg + 1,)``, where The last index is the degree of the
1127
+ corresponding Legendre polynomial. The dtype will be the same as
1128
+ the converted `x`.
1129
+
1130
+ """
1131
+ ideg = pu._as_int(deg, "deg")
1132
+ if ideg < 0:
1133
+ raise ValueError("deg must be non-negative")
1134
+
1135
+ x = np.array(x, copy=None, ndmin=1) + 0.0
1136
+ dims = (ideg + 1,) + x.shape
1137
+ dtyp = x.dtype
1138
+ v = np.empty(dims, dtype=dtyp)
1139
+ # Use forward recursion to generate the entries. This is not as accurate
1140
+ # as reverse recursion in this application but it is more efficient.
1141
+ v[0] = x * 0 + 1
1142
+ if ideg > 0:
1143
+ v[1] = x
1144
+ for i in range(2, ideg + 1):
1145
+ v[i] = (v[i - 1] * x * (2 * i - 1) - v[i - 2] * (i - 1)) / i
1146
+ return np.moveaxis(v, 0, -1)
1147
+
1148
+
1149
+ def legvander2d(x, y, deg):
1150
+ """Pseudo-Vandermonde matrix of given degrees.
1151
+
1152
+ Returns the pseudo-Vandermonde matrix of degrees `deg` and sample
1153
+ points ``(x, y)``. The pseudo-Vandermonde matrix is defined by
1154
+
1155
+ .. math:: V[..., (deg[1] + 1)*i + j] = L_i(x) * L_j(y),
1156
+
1157
+ where ``0 <= i <= deg[0]`` and ``0 <= j <= deg[1]``. The leading indices of
1158
+ `V` index the points ``(x, y)`` and the last index encodes the degrees of
1159
+ the Legendre polynomials.
1160
+
1161
+ If ``V = legvander2d(x, y, [xdeg, ydeg])``, then the columns of `V`
1162
+ correspond to the elements of a 2-D coefficient array `c` of shape
1163
+ (xdeg + 1, ydeg + 1) in the order
1164
+
1165
+ .. math:: c_{00}, c_{01}, c_{02}, ... , c_{10}, c_{11}, c_{12}, ...
1166
+
1167
+ and ``np.dot(V, c.flat)`` and ``legval2d(x, y, c)`` will be the same
1168
+ up to roundoff. This equivalence is useful both for least squares
1169
+ fitting and for the evaluation of a large number of 2-D Legendre
1170
+ series of the same degrees and sample points.
1171
+
1172
+ Parameters
1173
+ ----------
1174
+ x, y : array_like
1175
+ Arrays of point coordinates, all of the same shape. The dtypes
1176
+ will be converted to either float64 or complex128 depending on
1177
+ whether any of the elements are complex. Scalars are converted to
1178
+ 1-D arrays.
1179
+ deg : list of ints
1180
+ List of maximum degrees of the form [x_deg, y_deg].
1181
+
1182
+ Returns
1183
+ -------
1184
+ vander2d : ndarray
1185
+ The shape of the returned matrix is ``x.shape + (order,)``, where
1186
+ :math:`order = (deg[0]+1)*(deg[1]+1)`. The dtype will be the same
1187
+ as the converted `x` and `y`.
1188
+
1189
+ See Also
1190
+ --------
1191
+ legvander, legvander3d, legval2d, legval3d
1192
+ """
1193
+ return pu._vander_nd_flat((legvander, legvander), (x, y), deg)
1194
+
1195
+
1196
+ def legvander3d(x, y, z, deg):
1197
+ """Pseudo-Vandermonde matrix of given degrees.
1198
+
1199
+ Returns the pseudo-Vandermonde matrix of degrees `deg` and sample
1200
+ points ``(x, y, z)``. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`,
1201
+ then The pseudo-Vandermonde matrix is defined by
1202
+
1203
+ .. math:: V[..., (m+1)(n+1)i + (n+1)j + k] = L_i(x)*L_j(y)*L_k(z),
1204
+
1205
+ where ``0 <= i <= l``, ``0 <= j <= m``, and ``0 <= j <= n``. The leading
1206
+ indices of `V` index the points ``(x, y, z)`` and the last index encodes
1207
+ the degrees of the Legendre polynomials.
1208
+
1209
+ If ``V = legvander3d(x, y, z, [xdeg, ydeg, zdeg])``, then the columns
1210
+ of `V` correspond to the elements of a 3-D coefficient array `c` of
1211
+ shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
1212
+
1213
+ .. math:: c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...
1214
+
1215
+ and ``np.dot(V, c.flat)`` and ``legval3d(x, y, z, c)`` will be the
1216
+ same up to roundoff. This equivalence is useful both for least squares
1217
+ fitting and for the evaluation of a large number of 3-D Legendre
1218
+ series of the same degrees and sample points.
1219
+
1220
+ Parameters
1221
+ ----------
1222
+ x, y, z : array_like
1223
+ Arrays of point coordinates, all of the same shape. The dtypes will
1224
+ be converted to either float64 or complex128 depending on whether
1225
+ any of the elements are complex. Scalars are converted to 1-D
1226
+ arrays.
1227
+ deg : list of ints
1228
+ List of maximum degrees of the form [x_deg, y_deg, z_deg].
1229
+
1230
+ Returns
1231
+ -------
1232
+ vander3d : ndarray
1233
+ The shape of the returned matrix is ``x.shape + (order,)``, where
1234
+ :math:`order = (deg[0]+1)*(deg[1]+1)*(deg[2]+1)`. The dtype will
1235
+ be the same as the converted `x`, `y`, and `z`.
1236
+
1237
+ See Also
1238
+ --------
1239
+ legvander, legvander3d, legval2d, legval3d
1240
+ """
1241
+ return pu._vander_nd_flat((legvander, legvander, legvander), (x, y, z), deg)
1242
+
1243
+
1244
+ def legfit(x, y, deg, rcond=None, full=False, w=None):
1245
+ """
1246
+ Least squares fit of Legendre series to data.
1247
+
1248
+ Return the coefficients of a Legendre series of degree `deg` that is the
1249
+ least squares fit to the data values `y` given at points `x`. If `y` is
1250
+ 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple
1251
+ fits are done, one for each column of `y`, and the resulting
1252
+ coefficients are stored in the corresponding columns of a 2-D return.
1253
+ The fitted polynomial(s) are in the form
1254
+
1255
+ .. math:: p(x) = c_0 + c_1 * L_1(x) + ... + c_n * L_n(x),
1256
+
1257
+ where `n` is `deg`.
1258
+
1259
+ Parameters
1260
+ ----------
1261
+ x : array_like, shape (M,)
1262
+ x-coordinates of the M sample points ``(x[i], y[i])``.
1263
+ y : array_like, shape (M,) or (M, K)
1264
+ y-coordinates of the sample points. Several data sets of sample
1265
+ points sharing the same x-coordinates can be fitted at once by
1266
+ passing in a 2D-array that contains one dataset per column.
1267
+ deg : int or 1-D array_like
1268
+ Degree(s) of the fitting polynomials. If `deg` is a single integer
1269
+ all terms up to and including the `deg`'th term are included in the
1270
+ fit. For NumPy versions >= 1.11.0 a list of integers specifying the
1271
+ degrees of the terms to include may be used instead.
1272
+ rcond : float, optional
1273
+ Relative condition number of the fit. Singular values smaller than
1274
+ this relative to the largest singular value will be ignored. The
1275
+ default value is len(x)*eps, where eps is the relative precision of
1276
+ the float type, about 2e-16 in most cases.
1277
+ full : bool, optional
1278
+ Switch determining nature of return value. When it is False (the
1279
+ default) just the coefficients are returned, when True diagnostic
1280
+ information from the singular value decomposition is also returned.
1281
+ w : array_like, shape (`M`,), optional
1282
+ Weights. If not None, the weight ``w[i]`` applies to the unsquared
1283
+ residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
1284
+ chosen so that the errors of the products ``w[i]*y[i]`` all have the
1285
+ same variance. When using inverse-variance weighting, use
1286
+ ``w[i] = 1/sigma(y[i])``. The default value is None.
1287
+
1288
+ Returns
1289
+ -------
1290
+ coef : ndarray, shape (M,) or (M, K)
1291
+ Legendre coefficients ordered from low to high. If `y` was
1292
+ 2-D, the coefficients for the data in column k of `y` are in
1293
+ column `k`. If `deg` is specified as a list, coefficients for
1294
+ terms not included in the fit are set equal to zero in the
1295
+ returned `coef`.
1296
+
1297
+ [residuals, rank, singular_values, rcond] : list
1298
+ These values are only returned if ``full == True``
1299
+
1300
+ - residuals -- sum of squared residuals of the least squares fit
1301
+ - rank -- the numerical rank of the scaled Vandermonde matrix
1302
+ - singular_values -- singular values of the scaled Vandermonde matrix
1303
+ - rcond -- value of `rcond`.
1304
+
1305
+ For more details, see `numpy.linalg.lstsq`.
1306
+
1307
+ Warns
1308
+ -----
1309
+ RankWarning
1310
+ The rank of the coefficient matrix in the least-squares fit is
1311
+ deficient. The warning is only raised if ``full == False``. The
1312
+ warnings can be turned off by
1313
+
1314
+ >>> import warnings
1315
+ >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
1316
+
1317
+ See Also
1318
+ --------
1319
+ numpy.polynomial.polynomial.polyfit
1320
+ numpy.polynomial.chebyshev.chebfit
1321
+ numpy.polynomial.laguerre.lagfit
1322
+ numpy.polynomial.hermite.hermfit
1323
+ numpy.polynomial.hermite_e.hermefit
1324
+ legval : Evaluates a Legendre series.
1325
+ legvander : Vandermonde matrix of Legendre series.
1326
+ legweight : Legendre weight function (= 1).
1327
+ numpy.linalg.lstsq : Computes a least-squares fit from the matrix.
1328
+ scipy.interpolate.UnivariateSpline : Computes spline fits.
1329
+
1330
+ Notes
1331
+ -----
1332
+ The solution is the coefficients of the Legendre series `p` that
1333
+ minimizes the sum of the weighted squared errors
1334
+
1335
+ .. math:: E = \\sum_j w_j^2 * |y_j - p(x_j)|^2,
1336
+
1337
+ where :math:`w_j` are the weights. This problem is solved by setting up
1338
+ as the (typically) overdetermined matrix equation
1339
+
1340
+ .. math:: V(x) * c = w * y,
1341
+
1342
+ where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the
1343
+ coefficients to be solved for, `w` are the weights, and `y` are the
1344
+ observed values. This equation is then solved using the singular value
1345
+ decomposition of `V`.
1346
+
1347
+ If some of the singular values of `V` are so small that they are
1348
+ neglected, then a `~exceptions.RankWarning` will be issued. This means that
1349
+ the coefficient values may be poorly determined. Using a lower order fit
1350
+ will usually get rid of the warning. The `rcond` parameter can also be
1351
+ set to a value smaller than its default, but the resulting fit may be
1352
+ spurious and have large contributions from roundoff error.
1353
+
1354
+ Fits using Legendre series are usually better conditioned than fits
1355
+ using power series, but much can depend on the distribution of the
1356
+ sample points and the smoothness of the data. If the quality of the fit
1357
+ is inadequate splines may be a good alternative.
1358
+
1359
+ References
1360
+ ----------
1361
+ .. [1] Wikipedia, "Curve fitting",
1362
+ https://en.wikipedia.org/wiki/Curve_fitting
1363
+
1364
+ Examples
1365
+ --------
1366
+
1367
+ """
1368
+ return pu._fit(legvander, x, y, deg, rcond, full, w)
1369
+
1370
+
1371
+ def legcompanion(c):
1372
+ """Return the scaled companion matrix of c.
1373
+
1374
+ The basis polynomials are scaled so that the companion matrix is
1375
+ symmetric when `c` is an Legendre basis polynomial. This provides
1376
+ better eigenvalue estimates than the unscaled case and for basis
1377
+ polynomials the eigenvalues are guaranteed to be real if
1378
+ `numpy.linalg.eigvalsh` is used to obtain them.
1379
+
1380
+ Parameters
1381
+ ----------
1382
+ c : array_like
1383
+ 1-D array of Legendre series coefficients ordered from low to high
1384
+ degree.
1385
+
1386
+ Returns
1387
+ -------
1388
+ mat : ndarray
1389
+ Scaled companion matrix of dimensions (deg, deg).
1390
+ """
1391
+ # c is a trimmed copy
1392
+ [c] = pu.as_series([c])
1393
+ if len(c) < 2:
1394
+ raise ValueError('Series must have maximum degree of at least 1.')
1395
+ if len(c) == 2:
1396
+ return np.array([[-c[0] / c[1]]])
1397
+
1398
+ n = len(c) - 1
1399
+ mat = np.zeros((n, n), dtype=c.dtype)
1400
+ scl = 1. / np.sqrt(2 * np.arange(n) + 1)
1401
+ top = mat.reshape(-1)[1::n + 1]
1402
+ bot = mat.reshape(-1)[n::n + 1]
1403
+ top[...] = np.arange(1, n) * scl[:n - 1] * scl[1:n]
1404
+ bot[...] = top
1405
+ mat[:, -1] -= (c[:-1] / c[-1]) * (scl / scl[-1]) * (n / (2 * n - 1))
1406
+ return mat
1407
+
1408
+
1409
+ def legroots(c):
1410
+ """
1411
+ Compute the roots of a Legendre series.
1412
+
1413
+ Return the roots (a.k.a. "zeros") of the polynomial
1414
+
1415
+ .. math:: p(x) = \\sum_i c[i] * L_i(x).
1416
+
1417
+ Parameters
1418
+ ----------
1419
+ c : 1-D array_like
1420
+ 1-D array of coefficients.
1421
+
1422
+ Returns
1423
+ -------
1424
+ out : ndarray
1425
+ Array of the roots of the series. If all the roots are real,
1426
+ then `out` is also real, otherwise it is complex.
1427
+
1428
+ See Also
1429
+ --------
1430
+ numpy.polynomial.polynomial.polyroots
1431
+ numpy.polynomial.chebyshev.chebroots
1432
+ numpy.polynomial.laguerre.lagroots
1433
+ numpy.polynomial.hermite.hermroots
1434
+ numpy.polynomial.hermite_e.hermeroots
1435
+
1436
+ Notes
1437
+ -----
1438
+ The root estimates are obtained as the eigenvalues of the companion
1439
+ matrix, Roots far from the origin of the complex plane may have large
1440
+ errors due to the numerical instability of the series for such values.
1441
+ Roots with multiplicity greater than 1 will also show larger errors as
1442
+ the value of the series near such points is relatively insensitive to
1443
+ errors in the roots. Isolated roots near the origin can be improved by
1444
+ a few iterations of Newton's method.
1445
+
1446
+ The Legendre series basis polynomials aren't powers of ``x`` so the
1447
+ results of this function may seem unintuitive.
1448
+
1449
+ Examples
1450
+ --------
1451
+ >>> import numpy.polynomial.legendre as leg
1452
+ >>> leg.legroots((1, 2, 3, 4)) # 4L_3 + 3L_2 + 2L_1 + 1L_0, all real roots
1453
+ array([-0.85099543, -0.11407192, 0.51506735]) # may vary
1454
+
1455
+ """
1456
+ # c is a trimmed copy
1457
+ [c] = pu.as_series([c])
1458
+ if len(c) < 2:
1459
+ return np.array([], dtype=c.dtype)
1460
+ if len(c) == 2:
1461
+ return np.array([-c[0] / c[1]])
1462
+
1463
+ # rotated companion matrix reduces error
1464
+ m = legcompanion(c)[::-1, ::-1]
1465
+ r = np.linalg.eigvals(m)
1466
+ r.sort()
1467
+ return r
1468
+
1469
+
1470
+ def leggauss(deg):
1471
+ """
1472
+ Gauss-Legendre quadrature.
1473
+
1474
+ Computes the sample points and weights for Gauss-Legendre quadrature.
1475
+ These sample points and weights will correctly integrate polynomials of
1476
+ degree :math:`2*deg - 1` or less over the interval :math:`[-1, 1]` with
1477
+ the weight function :math:`f(x) = 1`.
1478
+
1479
+ Parameters
1480
+ ----------
1481
+ deg : int
1482
+ Number of sample points and weights. It must be >= 1.
1483
+
1484
+ Returns
1485
+ -------
1486
+ x : ndarray
1487
+ 1-D ndarray containing the sample points.
1488
+ y : ndarray
1489
+ 1-D ndarray containing the weights.
1490
+
1491
+ Notes
1492
+ -----
1493
+ The results have only been tested up to degree 100, higher degrees may
1494
+ be problematic. The weights are determined by using the fact that
1495
+
1496
+ .. math:: w_k = c / (L'_n(x_k) * L_{n-1}(x_k))
1497
+
1498
+ where :math:`c` is a constant independent of :math:`k` and :math:`x_k`
1499
+ is the k'th root of :math:`L_n`, and then scaling the results to get
1500
+ the right value when integrating 1.
1501
+
1502
+ """
1503
+ ideg = pu._as_int(deg, "deg")
1504
+ if ideg <= 0:
1505
+ raise ValueError("deg must be a positive integer")
1506
+
1507
+ # first approximation of roots. We use the fact that the companion
1508
+ # matrix is symmetric in this case in order to obtain better zeros.
1509
+ c = np.array([0] * deg + [1])
1510
+ m = legcompanion(c)
1511
+ x = np.linalg.eigvalsh(m)
1512
+
1513
+ # improve roots by one application of Newton
1514
+ dy = legval(x, c)
1515
+ df = legval(x, legder(c))
1516
+ x -= dy / df
1517
+
1518
+ # compute the weights. We scale the factor to avoid possible numerical
1519
+ # overflow.
1520
+ fm = legval(x, c[1:])
1521
+ fm /= np.abs(fm).max()
1522
+ df /= np.abs(df).max()
1523
+ w = 1 / (fm * df)
1524
+
1525
+ # for Legendre we can also symmetrize
1526
+ w = (w + w[::-1]) / 2
1527
+ x = (x - x[::-1]) / 2
1528
+
1529
+ # scale w to get the right value
1530
+ w *= 2. / w.sum()
1531
+
1532
+ return x, w
1533
+
1534
+
1535
+ def legweight(x):
1536
+ """
1537
+ Weight function of the Legendre polynomials.
1538
+
1539
+ The weight function is :math:`1` and the interval of integration is
1540
+ :math:`[-1, 1]`. The Legendre polynomials are orthogonal, but not
1541
+ normalized, with respect to this weight function.
1542
+
1543
+ Parameters
1544
+ ----------
1545
+ x : array_like
1546
+ Values at which the weight function will be computed.
1547
+
1548
+ Returns
1549
+ -------
1550
+ w : ndarray
1551
+ The weight function at `x`.
1552
+ """
1553
+ w = x * 0.0 + 1.0
1554
+ return w
1555
+
1556
+ #
1557
+ # Legendre series class
1558
+ #
1559
+
1560
+ class Legendre(ABCPolyBase):
1561
+ """A Legendre series class.
1562
+
1563
+ The Legendre class provides the standard Python numerical methods
1564
+ '+', '-', '*', '//', '%', 'divmod', '**', and '()' as well as the
1565
+ attributes and methods listed below.
1566
+
1567
+ Parameters
1568
+ ----------
1569
+ coef : array_like
1570
+ Legendre coefficients in order of increasing degree, i.e.,
1571
+ ``(1, 2, 3)`` gives ``1*P_0(x) + 2*P_1(x) + 3*P_2(x)``.
1572
+ domain : (2,) array_like, optional
1573
+ Domain to use. The interval ``[domain[0], domain[1]]`` is mapped
1574
+ to the interval ``[window[0], window[1]]`` by shifting and scaling.
1575
+ The default value is [-1., 1.].
1576
+ window : (2,) array_like, optional
1577
+ Window, see `domain` for its use. The default value is [-1., 1.].
1578
+ symbol : str, optional
1579
+ Symbol used to represent the independent variable in string
1580
+ representations of the polynomial expression, e.g. for printing.
1581
+ The symbol must be a valid Python identifier. Default value is 'x'.
1582
+
1583
+ .. versionadded:: 1.24
1584
+
1585
+ """
1586
+ # Virtual Functions
1587
+ _add = staticmethod(legadd)
1588
+ _sub = staticmethod(legsub)
1589
+ _mul = staticmethod(legmul)
1590
+ _div = staticmethod(legdiv)
1591
+ _pow = staticmethod(legpow)
1592
+ _val = staticmethod(legval)
1593
+ _int = staticmethod(legint)
1594
+ _der = staticmethod(legder)
1595
+ _fit = staticmethod(legfit)
1596
+ _line = staticmethod(legline)
1597
+ _roots = staticmethod(legroots)
1598
+ _fromroots = staticmethod(legfromroots)
1599
+
1600
+ # Virtual properties
1601
+ domain = np.array(legdomain)
1602
+ window = np.array(legdomain)
1603
+ basis_name = 'P'