numpy 2.3.5__cp313-cp313-macosx_14_0_arm64.whl

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

Potentially problematic release.


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

Files changed (897) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +102 -0
  3. numpy/__init__.cython-30.pxd +1241 -0
  4. numpy/__init__.pxd +1154 -0
  5. numpy/__init__.py +945 -0
  6. numpy/__init__.pyi +6147 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +207 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +186 -0
  12. numpy/_core/__init__.pyi +2 -0
  13. numpy/_core/_add_newdocs.py +6967 -0
  14. numpy/_core/_add_newdocs.pyi +3 -0
  15. numpy/_core/_add_newdocs_scalars.py +390 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +134 -0
  18. numpy/_core/_asarray.pyi +41 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +58 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +55 -0
  25. numpy/_core/_internal.py +958 -0
  26. numpy/_core/_internal.pyi +72 -0
  27. numpy/_core/_machar.py +355 -0
  28. numpy/_core/_machar.pyi +55 -0
  29. numpy/_core/_methods.py +255 -0
  30. numpy/_core/_methods.pyi +22 -0
  31. numpy/_core/_multiarray_tests.cpython-313-darwin.so +0 -0
  32. numpy/_core/_multiarray_umath.cpython-313-darwin.so +0 -0
  33. numpy/_core/_operand_flag_tests.cpython-313-darwin.so +0 -0
  34. numpy/_core/_rational_tests.cpython-313-darwin.so +0 -0
  35. numpy/_core/_simd.cpython-313-darwin.so +0 -0
  36. numpy/_core/_simd.pyi +25 -0
  37. numpy/_core/_string_helpers.py +100 -0
  38. numpy/_core/_string_helpers.pyi +12 -0
  39. numpy/_core/_struct_ufunc_tests.cpython-313-darwin.so +0 -0
  40. numpy/_core/_type_aliases.py +119 -0
  41. numpy/_core/_type_aliases.pyi +97 -0
  42. numpy/_core/_ufunc_config.py +491 -0
  43. numpy/_core/_ufunc_config.pyi +78 -0
  44. numpy/_core/_umath_tests.cpython-313-darwin.so +0 -0
  45. numpy/_core/arrayprint.py +1775 -0
  46. numpy/_core/arrayprint.pyi +238 -0
  47. numpy/_core/cversions.py +13 -0
  48. numpy/_core/defchararray.py +1427 -0
  49. numpy/_core/defchararray.pyi +1135 -0
  50. numpy/_core/einsumfunc.py +1498 -0
  51. numpy/_core/einsumfunc.pyi +184 -0
  52. numpy/_core/fromnumeric.py +4269 -0
  53. numpy/_core/fromnumeric.pyi +1750 -0
  54. numpy/_core/function_base.py +545 -0
  55. numpy/_core/function_base.pyi +278 -0
  56. numpy/_core/getlimits.py +748 -0
  57. numpy/_core/getlimits.pyi +3 -0
  58. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  59. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  60. numpy/_core/include/numpy/__ufunc_api.c +54 -0
  61. numpy/_core/include/numpy/__ufunc_api.h +341 -0
  62. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  63. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  64. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  65. numpy/_core/include/numpy/arrayobject.h +7 -0
  66. numpy/_core/include/numpy/arrayscalars.h +196 -0
  67. numpy/_core/include/numpy/dtype_api.h +480 -0
  68. numpy/_core/include/numpy/halffloat.h +70 -0
  69. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  70. numpy/_core/include/numpy/ndarraytypes.h +1950 -0
  71. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  72. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  73. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  74. numpy/_core/include/numpy/npy_common.h +977 -0
  75. numpy/_core/include/numpy/npy_cpu.h +124 -0
  76. numpy/_core/include/numpy/npy_endian.h +78 -0
  77. numpy/_core/include/numpy/npy_math.h +602 -0
  78. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  79. numpy/_core/include/numpy/npy_os.h +42 -0
  80. numpy/_core/include/numpy/numpyconfig.h +182 -0
  81. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  82. numpy/_core/include/numpy/random/bitgen.h +20 -0
  83. numpy/_core/include/numpy/random/distributions.h +209 -0
  84. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  85. numpy/_core/include/numpy/ufuncobject.h +343 -0
  86. numpy/_core/include/numpy/utils.h +37 -0
  87. numpy/_core/lib/libnpymath.a +0 -0
  88. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  89. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  90. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  91. numpy/_core/memmap.py +363 -0
  92. numpy/_core/memmap.pyi +3 -0
  93. numpy/_core/multiarray.py +1762 -0
  94. numpy/_core/multiarray.pyi +1285 -0
  95. numpy/_core/numeric.py +2760 -0
  96. numpy/_core/numeric.pyi +882 -0
  97. numpy/_core/numerictypes.py +633 -0
  98. numpy/_core/numerictypes.pyi +197 -0
  99. numpy/_core/overrides.py +183 -0
  100. numpy/_core/overrides.pyi +48 -0
  101. numpy/_core/printoptions.py +32 -0
  102. numpy/_core/printoptions.pyi +28 -0
  103. numpy/_core/records.py +1089 -0
  104. numpy/_core/records.pyi +333 -0
  105. numpy/_core/shape_base.py +998 -0
  106. numpy/_core/shape_base.pyi +175 -0
  107. numpy/_core/strings.py +1829 -0
  108. numpy/_core/strings.pyi +511 -0
  109. numpy/_core/tests/_locales.py +72 -0
  110. numpy/_core/tests/_natype.py +205 -0
  111. numpy/_core/tests/data/astype_copy.pkl +0 -0
  112. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  113. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  114. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  115. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  122. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  123. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  124. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  125. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  127. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  128. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  129. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  130. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  131. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  132. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  134. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  135. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  136. numpy/_core/tests/examples/cython/meson.build +43 -0
  137. numpy/_core/tests/examples/cython/setup.py +39 -0
  138. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  139. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  140. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  141. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  142. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  143. numpy/_core/tests/test__exceptions.py +90 -0
  144. numpy/_core/tests/test_abc.py +54 -0
  145. numpy/_core/tests/test_api.py +654 -0
  146. numpy/_core/tests/test_argparse.py +92 -0
  147. numpy/_core/tests/test_array_api_info.py +113 -0
  148. numpy/_core/tests/test_array_coercion.py +911 -0
  149. numpy/_core/tests/test_array_interface.py +222 -0
  150. numpy/_core/tests/test_arraymethod.py +84 -0
  151. numpy/_core/tests/test_arrayobject.py +75 -0
  152. numpy/_core/tests/test_arrayprint.py +1328 -0
  153. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  154. numpy/_core/tests/test_casting_unittests.py +817 -0
  155. numpy/_core/tests/test_conversion_utils.py +206 -0
  156. numpy/_core/tests/test_cpu_dispatcher.py +49 -0
  157. numpy/_core/tests/test_cpu_features.py +432 -0
  158. numpy/_core/tests/test_custom_dtypes.py +315 -0
  159. numpy/_core/tests/test_cython.py +351 -0
  160. numpy/_core/tests/test_datetime.py +2734 -0
  161. numpy/_core/tests/test_defchararray.py +825 -0
  162. numpy/_core/tests/test_deprecations.py +454 -0
  163. numpy/_core/tests/test_dlpack.py +190 -0
  164. numpy/_core/tests/test_dtype.py +1995 -0
  165. numpy/_core/tests/test_einsum.py +1317 -0
  166. numpy/_core/tests/test_errstate.py +131 -0
  167. numpy/_core/tests/test_extint128.py +217 -0
  168. numpy/_core/tests/test_function_base.py +503 -0
  169. numpy/_core/tests/test_getlimits.py +205 -0
  170. numpy/_core/tests/test_half.py +568 -0
  171. numpy/_core/tests/test_hashtable.py +35 -0
  172. numpy/_core/tests/test_indexerrors.py +125 -0
  173. numpy/_core/tests/test_indexing.py +1455 -0
  174. numpy/_core/tests/test_item_selection.py +167 -0
  175. numpy/_core/tests/test_limited_api.py +102 -0
  176. numpy/_core/tests/test_longdouble.py +369 -0
  177. numpy/_core/tests/test_machar.py +30 -0
  178. numpy/_core/tests/test_mem_overlap.py +930 -0
  179. numpy/_core/tests/test_mem_policy.py +452 -0
  180. numpy/_core/tests/test_memmap.py +246 -0
  181. numpy/_core/tests/test_multiarray.py +10577 -0
  182. numpy/_core/tests/test_multithreading.py +292 -0
  183. numpy/_core/tests/test_nditer.py +3498 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4247 -0
  186. numpy/_core/tests/test_numerictypes.py +651 -0
  187. numpy/_core/tests/test_overrides.py +791 -0
  188. numpy/_core/tests/test_print.py +200 -0
  189. numpy/_core/tests/test_protocols.py +46 -0
  190. numpy/_core/tests/test_records.py +544 -0
  191. numpy/_core/tests/test_regression.py +2670 -0
  192. numpy/_core/tests/test_scalar_ctors.py +207 -0
  193. numpy/_core/tests/test_scalar_methods.py +246 -0
  194. numpy/_core/tests/test_scalarbuffer.py +153 -0
  195. numpy/_core/tests/test_scalarinherit.py +105 -0
  196. numpy/_core/tests/test_scalarmath.py +1176 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +891 -0
  199. numpy/_core/tests/test_simd.py +1341 -0
  200. numpy/_core/tests/test_simd_module.py +103 -0
  201. numpy/_core/tests/test_stringdtype.py +1814 -0
  202. numpy/_core/tests/test_strings.py +1499 -0
  203. numpy/_core/tests/test_ufunc.py +3313 -0
  204. numpy/_core/tests/test_umath.py +4928 -0
  205. numpy/_core/tests/test_umath_accuracy.py +124 -0
  206. numpy/_core/tests/test_umath_complex.py +626 -0
  207. numpy/_core/tests/test_unicode.py +368 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +197 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +79 -0
  213. numpy/_expired_attrs_2_0.pyi +62 -0
  214. numpy/_globals.py +96 -0
  215. numpy/_globals.pyi +17 -0
  216. numpy/_pyinstaller/__init__.py +0 -0
  217. numpy/_pyinstaller/__init__.pyi +0 -0
  218. numpy/_pyinstaller/hook-numpy.py +36 -0
  219. numpy/_pyinstaller/hook-numpy.pyi +13 -0
  220. numpy/_pyinstaller/tests/__init__.py +16 -0
  221. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  222. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  223. numpy/_pytesttester.py +201 -0
  224. numpy/_pytesttester.pyi +18 -0
  225. numpy/_typing/__init__.py +148 -0
  226. numpy/_typing/_add_docstring.py +153 -0
  227. numpy/_typing/_array_like.py +106 -0
  228. numpy/_typing/_char_codes.py +213 -0
  229. numpy/_typing/_dtype_like.py +114 -0
  230. numpy/_typing/_extended_precision.py +15 -0
  231. numpy/_typing/_nbit.py +19 -0
  232. numpy/_typing/_nbit_base.py +94 -0
  233. numpy/_typing/_nbit_base.pyi +40 -0
  234. numpy/_typing/_nested_sequence.py +79 -0
  235. numpy/_typing/_scalars.py +20 -0
  236. numpy/_typing/_shape.py +8 -0
  237. numpy/_typing/_ufunc.py +7 -0
  238. numpy/_typing/_ufunc.pyi +941 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +30 -0
  241. numpy/_utils/_convertions.py +18 -0
  242. numpy/_utils/_convertions.pyi +4 -0
  243. numpy/_utils/_inspect.py +192 -0
  244. numpy/_utils/_inspect.pyi +71 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +121 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +258 -0
  250. numpy/core/__init__.py +33 -0
  251. numpy/core/__init__.pyi +0 -0
  252. numpy/core/_dtype.py +10 -0
  253. numpy/core/_dtype.pyi +0 -0
  254. numpy/core/_dtype_ctypes.py +10 -0
  255. numpy/core/_dtype_ctypes.pyi +0 -0
  256. numpy/core/_internal.py +27 -0
  257. numpy/core/_multiarray_umath.py +57 -0
  258. numpy/core/_utils.py +21 -0
  259. numpy/core/arrayprint.py +10 -0
  260. numpy/core/defchararray.py +10 -0
  261. numpy/core/einsumfunc.py +10 -0
  262. numpy/core/fromnumeric.py +10 -0
  263. numpy/core/function_base.py +10 -0
  264. numpy/core/getlimits.py +10 -0
  265. numpy/core/multiarray.py +25 -0
  266. numpy/core/numeric.py +12 -0
  267. numpy/core/numerictypes.py +10 -0
  268. numpy/core/overrides.py +10 -0
  269. numpy/core/overrides.pyi +7 -0
  270. numpy/core/records.py +10 -0
  271. numpy/core/shape_base.py +10 -0
  272. numpy/core/umath.py +10 -0
  273. numpy/ctypeslib/__init__.py +13 -0
  274. numpy/ctypeslib/__init__.pyi +33 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +245 -0
  277. numpy/doc/ufuncs.py +138 -0
  278. numpy/dtypes.py +41 -0
  279. numpy/dtypes.pyi +631 -0
  280. numpy/exceptions.py +247 -0
  281. numpy/exceptions.pyi +27 -0
  282. numpy/f2py/__init__.py +86 -0
  283. numpy/f2py/__init__.pyi +6 -0
  284. numpy/f2py/__main__.py +5 -0
  285. numpy/f2py/__version__.py +1 -0
  286. numpy/f2py/__version__.pyi +1 -0
  287. numpy/f2py/_backends/__init__.py +9 -0
  288. numpy/f2py/_backends/__init__.pyi +5 -0
  289. numpy/f2py/_backends/_backend.py +44 -0
  290. numpy/f2py/_backends/_backend.pyi +46 -0
  291. numpy/f2py/_backends/_distutils.py +76 -0
  292. numpy/f2py/_backends/_distutils.pyi +13 -0
  293. numpy/f2py/_backends/_meson.py +231 -0
  294. numpy/f2py/_backends/_meson.pyi +63 -0
  295. numpy/f2py/_backends/meson.build.template +55 -0
  296. numpy/f2py/_isocbind.py +62 -0
  297. numpy/f2py/_isocbind.pyi +13 -0
  298. numpy/f2py/_src_pyf.py +247 -0
  299. numpy/f2py/_src_pyf.pyi +29 -0
  300. numpy/f2py/auxfuncs.py +1004 -0
  301. numpy/f2py/auxfuncs.pyi +264 -0
  302. numpy/f2py/capi_maps.py +811 -0
  303. numpy/f2py/capi_maps.pyi +33 -0
  304. numpy/f2py/cb_rules.py +665 -0
  305. numpy/f2py/cb_rules.pyi +17 -0
  306. numpy/f2py/cfuncs.py +1563 -0
  307. numpy/f2py/cfuncs.pyi +31 -0
  308. numpy/f2py/common_rules.py +143 -0
  309. numpy/f2py/common_rules.pyi +9 -0
  310. numpy/f2py/crackfortran.py +3725 -0
  311. numpy/f2py/crackfortran.pyi +258 -0
  312. numpy/f2py/diagnose.py +149 -0
  313. numpy/f2py/diagnose.pyi +1 -0
  314. numpy/f2py/f2py2e.py +786 -0
  315. numpy/f2py/f2py2e.pyi +76 -0
  316. numpy/f2py/f90mod_rules.py +269 -0
  317. numpy/f2py/f90mod_rules.pyi +16 -0
  318. numpy/f2py/func2subr.py +329 -0
  319. numpy/f2py/func2subr.pyi +7 -0
  320. numpy/f2py/rules.py +1629 -0
  321. numpy/f2py/rules.pyi +43 -0
  322. numpy/f2py/setup.cfg +3 -0
  323. numpy/f2py/src/fortranobject.c +1436 -0
  324. numpy/f2py/src/fortranobject.h +173 -0
  325. numpy/f2py/symbolic.py +1516 -0
  326. numpy/f2py/symbolic.pyi +221 -0
  327. numpy/f2py/tests/__init__.py +16 -0
  328. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  329. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  330. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  331. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  332. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  333. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  334. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  335. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  336. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  337. numpy/f2py/tests/src/callback/foo.f +62 -0
  338. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  339. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  340. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  341. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  342. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  343. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  344. numpy/f2py/tests/src/cli/hi77.f +3 -0
  345. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  346. numpy/f2py/tests/src/common/block.f +11 -0
  347. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  348. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  349. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  350. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  351. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  352. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  353. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  354. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  355. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  356. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  357. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  358. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  359. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  360. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  361. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  362. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  363. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  364. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  365. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  366. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  367. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  368. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  369. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  370. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  371. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  372. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  373. numpy/f2py/tests/src/mixed/foo.f +5 -0
  374. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  375. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  376. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  377. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  378. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  379. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  380. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  381. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  382. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  383. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  384. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  385. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  386. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  387. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  388. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  389. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  390. numpy/f2py/tests/src/regression/AB.inc +1 -0
  391. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  392. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  393. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  394. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  395. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  396. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  397. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  398. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  399. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  400. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  401. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  402. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  403. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  404. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  405. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  406. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  407. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  408. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  409. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  410. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  411. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  412. numpy/f2py/tests/src/routines/subrout.f +4 -0
  413. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  414. numpy/f2py/tests/src/size/foo.f90 +44 -0
  415. numpy/f2py/tests/src/string/char.f90 +29 -0
  416. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  417. numpy/f2py/tests/src/string/gh24008.f +8 -0
  418. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  419. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  420. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  421. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  422. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  423. numpy/f2py/tests/src/string/string.f +12 -0
  424. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  425. numpy/f2py/tests/test_abstract_interface.py +26 -0
  426. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  427. numpy/f2py/tests/test_assumed_shape.py +50 -0
  428. numpy/f2py/tests/test_block_docstring.py +20 -0
  429. numpy/f2py/tests/test_callback.py +263 -0
  430. numpy/f2py/tests/test_character.py +641 -0
  431. numpy/f2py/tests/test_common.py +23 -0
  432. numpy/f2py/tests/test_crackfortran.py +421 -0
  433. numpy/f2py/tests/test_data.py +71 -0
  434. numpy/f2py/tests/test_docs.py +64 -0
  435. numpy/f2py/tests/test_f2cmap.py +17 -0
  436. numpy/f2py/tests/test_f2py2e.py +964 -0
  437. numpy/f2py/tests/test_isoc.py +56 -0
  438. numpy/f2py/tests/test_kind.py +53 -0
  439. numpy/f2py/tests/test_mixed.py +35 -0
  440. numpy/f2py/tests/test_modules.py +83 -0
  441. numpy/f2py/tests/test_parameter.py +129 -0
  442. numpy/f2py/tests/test_pyf_src.py +43 -0
  443. numpy/f2py/tests/test_quoted_character.py +18 -0
  444. numpy/f2py/tests/test_regression.py +187 -0
  445. numpy/f2py/tests/test_return_character.py +48 -0
  446. numpy/f2py/tests/test_return_complex.py +67 -0
  447. numpy/f2py/tests/test_return_integer.py +55 -0
  448. numpy/f2py/tests/test_return_logical.py +65 -0
  449. numpy/f2py/tests/test_return_real.py +109 -0
  450. numpy/f2py/tests/test_routines.py +29 -0
  451. numpy/f2py/tests/test_semicolon_split.py +75 -0
  452. numpy/f2py/tests/test_size.py +45 -0
  453. numpy/f2py/tests/test_string.py +100 -0
  454. numpy/f2py/tests/test_symbolic.py +495 -0
  455. numpy/f2py/tests/test_value_attrspec.py +15 -0
  456. numpy/f2py/tests/util.py +442 -0
  457. numpy/f2py/use_rules.py +99 -0
  458. numpy/f2py/use_rules.pyi +9 -0
  459. numpy/fft/__init__.py +215 -0
  460. numpy/fft/__init__.pyi +43 -0
  461. numpy/fft/_helper.py +235 -0
  462. numpy/fft/_helper.pyi +45 -0
  463. numpy/fft/_pocketfft.py +1693 -0
  464. numpy/fft/_pocketfft.pyi +138 -0
  465. numpy/fft/_pocketfft_umath.cpython-313-darwin.so +0 -0
  466. numpy/fft/helper.py +17 -0
  467. numpy/fft/helper.pyi +22 -0
  468. numpy/fft/tests/__init__.py +0 -0
  469. numpy/fft/tests/test_helper.py +167 -0
  470. numpy/fft/tests/test_pocketfft.py +589 -0
  471. numpy/lib/__init__.py +97 -0
  472. numpy/lib/__init__.pyi +44 -0
  473. numpy/lib/_array_utils_impl.py +62 -0
  474. numpy/lib/_array_utils_impl.pyi +26 -0
  475. numpy/lib/_arraypad_impl.py +890 -0
  476. numpy/lib/_arraypad_impl.pyi +89 -0
  477. numpy/lib/_arraysetops_impl.py +1260 -0
  478. numpy/lib/_arraysetops_impl.pyi +468 -0
  479. numpy/lib/_arrayterator_impl.py +224 -0
  480. numpy/lib/_arrayterator_impl.pyi +46 -0
  481. numpy/lib/_datasource.py +700 -0
  482. numpy/lib/_datasource.pyi +31 -0
  483. numpy/lib/_format_impl.py +1036 -0
  484. numpy/lib/_format_impl.pyi +26 -0
  485. numpy/lib/_function_base_impl.py +5844 -0
  486. numpy/lib/_function_base_impl.pyi +1164 -0
  487. numpy/lib/_histograms_impl.py +1085 -0
  488. numpy/lib/_histograms_impl.pyi +50 -0
  489. numpy/lib/_index_tricks_impl.py +1067 -0
  490. numpy/lib/_index_tricks_impl.pyi +208 -0
  491. numpy/lib/_iotools.py +900 -0
  492. numpy/lib/_iotools.pyi +114 -0
  493. numpy/lib/_nanfunctions_impl.py +2024 -0
  494. numpy/lib/_nanfunctions_impl.pyi +52 -0
  495. numpy/lib/_npyio_impl.py +2596 -0
  496. numpy/lib/_npyio_impl.pyi +301 -0
  497. numpy/lib/_polynomial_impl.py +1465 -0
  498. numpy/lib/_polynomial_impl.pyi +318 -0
  499. numpy/lib/_scimath_impl.py +642 -0
  500. numpy/lib/_scimath_impl.pyi +93 -0
  501. numpy/lib/_shape_base_impl.py +1301 -0
  502. numpy/lib/_shape_base_impl.pyi +235 -0
  503. numpy/lib/_stride_tricks_impl.py +549 -0
  504. numpy/lib/_stride_tricks_impl.pyi +74 -0
  505. numpy/lib/_twodim_base_impl.py +1201 -0
  506. numpy/lib/_twodim_base_impl.pyi +438 -0
  507. numpy/lib/_type_check_impl.py +699 -0
  508. numpy/lib/_type_check_impl.pyi +350 -0
  509. numpy/lib/_ufunclike_impl.py +207 -0
  510. numpy/lib/_ufunclike_impl.pyi +67 -0
  511. numpy/lib/_user_array_impl.py +299 -0
  512. numpy/lib/_user_array_impl.pyi +225 -0
  513. numpy/lib/_utils_impl.py +784 -0
  514. numpy/lib/_utils_impl.pyi +10 -0
  515. numpy/lib/_version.py +154 -0
  516. numpy/lib/_version.pyi +17 -0
  517. numpy/lib/array_utils.py +7 -0
  518. numpy/lib/array_utils.pyi +12 -0
  519. numpy/lib/format.py +24 -0
  520. numpy/lib/format.pyi +66 -0
  521. numpy/lib/introspect.py +95 -0
  522. numpy/lib/introspect.pyi +3 -0
  523. numpy/lib/mixins.py +180 -0
  524. numpy/lib/mixins.pyi +77 -0
  525. numpy/lib/npyio.py +1 -0
  526. numpy/lib/npyio.pyi +9 -0
  527. numpy/lib/recfunctions.py +1681 -0
  528. numpy/lib/recfunctions.pyi +435 -0
  529. numpy/lib/scimath.py +13 -0
  530. numpy/lib/scimath.pyi +30 -0
  531. numpy/lib/stride_tricks.py +1 -0
  532. numpy/lib/stride_tricks.pyi +6 -0
  533. numpy/lib/tests/__init__.py +0 -0
  534. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  535. numpy/lib/tests/data/py2-objarr.npy +0 -0
  536. numpy/lib/tests/data/py2-objarr.npz +0 -0
  537. numpy/lib/tests/data/py3-objarr.npy +0 -0
  538. numpy/lib/tests/data/py3-objarr.npz +0 -0
  539. numpy/lib/tests/data/python3.npy +0 -0
  540. numpy/lib/tests/data/win64python2.npy +0 -0
  541. numpy/lib/tests/test__datasource.py +352 -0
  542. numpy/lib/tests/test__iotools.py +360 -0
  543. numpy/lib/tests/test__version.py +64 -0
  544. numpy/lib/tests/test_array_utils.py +32 -0
  545. numpy/lib/tests/test_arraypad.py +1415 -0
  546. numpy/lib/tests/test_arraysetops.py +1074 -0
  547. numpy/lib/tests/test_arrayterator.py +46 -0
  548. numpy/lib/tests/test_format.py +1054 -0
  549. numpy/lib/tests/test_function_base.py +4573 -0
  550. numpy/lib/tests/test_histograms.py +855 -0
  551. numpy/lib/tests/test_index_tricks.py +573 -0
  552. numpy/lib/tests/test_io.py +2848 -0
  553. numpy/lib/tests/test_loadtxt.py +1101 -0
  554. numpy/lib/tests/test_mixins.py +215 -0
  555. numpy/lib/tests/test_nanfunctions.py +1438 -0
  556. numpy/lib/tests/test_packbits.py +376 -0
  557. numpy/lib/tests/test_polynomial.py +320 -0
  558. numpy/lib/tests/test_recfunctions.py +1052 -0
  559. numpy/lib/tests/test_regression.py +231 -0
  560. numpy/lib/tests/test_shape_base.py +813 -0
  561. numpy/lib/tests/test_stride_tricks.py +656 -0
  562. numpy/lib/tests/test_twodim_base.py +559 -0
  563. numpy/lib/tests/test_type_check.py +473 -0
  564. numpy/lib/tests/test_ufunclike.py +97 -0
  565. numpy/lib/tests/test_utils.py +80 -0
  566. numpy/lib/user_array.py +1 -0
  567. numpy/lib/user_array.pyi +1 -0
  568. numpy/linalg/__init__.py +98 -0
  569. numpy/linalg/__init__.pyi +73 -0
  570. numpy/linalg/_linalg.py +3682 -0
  571. numpy/linalg/_linalg.pyi +475 -0
  572. numpy/linalg/_umath_linalg.cpython-313-darwin.so +0 -0
  573. numpy/linalg/_umath_linalg.pyi +61 -0
  574. numpy/linalg/lapack_lite.cpython-313-darwin.so +0 -0
  575. numpy/linalg/lapack_lite.pyi +141 -0
  576. numpy/linalg/linalg.py +17 -0
  577. numpy/linalg/linalg.pyi +69 -0
  578. numpy/linalg/tests/__init__.py +0 -0
  579. numpy/linalg/tests/test_deprecations.py +20 -0
  580. numpy/linalg/tests/test_linalg.py +2443 -0
  581. numpy/linalg/tests/test_regression.py +181 -0
  582. numpy/ma/API_CHANGES.txt +135 -0
  583. numpy/ma/LICENSE +24 -0
  584. numpy/ma/README.rst +236 -0
  585. numpy/ma/__init__.py +53 -0
  586. numpy/ma/__init__.pyi +458 -0
  587. numpy/ma/core.py +8933 -0
  588. numpy/ma/core.pyi +1462 -0
  589. numpy/ma/extras.py +2344 -0
  590. numpy/ma/extras.pyi +138 -0
  591. numpy/ma/mrecords.py +773 -0
  592. numpy/ma/mrecords.pyi +96 -0
  593. numpy/ma/tests/__init__.py +0 -0
  594. numpy/ma/tests/test_arrayobject.py +40 -0
  595. numpy/ma/tests/test_core.py +5886 -0
  596. numpy/ma/tests/test_deprecations.py +87 -0
  597. numpy/ma/tests/test_extras.py +1998 -0
  598. numpy/ma/tests/test_mrecords.py +497 -0
  599. numpy/ma/tests/test_old_ma.py +942 -0
  600. numpy/ma/tests/test_regression.py +100 -0
  601. numpy/ma/tests/test_subclassing.py +469 -0
  602. numpy/ma/testutils.py +294 -0
  603. numpy/matlib.py +380 -0
  604. numpy/matlib.pyi +582 -0
  605. numpy/matrixlib/__init__.py +12 -0
  606. numpy/matrixlib/__init__.pyi +5 -0
  607. numpy/matrixlib/defmatrix.py +1119 -0
  608. numpy/matrixlib/defmatrix.pyi +17 -0
  609. numpy/matrixlib/tests/__init__.py +0 -0
  610. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  611. numpy/matrixlib/tests/test_interaction.py +360 -0
  612. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  613. numpy/matrixlib/tests/test_matrix_linalg.py +105 -0
  614. numpy/matrixlib/tests/test_multiarray.py +17 -0
  615. numpy/matrixlib/tests/test_numeric.py +18 -0
  616. numpy/matrixlib/tests/test_regression.py +31 -0
  617. numpy/polynomial/__init__.py +187 -0
  618. numpy/polynomial/__init__.pyi +25 -0
  619. numpy/polynomial/_polybase.py +1191 -0
  620. numpy/polynomial/_polybase.pyi +285 -0
  621. numpy/polynomial/_polytypes.pyi +892 -0
  622. numpy/polynomial/chebyshev.py +2003 -0
  623. numpy/polynomial/chebyshev.pyi +181 -0
  624. numpy/polynomial/hermite.py +1740 -0
  625. numpy/polynomial/hermite.pyi +107 -0
  626. numpy/polynomial/hermite_e.py +1642 -0
  627. numpy/polynomial/hermite_e.pyi +107 -0
  628. numpy/polynomial/laguerre.py +1675 -0
  629. numpy/polynomial/laguerre.pyi +100 -0
  630. numpy/polynomial/legendre.py +1605 -0
  631. numpy/polynomial/legendre.pyi +100 -0
  632. numpy/polynomial/polynomial.py +1616 -0
  633. numpy/polynomial/polynomial.pyi +89 -0
  634. numpy/polynomial/polyutils.py +759 -0
  635. numpy/polynomial/polyutils.pyi +423 -0
  636. numpy/polynomial/tests/__init__.py +0 -0
  637. numpy/polynomial/tests/test_chebyshev.py +623 -0
  638. numpy/polynomial/tests/test_classes.py +618 -0
  639. numpy/polynomial/tests/test_hermite.py +558 -0
  640. numpy/polynomial/tests/test_hermite_e.py +559 -0
  641. numpy/polynomial/tests/test_laguerre.py +540 -0
  642. numpy/polynomial/tests/test_legendre.py +571 -0
  643. numpy/polynomial/tests/test_polynomial.py +669 -0
  644. numpy/polynomial/tests/test_polyutils.py +128 -0
  645. numpy/polynomial/tests/test_printing.py +555 -0
  646. numpy/polynomial/tests/test_symbol.py +217 -0
  647. numpy/py.typed +0 -0
  648. numpy/random/LICENSE.md +71 -0
  649. numpy/random/__init__.pxd +14 -0
  650. numpy/random/__init__.py +213 -0
  651. numpy/random/__init__.pyi +124 -0
  652. numpy/random/_bounded_integers.cpython-313-darwin.so +0 -0
  653. numpy/random/_bounded_integers.pxd +29 -0
  654. numpy/random/_bounded_integers.pyi +1 -0
  655. numpy/random/_common.cpython-313-darwin.so +0 -0
  656. numpy/random/_common.pxd +107 -0
  657. numpy/random/_common.pyi +16 -0
  658. numpy/random/_examples/cffi/extending.py +44 -0
  659. numpy/random/_examples/cffi/parse.py +53 -0
  660. numpy/random/_examples/cython/extending.pyx +77 -0
  661. numpy/random/_examples/cython/extending_distributions.pyx +118 -0
  662. numpy/random/_examples/cython/meson.build +53 -0
  663. numpy/random/_examples/numba/extending.py +86 -0
  664. numpy/random/_examples/numba/extending_distributions.py +67 -0
  665. numpy/random/_generator.cpython-313-darwin.so +0 -0
  666. numpy/random/_generator.pyi +861 -0
  667. numpy/random/_mt19937.cpython-313-darwin.so +0 -0
  668. numpy/random/_mt19937.pyi +25 -0
  669. numpy/random/_pcg64.cpython-313-darwin.so +0 -0
  670. numpy/random/_pcg64.pyi +44 -0
  671. numpy/random/_philox.cpython-313-darwin.so +0 -0
  672. numpy/random/_philox.pyi +39 -0
  673. numpy/random/_pickle.py +88 -0
  674. numpy/random/_pickle.pyi +43 -0
  675. numpy/random/_sfc64.cpython-313-darwin.so +0 -0
  676. numpy/random/_sfc64.pyi +28 -0
  677. numpy/random/bit_generator.cpython-313-darwin.so +0 -0
  678. numpy/random/bit_generator.pxd +35 -0
  679. numpy/random/bit_generator.pyi +124 -0
  680. numpy/random/c_distributions.pxd +119 -0
  681. numpy/random/lib/libnpyrandom.a +0 -0
  682. numpy/random/mtrand.cpython-313-darwin.so +0 -0
  683. numpy/random/mtrand.pyi +703 -0
  684. numpy/random/tests/__init__.py +0 -0
  685. numpy/random/tests/data/__init__.py +0 -0
  686. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  687. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  688. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  689. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  690. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  691. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  692. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  693. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  694. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  695. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  696. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  697. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  698. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  699. numpy/random/tests/test_direct.py +592 -0
  700. numpy/random/tests/test_extending.py +127 -0
  701. numpy/random/tests/test_generator_mt19937.py +2809 -0
  702. numpy/random/tests/test_generator_mt19937_regressions.py +207 -0
  703. numpy/random/tests/test_random.py +1757 -0
  704. numpy/random/tests/test_randomstate.py +2130 -0
  705. numpy/random/tests/test_randomstate_regression.py +217 -0
  706. numpy/random/tests/test_regression.py +152 -0
  707. numpy/random/tests/test_seed_sequence.py +79 -0
  708. numpy/random/tests/test_smoke.py +819 -0
  709. numpy/rec/__init__.py +2 -0
  710. numpy/rec/__init__.pyi +23 -0
  711. numpy/strings/__init__.py +2 -0
  712. numpy/strings/__init__.pyi +97 -0
  713. numpy/testing/__init__.py +22 -0
  714. numpy/testing/__init__.pyi +102 -0
  715. numpy/testing/_private/__init__.py +0 -0
  716. numpy/testing/_private/__init__.pyi +0 -0
  717. numpy/testing/_private/extbuild.py +250 -0
  718. numpy/testing/_private/extbuild.pyi +25 -0
  719. numpy/testing/_private/utils.py +2752 -0
  720. numpy/testing/_private/utils.pyi +499 -0
  721. numpy/testing/overrides.py +84 -0
  722. numpy/testing/overrides.pyi +11 -0
  723. numpy/testing/print_coercion_tables.py +207 -0
  724. numpy/testing/print_coercion_tables.pyi +27 -0
  725. numpy/testing/tests/__init__.py +0 -0
  726. numpy/testing/tests/test_utils.py +1917 -0
  727. numpy/tests/__init__.py +0 -0
  728. numpy/tests/test__all__.py +10 -0
  729. numpy/tests/test_configtool.py +48 -0
  730. numpy/tests/test_ctypeslib.py +377 -0
  731. numpy/tests/test_lazyloading.py +38 -0
  732. numpy/tests/test_matlib.py +59 -0
  733. numpy/tests/test_numpy_config.py +46 -0
  734. numpy/tests/test_numpy_version.py +54 -0
  735. numpy/tests/test_public_api.py +806 -0
  736. numpy/tests/test_reloading.py +74 -0
  737. numpy/tests/test_scripts.py +49 -0
  738. numpy/tests/test_warnings.py +78 -0
  739. numpy/typing/__init__.py +201 -0
  740. numpy/typing/mypy_plugin.py +195 -0
  741. numpy/typing/tests/__init__.py +0 -0
  742. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  743. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  744. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  745. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  746. numpy/typing/tests/data/fail/arrayprint.pyi +16 -0
  747. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  748. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  749. numpy/typing/tests/data/fail/char.pyi +65 -0
  750. numpy/typing/tests/data/fail/chararray.pyi +62 -0
  751. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  752. numpy/typing/tests/data/fail/constants.pyi +3 -0
  753. numpy/typing/tests/data/fail/datasource.pyi +15 -0
  754. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  755. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  756. numpy/typing/tests/data/fail/flatiter.pyi +20 -0
  757. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  758. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  759. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  760. numpy/typing/tests/data/fail/lib_function_base.pyi +62 -0
  761. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  762. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  763. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  764. numpy/typing/tests/data/fail/linalg.pyi +48 -0
  765. numpy/typing/tests/data/fail/ma.pyi +143 -0
  766. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  767. numpy/typing/tests/data/fail/modules.pyi +17 -0
  768. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  769. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  770. numpy/typing/tests/data/fail/ndarray_misc.pyi +36 -0
  771. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  772. numpy/typing/tests/data/fail/nested_sequence.pyi +16 -0
  773. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  774. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  775. numpy/typing/tests/data/fail/random.pyi +62 -0
  776. numpy/typing/tests/data/fail/rec.pyi +17 -0
  777. numpy/typing/tests/data/fail/scalars.pyi +87 -0
  778. numpy/typing/tests/data/fail/shape.pyi +6 -0
  779. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  780. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  781. numpy/typing/tests/data/fail/strings.pyi +52 -0
  782. numpy/typing/tests/data/fail/testing.pyi +28 -0
  783. numpy/typing/tests/data/fail/twodim_base.pyi +32 -0
  784. numpy/typing/tests/data/fail/type_check.pyi +13 -0
  785. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  786. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  787. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  788. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  789. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  790. numpy/typing/tests/data/mypy.ini +9 -0
  791. numpy/typing/tests/data/pass/arithmetic.py +612 -0
  792. numpy/typing/tests/data/pass/array_constructors.py +137 -0
  793. numpy/typing/tests/data/pass/array_like.py +43 -0
  794. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  795. numpy/typing/tests/data/pass/arrayterator.py +27 -0
  796. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  797. numpy/typing/tests/data/pass/comparisons.py +315 -0
  798. numpy/typing/tests/data/pass/dtype.py +57 -0
  799. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  800. numpy/typing/tests/data/pass/flatiter.py +19 -0
  801. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  802. numpy/typing/tests/data/pass/index_tricks.py +60 -0
  803. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  804. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  805. numpy/typing/tests/data/pass/lib_version.py +18 -0
  806. numpy/typing/tests/data/pass/literal.py +51 -0
  807. numpy/typing/tests/data/pass/ma.py +174 -0
  808. numpy/typing/tests/data/pass/mod.py +149 -0
  809. numpy/typing/tests/data/pass/modules.py +45 -0
  810. numpy/typing/tests/data/pass/multiarray.py +76 -0
  811. numpy/typing/tests/data/pass/ndarray_conversion.py +87 -0
  812. numpy/typing/tests/data/pass/ndarray_misc.py +203 -0
  813. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  814. numpy/typing/tests/data/pass/nditer.py +4 -0
  815. numpy/typing/tests/data/pass/numeric.py +95 -0
  816. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  817. numpy/typing/tests/data/pass/random.py +1497 -0
  818. numpy/typing/tests/data/pass/recfunctions.py +161 -0
  819. numpy/typing/tests/data/pass/scalars.py +248 -0
  820. numpy/typing/tests/data/pass/shape.py +19 -0
  821. numpy/typing/tests/data/pass/simple.py +168 -0
  822. numpy/typing/tests/data/pass/simple_py3.py +6 -0
  823. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  824. numpy/typing/tests/data/pass/ufunclike.py +47 -0
  825. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  826. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  827. numpy/typing/tests/data/reveal/arithmetic.pyi +720 -0
  828. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  829. numpy/typing/tests/data/reveal/array_constructors.pyi +249 -0
  830. numpy/typing/tests/data/reveal/arraypad.pyi +22 -0
  831. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  832. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  833. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  834. numpy/typing/tests/data/reveal/bitwise_ops.pyi +167 -0
  835. numpy/typing/tests/data/reveal/char.pyi +224 -0
  836. numpy/typing/tests/data/reveal/chararray.pyi +137 -0
  837. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  838. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  839. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  840. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  841. numpy/typing/tests/data/reveal/dtype.pyi +136 -0
  842. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  843. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  844. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  845. numpy/typing/tests/data/reveal/flatiter.pyi +47 -0
  846. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  847. numpy/typing/tests/data/reveal/getlimits.pyi +51 -0
  848. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  849. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  850. numpy/typing/tests/data/reveal/lib_function_base.pyi +213 -0
  851. numpy/typing/tests/data/reveal/lib_polynomial.pyi +144 -0
  852. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  853. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  854. numpy/typing/tests/data/reveal/linalg.pyi +132 -0
  855. numpy/typing/tests/data/reveal/ma.pyi +369 -0
  856. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  857. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  858. numpy/typing/tests/data/reveal/mod.pyi +179 -0
  859. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  860. numpy/typing/tests/data/reveal/multiarray.pyi +194 -0
  861. numpy/typing/tests/data/reveal/nbit_base_example.pyi +21 -0
  862. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +77 -0
  863. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +85 -0
  864. numpy/typing/tests/data/reveal/ndarray_misc.pyi +247 -0
  865. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +39 -0
  866. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  867. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  868. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  869. numpy/typing/tests/data/reveal/numeric.pyi +134 -0
  870. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  871. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +220 -0
  872. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +219 -0
  873. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  874. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  875. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  876. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  877. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  878. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  879. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  880. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  881. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  882. numpy/typing/tests/data/reveal/twodim_base.pyi +145 -0
  883. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  884. numpy/typing/tests/data/reveal/ufunc_config.pyi +30 -0
  885. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  886. numpy/typing/tests/data/reveal/ufuncs.pyi +123 -0
  887. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  888. numpy/typing/tests/test_isfile.py +32 -0
  889. numpy/typing/tests/test_runtime.py +102 -0
  890. numpy/typing/tests/test_typing.py +205 -0
  891. numpy/version.py +11 -0
  892. numpy/version.pyi +18 -0
  893. numpy-2.3.5.dist-info/LICENSE.txt +971 -0
  894. numpy-2.3.5.dist-info/METADATA +1093 -0
  895. numpy-2.3.5.dist-info/RECORD +897 -0
  896. numpy-2.3.5.dist-info/WHEEL +6 -0
  897. numpy-2.3.5.dist-info/entry_points.txt +13 -0
@@ -0,0 +1,2003 @@
1
+ """
2
+ ====================================================
3
+ Chebyshev Series (:mod:`numpy.polynomial.chebyshev`)
4
+ ====================================================
5
+
6
+ This module provides a number of objects (mostly functions) useful for
7
+ dealing with Chebyshev series, including a `Chebyshev` 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
+
15
+ .. autosummary::
16
+ :toctree: generated/
17
+
18
+ Chebyshev
19
+
20
+
21
+ Constants
22
+ ---------
23
+
24
+ .. autosummary::
25
+ :toctree: generated/
26
+
27
+ chebdomain
28
+ chebzero
29
+ chebone
30
+ chebx
31
+
32
+ Arithmetic
33
+ ----------
34
+
35
+ .. autosummary::
36
+ :toctree: generated/
37
+
38
+ chebadd
39
+ chebsub
40
+ chebmulx
41
+ chebmul
42
+ chebdiv
43
+ chebpow
44
+ chebval
45
+ chebval2d
46
+ chebval3d
47
+ chebgrid2d
48
+ chebgrid3d
49
+
50
+ Calculus
51
+ --------
52
+
53
+ .. autosummary::
54
+ :toctree: generated/
55
+
56
+ chebder
57
+ chebint
58
+
59
+ Misc Functions
60
+ --------------
61
+
62
+ .. autosummary::
63
+ :toctree: generated/
64
+
65
+ chebfromroots
66
+ chebroots
67
+ chebvander
68
+ chebvander2d
69
+ chebvander3d
70
+ chebgauss
71
+ chebweight
72
+ chebcompanion
73
+ chebfit
74
+ chebpts1
75
+ chebpts2
76
+ chebtrim
77
+ chebline
78
+ cheb2poly
79
+ poly2cheb
80
+ chebinterpolate
81
+
82
+ See also
83
+ --------
84
+ `numpy.polynomial`
85
+
86
+ Notes
87
+ -----
88
+ The implementations of multiplication, division, integration, and
89
+ differentiation use the algebraic identities [1]_:
90
+
91
+ .. math::
92
+ T_n(x) = \\frac{z^n + z^{-n}}{2} \\\\
93
+ z\\frac{dx}{dz} = \\frac{z - z^{-1}}{2}.
94
+
95
+ where
96
+
97
+ .. math:: x = \\frac{z + z^{-1}}{2}.
98
+
99
+ These identities allow a Chebyshev series to be expressed as a finite,
100
+ symmetric Laurent series. In this module, this sort of Laurent series
101
+ is referred to as a "z-series."
102
+
103
+ References
104
+ ----------
105
+ .. [1] A. T. Benjamin, et al., "Combinatorial Trigonometry with Chebyshev
106
+ Polynomials," *Journal of Statistical Planning and Inference 14*, 2008
107
+ (https://web.archive.org/web/20080221202153/https://www.math.hmc.edu/~benjamin/papers/CombTrig.pdf, pg. 4)
108
+
109
+ """ # noqa: E501
110
+ import numpy as np
111
+ import numpy.linalg as la
112
+ from numpy.lib.array_utils import normalize_axis_index
113
+
114
+ from . import polyutils as pu
115
+ from ._polybase import ABCPolyBase
116
+
117
+ __all__ = [
118
+ 'chebzero', 'chebone', 'chebx', 'chebdomain', 'chebline', 'chebadd',
119
+ 'chebsub', 'chebmulx', 'chebmul', 'chebdiv', 'chebpow', 'chebval',
120
+ 'chebder', 'chebint', 'cheb2poly', 'poly2cheb', 'chebfromroots',
121
+ 'chebvander', 'chebfit', 'chebtrim', 'chebroots', 'chebpts1',
122
+ 'chebpts2', 'Chebyshev', 'chebval2d', 'chebval3d', 'chebgrid2d',
123
+ 'chebgrid3d', 'chebvander2d', 'chebvander3d', 'chebcompanion',
124
+ 'chebgauss', 'chebweight', 'chebinterpolate']
125
+
126
+ chebtrim = pu.trimcoef
127
+
128
+ #
129
+ # A collection of functions for manipulating z-series. These are private
130
+ # functions and do minimal error checking.
131
+ #
132
+
133
+ def _cseries_to_zseries(c):
134
+ """Convert Chebyshev series to z-series.
135
+
136
+ Convert a Chebyshev series to the equivalent z-series. The result is
137
+ never an empty array. The dtype of the return is the same as that of
138
+ the input. No checks are run on the arguments as this routine is for
139
+ internal use.
140
+
141
+ Parameters
142
+ ----------
143
+ c : 1-D ndarray
144
+ Chebyshev coefficients, ordered from low to high
145
+
146
+ Returns
147
+ -------
148
+ zs : 1-D ndarray
149
+ Odd length symmetric z-series, ordered from low to high.
150
+
151
+ """
152
+ n = c.size
153
+ zs = np.zeros(2 * n - 1, dtype=c.dtype)
154
+ zs[n - 1:] = c / 2
155
+ return zs + zs[::-1]
156
+
157
+
158
+ def _zseries_to_cseries(zs):
159
+ """Convert z-series to a Chebyshev series.
160
+
161
+ Convert a z series to the equivalent Chebyshev series. The result is
162
+ never an empty array. The dtype of the return is the same as that of
163
+ the input. No checks are run on the arguments as this routine is for
164
+ internal use.
165
+
166
+ Parameters
167
+ ----------
168
+ zs : 1-D ndarray
169
+ Odd length symmetric z-series, ordered from low to high.
170
+
171
+ Returns
172
+ -------
173
+ c : 1-D ndarray
174
+ Chebyshev coefficients, ordered from low to high.
175
+
176
+ """
177
+ n = (zs.size + 1) // 2
178
+ c = zs[n - 1:].copy()
179
+ c[1:n] *= 2
180
+ return c
181
+
182
+
183
+ def _zseries_mul(z1, z2):
184
+ """Multiply two z-series.
185
+
186
+ Multiply two z-series to produce a z-series.
187
+
188
+ Parameters
189
+ ----------
190
+ z1, z2 : 1-D ndarray
191
+ The arrays must be 1-D but this is not checked.
192
+
193
+ Returns
194
+ -------
195
+ product : 1-D ndarray
196
+ The product z-series.
197
+
198
+ Notes
199
+ -----
200
+ This is simply convolution. If symmetric/anti-symmetric z-series are
201
+ denoted by S/A then the following rules apply:
202
+
203
+ S*S, A*A -> S
204
+ S*A, A*S -> A
205
+
206
+ """
207
+ return np.convolve(z1, z2)
208
+
209
+
210
+ def _zseries_div(z1, z2):
211
+ """Divide the first z-series by the second.
212
+
213
+ Divide `z1` by `z2` and return the quotient and remainder as z-series.
214
+ Warning: this implementation only applies when both z1 and z2 have the
215
+ same symmetry, which is sufficient for present purposes.
216
+
217
+ Parameters
218
+ ----------
219
+ z1, z2 : 1-D ndarray
220
+ The arrays must be 1-D and have the same symmetry, but this is not
221
+ checked.
222
+
223
+ Returns
224
+ -------
225
+
226
+ (quotient, remainder) : 1-D ndarrays
227
+ Quotient and remainder as z-series.
228
+
229
+ Notes
230
+ -----
231
+ This is not the same as polynomial division on account of the desired form
232
+ of the remainder. If symmetric/anti-symmetric z-series are denoted by S/A
233
+ then the following rules apply:
234
+
235
+ S/S -> S,S
236
+ A/A -> S,A
237
+
238
+ The restriction to types of the same symmetry could be fixed but seems like
239
+ unneeded generality. There is no natural form for the remainder in the case
240
+ where there is no symmetry.
241
+
242
+ """
243
+ z1 = z1.copy()
244
+ z2 = z2.copy()
245
+ lc1 = len(z1)
246
+ lc2 = len(z2)
247
+ if lc2 == 1:
248
+ z1 /= z2
249
+ return z1, z1[:1] * 0
250
+ elif lc1 < lc2:
251
+ return z1[:1] * 0, z1
252
+ else:
253
+ dlen = lc1 - lc2
254
+ scl = z2[0]
255
+ z2 /= scl
256
+ quo = np.empty(dlen + 1, dtype=z1.dtype)
257
+ i = 0
258
+ j = dlen
259
+ while i < j:
260
+ r = z1[i]
261
+ quo[i] = z1[i]
262
+ quo[dlen - i] = r
263
+ tmp = r * z2
264
+ z1[i:i + lc2] -= tmp
265
+ z1[j:j + lc2] -= tmp
266
+ i += 1
267
+ j -= 1
268
+ r = z1[i]
269
+ quo[i] = r
270
+ tmp = r * z2
271
+ z1[i:i + lc2] -= tmp
272
+ quo /= scl
273
+ rem = z1[i + 1:i - 1 + lc2].copy()
274
+ return quo, rem
275
+
276
+
277
+ def _zseries_der(zs):
278
+ """Differentiate a z-series.
279
+
280
+ The derivative is with respect to x, not z. This is achieved using the
281
+ chain rule and the value of dx/dz given in the module notes.
282
+
283
+ Parameters
284
+ ----------
285
+ zs : z-series
286
+ The z-series to differentiate.
287
+
288
+ Returns
289
+ -------
290
+ derivative : z-series
291
+ The derivative
292
+
293
+ Notes
294
+ -----
295
+ The zseries for x (ns) has been multiplied by two in order to avoid
296
+ using floats that are incompatible with Decimal and likely other
297
+ specialized scalar types. This scaling has been compensated by
298
+ multiplying the value of zs by two also so that the two cancels in the
299
+ division.
300
+
301
+ """
302
+ n = len(zs) // 2
303
+ ns = np.array([-1, 0, 1], dtype=zs.dtype)
304
+ zs *= np.arange(-n, n + 1) * 2
305
+ d, r = _zseries_div(zs, ns)
306
+ return d
307
+
308
+
309
+ def _zseries_int(zs):
310
+ """Integrate a z-series.
311
+
312
+ The integral is with respect to x, not z. This is achieved by a change
313
+ of variable using dx/dz given in the module notes.
314
+
315
+ Parameters
316
+ ----------
317
+ zs : z-series
318
+ The z-series to integrate
319
+
320
+ Returns
321
+ -------
322
+ integral : z-series
323
+ The indefinite integral
324
+
325
+ Notes
326
+ -----
327
+ The zseries for x (ns) has been multiplied by two in order to avoid
328
+ using floats that are incompatible with Decimal and likely other
329
+ specialized scalar types. This scaling has been compensated by
330
+ dividing the resulting zs by two.
331
+
332
+ """
333
+ n = 1 + len(zs) // 2
334
+ ns = np.array([-1, 0, 1], dtype=zs.dtype)
335
+ zs = _zseries_mul(zs, ns)
336
+ div = np.arange(-n, n + 1) * 2
337
+ zs[:n] /= div[:n]
338
+ zs[n + 1:] /= div[n + 1:]
339
+ zs[n] = 0
340
+ return zs
341
+
342
+ #
343
+ # Chebyshev series functions
344
+ #
345
+
346
+
347
+ def poly2cheb(pol):
348
+ """
349
+ Convert a polynomial to a Chebyshev series.
350
+
351
+ Convert an array representing the coefficients of a polynomial (relative
352
+ to the "standard" basis) ordered from lowest degree to highest, to an
353
+ array of the coefficients of the equivalent Chebyshev series, ordered
354
+ from lowest to highest degree.
355
+
356
+ Parameters
357
+ ----------
358
+ pol : array_like
359
+ 1-D array containing the polynomial coefficients
360
+
361
+ Returns
362
+ -------
363
+ c : ndarray
364
+ 1-D array containing the coefficients of the equivalent Chebyshev
365
+ series.
366
+
367
+ See Also
368
+ --------
369
+ cheb2poly
370
+
371
+ Notes
372
+ -----
373
+ The easy way to do conversions between polynomial basis sets
374
+ is to use the convert method of a class instance.
375
+
376
+ Examples
377
+ --------
378
+ >>> from numpy import polynomial as P
379
+ >>> p = P.Polynomial(range(4))
380
+ >>> p
381
+ Polynomial([0., 1., 2., 3.], domain=[-1., 1.], window=[-1., 1.], symbol='x')
382
+ >>> c = p.convert(kind=P.Chebyshev)
383
+ >>> c
384
+ Chebyshev([1. , 3.25, 1. , 0.75], domain=[-1., 1.], window=[-1., ...
385
+ >>> P.chebyshev.poly2cheb(range(4))
386
+ array([1. , 3.25, 1. , 0.75])
387
+
388
+ """
389
+ [pol] = pu.as_series([pol])
390
+ deg = len(pol) - 1
391
+ res = 0
392
+ for i in range(deg, -1, -1):
393
+ res = chebadd(chebmulx(res), pol[i])
394
+ return res
395
+
396
+
397
+ def cheb2poly(c):
398
+ """
399
+ Convert a Chebyshev series to a polynomial.
400
+
401
+ Convert an array representing the coefficients of a Chebyshev series,
402
+ ordered from lowest degree to highest, to an array of the coefficients
403
+ of the equivalent polynomial (relative to the "standard" basis) ordered
404
+ from lowest to highest degree.
405
+
406
+ Parameters
407
+ ----------
408
+ c : array_like
409
+ 1-D array containing the Chebyshev series coefficients, ordered
410
+ from lowest order term to highest.
411
+
412
+ Returns
413
+ -------
414
+ pol : ndarray
415
+ 1-D array containing the coefficients of the equivalent polynomial
416
+ (relative to the "standard" basis) ordered from lowest order term
417
+ to highest.
418
+
419
+ See Also
420
+ --------
421
+ poly2cheb
422
+
423
+ Notes
424
+ -----
425
+ The easy way to do conversions between polynomial basis sets
426
+ is to use the convert method of a class instance.
427
+
428
+ Examples
429
+ --------
430
+ >>> from numpy import polynomial as P
431
+ >>> c = P.Chebyshev(range(4))
432
+ >>> c
433
+ Chebyshev([0., 1., 2., 3.], domain=[-1., 1.], window=[-1., 1.], symbol='x')
434
+ >>> p = c.convert(kind=P.Polynomial)
435
+ >>> p
436
+ Polynomial([-2., -8., 4., 12.], domain=[-1., 1.], window=[-1., 1.], ...
437
+ >>> P.chebyshev.cheb2poly(range(4))
438
+ array([-2., -8., 4., 12.])
439
+
440
+ """
441
+ from .polynomial import polyadd, polymulx, polysub
442
+
443
+ [c] = pu.as_series([c])
444
+ n = len(c)
445
+ if n < 3:
446
+ return c
447
+ else:
448
+ c0 = c[-2]
449
+ c1 = c[-1]
450
+ # i is the current degree of c1
451
+ for i in range(n - 1, 1, -1):
452
+ tmp = c0
453
+ c0 = polysub(c[i - 2], c1)
454
+ c1 = polyadd(tmp, polymulx(c1) * 2)
455
+ return polyadd(c0, polymulx(c1))
456
+
457
+
458
+ #
459
+ # These are constant arrays are of integer type so as to be compatible
460
+ # with the widest range of other types, such as Decimal.
461
+ #
462
+
463
+ # Chebyshev default domain.
464
+ chebdomain = np.array([-1., 1.])
465
+
466
+ # Chebyshev coefficients representing zero.
467
+ chebzero = np.array([0])
468
+
469
+ # Chebyshev coefficients representing one.
470
+ chebone = np.array([1])
471
+
472
+ # Chebyshev coefficients representing the identity x.
473
+ chebx = np.array([0, 1])
474
+
475
+
476
+ def chebline(off, scl):
477
+ """
478
+ Chebyshev series whose graph is a straight line.
479
+
480
+ Parameters
481
+ ----------
482
+ off, scl : scalars
483
+ The specified line is given by ``off + scl*x``.
484
+
485
+ Returns
486
+ -------
487
+ y : ndarray
488
+ This module's representation of the Chebyshev series for
489
+ ``off + scl*x``.
490
+
491
+ See Also
492
+ --------
493
+ numpy.polynomial.polynomial.polyline
494
+ numpy.polynomial.legendre.legline
495
+ numpy.polynomial.laguerre.lagline
496
+ numpy.polynomial.hermite.hermline
497
+ numpy.polynomial.hermite_e.hermeline
498
+
499
+ Examples
500
+ --------
501
+ >>> import numpy.polynomial.chebyshev as C
502
+ >>> C.chebline(3,2)
503
+ array([3, 2])
504
+ >>> C.chebval(-3, C.chebline(3,2)) # should be -3
505
+ -3.0
506
+
507
+ """
508
+ if scl != 0:
509
+ return np.array([off, scl])
510
+ else:
511
+ return np.array([off])
512
+
513
+
514
+ def chebfromroots(roots):
515
+ """
516
+ Generate a Chebyshev series with given roots.
517
+
518
+ The function returns the coefficients of the polynomial
519
+
520
+ .. math:: p(x) = (x - r_0) * (x - r_1) * ... * (x - r_n),
521
+
522
+ in Chebyshev form, where the :math:`r_n` are the roots specified in
523
+ `roots`. If a zero has multiplicity n, then it must appear in `roots`
524
+ n times. For instance, if 2 is a root of multiplicity three and 3 is a
525
+ root of multiplicity 2, then `roots` looks something like [2, 2, 2, 3, 3].
526
+ The roots can appear in any order.
527
+
528
+ If the returned coefficients are `c`, then
529
+
530
+ .. math:: p(x) = c_0 + c_1 * T_1(x) + ... + c_n * T_n(x)
531
+
532
+ The coefficient of the last term is not generally 1 for monic
533
+ polynomials in Chebyshev form.
534
+
535
+ Parameters
536
+ ----------
537
+ roots : array_like
538
+ Sequence containing the roots.
539
+
540
+ Returns
541
+ -------
542
+ out : ndarray
543
+ 1-D array of coefficients. If all roots are real then `out` is a
544
+ real array, if some of the roots are complex, then `out` is complex
545
+ even if all the coefficients in the result are real (see Examples
546
+ below).
547
+
548
+ See Also
549
+ --------
550
+ numpy.polynomial.polynomial.polyfromroots
551
+ numpy.polynomial.legendre.legfromroots
552
+ numpy.polynomial.laguerre.lagfromroots
553
+ numpy.polynomial.hermite.hermfromroots
554
+ numpy.polynomial.hermite_e.hermefromroots
555
+
556
+ Examples
557
+ --------
558
+ >>> import numpy.polynomial.chebyshev as C
559
+ >>> C.chebfromroots((-1,0,1)) # x^3 - x relative to the standard basis
560
+ array([ 0. , -0.25, 0. , 0.25])
561
+ >>> j = complex(0,1)
562
+ >>> C.chebfromroots((-j,j)) # x^2 + 1 relative to the standard basis
563
+ array([1.5+0.j, 0. +0.j, 0.5+0.j])
564
+
565
+ """
566
+ return pu._fromroots(chebline, chebmul, roots)
567
+
568
+
569
+ def chebadd(c1, c2):
570
+ """
571
+ Add one Chebyshev series to another.
572
+
573
+ Returns the sum of two Chebyshev series `c1` + `c2`. The arguments
574
+ are sequences of coefficients ordered from lowest order term to
575
+ highest, i.e., [1,2,3] represents the series ``T_0 + 2*T_1 + 3*T_2``.
576
+
577
+ Parameters
578
+ ----------
579
+ c1, c2 : array_like
580
+ 1-D arrays of Chebyshev series coefficients ordered from low to
581
+ high.
582
+
583
+ Returns
584
+ -------
585
+ out : ndarray
586
+ Array representing the Chebyshev series of their sum.
587
+
588
+ See Also
589
+ --------
590
+ chebsub, chebmulx, chebmul, chebdiv, chebpow
591
+
592
+ Notes
593
+ -----
594
+ Unlike multiplication, division, etc., the sum of two Chebyshev series
595
+ is a Chebyshev series (without having to "reproject" the result onto
596
+ the basis set) so addition, just like that of "standard" polynomials,
597
+ is simply "component-wise."
598
+
599
+ Examples
600
+ --------
601
+ >>> from numpy.polynomial import chebyshev as C
602
+ >>> c1 = (1,2,3)
603
+ >>> c2 = (3,2,1)
604
+ >>> C.chebadd(c1,c2)
605
+ array([4., 4., 4.])
606
+
607
+ """
608
+ return pu._add(c1, c2)
609
+
610
+
611
+ def chebsub(c1, c2):
612
+ """
613
+ Subtract one Chebyshev series from another.
614
+
615
+ Returns the difference of two Chebyshev series `c1` - `c2`. The
616
+ sequences of coefficients are from lowest order term to highest, i.e.,
617
+ [1,2,3] represents the series ``T_0 + 2*T_1 + 3*T_2``.
618
+
619
+ Parameters
620
+ ----------
621
+ c1, c2 : array_like
622
+ 1-D arrays of Chebyshev series coefficients ordered from low to
623
+ high.
624
+
625
+ Returns
626
+ -------
627
+ out : ndarray
628
+ Of Chebyshev series coefficients representing their difference.
629
+
630
+ See Also
631
+ --------
632
+ chebadd, chebmulx, chebmul, chebdiv, chebpow
633
+
634
+ Notes
635
+ -----
636
+ Unlike multiplication, division, etc., the difference of two Chebyshev
637
+ series is a Chebyshev series (without having to "reproject" the result
638
+ onto the basis set) so subtraction, just like that of "standard"
639
+ polynomials, is simply "component-wise."
640
+
641
+ Examples
642
+ --------
643
+ >>> from numpy.polynomial import chebyshev as C
644
+ >>> c1 = (1,2,3)
645
+ >>> c2 = (3,2,1)
646
+ >>> C.chebsub(c1,c2)
647
+ array([-2., 0., 2.])
648
+ >>> C.chebsub(c2,c1) # -C.chebsub(c1,c2)
649
+ array([ 2., 0., -2.])
650
+
651
+ """
652
+ return pu._sub(c1, c2)
653
+
654
+
655
+ def chebmulx(c):
656
+ """Multiply a Chebyshev series by x.
657
+
658
+ Multiply the polynomial `c` by x, where x is the independent
659
+ variable.
660
+
661
+
662
+ Parameters
663
+ ----------
664
+ c : array_like
665
+ 1-D array of Chebyshev series coefficients ordered from low to
666
+ high.
667
+
668
+ Returns
669
+ -------
670
+ out : ndarray
671
+ Array representing the result of the multiplication.
672
+
673
+ See Also
674
+ --------
675
+ chebadd, chebsub, chebmul, chebdiv, chebpow
676
+
677
+ Examples
678
+ --------
679
+ >>> from numpy.polynomial import chebyshev as C
680
+ >>> C.chebmulx([1,2,3])
681
+ array([1. , 2.5, 1. , 1.5])
682
+
683
+ """
684
+ # c is a trimmed copy
685
+ [c] = pu.as_series([c])
686
+ # The zero series needs special treatment
687
+ if len(c) == 1 and c[0] == 0:
688
+ return c
689
+
690
+ prd = np.empty(len(c) + 1, dtype=c.dtype)
691
+ prd[0] = c[0] * 0
692
+ prd[1] = c[0]
693
+ if len(c) > 1:
694
+ tmp = c[1:] / 2
695
+ prd[2:] = tmp
696
+ prd[0:-2] += tmp
697
+ return prd
698
+
699
+
700
+ def chebmul(c1, c2):
701
+ """
702
+ Multiply one Chebyshev series by another.
703
+
704
+ Returns the product of two Chebyshev series `c1` * `c2`. The arguments
705
+ are sequences of coefficients, from lowest order "term" to highest,
706
+ e.g., [1,2,3] represents the series ``T_0 + 2*T_1 + 3*T_2``.
707
+
708
+ Parameters
709
+ ----------
710
+ c1, c2 : array_like
711
+ 1-D arrays of Chebyshev series coefficients ordered from low to
712
+ high.
713
+
714
+ Returns
715
+ -------
716
+ out : ndarray
717
+ Of Chebyshev series coefficients representing their product.
718
+
719
+ See Also
720
+ --------
721
+ chebadd, chebsub, chebmulx, chebdiv, chebpow
722
+
723
+ Notes
724
+ -----
725
+ In general, the (polynomial) product of two C-series results in terms
726
+ that are not in the Chebyshev polynomial basis set. Thus, to express
727
+ the product as a C-series, it is typically necessary to "reproject"
728
+ the product onto said basis set, which typically produces
729
+ "unintuitive live" (but correct) results; see Examples section below.
730
+
731
+ Examples
732
+ --------
733
+ >>> from numpy.polynomial import chebyshev as C
734
+ >>> c1 = (1,2,3)
735
+ >>> c2 = (3,2,1)
736
+ >>> C.chebmul(c1,c2) # multiplication requires "reprojection"
737
+ array([ 6.5, 12. , 12. , 4. , 1.5])
738
+
739
+ """
740
+ # c1, c2 are trimmed copies
741
+ [c1, c2] = pu.as_series([c1, c2])
742
+ z1 = _cseries_to_zseries(c1)
743
+ z2 = _cseries_to_zseries(c2)
744
+ prd = _zseries_mul(z1, z2)
745
+ ret = _zseries_to_cseries(prd)
746
+ return pu.trimseq(ret)
747
+
748
+
749
+ def chebdiv(c1, c2):
750
+ """
751
+ Divide one Chebyshev series by another.
752
+
753
+ Returns the quotient-with-remainder of two Chebyshev series
754
+ `c1` / `c2`. The arguments are sequences of coefficients from lowest
755
+ order "term" to highest, e.g., [1,2,3] represents the series
756
+ ``T_0 + 2*T_1 + 3*T_2``.
757
+
758
+ Parameters
759
+ ----------
760
+ c1, c2 : array_like
761
+ 1-D arrays of Chebyshev series coefficients ordered from low to
762
+ high.
763
+
764
+ Returns
765
+ -------
766
+ [quo, rem] : ndarrays
767
+ Of Chebyshev series coefficients representing the quotient and
768
+ remainder.
769
+
770
+ See Also
771
+ --------
772
+ chebadd, chebsub, chebmulx, chebmul, chebpow
773
+
774
+ Notes
775
+ -----
776
+ In general, the (polynomial) division of one C-series by another
777
+ results in quotient and remainder terms that are not in the Chebyshev
778
+ polynomial basis set. Thus, to express these results as C-series, it
779
+ is typically necessary to "reproject" the results onto said basis
780
+ set, which typically produces "unintuitive" (but correct) results;
781
+ see Examples section below.
782
+
783
+ Examples
784
+ --------
785
+ >>> from numpy.polynomial import chebyshev as C
786
+ >>> c1 = (1,2,3)
787
+ >>> c2 = (3,2,1)
788
+ >>> C.chebdiv(c1,c2) # quotient "intuitive," remainder not
789
+ (array([3.]), array([-8., -4.]))
790
+ >>> c2 = (0,1,2,3)
791
+ >>> C.chebdiv(c2,c1) # neither "intuitive"
792
+ (array([0., 2.]), array([-2., -4.]))
793
+
794
+ """
795
+ # c1, c2 are trimmed copies
796
+ [c1, c2] = pu.as_series([c1, c2])
797
+ if c2[-1] == 0:
798
+ raise ZeroDivisionError # FIXME: add message with details to exception
799
+
800
+ # note: this is more efficient than `pu._div(chebmul, c1, c2)`
801
+ lc1 = len(c1)
802
+ lc2 = len(c2)
803
+ if lc1 < lc2:
804
+ return c1[:1] * 0, c1
805
+ elif lc2 == 1:
806
+ return c1 / c2[-1], c1[:1] * 0
807
+ else:
808
+ z1 = _cseries_to_zseries(c1)
809
+ z2 = _cseries_to_zseries(c2)
810
+ quo, rem = _zseries_div(z1, z2)
811
+ quo = pu.trimseq(_zseries_to_cseries(quo))
812
+ rem = pu.trimseq(_zseries_to_cseries(rem))
813
+ return quo, rem
814
+
815
+
816
+ def chebpow(c, pow, maxpower=16):
817
+ """Raise a Chebyshev series to a power.
818
+
819
+ Returns the Chebyshev series `c` raised to the power `pow`. The
820
+ argument `c` is a sequence of coefficients ordered from low to high.
821
+ i.e., [1,2,3] is the series ``T_0 + 2*T_1 + 3*T_2.``
822
+
823
+ Parameters
824
+ ----------
825
+ c : array_like
826
+ 1-D array of Chebyshev series coefficients ordered from low to
827
+ high.
828
+ pow : integer
829
+ Power to which the series will be raised
830
+ maxpower : integer, optional
831
+ Maximum power allowed. This is mainly to limit growth of the series
832
+ to unmanageable size. Default is 16
833
+
834
+ Returns
835
+ -------
836
+ coef : ndarray
837
+ Chebyshev series of power.
838
+
839
+ See Also
840
+ --------
841
+ chebadd, chebsub, chebmulx, chebmul, chebdiv
842
+
843
+ Examples
844
+ --------
845
+ >>> from numpy.polynomial import chebyshev as C
846
+ >>> C.chebpow([1, 2, 3, 4], 2)
847
+ array([15.5, 22. , 16. , ..., 12.5, 12. , 8. ])
848
+
849
+ """
850
+ # note: this is more efficient than `pu._pow(chebmul, c1, c2)`, as it
851
+ # avoids converting between z and c series repeatedly
852
+
853
+ # c is a trimmed copy
854
+ [c] = pu.as_series([c])
855
+ power = int(pow)
856
+ if power != pow or power < 0:
857
+ raise ValueError("Power must be a non-negative integer.")
858
+ elif maxpower is not None and power > maxpower:
859
+ raise ValueError("Power is too large")
860
+ elif power == 0:
861
+ return np.array([1], dtype=c.dtype)
862
+ elif power == 1:
863
+ return c
864
+ else:
865
+ # This can be made more efficient by using powers of two
866
+ # in the usual way.
867
+ zs = _cseries_to_zseries(c)
868
+ prd = zs
869
+ for i in range(2, power + 1):
870
+ prd = np.convolve(prd, zs)
871
+ return _zseries_to_cseries(prd)
872
+
873
+
874
+ def chebder(c, m=1, scl=1, axis=0):
875
+ """
876
+ Differentiate a Chebyshev series.
877
+
878
+ Returns the Chebyshev series coefficients `c` differentiated `m` times
879
+ along `axis`. At each iteration the result is multiplied by `scl` (the
880
+ scaling factor is for use in a linear change of variable). The argument
881
+ `c` is an array of coefficients from low to high degree along each
882
+ axis, e.g., [1,2,3] represents the series ``1*T_0 + 2*T_1 + 3*T_2``
883
+ while [[1,2],[1,2]] represents ``1*T_0(x)*T_0(y) + 1*T_1(x)*T_0(y) +
884
+ 2*T_0(x)*T_1(y) + 2*T_1(x)*T_1(y)`` if axis=0 is ``x`` and axis=1 is
885
+ ``y``.
886
+
887
+ Parameters
888
+ ----------
889
+ c : array_like
890
+ Array of Chebyshev series coefficients. If c is multidimensional
891
+ the different axis correspond to different variables with the
892
+ degree in each axis given by the corresponding index.
893
+ m : int, optional
894
+ Number of derivatives taken, must be non-negative. (Default: 1)
895
+ scl : scalar, optional
896
+ Each differentiation is multiplied by `scl`. The end result is
897
+ multiplication by ``scl**m``. This is for use in a linear change of
898
+ variable. (Default: 1)
899
+ axis : int, optional
900
+ Axis over which the derivative is taken. (Default: 0).
901
+
902
+ Returns
903
+ -------
904
+ der : ndarray
905
+ Chebyshev series of the derivative.
906
+
907
+ See Also
908
+ --------
909
+ chebint
910
+
911
+ Notes
912
+ -----
913
+ In general, the result of differentiating a C-series needs to be
914
+ "reprojected" onto the C-series basis set. Thus, typically, the
915
+ result of this function is "unintuitive," albeit correct; see Examples
916
+ section below.
917
+
918
+ Examples
919
+ --------
920
+ >>> from numpy.polynomial import chebyshev as C
921
+ >>> c = (1,2,3,4)
922
+ >>> C.chebder(c)
923
+ array([14., 12., 24.])
924
+ >>> C.chebder(c,3)
925
+ array([96.])
926
+ >>> C.chebder(c,scl=-1)
927
+ array([-14., -12., -24.])
928
+ >>> C.chebder(c,2,-1)
929
+ array([12., 96.])
930
+
931
+ """
932
+ c = np.array(c, ndmin=1, copy=True)
933
+ if c.dtype.char in '?bBhHiIlLqQpP':
934
+ c = c.astype(np.double)
935
+ cnt = pu._as_int(m, "the order of derivation")
936
+ iaxis = pu._as_int(axis, "the axis")
937
+ if cnt < 0:
938
+ raise ValueError("The order of derivation must be non-negative")
939
+ iaxis = normalize_axis_index(iaxis, c.ndim)
940
+
941
+ if cnt == 0:
942
+ return c
943
+
944
+ c = np.moveaxis(c, iaxis, 0)
945
+ n = len(c)
946
+ if cnt >= n:
947
+ c = c[:1] * 0
948
+ else:
949
+ for i in range(cnt):
950
+ n = n - 1
951
+ c *= scl
952
+ der = np.empty((n,) + c.shape[1:], dtype=c.dtype)
953
+ for j in range(n, 2, -1):
954
+ der[j - 1] = (2 * j) * c[j]
955
+ c[j - 2] += (j * c[j]) / (j - 2)
956
+ if n > 1:
957
+ der[1] = 4 * c[2]
958
+ der[0] = c[1]
959
+ c = der
960
+ c = np.moveaxis(c, 0, iaxis)
961
+ return c
962
+
963
+
964
+ def chebint(c, m=1, k=[], lbnd=0, scl=1, axis=0):
965
+ """
966
+ Integrate a Chebyshev series.
967
+
968
+ Returns the Chebyshev series coefficients `c` integrated `m` times from
969
+ `lbnd` along `axis`. At each iteration the resulting series is
970
+ **multiplied** by `scl` and an integration constant, `k`, is added.
971
+ The scaling factor is for use in a linear change of variable. ("Buyer
972
+ beware": note that, depending on what one is doing, one may want `scl`
973
+ to be the reciprocal of what one might expect; for more information,
974
+ see the Notes section below.) The argument `c` is an array of
975
+ coefficients from low to high degree along each axis, e.g., [1,2,3]
976
+ represents the series ``T_0 + 2*T_1 + 3*T_2`` while [[1,2],[1,2]]
977
+ represents ``1*T_0(x)*T_0(y) + 1*T_1(x)*T_0(y) + 2*T_0(x)*T_1(y) +
978
+ 2*T_1(x)*T_1(y)`` if axis=0 is ``x`` and axis=1 is ``y``.
979
+
980
+ Parameters
981
+ ----------
982
+ c : array_like
983
+ Array of Chebyshev series coefficients. If c is multidimensional
984
+ the different axis correspond to different variables with the
985
+ degree in each axis given by the corresponding index.
986
+ m : int, optional
987
+ Order of integration, must be positive. (Default: 1)
988
+ k : {[], list, scalar}, optional
989
+ Integration constant(s). The value of the first integral at zero
990
+ is the first value in the list, the value of the second integral
991
+ at zero is the second value, etc. If ``k == []`` (the default),
992
+ all constants are set to zero. If ``m == 1``, a single scalar can
993
+ be given instead of a list.
994
+ lbnd : scalar, optional
995
+ The lower bound of the integral. (Default: 0)
996
+ scl : scalar, optional
997
+ Following each integration the result is *multiplied* by `scl`
998
+ before the integration constant is added. (Default: 1)
999
+ axis : int, optional
1000
+ Axis over which the integral is taken. (Default: 0).
1001
+
1002
+ Returns
1003
+ -------
1004
+ S : ndarray
1005
+ C-series coefficients of the integral.
1006
+
1007
+ Raises
1008
+ ------
1009
+ ValueError
1010
+ If ``m < 1``, ``len(k) > m``, ``np.ndim(lbnd) != 0``, or
1011
+ ``np.ndim(scl) != 0``.
1012
+
1013
+ See Also
1014
+ --------
1015
+ chebder
1016
+
1017
+ Notes
1018
+ -----
1019
+ Note that the result of each integration is *multiplied* by `scl`.
1020
+ Why is this important to note? Say one is making a linear change of
1021
+ variable :math:`u = ax + b` in an integral relative to `x`. Then
1022
+ :math:`dx = du/a`, so one will need to set `scl` equal to
1023
+ :math:`1/a`- perhaps not what one would have first thought.
1024
+
1025
+ Also note that, in general, the result of integrating a C-series needs
1026
+ to be "reprojected" onto the C-series basis set. Thus, typically,
1027
+ the result of this function is "unintuitive," albeit correct; see
1028
+ Examples section below.
1029
+
1030
+ Examples
1031
+ --------
1032
+ >>> from numpy.polynomial import chebyshev as C
1033
+ >>> c = (1,2,3)
1034
+ >>> C.chebint(c)
1035
+ array([ 0.5, -0.5, 0.5, 0.5])
1036
+ >>> C.chebint(c,3)
1037
+ array([ 0.03125 , -0.1875 , 0.04166667, -0.05208333, 0.01041667, # may vary
1038
+ 0.00625 ])
1039
+ >>> C.chebint(c, k=3)
1040
+ array([ 3.5, -0.5, 0.5, 0.5])
1041
+ >>> C.chebint(c,lbnd=-2)
1042
+ array([ 8.5, -0.5, 0.5, 0.5])
1043
+ >>> C.chebint(c,scl=-2)
1044
+ array([-1., 1., -1., -1.])
1045
+
1046
+ """
1047
+ c = np.array(c, ndmin=1, copy=True)
1048
+ if c.dtype.char in '?bBhHiIlLqQpP':
1049
+ c = c.astype(np.double)
1050
+ if not np.iterable(k):
1051
+ k = [k]
1052
+ cnt = pu._as_int(m, "the order of integration")
1053
+ iaxis = pu._as_int(axis, "the axis")
1054
+ if cnt < 0:
1055
+ raise ValueError("The order of integration must be non-negative")
1056
+ if len(k) > cnt:
1057
+ raise ValueError("Too many integration constants")
1058
+ if np.ndim(lbnd) != 0:
1059
+ raise ValueError("lbnd must be a scalar.")
1060
+ if np.ndim(scl) != 0:
1061
+ raise ValueError("scl must be a scalar.")
1062
+ iaxis = normalize_axis_index(iaxis, c.ndim)
1063
+
1064
+ if cnt == 0:
1065
+ return c
1066
+
1067
+ c = np.moveaxis(c, iaxis, 0)
1068
+ k = list(k) + [0] * (cnt - len(k))
1069
+ for i in range(cnt):
1070
+ n = len(c)
1071
+ c *= scl
1072
+ if n == 1 and np.all(c[0] == 0):
1073
+ c[0] += k[i]
1074
+ else:
1075
+ tmp = np.empty((n + 1,) + c.shape[1:], dtype=c.dtype)
1076
+ tmp[0] = c[0] * 0
1077
+ tmp[1] = c[0]
1078
+ if n > 1:
1079
+ tmp[2] = c[1] / 4
1080
+ for j in range(2, n):
1081
+ tmp[j + 1] = c[j] / (2 * (j + 1))
1082
+ tmp[j - 1] -= c[j] / (2 * (j - 1))
1083
+ tmp[0] += k[i] - chebval(lbnd, tmp)
1084
+ c = tmp
1085
+ c = np.moveaxis(c, 0, iaxis)
1086
+ return c
1087
+
1088
+
1089
+ def chebval(x, c, tensor=True):
1090
+ """
1091
+ Evaluate a Chebyshev series at points x.
1092
+
1093
+ If `c` is of length `n + 1`, this function returns the value:
1094
+
1095
+ .. math:: p(x) = c_0 * T_0(x) + c_1 * T_1(x) + ... + c_n * T_n(x)
1096
+
1097
+ The parameter `x` is converted to an array only if it is a tuple or a
1098
+ list, otherwise it is treated as a scalar. In either case, either `x`
1099
+ or its elements must support multiplication and addition both with
1100
+ themselves and with the elements of `c`.
1101
+
1102
+ If `c` is a 1-D array, then ``p(x)`` will have the same shape as `x`. If
1103
+ `c` is multidimensional, then the shape of the result depends on the
1104
+ value of `tensor`. If `tensor` is true the shape will be c.shape[1:] +
1105
+ x.shape. If `tensor` is false the shape will be c.shape[1:]. Note that
1106
+ scalars have shape (,).
1107
+
1108
+ Trailing zeros in the coefficients will be used in the evaluation, so
1109
+ they should be avoided if efficiency is a concern.
1110
+
1111
+ Parameters
1112
+ ----------
1113
+ x : array_like, compatible object
1114
+ If `x` is a list or tuple, it is converted to an ndarray, otherwise
1115
+ it is left unchanged and treated as a scalar. In either case, `x`
1116
+ or its elements must support addition and multiplication with
1117
+ themselves and with the elements of `c`.
1118
+ c : array_like
1119
+ Array of coefficients ordered so that the coefficients for terms of
1120
+ degree n are contained in c[n]. If `c` is multidimensional the
1121
+ remaining indices enumerate multiple polynomials. In the two
1122
+ dimensional case the coefficients may be thought of as stored in
1123
+ the columns of `c`.
1124
+ tensor : boolean, optional
1125
+ If True, the shape of the coefficient array is extended with ones
1126
+ on the right, one for each dimension of `x`. Scalars have dimension 0
1127
+ for this action. The result is that every column of coefficients in
1128
+ `c` is evaluated for every element of `x`. If False, `x` is broadcast
1129
+ over the columns of `c` for the evaluation. This keyword is useful
1130
+ when `c` is multidimensional. The default value is True.
1131
+
1132
+ Returns
1133
+ -------
1134
+ values : ndarray, algebra_like
1135
+ The shape of the return value is described above.
1136
+
1137
+ See Also
1138
+ --------
1139
+ chebval2d, chebgrid2d, chebval3d, chebgrid3d
1140
+
1141
+ Notes
1142
+ -----
1143
+ The evaluation uses Clenshaw recursion, aka synthetic division.
1144
+
1145
+ """
1146
+ c = np.array(c, ndmin=1, copy=True)
1147
+ if c.dtype.char in '?bBhHiIlLqQpP':
1148
+ c = c.astype(np.double)
1149
+ if isinstance(x, (tuple, list)):
1150
+ x = np.asarray(x)
1151
+ if isinstance(x, np.ndarray) and tensor:
1152
+ c = c.reshape(c.shape + (1,) * x.ndim)
1153
+
1154
+ if len(c) == 1:
1155
+ c0 = c[0]
1156
+ c1 = 0
1157
+ elif len(c) == 2:
1158
+ c0 = c[0]
1159
+ c1 = c[1]
1160
+ else:
1161
+ x2 = 2 * x
1162
+ c0 = c[-2]
1163
+ c1 = c[-1]
1164
+ for i in range(3, len(c) + 1):
1165
+ tmp = c0
1166
+ c0 = c[-i] - c1
1167
+ c1 = tmp + c1 * x2
1168
+ return c0 + c1 * x
1169
+
1170
+
1171
+ def chebval2d(x, y, c):
1172
+ """
1173
+ Evaluate a 2-D Chebyshev series at points (x, y).
1174
+
1175
+ This function returns the values:
1176
+
1177
+ .. math:: p(x,y) = \\sum_{i,j} c_{i,j} * T_i(x) * T_j(y)
1178
+
1179
+ The parameters `x` and `y` are converted to arrays only if they are
1180
+ tuples or a lists, otherwise they are treated as a scalars and they
1181
+ must have the same shape after conversion. In either case, either `x`
1182
+ and `y` or their elements must support multiplication and addition both
1183
+ with themselves and with the elements of `c`.
1184
+
1185
+ If `c` is a 1-D array a one is implicitly appended to its shape to make
1186
+ it 2-D. The shape of the result will be c.shape[2:] + x.shape.
1187
+
1188
+ Parameters
1189
+ ----------
1190
+ x, y : array_like, compatible objects
1191
+ The two dimensional series is evaluated at the points ``(x, y)``,
1192
+ where `x` and `y` must have the same shape. If `x` or `y` is a list
1193
+ or tuple, it is first converted to an ndarray, otherwise it is left
1194
+ unchanged and if it isn't an ndarray it is treated as a scalar.
1195
+ c : array_like
1196
+ Array of coefficients ordered so that the coefficient of the term
1197
+ of multi-degree i,j is contained in ``c[i,j]``. If `c` has
1198
+ dimension greater than 2 the remaining indices enumerate multiple
1199
+ sets of coefficients.
1200
+
1201
+ Returns
1202
+ -------
1203
+ values : ndarray, compatible object
1204
+ The values of the two dimensional Chebyshev series at points formed
1205
+ from pairs of corresponding values from `x` and `y`.
1206
+
1207
+ See Also
1208
+ --------
1209
+ chebval, chebgrid2d, chebval3d, chebgrid3d
1210
+ """
1211
+ return pu._valnd(chebval, c, x, y)
1212
+
1213
+
1214
+ def chebgrid2d(x, y, c):
1215
+ """
1216
+ Evaluate a 2-D Chebyshev series on the Cartesian product of x and y.
1217
+
1218
+ This function returns the values:
1219
+
1220
+ .. math:: p(a,b) = \\sum_{i,j} c_{i,j} * T_i(a) * T_j(b),
1221
+
1222
+ where the points `(a, b)` consist of all pairs formed by taking
1223
+ `a` from `x` and `b` from `y`. The resulting points form a grid with
1224
+ `x` in the first dimension and `y` in the second.
1225
+
1226
+ The parameters `x` and `y` are converted to arrays only if they are
1227
+ tuples or a lists, otherwise they are treated as a scalars. In either
1228
+ case, either `x` and `y` or their elements must support multiplication
1229
+ and addition both with themselves and with the elements of `c`.
1230
+
1231
+ If `c` has fewer than two dimensions, ones are implicitly appended to
1232
+ its shape to make it 2-D. The shape of the result will be c.shape[2:] +
1233
+ x.shape + y.shape.
1234
+
1235
+ Parameters
1236
+ ----------
1237
+ x, y : array_like, compatible objects
1238
+ The two dimensional series is evaluated at the points in the
1239
+ Cartesian product of `x` and `y`. If `x` or `y` is a list or
1240
+ tuple, it is first converted to an ndarray, otherwise it is left
1241
+ unchanged and, if it isn't an ndarray, it is treated as a scalar.
1242
+ c : array_like
1243
+ Array of coefficients ordered so that the coefficient of the term of
1244
+ multi-degree i,j is contained in ``c[i,j]``. If `c` has dimension
1245
+ greater than two the remaining indices enumerate multiple sets of
1246
+ coefficients.
1247
+
1248
+ Returns
1249
+ -------
1250
+ values : ndarray, compatible object
1251
+ The values of the two dimensional Chebyshev series at points in the
1252
+ Cartesian product of `x` and `y`.
1253
+
1254
+ See Also
1255
+ --------
1256
+ chebval, chebval2d, chebval3d, chebgrid3d
1257
+ """
1258
+ return pu._gridnd(chebval, c, x, y)
1259
+
1260
+
1261
+ def chebval3d(x, y, z, c):
1262
+ """
1263
+ Evaluate a 3-D Chebyshev series at points (x, y, z).
1264
+
1265
+ This function returns the values:
1266
+
1267
+ .. math:: p(x,y,z) = \\sum_{i,j,k} c_{i,j,k} * T_i(x) * T_j(y) * T_k(z)
1268
+
1269
+ The parameters `x`, `y`, and `z` are converted to arrays only if
1270
+ they are tuples or a lists, otherwise they are treated as a scalars and
1271
+ they must have the same shape after conversion. In either case, either
1272
+ `x`, `y`, and `z` or their elements must support multiplication and
1273
+ addition both with themselves and with the elements of `c`.
1274
+
1275
+ If `c` has fewer than 3 dimensions, ones are implicitly appended to its
1276
+ shape to make it 3-D. The shape of the result will be c.shape[3:] +
1277
+ x.shape.
1278
+
1279
+ Parameters
1280
+ ----------
1281
+ x, y, z : array_like, compatible object
1282
+ The three dimensional series is evaluated at the points
1283
+ ``(x, y, z)``, where `x`, `y`, and `z` must have the same shape. If
1284
+ any of `x`, `y`, or `z` is a list or tuple, it is first converted
1285
+ to an ndarray, otherwise it is left unchanged and if it isn't an
1286
+ ndarray it is treated as a scalar.
1287
+ c : array_like
1288
+ Array of coefficients ordered so that the coefficient of the term of
1289
+ multi-degree i,j,k is contained in ``c[i,j,k]``. If `c` has dimension
1290
+ greater than 3 the remaining indices enumerate multiple sets of
1291
+ coefficients.
1292
+
1293
+ Returns
1294
+ -------
1295
+ values : ndarray, compatible object
1296
+ The values of the multidimensional polynomial on points formed with
1297
+ triples of corresponding values from `x`, `y`, and `z`.
1298
+
1299
+ See Also
1300
+ --------
1301
+ chebval, chebval2d, chebgrid2d, chebgrid3d
1302
+ """
1303
+ return pu._valnd(chebval, c, x, y, z)
1304
+
1305
+
1306
+ def chebgrid3d(x, y, z, c):
1307
+ """
1308
+ Evaluate a 3-D Chebyshev series on the Cartesian product of x, y, and z.
1309
+
1310
+ This function returns the values:
1311
+
1312
+ .. math:: p(a,b,c) = \\sum_{i,j,k} c_{i,j,k} * T_i(a) * T_j(b) * T_k(c)
1313
+
1314
+ where the points ``(a, b, c)`` consist of all triples formed by taking
1315
+ `a` from `x`, `b` from `y`, and `c` from `z`. The resulting points form
1316
+ a grid with `x` in the first dimension, `y` in the second, and `z` in
1317
+ the third.
1318
+
1319
+ The parameters `x`, `y`, and `z` are converted to arrays only if they
1320
+ are tuples or a lists, otherwise they are treated as a scalars. In
1321
+ either case, either `x`, `y`, and `z` or their elements must support
1322
+ multiplication and addition both with themselves and with the elements
1323
+ of `c`.
1324
+
1325
+ If `c` has fewer than three dimensions, ones are implicitly appended to
1326
+ its shape to make it 3-D. The shape of the result will be c.shape[3:] +
1327
+ x.shape + y.shape + z.shape.
1328
+
1329
+ Parameters
1330
+ ----------
1331
+ x, y, z : array_like, compatible objects
1332
+ The three dimensional series is evaluated at the points in the
1333
+ Cartesian product of `x`, `y`, and `z`. If `x`, `y`, or `z` is a
1334
+ list or tuple, it is first converted to an ndarray, otherwise it is
1335
+ left unchanged and, if it isn't an ndarray, it is treated as a
1336
+ scalar.
1337
+ c : array_like
1338
+ Array of coefficients ordered so that the coefficients for terms of
1339
+ degree i,j are contained in ``c[i,j]``. If `c` has dimension
1340
+ greater than two the remaining indices enumerate multiple sets of
1341
+ coefficients.
1342
+
1343
+ Returns
1344
+ -------
1345
+ values : ndarray, compatible object
1346
+ The values of the two dimensional polynomial at points in the Cartesian
1347
+ product of `x` and `y`.
1348
+
1349
+ See Also
1350
+ --------
1351
+ chebval, chebval2d, chebgrid2d, chebval3d
1352
+ """
1353
+ return pu._gridnd(chebval, c, x, y, z)
1354
+
1355
+
1356
+ def chebvander(x, deg):
1357
+ """Pseudo-Vandermonde matrix of given degree.
1358
+
1359
+ Returns the pseudo-Vandermonde matrix of degree `deg` and sample points
1360
+ `x`. The pseudo-Vandermonde matrix is defined by
1361
+
1362
+ .. math:: V[..., i] = T_i(x),
1363
+
1364
+ where ``0 <= i <= deg``. The leading indices of `V` index the elements of
1365
+ `x` and the last index is the degree of the Chebyshev polynomial.
1366
+
1367
+ If `c` is a 1-D array of coefficients of length ``n + 1`` and `V` is the
1368
+ matrix ``V = chebvander(x, n)``, then ``np.dot(V, c)`` and
1369
+ ``chebval(x, c)`` are the same up to roundoff. This equivalence is
1370
+ useful both for least squares fitting and for the evaluation of a large
1371
+ number of Chebyshev series of the same degree and sample points.
1372
+
1373
+ Parameters
1374
+ ----------
1375
+ x : array_like
1376
+ Array of points. The dtype is converted to float64 or complex128
1377
+ depending on whether any of the elements are complex. If `x` is
1378
+ scalar it is converted to a 1-D array.
1379
+ deg : int
1380
+ Degree of the resulting matrix.
1381
+
1382
+ Returns
1383
+ -------
1384
+ vander : ndarray
1385
+ The pseudo Vandermonde matrix. The shape of the returned matrix is
1386
+ ``x.shape + (deg + 1,)``, where The last index is the degree of the
1387
+ corresponding Chebyshev polynomial. The dtype will be the same as
1388
+ the converted `x`.
1389
+
1390
+ """
1391
+ ideg = pu._as_int(deg, "deg")
1392
+ if ideg < 0:
1393
+ raise ValueError("deg must be non-negative")
1394
+
1395
+ x = np.array(x, copy=None, ndmin=1) + 0.0
1396
+ dims = (ideg + 1,) + x.shape
1397
+ dtyp = x.dtype
1398
+ v = np.empty(dims, dtype=dtyp)
1399
+ # Use forward recursion to generate the entries.
1400
+ v[0] = x * 0 + 1
1401
+ if ideg > 0:
1402
+ x2 = 2 * x
1403
+ v[1] = x
1404
+ for i in range(2, ideg + 1):
1405
+ v[i] = v[i - 1] * x2 - v[i - 2]
1406
+ return np.moveaxis(v, 0, -1)
1407
+
1408
+
1409
+ def chebvander2d(x, y, deg):
1410
+ """Pseudo-Vandermonde matrix of given degrees.
1411
+
1412
+ Returns the pseudo-Vandermonde matrix of degrees `deg` and sample
1413
+ points ``(x, y)``. The pseudo-Vandermonde matrix is defined by
1414
+
1415
+ .. math:: V[..., (deg[1] + 1)*i + j] = T_i(x) * T_j(y),
1416
+
1417
+ where ``0 <= i <= deg[0]`` and ``0 <= j <= deg[1]``. The leading indices of
1418
+ `V` index the points ``(x, y)`` and the last index encodes the degrees of
1419
+ the Chebyshev polynomials.
1420
+
1421
+ If ``V = chebvander2d(x, y, [xdeg, ydeg])``, then the columns of `V`
1422
+ correspond to the elements of a 2-D coefficient array `c` of shape
1423
+ (xdeg + 1, ydeg + 1) in the order
1424
+
1425
+ .. math:: c_{00}, c_{01}, c_{02} ... , c_{10}, c_{11}, c_{12} ...
1426
+
1427
+ and ``np.dot(V, c.flat)`` and ``chebval2d(x, y, c)`` will be the same
1428
+ up to roundoff. This equivalence is useful both for least squares
1429
+ fitting and for the evaluation of a large number of 2-D Chebyshev
1430
+ series of the same degrees and sample points.
1431
+
1432
+ Parameters
1433
+ ----------
1434
+ x, y : array_like
1435
+ Arrays of point coordinates, all of the same shape. The dtypes
1436
+ will be converted to either float64 or complex128 depending on
1437
+ whether any of the elements are complex. Scalars are converted to
1438
+ 1-D arrays.
1439
+ deg : list of ints
1440
+ List of maximum degrees of the form [x_deg, y_deg].
1441
+
1442
+ Returns
1443
+ -------
1444
+ vander2d : ndarray
1445
+ The shape of the returned matrix is ``x.shape + (order,)``, where
1446
+ :math:`order = (deg[0]+1)*(deg[1]+1)`. The dtype will be the same
1447
+ as the converted `x` and `y`.
1448
+
1449
+ See Also
1450
+ --------
1451
+ chebvander, chebvander3d, chebval2d, chebval3d
1452
+ """
1453
+ return pu._vander_nd_flat((chebvander, chebvander), (x, y), deg)
1454
+
1455
+
1456
+ def chebvander3d(x, y, z, deg):
1457
+ """Pseudo-Vandermonde matrix of given degrees.
1458
+
1459
+ Returns the pseudo-Vandermonde matrix of degrees `deg` and sample
1460
+ points ``(x, y, z)``. If `l`, `m`, `n` are the given degrees in `x`, `y`, `z`,
1461
+ then The pseudo-Vandermonde matrix is defined by
1462
+
1463
+ .. math:: V[..., (m+1)(n+1)i + (n+1)j + k] = T_i(x)*T_j(y)*T_k(z),
1464
+
1465
+ where ``0 <= i <= l``, ``0 <= j <= m``, and ``0 <= j <= n``. The leading
1466
+ indices of `V` index the points ``(x, y, z)`` and the last index encodes
1467
+ the degrees of the Chebyshev polynomials.
1468
+
1469
+ If ``V = chebvander3d(x, y, z, [xdeg, ydeg, zdeg])``, then the columns
1470
+ of `V` correspond to the elements of a 3-D coefficient array `c` of
1471
+ shape (xdeg + 1, ydeg + 1, zdeg + 1) in the order
1472
+
1473
+ .. math:: c_{000}, c_{001}, c_{002},... , c_{010}, c_{011}, c_{012},...
1474
+
1475
+ and ``np.dot(V, c.flat)`` and ``chebval3d(x, y, z, c)`` will be the
1476
+ same up to roundoff. This equivalence is useful both for least squares
1477
+ fitting and for the evaluation of a large number of 3-D Chebyshev
1478
+ series of the same degrees and sample points.
1479
+
1480
+ Parameters
1481
+ ----------
1482
+ x, y, z : array_like
1483
+ Arrays of point coordinates, all of the same shape. The dtypes will
1484
+ be converted to either float64 or complex128 depending on whether
1485
+ any of the elements are complex. Scalars are converted to 1-D
1486
+ arrays.
1487
+ deg : list of ints
1488
+ List of maximum degrees of the form [x_deg, y_deg, z_deg].
1489
+
1490
+ Returns
1491
+ -------
1492
+ vander3d : ndarray
1493
+ The shape of the returned matrix is ``x.shape + (order,)``, where
1494
+ :math:`order = (deg[0]+1)*(deg[1]+1)*(deg[2]+1)`. The dtype will
1495
+ be the same as the converted `x`, `y`, and `z`.
1496
+
1497
+ See Also
1498
+ --------
1499
+ chebvander, chebvander3d, chebval2d, chebval3d
1500
+ """
1501
+ return pu._vander_nd_flat((chebvander, chebvander, chebvander), (x, y, z), deg)
1502
+
1503
+
1504
+ def chebfit(x, y, deg, rcond=None, full=False, w=None):
1505
+ """
1506
+ Least squares fit of Chebyshev series to data.
1507
+
1508
+ Return the coefficients of a Chebyshev series of degree `deg` that is the
1509
+ least squares fit to the data values `y` given at points `x`. If `y` is
1510
+ 1-D the returned coefficients will also be 1-D. If `y` is 2-D multiple
1511
+ fits are done, one for each column of `y`, and the resulting
1512
+ coefficients are stored in the corresponding columns of a 2-D return.
1513
+ The fitted polynomial(s) are in the form
1514
+
1515
+ .. math:: p(x) = c_0 + c_1 * T_1(x) + ... + c_n * T_n(x),
1516
+
1517
+ where `n` is `deg`.
1518
+
1519
+ Parameters
1520
+ ----------
1521
+ x : array_like, shape (M,)
1522
+ x-coordinates of the M sample points ``(x[i], y[i])``.
1523
+ y : array_like, shape (M,) or (M, K)
1524
+ y-coordinates of the sample points. Several data sets of sample
1525
+ points sharing the same x-coordinates can be fitted at once by
1526
+ passing in a 2D-array that contains one dataset per column.
1527
+ deg : int or 1-D array_like
1528
+ Degree(s) of the fitting polynomials. If `deg` is a single integer,
1529
+ all terms up to and including the `deg`'th term are included in the
1530
+ fit. For NumPy versions >= 1.11.0 a list of integers specifying the
1531
+ degrees of the terms to include may be used instead.
1532
+ rcond : float, optional
1533
+ Relative condition number of the fit. Singular values smaller than
1534
+ this relative to the largest singular value will be ignored. The
1535
+ default value is ``len(x)*eps``, where eps is the relative precision of
1536
+ the float type, about 2e-16 in most cases.
1537
+ full : bool, optional
1538
+ Switch determining nature of return value. When it is False (the
1539
+ default) just the coefficients are returned, when True diagnostic
1540
+ information from the singular value decomposition is also returned.
1541
+ w : array_like, shape (`M`,), optional
1542
+ Weights. If not None, the weight ``w[i]`` applies to the unsquared
1543
+ residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
1544
+ chosen so that the errors of the products ``w[i]*y[i]`` all have the
1545
+ same variance. When using inverse-variance weighting, use
1546
+ ``w[i] = 1/sigma(y[i])``. The default value is None.
1547
+
1548
+ Returns
1549
+ -------
1550
+ coef : ndarray, shape (M,) or (M, K)
1551
+ Chebyshev coefficients ordered from low to high. If `y` was 2-D,
1552
+ the coefficients for the data in column k of `y` are in column
1553
+ `k`.
1554
+
1555
+ [residuals, rank, singular_values, rcond] : list
1556
+ These values are only returned if ``full == True``
1557
+
1558
+ - residuals -- sum of squared residuals of the least squares fit
1559
+ - rank -- the numerical rank of the scaled Vandermonde matrix
1560
+ - singular_values -- singular values of the scaled Vandermonde matrix
1561
+ - rcond -- value of `rcond`.
1562
+
1563
+ For more details, see `numpy.linalg.lstsq`.
1564
+
1565
+ Warns
1566
+ -----
1567
+ RankWarning
1568
+ The rank of the coefficient matrix in the least-squares fit is
1569
+ deficient. The warning is only raised if ``full == False``. The
1570
+ warnings can be turned off by
1571
+
1572
+ >>> import warnings
1573
+ >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
1574
+
1575
+ See Also
1576
+ --------
1577
+ numpy.polynomial.polynomial.polyfit
1578
+ numpy.polynomial.legendre.legfit
1579
+ numpy.polynomial.laguerre.lagfit
1580
+ numpy.polynomial.hermite.hermfit
1581
+ numpy.polynomial.hermite_e.hermefit
1582
+ chebval : Evaluates a Chebyshev series.
1583
+ chebvander : Vandermonde matrix of Chebyshev series.
1584
+ chebweight : Chebyshev weight function.
1585
+ numpy.linalg.lstsq : Computes a least-squares fit from the matrix.
1586
+ scipy.interpolate.UnivariateSpline : Computes spline fits.
1587
+
1588
+ Notes
1589
+ -----
1590
+ The solution is the coefficients of the Chebyshev series `p` that
1591
+ minimizes the sum of the weighted squared errors
1592
+
1593
+ .. math:: E = \\sum_j w_j^2 * |y_j - p(x_j)|^2,
1594
+
1595
+ where :math:`w_j` are the weights. This problem is solved by setting up
1596
+ as the (typically) overdetermined matrix equation
1597
+
1598
+ .. math:: V(x) * c = w * y,
1599
+
1600
+ where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the
1601
+ coefficients to be solved for, `w` are the weights, and `y` are the
1602
+ observed values. This equation is then solved using the singular value
1603
+ decomposition of `V`.
1604
+
1605
+ If some of the singular values of `V` are so small that they are
1606
+ neglected, then a `~exceptions.RankWarning` will be issued. This means that
1607
+ the coefficient values may be poorly determined. Using a lower order fit
1608
+ will usually get rid of the warning. The `rcond` parameter can also be
1609
+ set to a value smaller than its default, but the resulting fit may be
1610
+ spurious and have large contributions from roundoff error.
1611
+
1612
+ Fits using Chebyshev series are usually better conditioned than fits
1613
+ using power series, but much can depend on the distribution of the
1614
+ sample points and the smoothness of the data. If the quality of the fit
1615
+ is inadequate splines may be a good alternative.
1616
+
1617
+ References
1618
+ ----------
1619
+ .. [1] Wikipedia, "Curve fitting",
1620
+ https://en.wikipedia.org/wiki/Curve_fitting
1621
+
1622
+ Examples
1623
+ --------
1624
+
1625
+ """
1626
+ return pu._fit(chebvander, x, y, deg, rcond, full, w)
1627
+
1628
+
1629
+ def chebcompanion(c):
1630
+ """Return the scaled companion matrix of c.
1631
+
1632
+ The basis polynomials are scaled so that the companion matrix is
1633
+ symmetric when `c` is a Chebyshev basis polynomial. This provides
1634
+ better eigenvalue estimates than the unscaled case and for basis
1635
+ polynomials the eigenvalues are guaranteed to be real if
1636
+ `numpy.linalg.eigvalsh` is used to obtain them.
1637
+
1638
+ Parameters
1639
+ ----------
1640
+ c : array_like
1641
+ 1-D array of Chebyshev series coefficients ordered from low to high
1642
+ degree.
1643
+
1644
+ Returns
1645
+ -------
1646
+ mat : ndarray
1647
+ Scaled companion matrix of dimensions (deg, deg).
1648
+ """
1649
+ # c is a trimmed copy
1650
+ [c] = pu.as_series([c])
1651
+ if len(c) < 2:
1652
+ raise ValueError('Series must have maximum degree of at least 1.')
1653
+ if len(c) == 2:
1654
+ return np.array([[-c[0] / c[1]]])
1655
+
1656
+ n = len(c) - 1
1657
+ mat = np.zeros((n, n), dtype=c.dtype)
1658
+ scl = np.array([1.] + [np.sqrt(.5)] * (n - 1))
1659
+ top = mat.reshape(-1)[1::n + 1]
1660
+ bot = mat.reshape(-1)[n::n + 1]
1661
+ top[0] = np.sqrt(.5)
1662
+ top[1:] = 1 / 2
1663
+ bot[...] = top
1664
+ mat[:, -1] -= (c[:-1] / c[-1]) * (scl / scl[-1]) * .5
1665
+ return mat
1666
+
1667
+
1668
+ def chebroots(c):
1669
+ """
1670
+ Compute the roots of a Chebyshev series.
1671
+
1672
+ Return the roots (a.k.a. "zeros") of the polynomial
1673
+
1674
+ .. math:: p(x) = \\sum_i c[i] * T_i(x).
1675
+
1676
+ Parameters
1677
+ ----------
1678
+ c : 1-D array_like
1679
+ 1-D array of coefficients.
1680
+
1681
+ Returns
1682
+ -------
1683
+ out : ndarray
1684
+ Array of the roots of the series. If all the roots are real,
1685
+ then `out` is also real, otherwise it is complex.
1686
+
1687
+ See Also
1688
+ --------
1689
+ numpy.polynomial.polynomial.polyroots
1690
+ numpy.polynomial.legendre.legroots
1691
+ numpy.polynomial.laguerre.lagroots
1692
+ numpy.polynomial.hermite.hermroots
1693
+ numpy.polynomial.hermite_e.hermeroots
1694
+
1695
+ Notes
1696
+ -----
1697
+ The root estimates are obtained as the eigenvalues of the companion
1698
+ matrix, Roots far from the origin of the complex plane may have large
1699
+ errors due to the numerical instability of the series for such
1700
+ values. Roots with multiplicity greater than 1 will also show larger
1701
+ errors as the value of the series near such points is relatively
1702
+ insensitive to errors in the roots. Isolated roots near the origin can
1703
+ be improved by a few iterations of Newton's method.
1704
+
1705
+ The Chebyshev series basis polynomials aren't powers of `x` so the
1706
+ results of this function may seem unintuitive.
1707
+
1708
+ Examples
1709
+ --------
1710
+ >>> import numpy.polynomial.chebyshev as cheb
1711
+ >>> cheb.chebroots((-1, 1,-1, 1)) # T3 - T2 + T1 - T0 has real roots
1712
+ array([ -5.00000000e-01, 2.60860684e-17, 1.00000000e+00]) # may vary
1713
+
1714
+ """
1715
+ # c is a trimmed copy
1716
+ [c] = pu.as_series([c])
1717
+ if len(c) < 2:
1718
+ return np.array([], dtype=c.dtype)
1719
+ if len(c) == 2:
1720
+ return np.array([-c[0] / c[1]])
1721
+
1722
+ # rotated companion matrix reduces error
1723
+ m = chebcompanion(c)[::-1, ::-1]
1724
+ r = la.eigvals(m)
1725
+ r.sort()
1726
+ return r
1727
+
1728
+
1729
+ def chebinterpolate(func, deg, args=()):
1730
+ """Interpolate a function at the Chebyshev points of the first kind.
1731
+
1732
+ Returns the Chebyshev series that interpolates `func` at the Chebyshev
1733
+ points of the first kind in the interval [-1, 1]. The interpolating
1734
+ series tends to a minmax approximation to `func` with increasing `deg`
1735
+ if the function is continuous in the interval.
1736
+
1737
+ Parameters
1738
+ ----------
1739
+ func : function
1740
+ The function to be approximated. It must be a function of a single
1741
+ variable of the form ``f(x, a, b, c...)``, where ``a, b, c...`` are
1742
+ extra arguments passed in the `args` parameter.
1743
+ deg : int
1744
+ Degree of the interpolating polynomial
1745
+ args : tuple, optional
1746
+ Extra arguments to be used in the function call. Default is no extra
1747
+ arguments.
1748
+
1749
+ Returns
1750
+ -------
1751
+ coef : ndarray, shape (deg + 1,)
1752
+ Chebyshev coefficients of the interpolating series ordered from low to
1753
+ high.
1754
+
1755
+ Examples
1756
+ --------
1757
+ >>> import numpy.polynomial.chebyshev as C
1758
+ >>> C.chebinterpolate(lambda x: np.tanh(x) + 0.5, 8)
1759
+ array([ 5.00000000e-01, 8.11675684e-01, -9.86864911e-17,
1760
+ -5.42457905e-02, -2.71387850e-16, 4.51658839e-03,
1761
+ 2.46716228e-17, -3.79694221e-04, -3.26899002e-16])
1762
+
1763
+ Notes
1764
+ -----
1765
+ The Chebyshev polynomials used in the interpolation are orthogonal when
1766
+ sampled at the Chebyshev points of the first kind. If it is desired to
1767
+ constrain some of the coefficients they can simply be set to the desired
1768
+ value after the interpolation, no new interpolation or fit is needed. This
1769
+ is especially useful if it is known apriori that some of coefficients are
1770
+ zero. For instance, if the function is even then the coefficients of the
1771
+ terms of odd degree in the result can be set to zero.
1772
+
1773
+ """
1774
+ deg = np.asarray(deg)
1775
+
1776
+ # check arguments.
1777
+ if deg.ndim > 0 or deg.dtype.kind not in 'iu' or deg.size == 0:
1778
+ raise TypeError("deg must be an int")
1779
+ if deg < 0:
1780
+ raise ValueError("expected deg >= 0")
1781
+
1782
+ order = deg + 1
1783
+ xcheb = chebpts1(order)
1784
+ yfunc = func(xcheb, *args)
1785
+ m = chebvander(xcheb, deg)
1786
+ c = np.dot(m.T, yfunc)
1787
+ c[0] /= order
1788
+ c[1:] /= 0.5 * order
1789
+
1790
+ return c
1791
+
1792
+
1793
+ def chebgauss(deg):
1794
+ """
1795
+ Gauss-Chebyshev quadrature.
1796
+
1797
+ Computes the sample points and weights for Gauss-Chebyshev quadrature.
1798
+ These sample points and weights will correctly integrate polynomials of
1799
+ degree :math:`2*deg - 1` or less over the interval :math:`[-1, 1]` with
1800
+ the weight function :math:`f(x) = 1/\\sqrt{1 - x^2}`.
1801
+
1802
+ Parameters
1803
+ ----------
1804
+ deg : int
1805
+ Number of sample points and weights. It must be >= 1.
1806
+
1807
+ Returns
1808
+ -------
1809
+ x : ndarray
1810
+ 1-D ndarray containing the sample points.
1811
+ y : ndarray
1812
+ 1-D ndarray containing the weights.
1813
+
1814
+ Notes
1815
+ -----
1816
+ The results have only been tested up to degree 100, higher degrees may
1817
+ be problematic. For Gauss-Chebyshev there are closed form solutions for
1818
+ the sample points and weights. If n = `deg`, then
1819
+
1820
+ .. math:: x_i = \\cos(\\pi (2 i - 1) / (2 n))
1821
+
1822
+ .. math:: w_i = \\pi / n
1823
+
1824
+ """
1825
+ ideg = pu._as_int(deg, "deg")
1826
+ if ideg <= 0:
1827
+ raise ValueError("deg must be a positive integer")
1828
+
1829
+ x = np.cos(np.pi * np.arange(1, 2 * ideg, 2) / (2.0 * ideg))
1830
+ w = np.ones(ideg) * (np.pi / ideg)
1831
+
1832
+ return x, w
1833
+
1834
+
1835
+ def chebweight(x):
1836
+ """
1837
+ The weight function of the Chebyshev polynomials.
1838
+
1839
+ The weight function is :math:`1/\\sqrt{1 - x^2}` and the interval of
1840
+ integration is :math:`[-1, 1]`. The Chebyshev polynomials are
1841
+ orthogonal, but not normalized, with respect to this weight function.
1842
+
1843
+ Parameters
1844
+ ----------
1845
+ x : array_like
1846
+ Values at which the weight function will be computed.
1847
+
1848
+ Returns
1849
+ -------
1850
+ w : ndarray
1851
+ The weight function at `x`.
1852
+ """
1853
+ w = 1. / (np.sqrt(1. + x) * np.sqrt(1. - x))
1854
+ return w
1855
+
1856
+
1857
+ def chebpts1(npts):
1858
+ """
1859
+ Chebyshev points of the first kind.
1860
+
1861
+ The Chebyshev points of the first kind are the points ``cos(x)``,
1862
+ where ``x = [pi*(k + .5)/npts for k in range(npts)]``.
1863
+
1864
+ Parameters
1865
+ ----------
1866
+ npts : int
1867
+ Number of sample points desired.
1868
+
1869
+ Returns
1870
+ -------
1871
+ pts : ndarray
1872
+ The Chebyshev points of the first kind.
1873
+
1874
+ See Also
1875
+ --------
1876
+ chebpts2
1877
+ """
1878
+ _npts = int(npts)
1879
+ if _npts != npts:
1880
+ raise ValueError("npts must be integer")
1881
+ if _npts < 1:
1882
+ raise ValueError("npts must be >= 1")
1883
+
1884
+ x = 0.5 * np.pi / _npts * np.arange(-_npts + 1, _npts + 1, 2)
1885
+ return np.sin(x)
1886
+
1887
+
1888
+ def chebpts2(npts):
1889
+ """
1890
+ Chebyshev points of the second kind.
1891
+
1892
+ The Chebyshev points of the second kind are the points ``cos(x)``,
1893
+ where ``x = [pi*k/(npts - 1) for k in range(npts)]`` sorted in ascending
1894
+ order.
1895
+
1896
+ Parameters
1897
+ ----------
1898
+ npts : int
1899
+ Number of sample points desired.
1900
+
1901
+ Returns
1902
+ -------
1903
+ pts : ndarray
1904
+ The Chebyshev points of the second kind.
1905
+ """
1906
+ _npts = int(npts)
1907
+ if _npts != npts:
1908
+ raise ValueError("npts must be integer")
1909
+ if _npts < 2:
1910
+ raise ValueError("npts must be >= 2")
1911
+
1912
+ x = np.linspace(-np.pi, 0, _npts)
1913
+ return np.cos(x)
1914
+
1915
+
1916
+ #
1917
+ # Chebyshev series class
1918
+ #
1919
+
1920
+ class Chebyshev(ABCPolyBase):
1921
+ """A Chebyshev series class.
1922
+
1923
+ The Chebyshev class provides the standard Python numerical methods
1924
+ '+', '-', '*', '//', '%', 'divmod', '**', and '()' as well as the
1925
+ attributes and methods listed below.
1926
+
1927
+ Parameters
1928
+ ----------
1929
+ coef : array_like
1930
+ Chebyshev coefficients in order of increasing degree, i.e.,
1931
+ ``(1, 2, 3)`` gives ``1*T_0(x) + 2*T_1(x) + 3*T_2(x)``.
1932
+ domain : (2,) array_like, optional
1933
+ Domain to use. The interval ``[domain[0], domain[1]]`` is mapped
1934
+ to the interval ``[window[0], window[1]]`` by shifting and scaling.
1935
+ The default value is [-1., 1.].
1936
+ window : (2,) array_like, optional
1937
+ Window, see `domain` for its use. The default value is [-1., 1.].
1938
+ symbol : str, optional
1939
+ Symbol used to represent the independent variable in string
1940
+ representations of the polynomial expression, e.g. for printing.
1941
+ The symbol must be a valid Python identifier. Default value is 'x'.
1942
+
1943
+ .. versionadded:: 1.24
1944
+
1945
+ """
1946
+ # Virtual Functions
1947
+ _add = staticmethod(chebadd)
1948
+ _sub = staticmethod(chebsub)
1949
+ _mul = staticmethod(chebmul)
1950
+ _div = staticmethod(chebdiv)
1951
+ _pow = staticmethod(chebpow)
1952
+ _val = staticmethod(chebval)
1953
+ _int = staticmethod(chebint)
1954
+ _der = staticmethod(chebder)
1955
+ _fit = staticmethod(chebfit)
1956
+ _line = staticmethod(chebline)
1957
+ _roots = staticmethod(chebroots)
1958
+ _fromroots = staticmethod(chebfromroots)
1959
+
1960
+ @classmethod
1961
+ def interpolate(cls, func, deg, domain=None, args=()):
1962
+ """Interpolate a function at the Chebyshev points of the first kind.
1963
+
1964
+ Returns the series that interpolates `func` at the Chebyshev points of
1965
+ the first kind scaled and shifted to the `domain`. The resulting series
1966
+ tends to a minmax approximation of `func` when the function is
1967
+ continuous in the domain.
1968
+
1969
+ Parameters
1970
+ ----------
1971
+ func : function
1972
+ The function to be interpolated. It must be a function of a single
1973
+ variable of the form ``f(x, a, b, c...)``, where ``a, b, c...`` are
1974
+ extra arguments passed in the `args` parameter.
1975
+ deg : int
1976
+ Degree of the interpolating polynomial.
1977
+ domain : {None, [beg, end]}, optional
1978
+ Domain over which `func` is interpolated. The default is None, in
1979
+ which case the domain is [-1, 1].
1980
+ args : tuple, optional
1981
+ Extra arguments to be used in the function call. Default is no
1982
+ extra arguments.
1983
+
1984
+ Returns
1985
+ -------
1986
+ polynomial : Chebyshev instance
1987
+ Interpolating Chebyshev instance.
1988
+
1989
+ Notes
1990
+ -----
1991
+ See `numpy.polynomial.chebinterpolate` for more details.
1992
+
1993
+ """
1994
+ if domain is None:
1995
+ domain = cls.domain
1996
+ xfunc = lambda x: func(pu.mapdomain(x, cls.window, domain), *args)
1997
+ coef = chebinterpolate(xfunc, deg)
1998
+ return cls(coef, domain=domain)
1999
+
2000
+ # Virtual properties
2001
+ domain = np.array(chebdomain)
2002
+ window = np.array(chebdomain)
2003
+ basis_name = 'T'