scipy 1.16.2__cp313-cp313-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp313-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp313-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp313-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp313-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp313-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp313-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp313-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp313-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp313-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp313-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp313-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp313-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp313-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp313-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp313-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp313-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp313-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp313-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp313-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp313-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp313-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp313-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp313-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp313-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp313-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp313-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp313-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp313-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp313-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp313-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp313-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp313-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp313-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp313-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp313-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp313-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp313-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp313-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp313-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp313-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp313-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp313-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp313-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp313-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp313-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp313-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp313-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp313-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp313-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp313-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp313-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp313-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp313-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp313-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp313-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp313-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp313-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp313-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp313-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp313-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp313-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp313-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp313-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp313-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp313-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp313-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp313-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp313-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp313-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp313-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp313-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp313-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp313-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp313-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp313-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp313-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp313-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp313-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp313-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp313-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp313-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp313-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp313-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp313-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp313-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp313-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp313-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp313-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp313-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp313-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp313-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp313-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp313-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp313-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp313-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp313-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp313-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp313-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp313-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp313-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp313-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp313-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp313-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp313-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp313-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp313-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp313-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp313-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp313-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp313-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp313-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp313-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp313-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp313-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp313-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp313-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp313-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp313-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp313-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp313-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp313-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp313-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp313-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp313-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp313-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp313-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp313-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp313-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp313-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp313-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp313-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp313-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp313-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp313-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp313-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp313-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp313-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp313-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp313-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp313-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp313-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp313-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp313-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp313-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp313-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp313-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp313-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp313-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp313-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp313-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp313-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp313-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp313-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp313-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp313-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp313-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp313-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp313-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp313-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp313-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp313-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp313-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp313-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp313-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp313-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp313-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp313-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp313-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp313-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp313-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp313-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp313-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp313-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp313-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp313-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp313-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp313-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp313-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp313-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp313-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp313-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp313-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp313-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp313-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp313-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp313-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp313-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp313-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp313-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp313-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp313-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp313-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp313-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp313-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp313-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp313-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp313-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp313-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp313-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp313-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp313-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp313-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp313-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp313-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp313-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp313-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp313-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp313-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp313-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp313-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp313-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp313-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp313-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp313-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp313-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp313-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
scipy/sparse/_coo.py ADDED
@@ -0,0 +1,1581 @@
1
+ """ A sparse matrix in COOrdinate or 'triplet' format"""
2
+
3
+ __docformat__ = "restructuredtext en"
4
+
5
+ __all__ = ['coo_array', 'coo_matrix', 'isspmatrix_coo']
6
+
7
+ import math
8
+ from warnings import warn
9
+
10
+ import numpy as np
11
+
12
+ from .._lib._util import copy_if_needed
13
+ from ._matrix import spmatrix
14
+ from ._sparsetools import (coo_tocsr, coo_todense, coo_todense_nd,
15
+ coo_matvec, coo_matvec_nd, coo_matmat_dense,
16
+ coo_matmat_dense_nd)
17
+ from ._base import issparse, SparseEfficiencyWarning, _spbase, sparray
18
+ from ._data import _data_matrix, _minmax_mixin
19
+ from ._sputils import (upcast_char, to_native, isshape, getdtype,
20
+ getdata, downcast_intp_index, get_index_dtype,
21
+ check_shape, check_reshape_kwargs, isscalarlike, isdense)
22
+
23
+ import operator
24
+
25
+
26
+ class _coo_base(_data_matrix, _minmax_mixin):
27
+ _format = 'coo'
28
+ _allow_nd = range(1, 65)
29
+
30
+ def __init__(self, arg1, shape=None, dtype=None, copy=False, *, maxprint=None):
31
+ _data_matrix.__init__(self, arg1, maxprint=maxprint)
32
+ if not copy:
33
+ copy = copy_if_needed
34
+
35
+ if isinstance(arg1, tuple):
36
+ if isshape(arg1, allow_nd=self._allow_nd):
37
+ self._shape = check_shape(arg1, allow_nd=self._allow_nd)
38
+ idx_dtype = self._get_index_dtype(maxval=max(self._shape))
39
+ data_dtype = getdtype(dtype, default=float)
40
+ self.coords = tuple(np.array([], dtype=idx_dtype)
41
+ for _ in range(len(self._shape)))
42
+ self.data = np.array([], dtype=data_dtype)
43
+ self.has_canonical_format = True
44
+ else:
45
+ try:
46
+ obj, coords = arg1
47
+ except (TypeError, ValueError) as e:
48
+ raise TypeError('invalid input format') from e
49
+
50
+ if shape is None:
51
+ if any(len(idx) == 0 for idx in coords):
52
+ raise ValueError('cannot infer dimensions from zero '
53
+ 'sized index arrays')
54
+ shape = tuple(operator.index(np.max(idx)) + 1
55
+ for idx in coords)
56
+ self._shape = check_shape(shape, allow_nd=self._allow_nd)
57
+ idx_dtype = self._get_index_dtype(coords,
58
+ maxval=max(self.shape),
59
+ check_contents=True)
60
+ self.coords = tuple(np.array(idx, copy=copy, dtype=idx_dtype)
61
+ for idx in coords)
62
+ self.data = getdata(obj, copy=copy, dtype=dtype)
63
+ self.has_canonical_format = False
64
+ else:
65
+ if issparse(arg1):
66
+ if arg1.format == self.format and copy:
67
+ self.coords = tuple(idx.copy() for idx in arg1.coords)
68
+ self.data = arg1.data.astype(getdtype(dtype, arg1)) # copy=True
69
+ self._shape = check_shape(arg1.shape, allow_nd=self._allow_nd)
70
+ self.has_canonical_format = arg1.has_canonical_format
71
+ else:
72
+ coo = arg1.tocoo()
73
+ self.coords = tuple(coo.coords)
74
+ self.data = coo.data.astype(getdtype(dtype, coo), copy=False)
75
+ self._shape = check_shape(coo.shape, allow_nd=self._allow_nd)
76
+ self.has_canonical_format = False
77
+ else:
78
+ # dense argument
79
+ M = np.asarray(arg1)
80
+ if not isinstance(self, sparray):
81
+ M = np.atleast_2d(M)
82
+ if M.ndim != 2:
83
+ raise TypeError(f'expected 2D array or matrix, not {M.ndim}D')
84
+
85
+ self._shape = check_shape(M.shape, allow_nd=self._allow_nd)
86
+ if shape is not None:
87
+ if check_shape(shape, allow_nd=self._allow_nd) != self._shape:
88
+ message = f'inconsistent shapes: {shape} != {self._shape}'
89
+ raise ValueError(message)
90
+
91
+ index_dtype = self._get_index_dtype(maxval=max(self._shape))
92
+ coords = M.nonzero()
93
+ self.coords = tuple(idx.astype(index_dtype, copy=False)
94
+ for idx in coords)
95
+ self.data = getdata(M[coords], copy=copy, dtype=dtype)
96
+ self.has_canonical_format = True
97
+
98
+ if len(self._shape) > 2:
99
+ self.coords = tuple(idx.astype(np.int64, copy=False) for idx in self.coords)
100
+
101
+ self._check()
102
+
103
+ @property
104
+ def row(self):
105
+ if self.ndim > 1:
106
+ return self.coords[-2]
107
+ result = np.zeros_like(self.col)
108
+ result.setflags(write=False)
109
+ return result
110
+
111
+
112
+ @row.setter
113
+ def row(self, new_row):
114
+ if self.ndim < 2:
115
+ raise ValueError('cannot set row attribute of a 1-dimensional sparse array')
116
+ new_row = np.asarray(new_row, dtype=self.coords[-2].dtype)
117
+ self.coords = self.coords[:-2] + (new_row,) + self.coords[-1:]
118
+
119
+ @property
120
+ def col(self):
121
+ return self.coords[-1]
122
+
123
+ @col.setter
124
+ def col(self, new_col):
125
+ new_col = np.asarray(new_col, dtype=self.coords[-1].dtype)
126
+ self.coords = self.coords[:-1] + (new_col,)
127
+
128
+ def reshape(self, *args, **kwargs):
129
+ shape = check_shape(args, self.shape, allow_nd=self._allow_nd)
130
+ order, copy = check_reshape_kwargs(kwargs)
131
+
132
+ # Return early if reshape is not required
133
+ if shape == self.shape:
134
+ if copy:
135
+ return self.copy()
136
+ else:
137
+ return self
138
+
139
+ # When reducing the number of dimensions, we need to be careful about
140
+ # index overflow. This is why we can't simply call
141
+ # `np.ravel_multi_index()` followed by `np.unravel_index()` here.
142
+ flat_coords = _ravel_coords(self.coords, self.shape, order=order)
143
+ if len(shape) == 2:
144
+ if order == 'C':
145
+ new_coords = divmod(flat_coords, shape[1])
146
+ else:
147
+ new_coords = divmod(flat_coords, shape[0])[::-1]
148
+ else:
149
+ new_coords = np.unravel_index(flat_coords, shape, order=order)
150
+
151
+ idx_dtype = self._get_index_dtype(self.coords, maxval=max(shape))
152
+ new_coords = tuple(np.asarray(co, dtype=idx_dtype) for co in new_coords)
153
+
154
+ # Handle copy here rather than passing on to the constructor so that no
155
+ # copy will be made of `new_coords` regardless.
156
+ if copy:
157
+ new_data = self.data.copy()
158
+ else:
159
+ new_data = self.data
160
+
161
+ return self.__class__((new_data, new_coords), shape=shape, copy=False)
162
+
163
+ reshape.__doc__ = _spbase.reshape.__doc__
164
+
165
+ def _getnnz(self, axis=None):
166
+ if axis is None or (axis == 0 and self.ndim == 1):
167
+ nnz = len(self.data)
168
+ if any(len(idx) != nnz for idx in self.coords):
169
+ raise ValueError('all index and data arrays must have the '
170
+ 'same length')
171
+
172
+ if self.data.ndim != 1 or any(idx.ndim != 1 for idx in self.coords):
173
+ raise ValueError('coordinates and data arrays must be 1-D')
174
+
175
+ return int(nnz)
176
+
177
+ if axis < 0:
178
+ axis += self.ndim
179
+ if axis >= self.ndim:
180
+ raise ValueError('axis out of bounds')
181
+
182
+ return np.bincount(downcast_intp_index(self.coords[1 - axis]),
183
+ minlength=self.shape[1 - axis])
184
+
185
+ _getnnz.__doc__ = _spbase._getnnz.__doc__
186
+
187
+ def count_nonzero(self, axis=None):
188
+ self.sum_duplicates()
189
+ if axis is None:
190
+ return np.count_nonzero(self.data)
191
+
192
+ if axis < 0:
193
+ axis += self.ndim
194
+ if axis < 0 or axis >= self.ndim:
195
+ raise ValueError('axis out of bounds')
196
+ mask = self.data != 0
197
+ coord = self.coords[1 - axis][mask]
198
+ return np.bincount(downcast_intp_index(coord), minlength=self.shape[1 - axis])
199
+
200
+ count_nonzero.__doc__ = _spbase.count_nonzero.__doc__
201
+
202
+ def _check(self):
203
+ """ Checks data structure for consistency """
204
+ if self.ndim != len(self.coords):
205
+ raise ValueError('mismatching number of index arrays for shape; '
206
+ f'got {len(self.coords)}, expected {self.ndim}')
207
+
208
+ # index arrays should have integer data types
209
+ for i, idx in enumerate(self.coords):
210
+ if idx.dtype.kind != 'i':
211
+ warn(f'index array {i} has non-integer dtype ({idx.dtype.name})',
212
+ stacklevel=3)
213
+
214
+ idx_dtype = self._get_index_dtype(self.coords, maxval=max(self.shape))
215
+ self.coords = tuple(np.asarray(idx, dtype=idx_dtype)
216
+ for idx in self.coords)
217
+ self.data = to_native(self.data)
218
+
219
+ if self.nnz > 0:
220
+ for i, idx in enumerate(self.coords):
221
+ if idx.max() >= self.shape[i]:
222
+ raise ValueError(f'axis {i} index {idx.max()} exceeds '
223
+ f'matrix dimension {self.shape[i]}')
224
+ if idx.min() < 0:
225
+ raise ValueError(f'negative axis {i} index: {idx.min()}')
226
+
227
+ def transpose(self, axes=None, copy=False):
228
+ if axes is None:
229
+ axes = range(self.ndim)[::-1]
230
+ elif isinstance(self, sparray):
231
+ if not hasattr(axes, "__len__") or len(axes) != self.ndim:
232
+ raise ValueError("axes don't match matrix dimensions")
233
+ if len(set(axes)) != self.ndim:
234
+ raise ValueError("repeated axis in transpose")
235
+ elif axes != (1, 0):
236
+ raise ValueError("Sparse matrices do not support an 'axes' "
237
+ "parameter because swapping dimensions is the "
238
+ "only logical permutation.")
239
+
240
+ permuted_shape = tuple(self._shape[i] for i in axes)
241
+ permuted_coords = tuple(self.coords[i] for i in axes)
242
+ return self.__class__((self.data, permuted_coords),
243
+ shape=permuted_shape, copy=copy)
244
+
245
+ transpose.__doc__ = _spbase.transpose.__doc__
246
+
247
+ def resize(self, *shape) -> None:
248
+ shape = check_shape(shape, allow_nd=self._allow_nd)
249
+ if self.ndim > 2:
250
+ raise ValueError("only 1-D or 2-D input accepted")
251
+ if len(shape) > 2:
252
+ raise ValueError("shape argument must be 1-D or 2-D")
253
+ # Check for added dimensions.
254
+ if len(shape) > self.ndim:
255
+ flat_coords = _ravel_coords(self.coords, self.shape)
256
+ max_size = math.prod(shape)
257
+ self.coords = np.unravel_index(flat_coords[:max_size], shape)
258
+ self.data = self.data[:max_size]
259
+ self._shape = shape
260
+ return
261
+
262
+ # Check for removed dimensions.
263
+ if len(shape) < self.ndim:
264
+ tmp_shape = (
265
+ self._shape[:len(shape) - 1] # Original shape without last axis
266
+ + (-1,) # Last axis is used to flatten the array
267
+ + (1,) * (self.ndim - len(shape)) # Pad with ones
268
+ )
269
+ tmp = self.reshape(tmp_shape)
270
+ self.coords = tmp.coords[:len(shape)]
271
+ self._shape = tmp.shape[:len(shape)]
272
+
273
+ # Handle truncation of existing dimensions.
274
+ is_truncating = any(old > new for old, new in zip(self.shape, shape))
275
+ if is_truncating:
276
+ mask = np.logical_and.reduce([
277
+ idx < size for idx, size in zip(self.coords, shape)
278
+ ])
279
+ if not mask.all():
280
+ self.coords = tuple(idx[mask] for idx in self.coords)
281
+ self.data = self.data[mask]
282
+
283
+ self._shape = shape
284
+
285
+ resize.__doc__ = _spbase.resize.__doc__
286
+
287
+ def toarray(self, order=None, out=None):
288
+ B = self._process_toarray_args(order, out)
289
+ fortran = int(B.flags.f_contiguous)
290
+ if not fortran and not B.flags.c_contiguous:
291
+ raise ValueError("Output array must be C or F contiguous")
292
+ # This handles both 0D and 1D cases correctly regardless of the
293
+ # original shape.
294
+ if self.ndim == 1:
295
+ coo_todense_nd(np.array([1]), self.nnz, self.ndim,
296
+ self.coords[0], self.data, B.ravel('A'), fortran)
297
+ elif self.ndim == 2:
298
+ M, N = self.shape
299
+ coo_todense(M, N, self.nnz, self.row, self.col, self.data,
300
+ B.ravel('A'), fortran)
301
+ else: # dim>2
302
+ if fortran:
303
+ strides = np.append(1, np.cumprod(self.shape[:-1]))
304
+ else:
305
+ strides = np.append(np.cumprod(self.shape[1:][::-1])[::-1], 1)
306
+ coords = np.concatenate(self.coords)
307
+ coo_todense_nd(strides, self.nnz, self.ndim,
308
+ coords, self.data, B.ravel('A'), fortran)
309
+ # Note: reshape() doesn't copy here, but does return a new array (view).
310
+ return B.reshape(self.shape)
311
+
312
+ toarray.__doc__ = _spbase.toarray.__doc__
313
+
314
+ def tocsc(self, copy=False):
315
+ """Convert this array/matrix to Compressed Sparse Column format
316
+
317
+ Duplicate entries will be summed together.
318
+
319
+ Examples
320
+ --------
321
+ >>> from numpy import array
322
+ >>> from scipy.sparse import coo_array
323
+ >>> row = array([0, 0, 1, 3, 1, 0, 0])
324
+ >>> col = array([0, 2, 1, 3, 1, 0, 0])
325
+ >>> data = array([1, 1, 1, 1, 1, 1, 1])
326
+ >>> A = coo_array((data, (row, col)), shape=(4, 4)).tocsc()
327
+ >>> A.toarray()
328
+ array([[3, 0, 1, 0],
329
+ [0, 2, 0, 0],
330
+ [0, 0, 0, 0],
331
+ [0, 0, 0, 1]])
332
+
333
+ """
334
+ if self.ndim != 2:
335
+ raise ValueError(f'Cannot convert. CSC format must be 2D. Got {self.ndim}D')
336
+ if self.nnz == 0:
337
+ return self._csc_container(self.shape, dtype=self.dtype)
338
+ else:
339
+ from ._csc import csc_array
340
+ indptr, indices, data, shape = self._coo_to_compressed(csc_array._swap)
341
+
342
+ x = self._csc_container((data, indices, indptr), shape=shape)
343
+ if not self.has_canonical_format:
344
+ x.sum_duplicates()
345
+ return x
346
+
347
+ def tocsr(self, copy=False):
348
+ """Convert this array/matrix to Compressed Sparse Row format
349
+
350
+ Duplicate entries will be summed together.
351
+
352
+ Examples
353
+ --------
354
+ >>> from numpy import array
355
+ >>> from scipy.sparse import coo_array
356
+ >>> row = array([0, 0, 1, 3, 1, 0, 0])
357
+ >>> col = array([0, 2, 1, 3, 1, 0, 0])
358
+ >>> data = array([1, 1, 1, 1, 1, 1, 1])
359
+ >>> A = coo_array((data, (row, col)), shape=(4, 4)).tocsr()
360
+ >>> A.toarray()
361
+ array([[3, 0, 1, 0],
362
+ [0, 2, 0, 0],
363
+ [0, 0, 0, 0],
364
+ [0, 0, 0, 1]])
365
+
366
+ """
367
+ if self.ndim > 2:
368
+ raise ValueError(f'Cannot convert. CSR must be 1D or 2D. Got {self.ndim}D')
369
+ if self.nnz == 0:
370
+ return self._csr_container(self.shape, dtype=self.dtype)
371
+ else:
372
+ from ._csr import csr_array
373
+ arrays = self._coo_to_compressed(csr_array._swap, copy=copy)
374
+ indptr, indices, data, shape = arrays
375
+
376
+ x = self._csr_container((data, indices, indptr), shape=self.shape)
377
+ if not self.has_canonical_format:
378
+ x.sum_duplicates()
379
+ return x
380
+
381
+ def _coo_to_compressed(self, swap, copy=False):
382
+ """convert (shape, coords, data) to (indptr, indices, data, shape)"""
383
+ M, N = swap(self._shape_as_2d)
384
+ # convert idx_dtype intc to int32 for pythran.
385
+ # tested in scipy/optimize/tests/test__numdiff.py::test_group_columns
386
+ idx_dtype = self._get_index_dtype(self.coords, maxval=max(self.nnz, N))
387
+
388
+ if self.ndim == 1:
389
+ indices = self.coords[0].copy() if copy else self.coords[0]
390
+ nnz = len(indices)
391
+ indptr = np.array([0, nnz], dtype=idx_dtype)
392
+ data = self.data.copy() if copy else self.data
393
+ return indptr, indices, data, self.shape
394
+
395
+ # ndim == 2
396
+ major, minor = swap(self.coords)
397
+ nnz = len(major)
398
+ major = major.astype(idx_dtype, copy=False)
399
+ minor = minor.astype(idx_dtype, copy=False)
400
+
401
+ indptr = np.empty(M + 1, dtype=idx_dtype)
402
+ indices = np.empty_like(minor, dtype=idx_dtype)
403
+ data = np.empty_like(self.data, dtype=self.dtype)
404
+
405
+ coo_tocsr(M, N, nnz, major, minor, self.data, indptr, indices, data)
406
+ return indptr, indices, data, self.shape
407
+
408
+ def tocoo(self, copy=False):
409
+ if copy:
410
+ return self.copy()
411
+ else:
412
+ return self
413
+
414
+ tocoo.__doc__ = _spbase.tocoo.__doc__
415
+
416
+ def todia(self, copy=False):
417
+ if self.ndim != 2:
418
+ raise ValueError(f'Cannot convert. DIA format must be 2D. Got {self.ndim}D')
419
+ self.sum_duplicates()
420
+ ks = self.col - self.row # the diagonal for each nonzero
421
+ diags, diag_idx = np.unique(ks, return_inverse=True)
422
+
423
+ if len(diags) > 100:
424
+ # probably undesired, should todia() have a maxdiags parameter?
425
+ warn(f"Constructing a DIA matrix with {len(diags)} diagonals "
426
+ "is inefficient",
427
+ SparseEfficiencyWarning, stacklevel=2)
428
+
429
+ #initialize and fill in data array
430
+ if self.data.size == 0:
431
+ data = np.zeros((0, 0), dtype=self.dtype)
432
+ else:
433
+ data = np.zeros((len(diags), self.col.max()+1), dtype=self.dtype)
434
+ data[diag_idx, self.col] = self.data
435
+
436
+ return self._dia_container((data, diags), shape=self.shape)
437
+
438
+ todia.__doc__ = _spbase.todia.__doc__
439
+
440
+ def todok(self, copy=False):
441
+ if self.ndim > 2:
442
+ raise ValueError(f'Cannot convert. DOK must be 1D or 2D. Got {self.ndim}D')
443
+ self.sum_duplicates()
444
+ dok = self._dok_container(self.shape, dtype=self.dtype)
445
+ # ensure that 1d coordinates are not tuples
446
+ if self.ndim == 1:
447
+ coords = self.coords[0]
448
+ else:
449
+ coords = zip(*self.coords)
450
+
451
+ dok._dict = dict(zip(coords, self.data))
452
+ return dok
453
+
454
+ todok.__doc__ = _spbase.todok.__doc__
455
+
456
+ def diagonal(self, k=0):
457
+ if self.ndim != 2:
458
+ raise ValueError("diagonal requires two dimensions")
459
+ rows, cols = self.shape
460
+ if k <= -rows or k >= cols:
461
+ return np.empty(0, dtype=self.data.dtype)
462
+ diag = np.zeros(min(rows + min(k, 0), cols - max(k, 0)),
463
+ dtype=self.dtype)
464
+ diag_mask = (self.row + k) == self.col
465
+
466
+ if self.has_canonical_format:
467
+ row = self.row[diag_mask]
468
+ data = self.data[diag_mask]
469
+ else:
470
+ inds = tuple(idx[diag_mask] for idx in self.coords)
471
+ (row, _), data = self._sum_duplicates(inds, self.data[diag_mask])
472
+ diag[row + min(k, 0)] = data
473
+
474
+ return diag
475
+
476
+ diagonal.__doc__ = _data_matrix.diagonal.__doc__
477
+
478
+ def _setdiag(self, values, k):
479
+ if self.ndim != 2:
480
+ raise ValueError("setting a diagonal requires two dimensions")
481
+ M, N = self.shape
482
+ if values.ndim and not len(values):
483
+ return
484
+ idx_dtype = self.row.dtype
485
+
486
+ # Determine which triples to keep and where to put the new ones.
487
+ full_keep = self.col - self.row != k
488
+ if k < 0:
489
+ max_index = min(M+k, N)
490
+ if values.ndim:
491
+ max_index = min(max_index, len(values))
492
+ keep = np.logical_or(full_keep, self.col >= max_index)
493
+ new_row = np.arange(-k, -k + max_index, dtype=idx_dtype)
494
+ new_col = np.arange(max_index, dtype=idx_dtype)
495
+ else:
496
+ max_index = min(M, N-k)
497
+ if values.ndim:
498
+ max_index = min(max_index, len(values))
499
+ keep = np.logical_or(full_keep, self.row >= max_index)
500
+ new_row = np.arange(max_index, dtype=idx_dtype)
501
+ new_col = np.arange(k, k + max_index, dtype=idx_dtype)
502
+
503
+ # Define the array of data consisting of the entries to be added.
504
+ if values.ndim:
505
+ new_data = values[:max_index]
506
+ else:
507
+ new_data = np.empty(max_index, dtype=self.dtype)
508
+ new_data[:] = values
509
+
510
+ # Update the internal structure.
511
+ self.coords = (np.concatenate((self.row[keep], new_row)),
512
+ np.concatenate((self.col[keep], new_col)))
513
+ self.data = np.concatenate((self.data[keep], new_data))
514
+ self.has_canonical_format = False
515
+
516
+ # needed by _data_matrix
517
+ def _with_data(self, data, copy=True):
518
+ """Returns a matrix with the same sparsity structure as self,
519
+ but with different data. By default the index arrays are copied.
520
+ """
521
+ if copy:
522
+ coords = tuple(idx.copy() for idx in self.coords)
523
+ else:
524
+ coords = self.coords
525
+ return self.__class__((data, coords), shape=self.shape, dtype=data.dtype)
526
+
527
+ def sum_duplicates(self) -> None:
528
+ """Eliminate duplicate entries by adding them together
529
+
530
+ This is an *in place* operation
531
+ """
532
+ if self.has_canonical_format:
533
+ return
534
+ summed = self._sum_duplicates(self.coords, self.data)
535
+ self.coords, self.data = summed
536
+ self.has_canonical_format = True
537
+
538
+ def _sum_duplicates(self, coords, data):
539
+ # Assumes coords not in canonical format.
540
+ if len(data) == 0:
541
+ return coords, data
542
+ # Sort coords w.r.t. rows, then cols. This corresponds to C-order,
543
+ # which we rely on for argmin/argmax to return the first index in the
544
+ # same way that numpy does (in the case of ties).
545
+ order = np.lexsort(coords[::-1])
546
+ coords = tuple(idx[order] for idx in coords)
547
+ data = data[order]
548
+ unique_mask = np.logical_or.reduce([
549
+ idx[1:] != idx[:-1] for idx in coords
550
+ ])
551
+ unique_mask = np.append(True, unique_mask)
552
+ coords = tuple(idx[unique_mask] for idx in coords)
553
+ unique_inds, = np.nonzero(unique_mask)
554
+ data = np.add.reduceat(data, downcast_intp_index(unique_inds), dtype=self.dtype)
555
+ return coords, data
556
+
557
+ def eliminate_zeros(self):
558
+ """Remove zero entries from the array/matrix
559
+
560
+ This is an *in place* operation
561
+ """
562
+ mask = self.data != 0
563
+ self.data = self.data[mask]
564
+ self.coords = tuple(idx[mask] for idx in self.coords)
565
+
566
+ #######################
567
+ # Arithmetic handlers #
568
+ #######################
569
+
570
+ def _add_dense(self, other):
571
+ if other.shape != self.shape:
572
+ raise ValueError(f'Incompatible shapes ({self.shape} and {other.shape})')
573
+ dtype = upcast_char(self.dtype.char, other.dtype.char)
574
+ result = np.array(other, dtype=dtype, copy=True)
575
+ fortran = int(result.flags.f_contiguous)
576
+ if self.ndim == 1:
577
+ coo_todense_nd(np.array([1]), self.nnz, self.ndim,
578
+ self.coords[0], self.data, result.ravel('A'), fortran)
579
+ elif self.ndim == 2:
580
+ M, N = self._shape_as_2d
581
+ coo_todense(M, N, self.nnz, self.row, self.col, self.data,
582
+ result.ravel('A'), fortran)
583
+ else:
584
+ if fortran:
585
+ strides = np.append(1, np.cumprod(self.shape[:-1]))
586
+ else:
587
+ strides = np.append(np.cumprod(self.shape[1:][::-1])[::-1], 1)
588
+ coords = np.concatenate(self.coords)
589
+ coo_todense_nd(strides, self.nnz, self.ndim,
590
+ coords, self.data, result.ravel('A'), fortran)
591
+ return self._container(result, copy=False)
592
+
593
+
594
+ def _add_sparse(self, other):
595
+ if self.ndim < 3:
596
+ return self.tocsr()._add_sparse(other)
597
+
598
+ if other.shape != self.shape:
599
+ raise ValueError(f'Incompatible shapes ({self.shape} and {other.shape})')
600
+ other = self.__class__(other)
601
+ new_data = np.concatenate((self.data, other.data))
602
+ new_coords = tuple(np.concatenate((self.coords, other.coords), axis=1))
603
+ A = self.__class__((new_data, new_coords), shape=self.shape)
604
+ return A
605
+
606
+ def _sub_sparse(self, other):
607
+ if self.ndim < 3:
608
+ return self.tocsr()._sub_sparse(other)
609
+
610
+ if other.shape != self.shape:
611
+ raise ValueError(f'Incompatible shapes ({self.shape} and {other.shape})')
612
+ other = self.__class__(other)
613
+ new_data = np.concatenate((self.data, -other.data))
614
+ new_coords = tuple(np.concatenate((self.coords, other.coords), axis=1))
615
+ A = coo_array((new_data, new_coords), shape=self.shape)
616
+ return A
617
+
618
+ def _matmul_vector(self, other):
619
+ if self.ndim > 2:
620
+ result = np.zeros(math.prod(self.shape[:-1]),
621
+ dtype=upcast_char(self.dtype.char, other.dtype.char))
622
+ shape = np.array(self.shape)
623
+ strides = np.append(np.cumprod(shape[:-1][::-1])[::-1][1:], 1)
624
+ coords = np.concatenate(self.coords)
625
+ coo_matvec_nd(self.nnz, len(self.shape), strides, coords, self.data,
626
+ other, result)
627
+
628
+ result = result.reshape(self.shape[:-1])
629
+ return result
630
+
631
+ # self.ndim <= 2
632
+ result_shape = self.shape[0] if self.ndim > 1 else 1
633
+ result = np.zeros(result_shape,
634
+ dtype=upcast_char(self.dtype.char, other.dtype.char))
635
+ if self.ndim == 2:
636
+ col = self.col
637
+ row = self.row
638
+ elif self.ndim == 1:
639
+ col = self.coords[0]
640
+ row = np.zeros_like(col)
641
+ else:
642
+ raise NotImplementedError(
643
+ f"coo_matvec not implemented for ndim={self.ndim}")
644
+
645
+ coo_matvec(self.nnz, row, col, self.data, other, result)
646
+ # Array semantics return a scalar here, not a single-element array.
647
+ if isinstance(self, sparray) and result_shape == 1:
648
+ return result[0]
649
+ return result
650
+
651
+ def _rmatmul_dispatch(self, other):
652
+ if isscalarlike(other):
653
+ return self._mul_scalar(other)
654
+ else:
655
+ # Don't use asarray unless we have to
656
+ try:
657
+ o_ndim = other.ndim
658
+ except AttributeError:
659
+ other = np.asarray(other)
660
+ o_ndim = other.ndim
661
+ perm = tuple(range(o_ndim)[:-2]) + tuple(range(o_ndim)[-2:][::-1])
662
+ tr = other.transpose(perm)
663
+
664
+ s_ndim = self.ndim
665
+ perm = tuple(range(s_ndim)[:-2]) + tuple(range(s_ndim)[-2:][::-1])
666
+ ret = self.transpose(perm)._matmul_dispatch(tr)
667
+ if ret is NotImplemented:
668
+ return NotImplemented
669
+
670
+ if s_ndim == 1 or o_ndim == 1:
671
+ perm = range(ret.ndim)
672
+ else:
673
+ perm = tuple(range(ret.ndim)[:-2]) + tuple(range(ret.ndim)[-2:][::-1])
674
+ return ret.transpose(perm)
675
+
676
+ def _matmul_dispatch(self, other):
677
+ if isscalarlike(other):
678
+ return self.multiply(other)
679
+
680
+ if not (issparse(other) or isdense(other)):
681
+ # If it's a list or whatever, treat it like an array
682
+ other_a = np.asanyarray(other)
683
+
684
+ if other_a.ndim == 0 and other_a.dtype == np.object_:
685
+ # Not interpretable as an array; return NotImplemented so that
686
+ # other's __rmatmul__ can kick in if that's implemented.
687
+ return NotImplemented
688
+ # Allow custom sparse class indicated by attr sparse gh-6520
689
+ try:
690
+ other.shape
691
+ except AttributeError:
692
+ other = other_a
693
+
694
+ if self.ndim < 3 and other.ndim < 3:
695
+ return _spbase._matmul_dispatch(self, other)
696
+
697
+ N = self.shape[-1]
698
+ err_prefix = "matmul: dimension mismatch with signature"
699
+ if other.__class__ is np.ndarray:
700
+ if other.shape == (N,):
701
+ return self._matmul_vector(other)
702
+ if other.shape == (N, 1):
703
+ result = self._matmul_vector(other.ravel())
704
+ return result.reshape(*self.shape[:-1], 1)
705
+ if other.ndim == 1:
706
+ msg = f"{err_prefix} (n,k={N}),(k={other.shape[0]},)->(n,)"
707
+ raise ValueError(msg)
708
+ if other.shape[-2] == N:
709
+ # check for batch dimensions compatibility
710
+ batch_shape_A = self.shape[:-2]
711
+ batch_shape_B = other.shape[:-2]
712
+ if batch_shape_A != batch_shape_B:
713
+ try:
714
+ # This will raise an error if the shapes are not broadcastable
715
+ np.broadcast_shapes(batch_shape_A, batch_shape_B)
716
+ except ValueError:
717
+ raise ValueError("Batch dimensions are not broadcastable")
718
+
719
+ return self._matmul_multivector(other)
720
+ else:
721
+ raise ValueError(
722
+ f"{err_prefix} (n,..,k={N}),(k={other.shape[-2]},..,m)->(n,..,m)"
723
+ )
724
+
725
+ if isscalarlike(other):
726
+ # scalar value
727
+ return self._mul_scalar(other)
728
+
729
+ if issparse(other):
730
+ self_is_1d = self.ndim == 1
731
+ other_is_1d = other.ndim == 1
732
+
733
+ # reshape to 2-D if self or other is 1-D
734
+ if self_is_1d:
735
+ self = self.reshape(self._shape_as_2d) # prepend 1 to shape
736
+
737
+ if other_is_1d:
738
+ other = other.reshape((other.shape[0], 1)) # append 1 to shape
739
+
740
+ # Check if the inner dimensions match for matrix multiplication
741
+ if N != other.shape[-2]:
742
+ raise ValueError(
743
+ f"{err_prefix} (n,..,k={N}),(k={other.shape[-2]},..,m)->(n,..,m)"
744
+ )
745
+
746
+ # If A or B has more than 2 dimensions, check for
747
+ # batch dimensions compatibility
748
+ if self.ndim > 2 or other.ndim > 2:
749
+ batch_shape_A = self.shape[:-2]
750
+ batch_shape_B = other.shape[:-2]
751
+ if batch_shape_A != batch_shape_B:
752
+ try:
753
+ # This will raise an error if the shapes are not broadcastable
754
+ np.broadcast_shapes(batch_shape_A, batch_shape_B)
755
+ except ValueError:
756
+ raise ValueError("Batch dimensions are not broadcastable")
757
+
758
+ result = self._matmul_sparse(other)
759
+
760
+ # reshape back if a or b were originally 1-D
761
+ if self_is_1d:
762
+ # if self was originally 1-D, reshape result accordingly
763
+ result = result.reshape(tuple(result.shape[:-2]) +
764
+ tuple(result.shape[-1:]))
765
+ if other_is_1d:
766
+ result = result.reshape(result.shape[:-1])
767
+ return result
768
+
769
+ def _matmul_multivector(self, other):
770
+ result_dtype = upcast_char(self.dtype.char, other.dtype.char)
771
+ if self.ndim >= 3 or other.ndim >= 3:
772
+ # if self has shape (N,), reshape to (1,N)
773
+ if self.ndim == 1:
774
+ result = self.reshape(1, self.shape[0])._matmul_multivector(other)
775
+ return result.reshape(tuple(other.shape[:-2]) + tuple(other.shape[-1:]))
776
+
777
+ broadcast_shape = np.broadcast_shapes(self.shape[:-2], other.shape[:-2])
778
+ self_shape = broadcast_shape + self.shape[-2:]
779
+ other_shape = broadcast_shape + other.shape[-2:]
780
+
781
+ self = self._broadcast_to(self_shape)
782
+ other = np.broadcast_to(other, other_shape)
783
+ result_shape = broadcast_shape + self.shape[-2:-1] + other.shape[-1:]
784
+ result = np.zeros(result_shape, dtype=result_dtype)
785
+ coo_matmat_dense_nd(self.nnz, len(self.shape), other.shape[-1],
786
+ np.array(other_shape), np.array(result_shape),
787
+ np.concatenate(self.coords),
788
+ self.data, other.ravel('C'), result)
789
+ return result
790
+
791
+ if self.ndim == 2:
792
+ result_shape = (self.shape[0], other.shape[1])
793
+ col = self.col
794
+ row = self.row
795
+ elif self.ndim == 1:
796
+ result_shape = (other.shape[1],)
797
+ col = self.coords[0]
798
+ row = np.zeros_like(col)
799
+ result = np.zeros(result_shape, dtype=result_dtype)
800
+ coo_matmat_dense(self.nnz, other.shape[-1], row, col,
801
+ self.data, other.ravel('C'), result)
802
+ return result.view(type=type(other))
803
+
804
+ def dot(self, other):
805
+ """Return the dot product of two arrays.
806
+
807
+ Strictly speaking a dot product involves two vectors.
808
+ But in the sense that an array with ndim >= 1 is a collection
809
+ of vectors, the function computes the collection of dot products
810
+ between each vector in the first array with each vector in the
811
+ second array. The axis upon which the sum of products is performed
812
+ is the last axis of the first array and the second to last axis of
813
+ the second array. If the second array is 1-D, the last axis is used.
814
+
815
+ Thus, if both arrays are 1-D, the inner product is returned.
816
+ If both are 2-D, we have matrix multiplication. If `other` is 1-D,
817
+ the sum product is taken along the last axis of each array. If
818
+ `other` is N-D for N>=2, the sum product is over the last axis of
819
+ the first array and the second-to-last axis of the second array.
820
+
821
+ Parameters
822
+ ----------
823
+ other : array_like (dense or sparse)
824
+ Second array
825
+
826
+ Returns
827
+ -------
828
+ output : array (sparse or dense)
829
+ The dot product of this array with `other`.
830
+ It will be dense/sparse if `other` is dense/sparse.
831
+
832
+ Examples
833
+ --------
834
+
835
+ >>> import numpy as np
836
+ >>> from scipy.sparse import coo_array
837
+ >>> A = coo_array([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
838
+ >>> v = np.array([1, 0, -1])
839
+ >>> A.dot(v)
840
+ array([ 1, -3, -1], dtype=int64)
841
+
842
+ For 2-D arrays it is the matrix product:
843
+
844
+ >>> A = coo_array([[1, 0], [0, 1]])
845
+ >>> B = coo_array([[4, 1], [2, 2]])
846
+ >>> A.dot(B).toarray()
847
+ array([[4, 1],
848
+ [2, 2]])
849
+
850
+ For 3-D arrays the shape extends unused axes by other unused axes.
851
+
852
+ >>> A = coo_array(np.arange(3*4*5*6)).reshape((3,4,5,6))
853
+ >>> B = coo_array(np.arange(3*4*5*6)).reshape((5,4,6,3))
854
+ >>> A.dot(B).shape
855
+ (3, 4, 5, 5, 4, 3)
856
+ """
857
+ # handle non-array input: lists, ints, etc
858
+ if not (issparse(other) or isdense(other) or isscalarlike(other)):
859
+ # If it's a list or whatever, treat it like an array
860
+ o_array = np.asanyarray(other)
861
+
862
+ if o_array.ndim == 0 and o_array.dtype == np.object_:
863
+ raise TypeError(f"dot argument not supported type: '{type(other)}'")
864
+ try:
865
+ other.shape
866
+ except AttributeError:
867
+ other = o_array
868
+
869
+ # Handle scalar multiplication
870
+ if isscalarlike(other):
871
+ return self * other
872
+
873
+ # other.shape[-2:][0] gets last index of 1d, next to last index of >1d
874
+ if self.shape[-1] != other.shape[-2:][0]:
875
+ raise ValueError(f"shapes {self.shape} and {other.shape}"
876
+ " are not aligned for n-D dot")
877
+
878
+ if self.ndim < 3 and other.ndim < 3:
879
+ return self @ other
880
+ if isdense(other):
881
+ return self._dense_dot(other)
882
+ return self._sparse_dot(other.tocoo())
883
+
884
+ def _sparse_dot(self, other):
885
+ # already checked: at least one is >2d, neither scalar, both are coo
886
+ # Ravel non-reduced axes coordinates
887
+ self_2d, s_new_shape = _convert_to_2d(self, [self.ndim - 1])
888
+ other_2d, o_new_shape = _convert_to_2d(other, [max(0, other.ndim - 2)])
889
+
890
+ prod = self_2d @ other_2d.T # routes via 2-D CSR
891
+ prod = prod.tocoo()
892
+
893
+ # Combine the shapes of the non-contracted axes
894
+ combined_shape = s_new_shape + o_new_shape
895
+
896
+ # Unravel the 2D coordinates to get multi-dimensional coordinates
897
+ coords = []
898
+ new_shapes = (s_new_shape, o_new_shape) if s_new_shape else (o_new_shape,)
899
+ for c, s in zip(prod.coords, new_shapes):
900
+ coords.extend(np.unravel_index(c, s))
901
+
902
+ # Construct the resulting COO array with coords and shape
903
+ return coo_array((prod.data, coords), shape=combined_shape)
904
+
905
+ def _dense_dot(self, other):
906
+ # already checked: self is >0d, other is dense and >0d
907
+ # Ravel non-reduced axes coordinates
908
+ s_ndim = self.ndim
909
+ if s_ndim <= 2:
910
+ s_new_shape = () if s_ndim == 1 else (self.shape[0],)
911
+ self_2d = self
912
+ else:
913
+ self_2d, s_new_shape = _convert_to_2d(self, [self.ndim - 1])
914
+
915
+ o_ndim = other.ndim
916
+ if o_ndim <= 2:
917
+ o_new_shape = () if o_ndim == 1 else (other.shape[-1],)
918
+ other_2d = other
919
+ else:
920
+ o_new_shape = other.shape[:-2] + other.shape[-1:]
921
+ reorder_dims = (o_ndim - 2, *range(o_ndim - 2), o_ndim - 1)
922
+ o_reorg = np.transpose(other, reorder_dims)
923
+ other_2d = o_reorg.reshape((other.shape[-2], math.prod(o_new_shape)))
924
+
925
+ prod = self_2d @ other_2d # routes via 2-D CSR
926
+
927
+ # Combine the shapes of the non-contracted axes
928
+ combined_shape = s_new_shape + o_new_shape
929
+ return prod.reshape(combined_shape)
930
+
931
+
932
+ def tensordot(self, other, axes=2):
933
+ """Return the tensordot product with another array along the given axes.
934
+
935
+ The tensordot differs from dot and matmul in that any axis can be
936
+ chosen for each of the first and second array and the sum of the
937
+ products is computed just like for matrix multiplication, only not
938
+ just for the rows of the first times the columns of the second. It
939
+ takes the dot product of the collection of vectors along the specified
940
+ axes. Here we can even take the sum of the products along two or even
941
+ more axes if desired. So, tensordot is a dot product computation
942
+ applied to arrays of any dimension >= 1. It is like matmul but over
943
+ arbitrary axes for each matrix.
944
+
945
+ Given two tensors, `a` and `b`, and the desired axes specified as a
946
+ 2-tuple/list/array containing two sequences of axis numbers,
947
+ ``(a_axes, b_axes)``, sum the products of `a`'s and `b`'s elements
948
+ (components) over the axes specified by ``a_axes`` and ``b_axes``.
949
+ The `axes` input can be a single non-negative integer, ``N``;
950
+ if it is, then the last ``N`` dimensions of `a` and the first
951
+ ``N`` dimensions of `b` are summed over.
952
+
953
+ Parameters
954
+ ----------
955
+ a, b : array_like
956
+ Tensors to "dot".
957
+
958
+ axes : int or (2,) array_like
959
+ * integer_like
960
+ If an int N, sum over the last N axes of `a` and the first N axes
961
+ of `b` in order. The sizes of the corresponding axes must match.
962
+ * (2,) array_like
963
+ A 2-tuple of sequences of axes to be summed over, the first applying
964
+ to `a`, the second to `b`. The sequences must be the same length.
965
+ The shape of the corresponding axes must match between `a` and `b`.
966
+
967
+ Returns
968
+ -------
969
+ output : coo_array
970
+ The tensor dot product of this array with `other`.
971
+ It will be dense/sparse if `other` is dense/sparse.
972
+
973
+ See Also
974
+ --------
975
+ dot
976
+
977
+ Examples
978
+ --------
979
+ >>> import numpy as np
980
+ >>> import scipy.sparse
981
+ >>> A = scipy.sparse.coo_array([[[2, 3], [0, 0]], [[0, 1], [0, 5]]])
982
+ >>> A.shape
983
+ (2, 2, 2)
984
+
985
+ Integer axes N are shorthand for (range(-N, 0), range(0, N)):
986
+
987
+ >>> A.tensordot(A, axes=1).toarray()
988
+ array([[[[ 4, 9],
989
+ [ 0, 15]],
990
+ <BLANKLINE>
991
+ [[ 0, 0],
992
+ [ 0, 0]]],
993
+ <BLANKLINE>
994
+ <BLANKLINE>
995
+ [[[ 0, 1],
996
+ [ 0, 5]],
997
+ <BLANKLINE>
998
+ [[ 0, 5],
999
+ [ 0, 25]]]])
1000
+ >>> A.tensordot(A, axes=2).toarray()
1001
+ array([[ 4, 6],
1002
+ [ 0, 25]])
1003
+ >>> A.tensordot(A, axes=3)
1004
+ array(39)
1005
+
1006
+ Using tuple for axes:
1007
+
1008
+ >>> a = scipy.sparse.coo_array(np.arange(60).reshape(3,4,5))
1009
+ >>> b = np.arange(24).reshape(4,3,2)
1010
+ >>> c = a.tensordot(b, axes=([1,0],[0,1]))
1011
+ >>> c.shape
1012
+ (5, 2)
1013
+ >>> c
1014
+ array([[4400, 4730],
1015
+ [4532, 4874],
1016
+ [4664, 5018],
1017
+ [4796, 5162],
1018
+ [4928, 5306]])
1019
+
1020
+ """
1021
+ if not isdense(other) and not issparse(other):
1022
+ # If it's a list or whatever, treat it like an array
1023
+ other_array = np.asanyarray(other)
1024
+
1025
+ if other_array.ndim == 0 and other_array.dtype == np.object_:
1026
+ raise TypeError(f"tensordot arg not supported type: '{type(other)}'")
1027
+ try:
1028
+ other.shape
1029
+ except AttributeError:
1030
+ other = other_array
1031
+
1032
+ axes_self, axes_other = _process_axes(self.ndim, other.ndim, axes)
1033
+
1034
+ # Check for shape compatibility along specified axes
1035
+ if any(self.shape[ax] != other.shape[bx]
1036
+ for ax, bx in zip(axes_self, axes_other)):
1037
+ raise ValueError("sizes of the corresponding axes must match")
1038
+
1039
+ if isdense(other):
1040
+ return self._dense_tensordot(other, axes_self, axes_other)
1041
+ else:
1042
+ return self._sparse_tensordot(other, axes_self, axes_other)
1043
+
1044
+ def _sparse_tensordot(self, other, s_axes, o_axes):
1045
+ # Prepare the tensors for tensordot operation
1046
+ # Ravel non-reduced axes coordinates
1047
+ self_2d, s_new_shape = _convert_to_2d(self, s_axes)
1048
+ other_2d, o_new_shape = _convert_to_2d(other, o_axes)
1049
+
1050
+ # Perform matrix multiplication (routed via 2-D CSR)
1051
+ prod = self_2d @ other_2d.T
1052
+ # handle case of scalar result (axis includes all axes for both)
1053
+ if not issparse(prod):
1054
+ return prod
1055
+ prod = prod.tocoo()
1056
+
1057
+ # Combine the shapes of the non-contracted axes
1058
+ combined_shape = s_new_shape + o_new_shape
1059
+
1060
+ # Unravel the 2D coordinates to get multi-dimensional coordinates
1061
+ coords = []
1062
+ new_shapes = (s_new_shape, o_new_shape) if s_new_shape else (o_new_shape,)
1063
+ for c, s in zip(prod.coords, new_shapes):
1064
+ if s:
1065
+ coords.extend(np.unravel_index(c, s))
1066
+
1067
+ # Construct the resulting COO array with coords and shape
1068
+ return coo_array((prod.data, coords), shape=combined_shape)
1069
+
1070
+ def _dense_tensordot(self, other, s_axes, o_axes):
1071
+ s_ndim = len(self.shape)
1072
+ o_ndim = len(other.shape)
1073
+
1074
+ s_non_axes = [i for i in range(s_ndim) if i not in s_axes]
1075
+ s_axes_shape = [self.shape[i] for i in s_axes]
1076
+ s_non_axes_shape = [self.shape[i] for i in s_non_axes]
1077
+
1078
+ o_non_axes = [i for i in range(o_ndim) if i not in o_axes]
1079
+ o_axes_shape = [other.shape[i] for i in o_axes]
1080
+ o_non_axes_shape = [other.shape[i] for i in o_non_axes]
1081
+
1082
+ left = self.transpose(s_non_axes + s_axes)
1083
+ right = np.transpose(other, o_non_axes[:-1] + o_axes + o_non_axes[-1:])
1084
+
1085
+ reshape_left = (*s_non_axes_shape, math.prod(s_axes_shape))
1086
+ reshape_right = (*o_non_axes_shape[:-1], math.prod(o_axes_shape),
1087
+ *o_non_axes_shape[-1:])
1088
+
1089
+ return left.reshape(reshape_left).dot(right.reshape(reshape_right))
1090
+
1091
+ def _matmul_sparse(self, other):
1092
+ """
1093
+ Perform sparse-sparse matrix multiplication for two n-D COO arrays.
1094
+ The method converts input n-D arrays to 2-D block array format,
1095
+ uses csr_matmat to multiply them, and then converts the
1096
+ result back to n-D COO array.
1097
+
1098
+ Parameters:
1099
+ self (COO): The first n-D sparse array in COO format.
1100
+ other (COO): The second n-D sparse array in COO format.
1101
+
1102
+ Returns:
1103
+ prod (COO): The resulting n-D sparse array after multiplication.
1104
+ """
1105
+ if self.ndim < 3 and other.ndim < 3:
1106
+ return _spbase._matmul_sparse(self, other)
1107
+
1108
+ # Get the shapes of self and other
1109
+ self_shape = self.shape
1110
+ other_shape = other.shape
1111
+
1112
+ # Determine the new shape to broadcast self and other
1113
+ broadcast_shape = np.broadcast_shapes(self_shape[:-2], other_shape[:-2])
1114
+ self_new_shape = tuple(broadcast_shape) + self_shape[-2:]
1115
+ other_new_shape = tuple(broadcast_shape) + other_shape[-2:]
1116
+
1117
+ self_broadcasted = self._broadcast_to(self_new_shape)
1118
+ other_broadcasted = other._broadcast_to(other_new_shape)
1119
+
1120
+ # Convert n-D COO arrays to 2-D block diagonal arrays
1121
+ self_block_diag = _block_diag(self_broadcasted)
1122
+ other_block_diag = _block_diag(other_broadcasted)
1123
+
1124
+ # Use csr_matmat to perform sparse matrix multiplication
1125
+ prod_block_diag = (self_block_diag @ other_block_diag).tocoo()
1126
+
1127
+ # Convert the 2-D block diagonal array back to n-D
1128
+ return _extract_block_diag(
1129
+ prod_block_diag,
1130
+ shape=(*broadcast_shape, self.shape[-2], other.shape[-1]),
1131
+ )
1132
+
1133
+ def _broadcast_to(self, new_shape, copy=False):
1134
+ if self.shape == new_shape:
1135
+ return self.copy() if copy else self
1136
+
1137
+ old_shape = self.shape
1138
+
1139
+ # Check if the new shape is compatible for broadcasting
1140
+ if len(new_shape) < len(old_shape):
1141
+ raise ValueError("New shape must have at least as many dimensions"
1142
+ " as the current shape")
1143
+
1144
+ # Add leading ones to shape to ensure same length as `new_shape`
1145
+ shape = (1,) * (len(new_shape) - len(old_shape)) + tuple(old_shape)
1146
+
1147
+ # Ensure the old shape can be broadcast to the new shape
1148
+ if any((o != 1 and o != n) for o, n in zip(shape, new_shape)):
1149
+ raise ValueError(f"current shape {old_shape} cannot be "
1150
+ "broadcast to new shape {new_shape}")
1151
+
1152
+ # Reshape the COO array to match the new dimensions
1153
+ self = self.reshape(shape)
1154
+
1155
+ idx_dtype = get_index_dtype(self.coords, maxval=max(new_shape))
1156
+ coords = self.coords
1157
+ new_data = self.data
1158
+ new_coords = coords[-1:] # Copy last coordinate to start
1159
+ cum_repeat = 1 # Cumulative repeat factor for broadcasting
1160
+
1161
+ if shape[-1] != new_shape[-1]: # broadcasting the n-th (col) dimension
1162
+ repeat_count = new_shape[-1]
1163
+ cum_repeat *= repeat_count
1164
+ new_data = np.tile(new_data, repeat_count)
1165
+ new_dim = np.repeat(np.arange(0, repeat_count, dtype=idx_dtype), self.nnz)
1166
+ new_coords = (new_dim,)
1167
+
1168
+ for i in range(-2, -(len(shape)+1), -1):
1169
+ if shape[i] != new_shape[i]:
1170
+ repeat_count = new_shape[i] # number of times to repeat data, coords
1171
+ cum_repeat *= repeat_count # update cumulative repeat factor
1172
+ nnz = len(new_data) # Number of non-zero elements so far
1173
+
1174
+ # Tile data and coordinates to match the new repeat count
1175
+ new_data = np.tile(new_data, repeat_count)
1176
+ new_coords = tuple(np.tile(new_coords[i+1:], repeat_count))
1177
+
1178
+ # Create new dimensions and stack them
1179
+ new_dim = np.repeat(np.arange(0, repeat_count, dtype=idx_dtype), nnz)
1180
+ new_coords = (new_dim,) + new_coords
1181
+ else:
1182
+ # If no broadcasting needed, tile the coordinates
1183
+ new_dim = np.tile(coords[i], cum_repeat)
1184
+ new_coords = (new_dim,) + new_coords
1185
+
1186
+ return coo_array((new_data, new_coords), new_shape)
1187
+
1188
+ def _sum_nd(self, axis, res_dtype, out):
1189
+ # axis and out are preprocessed. out.shape is new_shape
1190
+ A2d, new_shape = _convert_to_2d(self, axis)
1191
+ ones = np.ones((A2d.shape[1], 1), dtype=res_dtype)
1192
+ # sets dtype while loading into out
1193
+ out[...] = (A2d @ ones).reshape(new_shape)
1194
+ return out
1195
+
1196
+ def _min_or_max_axis_nd(self, axis, min_or_max, explicit):
1197
+ A2d, new_shape = _convert_to_2d(self, axis)
1198
+ res = A2d._min_or_max_axis(1, min_or_max, explicit)
1199
+ unraveled_coords = np.unravel_index(res.coords[0], new_shape)
1200
+
1201
+ return coo_array((res.data, unraveled_coords), new_shape)
1202
+
1203
+ def _argminmax_axis_nd(self, axis, argminmax, compare, explicit):
1204
+ A2d, new_shape = _convert_to_2d(self, axis)
1205
+ res_flat = A2d._argminmax_axis(1, argminmax, compare, explicit)
1206
+ return res_flat.reshape(new_shape)
1207
+
1208
+
1209
+ def _block_diag(self):
1210
+ """
1211
+ Converts an N-D COO array into a 2-D COO array in block diagonal form.
1212
+
1213
+ Parameters:
1214
+ self (coo_array): An N-Dimensional COO sparse array.
1215
+
1216
+ Returns:
1217
+ coo_array: A 2-Dimensional COO sparse array in block diagonal form.
1218
+ """
1219
+ if self.ndim<2:
1220
+ raise ValueError("array must have atleast dim=2")
1221
+ num_blocks = math.prod(self.shape[:-2])
1222
+ n_col = self.shape[-1]
1223
+ n_row = self.shape[-2]
1224
+ res_arr = self.reshape((num_blocks, n_row, n_col))
1225
+ new_coords = (
1226
+ res_arr.coords[1] + res_arr.coords[0] * res_arr.shape[1],
1227
+ res_arr.coords[2] + res_arr.coords[0] * res_arr.shape[2],
1228
+ )
1229
+
1230
+ new_shape = (num_blocks * n_row, num_blocks * n_col)
1231
+ return coo_array((self.data, tuple(new_coords)), shape=new_shape)
1232
+
1233
+
1234
+ def _extract_block_diag(self, shape):
1235
+ n_row, n_col = shape[-2], shape[-1]
1236
+
1237
+ # Extract data and coordinates from the block diagonal COO array
1238
+ data = self.data
1239
+ row, col = self.row, self.col
1240
+
1241
+ # Initialize new coordinates array
1242
+ new_coords = np.empty((len(shape), self.nnz), dtype=int)
1243
+
1244
+ # Calculate within-block indices
1245
+ new_coords[-2] = row % n_row
1246
+ new_coords[-1] = col % n_col
1247
+
1248
+ # Calculate coordinates for higher dimensions
1249
+ temp_block_idx = row // n_row
1250
+ for i in range(len(shape) - 3, -1, -1):
1251
+ size = shape[i]
1252
+ new_coords[i] = temp_block_idx % size
1253
+ temp_block_idx = temp_block_idx // size
1254
+
1255
+ # Create the new COO array with the original n-D shape
1256
+ return coo_array((data, tuple(new_coords)), shape=shape)
1257
+
1258
+
1259
+ def _process_axes(ndim_a, ndim_b, axes):
1260
+ if isinstance(axes, int):
1261
+ if axes < 1 or axes > min(ndim_a, ndim_b):
1262
+ raise ValueError("axes integer is out of bounds for input arrays")
1263
+ axes_a = list(range(ndim_a - axes, ndim_a))
1264
+ axes_b = list(range(axes))
1265
+ elif isinstance(axes, tuple | list):
1266
+ if len(axes) != 2:
1267
+ raise ValueError("axes must be a tuple/list of length 2")
1268
+ axes_a, axes_b = axes
1269
+ if len(axes_a) != len(axes_b):
1270
+ raise ValueError("axes lists/tuples must be of the same length")
1271
+ if any(ax >= ndim_a or ax < -ndim_a for ax in axes_a) or \
1272
+ any(bx >= ndim_b or bx < -ndim_b for bx in axes_b):
1273
+ raise ValueError("axes indices are out of bounds for input arrays")
1274
+ else:
1275
+ raise TypeError("axes must be an integer or a tuple/list of integers")
1276
+
1277
+ axes_a = [axis + ndim_a if axis < 0 else axis for axis in axes_a]
1278
+ axes_b = [axis + ndim_b if axis < 0 else axis for axis in axes_b]
1279
+ return axes_a, axes_b
1280
+
1281
+
1282
+ def _convert_to_2d(coo, axis):
1283
+ axis_coords = tuple(coo.coords[i] for i in axis)
1284
+ axis_shape = tuple(coo.shape[i] for i in axis)
1285
+ axis_ravel = _ravel_coords(axis_coords, axis_shape)
1286
+
1287
+ ndim = len(coo.coords)
1288
+ non_axis = tuple(i for i in range(ndim) if i not in axis)
1289
+ if non_axis:
1290
+ non_axis_coords = tuple(coo.coords[i] for i in non_axis)
1291
+ non_axis_shape = tuple(coo.shape[i] for i in non_axis)
1292
+ non_axis_ravel = _ravel_coords(non_axis_coords, non_axis_shape)
1293
+ coords_2d = (non_axis_ravel, axis_ravel)
1294
+ shape_2d = (math.prod(non_axis_shape), math.prod(axis_shape))
1295
+ else: # all axes included in axis so result will have 1 element
1296
+ coords_2d = (axis_ravel,)
1297
+ shape_2d = (math.prod(axis_shape),)
1298
+ non_axis_shape = ()
1299
+
1300
+ new_coo = coo_array((coo.data, coords_2d), shape=shape_2d)
1301
+ return new_coo, non_axis_shape
1302
+
1303
+
1304
+ def _ravel_coords(coords, shape, order='C'):
1305
+ """Like np.ravel_multi_index, but avoids some overflow issues."""
1306
+ if len(coords) == 1:
1307
+ return coords[0]
1308
+ # Handle overflow as in https://github.com/scipy/scipy/pull/9132
1309
+ if len(coords) == 2:
1310
+ nrows, ncols = shape
1311
+ row, col = coords
1312
+ if order == 'C':
1313
+ maxval = (ncols * max(0, nrows - 1) + max(0, ncols - 1))
1314
+ idx_dtype = get_index_dtype(maxval=maxval)
1315
+ return np.multiply(ncols, row, dtype=idx_dtype) + col
1316
+ elif order == 'F':
1317
+ maxval = (nrows * max(0, ncols - 1) + max(0, nrows - 1))
1318
+ idx_dtype = get_index_dtype(maxval=maxval)
1319
+ return np.multiply(nrows, col, dtype=idx_dtype) + row
1320
+ else:
1321
+ raise ValueError("'order' must be 'C' or 'F'")
1322
+ return np.ravel_multi_index(coords, shape, order=order)
1323
+
1324
+
1325
+ def isspmatrix_coo(x):
1326
+ """Is `x` of coo_matrix type?
1327
+
1328
+ Parameters
1329
+ ----------
1330
+ x
1331
+ object to check for being a coo matrix
1332
+
1333
+ Returns
1334
+ -------
1335
+ bool
1336
+ True if `x` is a coo matrix, False otherwise
1337
+
1338
+ Examples
1339
+ --------
1340
+ >>> from scipy.sparse import coo_array, coo_matrix, csr_matrix, isspmatrix_coo
1341
+ >>> isspmatrix_coo(coo_matrix([[5]]))
1342
+ True
1343
+ >>> isspmatrix_coo(coo_array([[5]]))
1344
+ False
1345
+ >>> isspmatrix_coo(csr_matrix([[5]]))
1346
+ False
1347
+ """
1348
+ return isinstance(x, coo_matrix)
1349
+
1350
+
1351
+ # This namespace class separates array from matrix with isinstance
1352
+ class coo_array(_coo_base, sparray):
1353
+ """
1354
+ A sparse array in COOrdinate format.
1355
+
1356
+ Also known as the 'ijv' or 'triplet' format.
1357
+
1358
+ This can be instantiated in several ways:
1359
+ coo_array(D)
1360
+ where D is an ndarray
1361
+
1362
+ coo_array(S)
1363
+ with another sparse array or matrix S (equivalent to S.tocoo())
1364
+
1365
+ coo_array(shape, [dtype])
1366
+ to construct an empty sparse array with shape `shape`
1367
+ dtype is optional, defaulting to dtype='d'.
1368
+
1369
+ coo_array((data, coords), [shape])
1370
+ to construct from existing data and index arrays:
1371
+ 1. data[:] the entries of the sparse array, in any order
1372
+ 2. coords[i][:] the axis-i coordinates of the data entries
1373
+
1374
+ Where ``A[coords] = data``, and coords is a tuple of index arrays.
1375
+ When shape is not specified, it is inferred from the index arrays.
1376
+
1377
+ Attributes
1378
+ ----------
1379
+ dtype : dtype
1380
+ Data type of the sparse array
1381
+ shape : tuple of integers
1382
+ Shape of the sparse array
1383
+ ndim : int
1384
+ Number of dimensions of the sparse array
1385
+ nnz
1386
+ size
1387
+ data
1388
+ COO format data array of the sparse array
1389
+ coords
1390
+ COO format tuple of index arrays
1391
+ has_canonical_format : bool
1392
+ Whether the matrix has sorted coordinates and no duplicates
1393
+ format
1394
+ T
1395
+
1396
+ Notes
1397
+ -----
1398
+
1399
+ Sparse arrays can be used in arithmetic operations: they support
1400
+ addition, subtraction, multiplication, division, and matrix power.
1401
+
1402
+ Advantages of the COO format
1403
+ - facilitates fast conversion among sparse formats
1404
+ - permits duplicate entries (see example)
1405
+ - very fast conversion to and from CSR/CSC formats
1406
+
1407
+ Disadvantages of the COO format
1408
+ - does not directly support:
1409
+ + arithmetic operations
1410
+ + slicing
1411
+
1412
+ Intended Usage
1413
+ - COO is a fast format for constructing sparse arrays
1414
+ - Once a COO array has been constructed, convert to CSR or
1415
+ CSC format for fast arithmetic and matrix vector operations
1416
+ - By default when converting to CSR or CSC format, duplicate (i,j)
1417
+ entries will be summed together. This facilitates efficient
1418
+ construction of finite element matrices and the like. (see example)
1419
+
1420
+ Canonical format
1421
+ - Entries and coordinates sorted by row, then column.
1422
+ - There are no duplicate entries (i.e. duplicate (i,j) locations)
1423
+ - Data arrays MAY have explicit zeros.
1424
+
1425
+ Examples
1426
+ --------
1427
+
1428
+ >>> # Constructing an empty sparse array
1429
+ >>> import numpy as np
1430
+ >>> from scipy.sparse import coo_array
1431
+ >>> coo_array((3, 4), dtype=np.int8).toarray()
1432
+ array([[0, 0, 0, 0],
1433
+ [0, 0, 0, 0],
1434
+ [0, 0, 0, 0]], dtype=int8)
1435
+
1436
+ >>> # Constructing a sparse array using ijv format
1437
+ >>> row = np.array([0, 3, 1, 0])
1438
+ >>> col = np.array([0, 3, 1, 2])
1439
+ >>> data = np.array([4, 5, 7, 9])
1440
+ >>> coo_array((data, (row, col)), shape=(4, 4)).toarray()
1441
+ array([[4, 0, 9, 0],
1442
+ [0, 7, 0, 0],
1443
+ [0, 0, 0, 0],
1444
+ [0, 0, 0, 5]])
1445
+
1446
+ >>> # Constructing a sparse array with duplicate coordinates
1447
+ >>> row = np.array([0, 0, 1, 3, 1, 0, 0])
1448
+ >>> col = np.array([0, 2, 1, 3, 1, 0, 0])
1449
+ >>> data = np.array([1, 1, 1, 1, 1, 1, 1])
1450
+ >>> coo = coo_array((data, (row, col)), shape=(4, 4))
1451
+ >>> # Duplicate coordinates are maintained until implicitly or explicitly summed
1452
+ >>> np.max(coo.data)
1453
+ 1
1454
+ >>> coo.toarray()
1455
+ array([[3, 0, 1, 0],
1456
+ [0, 2, 0, 0],
1457
+ [0, 0, 0, 0],
1458
+ [0, 0, 0, 1]])
1459
+
1460
+ """
1461
+
1462
+
1463
+ class coo_matrix(spmatrix, _coo_base):
1464
+ """
1465
+ A sparse matrix in COOrdinate format.
1466
+
1467
+ Also known as the 'ijv' or 'triplet' format.
1468
+
1469
+ This can be instantiated in several ways:
1470
+ coo_matrix(D)
1471
+ where D is a 2-D ndarray
1472
+
1473
+ coo_matrix(S)
1474
+ with another sparse array or matrix S (equivalent to S.tocoo())
1475
+
1476
+ coo_matrix((M, N), [dtype])
1477
+ to construct an empty matrix with shape (M, N)
1478
+ dtype is optional, defaulting to dtype='d'.
1479
+
1480
+ coo_matrix((data, (i, j)), [shape=(M, N)])
1481
+ to construct from three arrays:
1482
+ 1. data[:] the entries of the matrix, in any order
1483
+ 2. i[:] the row indices of the matrix entries
1484
+ 3. j[:] the column indices of the matrix entries
1485
+
1486
+ Where ``A[i[k], j[k]] = data[k]``. When shape is not
1487
+ specified, it is inferred from the index arrays
1488
+
1489
+ Attributes
1490
+ ----------
1491
+ dtype : dtype
1492
+ Data type of the matrix
1493
+ shape : 2-tuple
1494
+ Shape of the matrix
1495
+ ndim : int
1496
+ Number of dimensions (this is always 2)
1497
+ nnz
1498
+ size
1499
+ data
1500
+ COO format data array of the matrix
1501
+ row
1502
+ COO format row index array of the matrix
1503
+ col
1504
+ COO format column index array of the matrix
1505
+ has_canonical_format : bool
1506
+ Whether the matrix has sorted indices and no duplicates
1507
+ format
1508
+ T
1509
+
1510
+ Notes
1511
+ -----
1512
+
1513
+ Sparse matrices can be used in arithmetic operations: they support
1514
+ addition, subtraction, multiplication, division, and matrix power.
1515
+
1516
+ Advantages of the COO format
1517
+ - facilitates fast conversion among sparse formats
1518
+ - permits duplicate entries (see example)
1519
+ - very fast conversion to and from CSR/CSC formats
1520
+
1521
+ Disadvantages of the COO format
1522
+ - does not directly support:
1523
+ + arithmetic operations
1524
+ + slicing
1525
+
1526
+ Intended Usage
1527
+ - COO is a fast format for constructing sparse matrices
1528
+ - Once a COO matrix has been constructed, convert to CSR or
1529
+ CSC format for fast arithmetic and matrix vector operations
1530
+ - By default when converting to CSR or CSC format, duplicate (i,j)
1531
+ entries will be summed together. This facilitates efficient
1532
+ construction of finite element matrices and the like. (see example)
1533
+
1534
+ Canonical format
1535
+ - Entries and coordinates sorted by row, then column.
1536
+ - There are no duplicate entries (i.e. duplicate (i,j) locations)
1537
+ - Data arrays MAY have explicit zeros.
1538
+
1539
+ Examples
1540
+ --------
1541
+
1542
+ >>> # Constructing an empty matrix
1543
+ >>> import numpy as np
1544
+ >>> from scipy.sparse import coo_matrix
1545
+ >>> coo_matrix((3, 4), dtype=np.int8).toarray()
1546
+ array([[0, 0, 0, 0],
1547
+ [0, 0, 0, 0],
1548
+ [0, 0, 0, 0]], dtype=int8)
1549
+
1550
+ >>> # Constructing a matrix using ijv format
1551
+ >>> row = np.array([0, 3, 1, 0])
1552
+ >>> col = np.array([0, 3, 1, 2])
1553
+ >>> data = np.array([4, 5, 7, 9])
1554
+ >>> coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
1555
+ array([[4, 0, 9, 0],
1556
+ [0, 7, 0, 0],
1557
+ [0, 0, 0, 0],
1558
+ [0, 0, 0, 5]])
1559
+
1560
+ >>> # Constructing a matrix with duplicate coordinates
1561
+ >>> row = np.array([0, 0, 1, 3, 1, 0, 0])
1562
+ >>> col = np.array([0, 2, 1, 3, 1, 0, 0])
1563
+ >>> data = np.array([1, 1, 1, 1, 1, 1, 1])
1564
+ >>> coo = coo_matrix((data, (row, col)), shape=(4, 4))
1565
+ >>> # Duplicate coordinates are maintained until implicitly or explicitly summed
1566
+ >>> np.max(coo.data)
1567
+ 1
1568
+ >>> coo.toarray()
1569
+ array([[3, 0, 1, 0],
1570
+ [0, 2, 0, 0],
1571
+ [0, 0, 0, 0],
1572
+ [0, 0, 0, 1]])
1573
+
1574
+ """
1575
+
1576
+ def __setstate__(self, state):
1577
+ if 'coords' not in state:
1578
+ # For retro-compatibility with the previous attributes
1579
+ # storing nnz coordinates for 2D COO matrix.
1580
+ state['coords'] = (state.pop('row'), state.pop('col'))
1581
+ self.__dict__.update(state)