scipy 1.15.2__cp312-cp312-macosx_14_0_arm64.whl → 1.16.0__cp312-cp312-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. scipy/.dylibs/libgcc_s.1.1.dylib +0 -0
  2. scipy/.dylibs/libgfortran.5.dylib +0 -0
  3. scipy/.dylibs/libquadmath.0.dylib +0 -0
  4. scipy/__config__.py +5 -5
  5. scipy/__init__.py +3 -6
  6. scipy/_cyutility.cpython-312-darwin.so +0 -0
  7. scipy/_lib/_array_api.py +497 -161
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_bunch.py +4 -0
  10. scipy/_lib/_ccallback_c.cpython-312-darwin.so +0 -0
  11. scipy/_lib/_docscrape.py +1 -1
  12. scipy/_lib/_elementwise_iterative_method.py +15 -26
  13. scipy/_lib/_sparse.py +41 -0
  14. scipy/_lib/_test_ccallback.cpython-312-darwin.so +0 -0
  15. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  16. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  17. scipy/_lib/_testutils.py +6 -2
  18. scipy/_lib/_util.py +222 -125
  19. scipy/_lib/array_api_compat/__init__.py +4 -4
  20. scipy/_lib/array_api_compat/_internal.py +19 -6
  21. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  22. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  23. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  24. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  25. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  26. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  27. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  28. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  29. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  30. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  31. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  32. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  33. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  34. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  35. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  36. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  37. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  38. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  39. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  40. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  41. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  42. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  43. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  44. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  45. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  46. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  47. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  48. scipy/_lib/array_api_extra/__init__.py +26 -3
  49. scipy/_lib/array_api_extra/_delegation.py +171 -0
  50. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  51. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  52. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  53. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  54. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  55. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  61. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  62. scipy/_lib/array_api_extra/testing.py +359 -0
  63. scipy/_lib/decorator.py +2 -2
  64. scipy/_lib/doccer.py +1 -7
  65. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  66. scipy/_lib/pyprima/__init__.py +212 -0
  67. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  68. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  69. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  70. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  71. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  72. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  73. scipy/_lib/pyprima/cobyla/update.py +289 -0
  74. scipy/_lib/pyprima/common/__init__.py +0 -0
  75. scipy/_lib/pyprima/common/_bounds.py +34 -0
  76. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  77. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  78. scipy/_lib/pyprima/common/_project.py +173 -0
  79. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  80. scipy/_lib/pyprima/common/consts.py +47 -0
  81. scipy/_lib/pyprima/common/evaluate.py +99 -0
  82. scipy/_lib/pyprima/common/history.py +38 -0
  83. scipy/_lib/pyprima/common/infos.py +30 -0
  84. scipy/_lib/pyprima/common/linalg.py +435 -0
  85. scipy/_lib/pyprima/common/message.py +290 -0
  86. scipy/_lib/pyprima/common/powalg.py +131 -0
  87. scipy/_lib/pyprima/common/preproc.py +277 -0
  88. scipy/_lib/pyprima/common/present.py +5 -0
  89. scipy/_lib/pyprima/common/ratio.py +54 -0
  90. scipy/_lib/pyprima/common/redrho.py +47 -0
  91. scipy/_lib/pyprima/common/selectx.py +296 -0
  92. scipy/_lib/tests/test__util.py +105 -121
  93. scipy/_lib/tests/test_array_api.py +169 -34
  94. scipy/_lib/tests/test_bunch.py +7 -0
  95. scipy/_lib/tests/test_ccallback.py +2 -10
  96. scipy/_lib/tests/test_public_api.py +13 -0
  97. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  98. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  99. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  100. scipy/cluster/hierarchy.py +393 -223
  101. scipy/cluster/tests/test_hierarchy.py +273 -335
  102. scipy/cluster/tests/test_vq.py +45 -61
  103. scipy/cluster/vq.py +39 -35
  104. scipy/conftest.py +282 -151
  105. scipy/constants/_constants.py +4 -1
  106. scipy/constants/tests/test_codata.py +2 -2
  107. scipy/constants/tests/test_constants.py +11 -18
  108. scipy/datasets/_download_all.py +15 -1
  109. scipy/datasets/_fetchers.py +7 -1
  110. scipy/datasets/_utils.py +1 -1
  111. scipy/differentiate/_differentiate.py +25 -25
  112. scipy/differentiate/tests/test_differentiate.py +24 -25
  113. scipy/fft/_basic.py +20 -0
  114. scipy/fft/_helper.py +3 -34
  115. scipy/fft/_pocketfft/helper.py +29 -1
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_ivp/common.py +3 -3
  130. scipy/integrate/_ivp/ivp.py +9 -2
  131. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  132. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  133. scipy/integrate/_ode.py +9 -2
  134. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  135. scipy/integrate/_quad_vec.py +21 -29
  136. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  137. scipy/integrate/_quadpack_py.py +11 -7
  138. scipy/integrate/_quadrature.py +3 -3
  139. scipy/integrate/_rules/_base.py +2 -2
  140. scipy/integrate/_tanhsinh.py +57 -54
  141. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  142. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  143. scipy/integrate/tests/test__quad_vec.py +0 -6
  144. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  145. scipy/integrate/tests/test_cubature.py +21 -35
  146. scipy/integrate/tests/test_quadrature.py +6 -8
  147. scipy/integrate/tests/test_tanhsinh.py +61 -43
  148. scipy/interpolate/__init__.py +70 -58
  149. scipy/interpolate/_bary_rational.py +22 -22
  150. scipy/interpolate/_bsplines.py +119 -66
  151. scipy/interpolate/_cubic.py +65 -50
  152. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  154. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  155. scipy/interpolate/_fitpack2.py +9 -6
  156. scipy/interpolate/_fitpack_impl.py +32 -26
  157. scipy/interpolate/_fitpack_repro.py +23 -19
  158. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  159. scipy/interpolate/_interpolate.py +30 -12
  160. scipy/interpolate/_ndbspline.py +13 -18
  161. scipy/interpolate/_ndgriddata.py +5 -8
  162. scipy/interpolate/_polyint.py +95 -31
  163. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  164. scipy/interpolate/_rbf.py +2 -2
  165. scipy/interpolate/_rbfinterp.py +1 -1
  166. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  167. scipy/interpolate/_rgi.py +31 -26
  168. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  169. scipy/interpolate/dfitpack.py +0 -20
  170. scipy/interpolate/interpnd.py +1 -2
  171. scipy/interpolate/tests/test_bary_rational.py +2 -2
  172. scipy/interpolate/tests/test_bsplines.py +97 -1
  173. scipy/interpolate/tests/test_fitpack2.py +39 -1
  174. scipy/interpolate/tests/test_interpnd.py +32 -20
  175. scipy/interpolate/tests/test_interpolate.py +48 -4
  176. scipy/interpolate/tests/test_rgi.py +2 -1
  177. scipy/io/_fast_matrix_market/__init__.py +2 -0
  178. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  179. scipy/io/_harwell_boeing/hb.py +7 -11
  180. scipy/io/_idl.py +5 -7
  181. scipy/io/_netcdf.py +15 -5
  182. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  183. scipy/io/arff/tests/test_arffread.py +3 -3
  184. scipy/io/matlab/__init__.py +5 -3
  185. scipy/io/matlab/_mio.py +4 -1
  186. scipy/io/matlab/_mio5.py +19 -13
  187. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  188. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  189. scipy/io/matlab/_miobase.py +4 -1
  190. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  191. scipy/io/matlab/tests/test_mio.py +46 -18
  192. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  193. scipy/io/tests/test_mmio.py +7 -1
  194. scipy/io/tests/test_wavfile.py +41 -0
  195. scipy/io/wavfile.py +57 -10
  196. scipy/linalg/_basic.py +113 -86
  197. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  198. scipy/linalg/_decomp.py +22 -9
  199. scipy/linalg/_decomp_cholesky.py +28 -13
  200. scipy/linalg/_decomp_cossin.py +45 -30
  201. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  202. scipy/linalg/_decomp_ldl.py +4 -1
  203. scipy/linalg/_decomp_lu.py +18 -6
  204. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_decomp_polar.py +2 -0
  206. scipy/linalg/_decomp_qr.py +6 -2
  207. scipy/linalg/_decomp_qz.py +3 -0
  208. scipy/linalg/_decomp_schur.py +3 -1
  209. scipy/linalg/_decomp_svd.py +13 -2
  210. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_expm_frechet.py +4 -0
  212. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  213. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  215. scipy/linalg/_matfuncs.py +187 -4
  216. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  218. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  219. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  220. scipy/linalg/_procrustes.py +2 -0
  221. scipy/linalg/_sketches.py +17 -6
  222. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  223. scipy/linalg/_solvers.py +7 -2
  224. scipy/linalg/_special_matrices.py +26 -36
  225. scipy/linalg/blas.py +35 -24
  226. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  227. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  228. scipy/linalg/lapack.py +22 -2
  229. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  230. scipy/linalg/tests/test_basic.py +31 -16
  231. scipy/linalg/tests/test_batch.py +588 -0
  232. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  233. scipy/linalg/tests/test_decomp.py +40 -3
  234. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  235. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  236. scipy/linalg/tests/test_interpolative.py +17 -0
  237. scipy/linalg/tests/test_lapack.py +115 -7
  238. scipy/linalg/tests/test_matfuncs.py +157 -102
  239. scipy/linalg/tests/test_procrustes.py +0 -7
  240. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  241. scipy/linalg/tests/test_special_matrices.py +1 -5
  242. scipy/ndimage/__init__.py +1 -0
  243. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_delegators.py +8 -2
  245. scipy/ndimage/_filters.py +453 -5
  246. scipy/ndimage/_interpolation.py +36 -6
  247. scipy/ndimage/_measurements.py +4 -2
  248. scipy/ndimage/_morphology.py +5 -0
  249. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  250. scipy/ndimage/_ndimage_api.py +2 -1
  251. scipy/ndimage/_ni_docstrings.py +5 -1
  252. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  253. scipy/ndimage/_ni_support.py +1 -5
  254. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  255. scipy/ndimage/_support_alternative_backends.py +18 -6
  256. scipy/ndimage/tests/test_filters.py +384 -259
  257. scipy/ndimage/tests/test_fourier.py +7 -9
  258. scipy/ndimage/tests/test_interpolation.py +68 -61
  259. scipy/ndimage/tests/test_measurements.py +18 -35
  260. scipy/ndimage/tests/test_morphology.py +143 -131
  261. scipy/ndimage/tests/test_splines.py +1 -3
  262. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_basinhopping.py +13 -7
  264. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  265. scipy/optimize/_bracket.py +46 -26
  266. scipy/optimize/_chandrupatla.py +9 -10
  267. scipy/optimize/_cobyla_py.py +104 -123
  268. scipy/optimize/_constraints.py +14 -10
  269. scipy/optimize/_differentiable_functions.py +371 -230
  270. scipy/optimize/_differentialevolution.py +4 -3
  271. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  272. scipy/optimize/_dual_annealing.py +1 -1
  273. scipy/optimize/_elementwise.py +1 -4
  274. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  275. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  276. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  277. scipy/optimize/_lbfgsb_py.py +80 -24
  278. scipy/optimize/_linprog_doc.py +2 -2
  279. scipy/optimize/_linprog_highs.py +11 -11
  280. scipy/optimize/_linprog_ip.py +25 -10
  281. scipy/optimize/_linprog_util.py +18 -19
  282. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  283. scipy/optimize/_lsq/common.py +3 -3
  284. scipy/optimize/_lsq/dogbox.py +16 -2
  285. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  286. scipy/optimize/_lsq/least_squares.py +198 -126
  287. scipy/optimize/_lsq/lsq_linear.py +6 -6
  288. scipy/optimize/_lsq/trf.py +35 -8
  289. scipy/optimize/_milp.py +3 -1
  290. scipy/optimize/_minimize.py +105 -36
  291. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  292. scipy/optimize/_minpack_py.py +21 -14
  293. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  294. scipy/optimize/_nnls.py +20 -21
  295. scipy/optimize/_nonlin.py +34 -3
  296. scipy/optimize/_numdiff.py +288 -110
  297. scipy/optimize/_optimize.py +86 -48
  298. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  299. scipy/optimize/_remove_redundancy.py +5 -5
  300. scipy/optimize/_root_scalar.py +1 -1
  301. scipy/optimize/_shgo.py +6 -0
  302. scipy/optimize/_shgo_lib/_complex.py +1 -1
  303. scipy/optimize/_slsqp_py.py +216 -124
  304. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  305. scipy/optimize/_spectral.py +1 -1
  306. scipy/optimize/_tnc.py +8 -1
  307. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  308. scipy/optimize/_trustregion.py +20 -6
  309. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  310. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  311. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  312. scipy/optimize/_trustregion_constr/projections.py +12 -8
  313. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  314. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  315. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  316. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  317. scipy/optimize/_trustregion_exact.py +0 -1
  318. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  319. scipy/optimize/_zeros_py.py +97 -17
  320. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  321. scipy/optimize/slsqp.py +0 -1
  322. scipy/optimize/tests/test__basinhopping.py +1 -1
  323. scipy/optimize/tests/test__differential_evolution.py +4 -4
  324. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  325. scipy/optimize/tests/test__numdiff.py +66 -22
  326. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  327. scipy/optimize/tests/test__shgo.py +9 -1
  328. scipy/optimize/tests/test_bracket.py +71 -46
  329. scipy/optimize/tests/test_chandrupatla.py +133 -135
  330. scipy/optimize/tests/test_cobyla.py +74 -45
  331. scipy/optimize/tests/test_constraints.py +1 -1
  332. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  333. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  334. scipy/optimize/tests/test_least_squares.py +125 -13
  335. scipy/optimize/tests/test_linear_assignment.py +3 -3
  336. scipy/optimize/tests/test_linprog.py +3 -3
  337. scipy/optimize/tests/test_lsq_linear.py +6 -6
  338. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  339. scipy/optimize/tests/test_minpack.py +4 -4
  340. scipy/optimize/tests/test_nnls.py +43 -3
  341. scipy/optimize/tests/test_nonlin.py +36 -0
  342. scipy/optimize/tests/test_optimize.py +98 -20
  343. scipy/optimize/tests/test_slsqp.py +36 -4
  344. scipy/optimize/tests/test_zeros.py +34 -1
  345. scipy/signal/__init__.py +12 -23
  346. scipy/signal/_delegators.py +568 -0
  347. scipy/signal/_filter_design.py +459 -241
  348. scipy/signal/_fir_filter_design.py +262 -90
  349. scipy/signal/_lti_conversion.py +3 -2
  350. scipy/signal/_ltisys.py +118 -91
  351. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  352. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  353. scipy/signal/_polyutils.py +172 -0
  354. scipy/signal/_short_time_fft.py +553 -76
  355. scipy/signal/_signal_api.py +30 -0
  356. scipy/signal/_signaltools.py +719 -396
  357. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  358. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  359. scipy/signal/_spectral_py.py +230 -50
  360. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  361. scipy/signal/_spline_filters.py +108 -68
  362. scipy/signal/_support_alternative_backends.py +73 -0
  363. scipy/signal/_upfirdn.py +4 -1
  364. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  365. scipy/signal/_waveforms.py +2 -11
  366. scipy/signal/_wavelets.py +1 -1
  367. scipy/signal/fir_filter_design.py +1 -0
  368. scipy/signal/spline.py +4 -11
  369. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  370. scipy/signal/tests/test_bsplines.py +114 -79
  371. scipy/signal/tests/test_cont2discrete.py +9 -2
  372. scipy/signal/tests/test_filter_design.py +721 -481
  373. scipy/signal/tests/test_fir_filter_design.py +332 -140
  374. scipy/signal/tests/test_savitzky_golay.py +4 -3
  375. scipy/signal/tests/test_short_time_fft.py +231 -5
  376. scipy/signal/tests/test_signaltools.py +2150 -1349
  377. scipy/signal/tests/test_spectral.py +50 -6
  378. scipy/signal/tests/test_splines.py +161 -96
  379. scipy/signal/tests/test_upfirdn.py +84 -50
  380. scipy/signal/tests/test_waveforms.py +20 -0
  381. scipy/signal/tests/test_windows.py +607 -466
  382. scipy/signal/windows/_windows.py +287 -148
  383. scipy/sparse/__init__.py +23 -4
  384. scipy/sparse/_base.py +269 -120
  385. scipy/sparse/_bsr.py +7 -4
  386. scipy/sparse/_compressed.py +59 -234
  387. scipy/sparse/_construct.py +90 -38
  388. scipy/sparse/_coo.py +115 -181
  389. scipy/sparse/_csc.py +4 -4
  390. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  391. scipy/sparse/_csr.py +2 -2
  392. scipy/sparse/_data.py +48 -48
  393. scipy/sparse/_dia.py +105 -21
  394. scipy/sparse/_dok.py +0 -23
  395. scipy/sparse/_index.py +4 -4
  396. scipy/sparse/_matrix.py +23 -0
  397. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  398. scipy/sparse/_sputils.py +37 -22
  399. scipy/sparse/base.py +0 -9
  400. scipy/sparse/bsr.py +0 -14
  401. scipy/sparse/compressed.py +0 -23
  402. scipy/sparse/construct.py +0 -6
  403. scipy/sparse/coo.py +0 -14
  404. scipy/sparse/csc.py +0 -3
  405. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  406. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  407. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  408. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  409. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  410. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  411. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  412. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  413. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  414. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  415. scipy/sparse/csr.py +0 -5
  416. scipy/sparse/data.py +1 -6
  417. scipy/sparse/dia.py +0 -7
  418. scipy/sparse/dok.py +0 -10
  419. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  420. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  421. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  422. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  423. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  424. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  425. scipy/sparse/linalg/_expm_multiply.py +8 -3
  426. scipy/sparse/linalg/_interface.py +29 -26
  427. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  428. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  429. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  430. scipy/sparse/linalg/_isolve/minres.py +5 -5
  431. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  432. scipy/sparse/linalg/_isolve/utils.py +2 -8
  433. scipy/sparse/linalg/_matfuncs.py +1 -1
  434. scipy/sparse/linalg/_norm.py +1 -1
  435. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  436. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  437. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  438. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  439. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  440. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  441. scipy/sparse/linalg/tests/test_interface.py +35 -0
  442. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  443. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  444. scipy/sparse/tests/test_base.py +224 -40
  445. scipy/sparse/tests/test_common1d.py +17 -12
  446. scipy/sparse/tests/test_construct.py +1 -1
  447. scipy/sparse/tests/test_coo.py +272 -4
  448. scipy/sparse/tests/test_sparsetools.py +5 -0
  449. scipy/sparse/tests/test_sputils.py +36 -7
  450. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  451. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  452. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  453. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  454. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  455. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  456. scipy/spatial/distance.py +49 -42
  457. scipy/spatial/tests/test_distance.py +15 -1
  458. scipy/spatial/tests/test_kdtree.py +1 -0
  459. scipy/spatial/tests/test_qhull.py +106 -2
  460. scipy/spatial/transform/__init__.py +5 -3
  461. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  462. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  463. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  464. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  465. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  466. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  467. scipy/special/__init__.py +1 -47
  468. scipy/special/_add_newdocs.py +34 -772
  469. scipy/special/_basic.py +22 -25
  470. scipy/special/_comb.cpython-312-darwin.so +0 -0
  471. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  472. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  473. scipy/special/_logsumexp.py +83 -69
  474. scipy/special/_orthogonal.pyi +1 -1
  475. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  476. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  477. scipy/special/_spherical_bessel.py +4 -4
  478. scipy/special/_support_alternative_backends.py +212 -119
  479. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  480. scipy/special/_testutils.py +4 -4
  481. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  482. scipy/special/_ufuncs.pyi +1 -0
  483. scipy/special/_ufuncs.pyx +215 -1400
  484. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  485. scipy/special/_ufuncs_cxx.pxd +2 -15
  486. scipy/special/_ufuncs_cxx.pyx +5 -44
  487. scipy/special/_ufuncs_cxx_defs.h +2 -16
  488. scipy/special/_ufuncs_defs.h +0 -8
  489. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  490. scipy/special/cython_special.pxd +1 -1
  491. scipy/special/tests/_cython_examples/meson.build +10 -1
  492. scipy/special/tests/test_basic.py +153 -20
  493. scipy/special/tests/test_boost_ufuncs.py +3 -0
  494. scipy/special/tests/test_cdflib.py +35 -11
  495. scipy/special/tests/test_gammainc.py +16 -0
  496. scipy/special/tests/test_hyp2f1.py +23 -2
  497. scipy/special/tests/test_log1mexp.py +85 -0
  498. scipy/special/tests/test_logsumexp.py +220 -64
  499. scipy/special/tests/test_mpmath.py +1 -0
  500. scipy/special/tests/test_nan_inputs.py +1 -1
  501. scipy/special/tests/test_orthogonal.py +17 -18
  502. scipy/special/tests/test_sf_error.py +3 -2
  503. scipy/special/tests/test_sph_harm.py +6 -7
  504. scipy/special/tests/test_support_alternative_backends.py +211 -76
  505. scipy/stats/__init__.py +4 -1
  506. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  507. scipy/stats/_axis_nan_policy.py +5 -12
  508. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  509. scipy/stats/_continued_fraction.py +387 -0
  510. scipy/stats/_continuous_distns.py +296 -319
  511. scipy/stats/_correlation.py +1 -1
  512. scipy/stats/_covariance.py +6 -3
  513. scipy/stats/_discrete_distns.py +39 -32
  514. scipy/stats/_distn_infrastructure.py +39 -12
  515. scipy/stats/_distribution_infrastructure.py +920 -238
  516. scipy/stats/_entropy.py +9 -10
  517. scipy/{_lib → stats}/_finite_differences.py +1 -1
  518. scipy/stats/_hypotests.py +83 -50
  519. scipy/stats/_kde.py +53 -49
  520. scipy/stats/_ksstats.py +1 -1
  521. scipy/stats/_levy_stable/__init__.py +7 -15
  522. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  523. scipy/stats/_morestats.py +118 -73
  524. scipy/stats/_mstats_basic.py +13 -17
  525. scipy/stats/_mstats_extras.py +8 -8
  526. scipy/stats/_multivariate.py +89 -113
  527. scipy/stats/_new_distributions.py +97 -20
  528. scipy/stats/_page_trend_test.py +12 -5
  529. scipy/stats/_probability_distribution.py +265 -43
  530. scipy/stats/_qmc.py +14 -9
  531. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  532. scipy/stats/_qmvnt.py +16 -95
  533. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  534. scipy/stats/_quantile.py +335 -0
  535. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  536. scipy/stats/_resampling.py +5 -30
  537. scipy/stats/_sampling.py +1 -1
  538. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  539. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  540. scipy/stats/_stats_mstats_common.py +21 -2
  541. scipy/stats/_stats_py.py +551 -477
  542. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  543. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  544. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  545. scipy/stats/_variation.py +6 -8
  546. scipy/stats/_wilcoxon.py +13 -7
  547. scipy/stats/tests/common_tests.py +6 -4
  548. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  549. scipy/stats/tests/test_continued_fraction.py +173 -0
  550. scipy/stats/tests/test_continuous.py +379 -60
  551. scipy/stats/tests/test_continuous_basic.py +18 -12
  552. scipy/stats/tests/test_discrete_basic.py +14 -8
  553. scipy/stats/tests/test_discrete_distns.py +16 -16
  554. scipy/stats/tests/test_distributions.py +117 -75
  555. scipy/stats/tests/test_entropy.py +40 -48
  556. scipy/stats/tests/test_fit.py +4 -3
  557. scipy/stats/tests/test_hypotests.py +153 -24
  558. scipy/stats/tests/test_kdeoth.py +109 -41
  559. scipy/stats/tests/test_marray.py +289 -0
  560. scipy/stats/tests/test_morestats.py +81 -49
  561. scipy/stats/tests/test_mstats_basic.py +3 -3
  562. scipy/stats/tests/test_multivariate.py +434 -83
  563. scipy/stats/tests/test_qmc.py +13 -10
  564. scipy/stats/tests/test_quantile.py +199 -0
  565. scipy/stats/tests/test_rank.py +119 -112
  566. scipy/stats/tests/test_resampling.py +47 -56
  567. scipy/stats/tests/test_sampling.py +9 -4
  568. scipy/stats/tests/test_stats.py +799 -939
  569. scipy/stats/tests/test_variation.py +8 -6
  570. scipy/version.py +2 -2
  571. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  572. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/METADATA +12 -12
  573. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/RECORD +574 -581
  574. scipy-1.16.0.dist-info/WHEEL +6 -0
  575. scipy/_lib/array_api_extra/_funcs.py +0 -484
  576. scipy/_lib/array_api_extra/_typing.py +0 -8
  577. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  578. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  579. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  580. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  581. scipy/spatial/qhull_src/COPYING.txt +0 -38
  582. scipy/special/libsf_error_state.dylib +0 -0
  583. scipy/special/tests/test_log_softmax.py +0 -109
  584. scipy/special/tests/test_xsf_cuda.py +0 -114
  585. scipy/special/xsf/binom.h +0 -89
  586. scipy/special/xsf/cdflib.h +0 -100
  587. scipy/special/xsf/cephes/airy.h +0 -307
  588. scipy/special/xsf/cephes/besselpoly.h +0 -51
  589. scipy/special/xsf/cephes/beta.h +0 -257
  590. scipy/special/xsf/cephes/cbrt.h +0 -131
  591. scipy/special/xsf/cephes/chbevl.h +0 -85
  592. scipy/special/xsf/cephes/chdtr.h +0 -193
  593. scipy/special/xsf/cephes/const.h +0 -87
  594. scipy/special/xsf/cephes/ellie.h +0 -293
  595. scipy/special/xsf/cephes/ellik.h +0 -251
  596. scipy/special/xsf/cephes/ellpe.h +0 -107
  597. scipy/special/xsf/cephes/ellpk.h +0 -117
  598. scipy/special/xsf/cephes/expn.h +0 -260
  599. scipy/special/xsf/cephes/gamma.h +0 -398
  600. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  601. scipy/special/xsf/cephes/hyperg.h +0 -361
  602. scipy/special/xsf/cephes/i0.h +0 -149
  603. scipy/special/xsf/cephes/i1.h +0 -158
  604. scipy/special/xsf/cephes/igam.h +0 -421
  605. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  606. scipy/special/xsf/cephes/igami.h +0 -313
  607. scipy/special/xsf/cephes/j0.h +0 -225
  608. scipy/special/xsf/cephes/j1.h +0 -198
  609. scipy/special/xsf/cephes/jv.h +0 -715
  610. scipy/special/xsf/cephes/k0.h +0 -164
  611. scipy/special/xsf/cephes/k1.h +0 -163
  612. scipy/special/xsf/cephes/kn.h +0 -243
  613. scipy/special/xsf/cephes/lanczos.h +0 -112
  614. scipy/special/xsf/cephes/ndtr.h +0 -275
  615. scipy/special/xsf/cephes/poch.h +0 -85
  616. scipy/special/xsf/cephes/polevl.h +0 -167
  617. scipy/special/xsf/cephes/psi.h +0 -194
  618. scipy/special/xsf/cephes/rgamma.h +0 -111
  619. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  620. scipy/special/xsf/cephes/shichi.h +0 -248
  621. scipy/special/xsf/cephes/sici.h +0 -224
  622. scipy/special/xsf/cephes/sindg.h +0 -221
  623. scipy/special/xsf/cephes/tandg.h +0 -139
  624. scipy/special/xsf/cephes/trig.h +0 -58
  625. scipy/special/xsf/cephes/unity.h +0 -186
  626. scipy/special/xsf/cephes/zeta.h +0 -172
  627. scipy/special/xsf/config.h +0 -304
  628. scipy/special/xsf/digamma.h +0 -205
  629. scipy/special/xsf/error.h +0 -57
  630. scipy/special/xsf/evalpoly.h +0 -47
  631. scipy/special/xsf/expint.h +0 -266
  632. scipy/special/xsf/hyp2f1.h +0 -694
  633. scipy/special/xsf/iv_ratio.h +0 -173
  634. scipy/special/xsf/lambertw.h +0 -150
  635. scipy/special/xsf/loggamma.h +0 -163
  636. scipy/special/xsf/sici.h +0 -200
  637. scipy/special/xsf/tools.h +0 -427
  638. scipy/special/xsf/trig.h +0 -164
  639. scipy/special/xsf/wright_bessel.h +0 -843
  640. scipy/special/xsf/zlog1.h +0 -35
  641. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  642. scipy-1.15.2.dist-info/WHEEL +0 -4
@@ -5,22 +5,24 @@
5
5
 
6
6
  """
7
7
  import functools
8
+ import pytest
8
9
 
9
10
  import numpy as np
10
- from numpy import array, identity, dot, sqrt
11
+ from numpy import array, identity, sqrt
11
12
  from numpy.testing import (assert_array_almost_equal, assert_allclose, assert_,
12
- assert_array_less, assert_array_equal, assert_warns)
13
- import pytest
13
+ assert_array_less, assert_array_equal, assert_warns,
14
+ suppress_warnings)
14
15
 
15
16
  import scipy.linalg
16
17
  from scipy.linalg import (funm, signm, logm, sqrtm, fractional_matrix_power,
17
18
  expm, expm_frechet, expm_cond, norm, khatri_rao,
18
19
  cosm, sinm, tanm, coshm, sinhm, tanhm)
20
+
19
21
  from scipy.linalg import _matfuncs_inv_ssq
20
22
  from scipy.linalg._matfuncs import pick_pade_structure
21
23
  from scipy.linalg._matfuncs_inv_ssq import LogmExactlySingularWarning
22
24
  import scipy.linalg._expm_frechet
23
-
25
+ from scipy.linalg import LinAlgWarning
24
26
  from scipy.optimize import minimize
25
27
 
26
28
 
@@ -63,7 +65,7 @@ class TestSignM:
63
65
 
64
66
  def test_defective1(self):
65
67
  a = array([[0.0,1,0,0],[1,0,1,0],[0,0,0,1],[0,0,1,0]])
66
- signm(a, disp=False)
68
+ signm(a)
67
69
  #XXX: what would be the correct result?
68
70
 
69
71
  def test_defective2(self):
@@ -73,7 +75,7 @@ class TestSignM:
73
75
  [-10.0,6.0,-20.0,-18.0,-2.0],
74
76
  [-9.6,9.6,-25.5,-15.4,-2.0],
75
77
  [9.8,-4.8,18.0,18.2,2.0]))
76
- signm(a, disp=False)
78
+ signm(a)
77
79
  #XXX: what would be the correct result?
78
80
 
79
81
  def test_defective3(self):
@@ -84,12 +86,15 @@ class TestSignM:
84
86
  [0., 0., 0., 0., 3., 10., 0.],
85
87
  [0., 0., 0., 0., 0., -2., 25.],
86
88
  [0., 0., 0., 0., 0., 0., -3.]])
87
- signm(a, disp=False)
89
+ signm(a)
88
90
  #XXX: what would be the correct result?
89
91
 
90
92
 
91
93
  class TestLogM:
94
+ def setup_method(self):
95
+ self.rng = np.random.default_rng(1738098768840254)
92
96
 
97
+ @pytest.mark.filterwarnings("ignore:.*inaccurate.*:RuntimeWarning")
93
98
  def test_nils(self):
94
99
  a = array([[-2., 25., 0., 0., 0., 0., 0.],
95
100
  [0., -3., 10., 3., 3., 3., 0.],
@@ -99,14 +104,15 @@ class TestLogM:
99
104
  [0., 0., 0., 0., 0., -2., 25.],
100
105
  [0., 0., 0., 0., 0., 0., -3.]])
101
106
  m = (identity(7)*3.1+0j)-a
102
- logm(m, disp=False)
107
+ logm(m)
103
108
  #XXX: what would be the correct result?
104
109
 
110
+ @pytest.mark.filterwarnings("ignore:.*inaccurate.*:RuntimeWarning")
105
111
  def test_al_mohy_higham_2012_experiment_1_logm(self):
106
112
  # The logm completes the round trip successfully.
107
113
  # Note that the expm leg of the round trip is badly conditioned.
108
114
  A = _get_al_mohy_higham_2012_experiment_1()
109
- A_logm, info = logm(A, disp=False)
115
+ A_logm = logm(A)
110
116
  A_round_trip = expm(A_logm)
111
117
  assert_allclose(A_round_trip, A, rtol=5e-5, atol=1e-14)
112
118
 
@@ -114,14 +120,13 @@ class TestLogM:
114
120
  # The raw funm with np.log does not complete the round trip.
115
121
  # Note that the expm leg of the round trip is badly conditioned.
116
122
  A = _get_al_mohy_higham_2012_experiment_1()
117
- A_funm_log, info = funm(A, np.log, disp=False)
123
+ A_funm_log = funm(A, np.log)
118
124
  A_round_trip = expm(A_funm_log)
119
125
  assert_(not np.allclose(A_round_trip, A, rtol=1e-5, atol=1e-14))
120
126
 
121
127
  def test_round_trip_random_float(self):
122
- np.random.seed(1234)
123
128
  for n in range(1, 6):
124
- M_unscaled = np.random.randn(n, n)
129
+ M_unscaled = self.rng.uniform(size=(n, n))
125
130
  for scale in np.logspace(-4, 4, 9):
126
131
  M = M_unscaled * scale
127
132
 
@@ -130,22 +135,26 @@ class TestLogM:
130
135
  err_msg = f'M:{M} eivals:{W}'
131
136
 
132
137
  # Check sqrtm round trip because it is used within logm.
133
- M_sqrtm, info = sqrtm(M, disp=False)
134
- M_sqrtm_round_trip = M_sqrtm.dot(M_sqrtm)
138
+ M_sqrtm = sqrtm(M)
139
+ M_sqrtm_round_trip = M_sqrtm @ M_sqrtm
135
140
  assert_allclose(M_sqrtm_round_trip, M)
136
141
 
137
142
  # Check logm round trip.
138
- M_logm, info = logm(M, disp=False)
139
- M_logm_round_trip = expm(M_logm)
140
- assert_allclose(M_logm_round_trip, M, err_msg=err_msg)
143
+ with suppress_warnings() as sup:
144
+ sup.filter(category=RuntimeWarning)
145
+
146
+ M_logm = logm(M)
147
+ M_logm_round_trip = expm(M_logm)
148
+ assert_allclose(M_logm_round_trip, M, err_msg=err_msg)
141
149
 
142
150
  def test_round_trip_random_complex(self):
143
- np.random.seed(1234)
151
+
144
152
  for n in range(1, 6):
145
- M_unscaled = np.random.randn(n, n) + 1j * np.random.randn(n, n)
153
+ M_unscaled = (self.rng.standard_normal((n, n)) +
154
+ 1j*self.rng.standard_normal((n, n)))
146
155
  for scale in np.logspace(-4, 4, 9):
147
156
  M = M_unscaled * scale
148
- M_logm, info = logm(M, disp=False)
157
+ M_logm = logm(M)
149
158
  M_round_trip = expm(M_logm)
150
159
  assert_allclose(M_round_trip, M)
151
160
 
@@ -166,17 +175,17 @@ class TestLogM:
166
175
 
167
176
  # check float type preservation
168
177
  A = np.array(matrix_as_list, dtype=float)
169
- A_logm, info = logm(A, disp=False)
178
+ A_logm = logm(A)
170
179
  assert_(A_logm.dtype.char not in complex_dtype_chars)
171
180
 
172
181
  # check complex type preservation
173
182
  A = np.array(matrix_as_list, dtype=complex)
174
- A_logm, info = logm(A, disp=False)
183
+ A_logm = logm(A)
175
184
  assert_(A_logm.dtype.char in complex_dtype_chars)
176
185
 
177
186
  # check float->complex type conversion for the matrix negation
178
187
  A = -np.array(matrix_as_list, dtype=float)
179
- A_logm, info = logm(A, disp=False)
188
+ A_logm = logm(A)
180
189
  assert_(A_logm.dtype.char in complex_dtype_chars)
181
190
 
182
191
  def test_complex_spectrum_real_logm(self):
@@ -187,7 +196,7 @@ class TestLogM:
187
196
  X = np.array(M, dtype=dt)
188
197
  w = scipy.linalg.eigvals(X)
189
198
  assert_(1e-2 < np.absolute(w.imag).sum())
190
- Y, info = logm(X, disp=False)
199
+ Y = logm(X)
191
200
  assert_(np.issubdtype(Y.dtype, np.inexact))
192
201
  assert_allclose(expm(Y), X)
193
202
 
@@ -199,7 +208,7 @@ class TestLogM:
199
208
  [[0, 1], [1, 0]]):
200
209
  for dt in float, complex:
201
210
  A = np.array(M, dtype=dt)
202
- A_logm, info = logm(A, disp=False)
211
+ A_logm, info = logm(A)
203
212
  assert_(np.issubdtype(A_logm.dtype, np.complexfloating))
204
213
 
205
214
  @pytest.mark.thread_unsafe
@@ -208,7 +217,7 @@ class TestLogM:
208
217
  B = np.asarray([[1, 1], [0, 0]])
209
218
  for M in A, A.T, B, B.T:
210
219
  expected_warning = _matfuncs_inv_ssq.LogmExactlySingularWarning
211
- L, info = assert_warns(expected_warning, logm, M, disp=False)
220
+ L = assert_warns(expected_warning, logm, M)
212
221
  E = expm(L)
213
222
  assert_allclose(E, M, atol=1e-14)
214
223
 
@@ -216,7 +225,7 @@ class TestLogM:
216
225
  def test_nearly_singular(self):
217
226
  M = np.array([[1e-100]])
218
227
  expected_warning = _matfuncs_inv_ssq.LogmNearlySingularWarning
219
- L, info = assert_warns(expected_warning, logm, M, disp=False)
228
+ L = assert_warns(expected_warning, logm, M)
220
229
  E = expm(L)
221
230
  assert_allclose(E, M, atol=1e-14)
222
231
 
@@ -264,23 +273,25 @@ class TestLogM:
264
273
 
265
274
 
266
275
  class TestSqrtM:
276
+
267
277
  def test_round_trip_random_float(self):
268
- rng = np.random.RandomState(1234)
278
+ rng = np.random.default_rng(1738151906092735)
269
279
  for n in range(1, 6):
270
- M_unscaled = rng.randn(n, n)
280
+ M_unscaled = rng.standard_normal((n, n))
271
281
  for scale in np.logspace(-4, 4, 9):
272
282
  M = M_unscaled * scale
273
- M_sqrtm, info = sqrtm(M, disp=False)
283
+ M_sqrtm = sqrtm(M)
274
284
  M_sqrtm_round_trip = M_sqrtm.dot(M_sqrtm)
275
285
  assert_allclose(M_sqrtm_round_trip, M)
276
286
 
277
287
  def test_round_trip_random_complex(self):
278
- rng = np.random.RandomState(1234)
288
+ rng = np.random.default_rng(1738151906092736)
279
289
  for n in range(1, 6):
280
- M_unscaled = rng.randn(n, n) + 1j * rng.randn(n, n)
290
+ M_unscaled = (rng.standard_normal((n, n)) +
291
+ 1j * rng.standard_normal((n, n)))
281
292
  for scale in np.logspace(-4, 4, 9):
282
293
  M = M_unscaled * scale
283
- M_sqrtm, info = sqrtm(M, disp=False)
294
+ M_sqrtm = sqrtm(M)
284
295
  M_sqrtm_round_trip = M_sqrtm.dot(M_sqrtm)
285
296
  assert_allclose(M_sqrtm_round_trip, M)
286
297
 
@@ -296,14 +307,10 @@ class TestSqrtM:
296
307
  [0,se,0,0],
297
308
  [0,0,se,0],
298
309
  [0,0,0,1]])
299
- n = a.shape[0]
300
- assert_array_almost_equal(dot(sa,sa),a)
310
+ assert_array_almost_equal(sa @ sa, a)
301
311
  # Check default sqrtm.
302
- esa = sqrtm(a, disp=False, blocksize=n)[0]
303
- assert_array_almost_equal(dot(esa,esa),a)
304
- # Check sqrtm with 2x2 blocks.
305
- esa = sqrtm(a, disp=False, blocksize=2)[0]
306
- assert_array_almost_equal(dot(esa,esa),a)
312
+ esa = sqrtm(a)
313
+ assert_array_almost_equal(esa @ esa, a)
307
314
 
308
315
  def test_sqrtm_type_preservation_and_conversion(self):
309
316
  # The sqrtm matrix function should preserve the type of a matrix
@@ -321,27 +328,31 @@ class TestSqrtM:
321
328
  W = scipy.linalg.eigvals(matrix_as_list)
322
329
  assert_(not any(w.imag or w.real < 0 for w in W))
323
330
 
324
- # check float type preservation
325
- A = np.array(matrix_as_list, dtype=float)
326
- A_sqrtm, info = sqrtm(A, disp=False)
327
- assert_(A_sqrtm.dtype.char not in complex_dtype_chars)
331
+ # Last test matrix is singular so suppress the warning
332
+ with suppress_warnings() as sup:
333
+ sup.filter(category=LinAlgWarning)
328
334
 
329
- # check complex type preservation
330
- A = np.array(matrix_as_list, dtype=complex)
331
- A_sqrtm, info = sqrtm(A, disp=False)
332
- assert_(A_sqrtm.dtype.char in complex_dtype_chars)
335
+ # check float type preservation
336
+ A = np.array(matrix_as_list, dtype=float)
337
+ A_sqrtm = sqrtm(A)
338
+ assert_(A_sqrtm.dtype.char not in complex_dtype_chars)
333
339
 
334
- # check float->complex type conversion for the matrix negation
335
- A = -np.array(matrix_as_list, dtype=float)
336
- A_sqrtm, info = sqrtm(A, disp=False)
337
- assert_(A_sqrtm.dtype.char in complex_dtype_chars)
340
+ # check complex type preservation
341
+ A = np.array(matrix_as_list, dtype=complex)
342
+ A_sqrtm = sqrtm(A)
343
+ assert_(A_sqrtm.dtype.char in complex_dtype_chars)
344
+
345
+ # check float->complex type conversion for the matrix negation
346
+ A = -np.array(matrix_as_list, dtype=float)
347
+ A_sqrtm = sqrtm(A)
348
+ assert_(A_sqrtm.dtype.char in complex_dtype_chars)
338
349
 
339
350
  def test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum(self):
340
351
  complex_dtype_chars = ('F', 'D', 'G')
341
352
  for matrix_as_list in (
342
353
  [[1, 0], [0, -1]],
343
354
  [[0, 1], [1, 0]],
344
- [[0, 1, 0], [0, 0, 1], [1, 0, 0]]):
355
+ [[0, 1, 0], [0, 0, -1], [1, 0, 0]]):
345
356
 
346
357
  # check that the spectrum has the expected properties
347
358
  W = scipy.linalg.eigvals(matrix_as_list)
@@ -349,44 +360,44 @@ class TestSqrtM:
349
360
 
350
361
  # check complex->complex
351
362
  A = np.array(matrix_as_list, dtype=complex)
352
- A_sqrtm, info = sqrtm(A, disp=False)
363
+ A_sqrtm = sqrtm(A)
353
364
  assert_(A_sqrtm.dtype.char in complex_dtype_chars)
354
365
 
355
366
  # check float->complex
356
367
  A = np.array(matrix_as_list, dtype=float)
357
- A_sqrtm, info = sqrtm(A, disp=False)
368
+ A_sqrtm = sqrtm(A)
358
369
  assert_(A_sqrtm.dtype.char in complex_dtype_chars)
359
370
 
360
- def test_blocksizes(self):
361
- # Make sure I do not goof up the blocksizes when they do not divide n.
362
- np.random.seed(1234)
363
- for n in range(1, 8):
364
- A = np.random.rand(n, n) + 1j*np.random.randn(n, n)
365
- A_sqrtm_default, info = sqrtm(A, disp=False, blocksize=n)
366
- assert_allclose(A, np.linalg.matrix_power(A_sqrtm_default, 2))
367
- for blocksize in range(1, 10):
368
- A_sqrtm_new, info = sqrtm(A, disp=False, blocksize=blocksize)
369
- assert_allclose(A_sqrtm_default, A_sqrtm_new)
370
-
371
371
  def test_al_mohy_higham_2012_experiment_1(self):
372
372
  # Matrix square root of a tricky upper triangular matrix.
373
373
  A = _get_al_mohy_higham_2012_experiment_1()
374
- A_sqrtm, info = sqrtm(A, disp=False)
375
- A_round_trip = A_sqrtm.dot(A_sqrtm)
374
+ A_sqrtm = sqrtm(A)
375
+ A_round_trip = A_sqrtm @ A_sqrtm
376
376
  assert_allclose(A_round_trip, A, rtol=1e-5)
377
377
  assert_allclose(np.tril(A_round_trip), np.tril(A))
378
378
 
379
379
  def test_strict_upper_triangular(self):
380
- # This matrix has no square root.
380
+ # This matrix has no square root but upper triangular hence upper
381
+ # triangle will be filled with junk values.
381
382
  for dt in int, float:
382
383
  A = np.array([
383
384
  [0, 3, 0, 0],
384
385
  [0, 0, 3, 0],
385
386
  [0, 0, 0, 3],
386
387
  [0, 0, 0, 0]], dtype=dt)
387
- A_sqrtm, info = sqrtm(A, disp=False)
388
- assert_(np.isnan(A_sqrtm).all())
389
-
388
+ with suppress_warnings() as sup:
389
+ sup.filter(category=LinAlgWarning)
390
+
391
+ A_sqrtm = sqrtm(A)
392
+ assert_allclose(np.tril(A_sqrtm), np.zeros((4, 4)))
393
+ assert np.isnan(A_sqrtm).any()
394
+ assert np.isinf(A_sqrtm).any()
395
+
396
+ # Future edit: This squareroot is not possible to find algorithmically
397
+ # with the current methods. Now sqrtm docstring has another example of
398
+ # such matrix whose squareroot is not a polynomial in it. Hence no need
399
+ # to test it here.
400
+ """
390
401
  def test_weird_matrix(self):
391
402
  # The square root of matrix B exists.
392
403
  for dt in int, float:
@@ -398,18 +409,12 @@ class TestSqrtM:
398
409
  [0, 1, 0],
399
410
  [0, 0, 0],
400
411
  [0, 0, 0]], dtype=dt)
401
- assert_array_equal(B, A.dot(A))
412
+ assert_array_equal(B, A @ A)
402
413
 
403
414
  # But scipy sqrtm is not clever enough to find it.
404
415
  B_sqrtm, info = sqrtm(B, disp=False)
405
416
  assert_(np.isnan(B_sqrtm).all())
406
-
407
- def test_disp(self):
408
- np.random.seed(1234)
409
-
410
- A = np.random.rand(3, 3)
411
- B = sqrtm(A, disp=True)
412
- assert_allclose(B.dot(B), A)
417
+ """
413
418
 
414
419
  def test_opposite_sign_complex_eigenvalues(self):
415
420
  M = [[2j, 4], [0, -2j]]
@@ -426,22 +431,29 @@ class TestSqrtM:
426
431
  [0, 0, 0, 0],
427
432
  [0, 0, 0, 0],
428
433
  [sqrt(0.5), 0, 0, sqrt(0.5)]])
429
- assert_allclose(np.dot(R, R), M, atol=1e-14)
430
- assert_allclose(sqrtm(M), R, atol=1e-14)
434
+ assert_allclose(R @ R, M, atol=1e-14)
435
+ with suppress_warnings() as sup:
436
+ sup.filter(category=LinAlgWarning)
437
+
438
+ assert_allclose(sqrtm(M), R, atol=1e-14)
431
439
 
432
440
  def test_gh5336(self):
433
441
  M = np.diag([2, 1, 0])
434
442
  R = np.diag([sqrt(2), 1, 0])
435
- assert_allclose(np.dot(R, R), M, atol=1e-14)
436
- assert_allclose(sqrtm(M), R, atol=1e-14)
443
+ assert_allclose(R @ R, M, atol=1e-14)
444
+ with suppress_warnings() as sup:
445
+ sup.filter(category=LinAlgWarning)
446
+ assert_allclose(sqrtm(M), R, atol=1e-14)
437
447
 
438
448
  def test_gh7839(self):
439
449
  M = np.zeros((2, 2))
440
450
  R = np.zeros((2, 2))
441
- assert_allclose(np.dot(R, R), M, atol=1e-14)
442
- assert_allclose(sqrtm(M), R, atol=1e-14)
451
+ # Catch and silence LinAlgWarning
452
+ with suppress_warnings() as sup:
453
+ sup.filter(category=LinAlgWarning)
454
+
455
+ assert_allclose(sqrtm(M), R, atol=1e-14)
443
456
 
444
- @pytest.mark.xfail(reason="failing on macOS after gh-20212")
445
457
  def test_gh17918(self):
446
458
  M = np.empty((19, 19))
447
459
  M.fill(0.94)
@@ -449,23 +461,23 @@ class TestSqrtM:
449
461
  assert np.isrealobj(sqrtm(M))
450
462
 
451
463
  def test_data_size_preservation_uint_in_float_out(self):
452
- M = np.zeros((10, 10), dtype=np.uint8)
464
+ M = np.eye(10, dtype=np.uint8)
453
465
  assert sqrtm(M).dtype == np.float64
454
- M = np.zeros((10, 10), dtype=np.uint16)
466
+ M = np.eye(10, dtype=np.uint16)
455
467
  assert sqrtm(M).dtype == np.float64
456
- M = np.zeros((10, 10), dtype=np.uint32)
468
+ M = np.eye(10, dtype=np.uint32)
457
469
  assert sqrtm(M).dtype == np.float64
458
- M = np.zeros((10, 10), dtype=np.uint64)
470
+ M = np.eye(10, dtype=np.uint64)
459
471
  assert sqrtm(M).dtype == np.float64
460
472
 
461
473
  def test_data_size_preservation_int_in_float_out(self):
462
- M = np.zeros((10, 10), dtype=np.int8)
474
+ M = np.eye(10, dtype=np.int8)
463
475
  assert sqrtm(M).dtype == np.float64
464
- M = np.zeros((10, 10), dtype=np.int16)
476
+ M = np.eye(10, dtype=np.int16)
465
477
  assert sqrtm(M).dtype == np.float64
466
- M = np.zeros((10, 10), dtype=np.int32)
478
+ M = np.eye(10, dtype=np.int32)
467
479
  assert sqrtm(M).dtype == np.float64
468
- M = np.zeros((10, 10), dtype=np.int64)
480
+ M = np.eye(10, dtype=np.int64)
469
481
  assert sqrtm(M).dtype == np.float64
470
482
 
471
483
  def test_data_size_preservation_int_in_comp_out(self):
@@ -479,14 +491,14 @@ class TestSqrtM:
479
491
  assert sqrtm(M).dtype == np.complex128
480
492
 
481
493
  def test_data_size_preservation_float_in_float_out(self):
482
- M = np.zeros((10, 10), dtype=np.float16)
494
+ M = np.eye(10, dtype=np.float16)
483
495
  assert sqrtm(M).dtype == np.float32
484
- M = np.zeros((10, 10), dtype=np.float32)
496
+ M = np.eye(10, dtype=np.float32)
485
497
  assert sqrtm(M).dtype == np.float32
486
- M = np.zeros((10, 10), dtype=np.float64)
498
+ M = np.eye(10, dtype=np.float64)
487
499
  assert sqrtm(M).dtype == np.float64
488
500
  if hasattr(np, 'float128'):
489
- M = np.zeros((10, 10), dtype=np.float128)
501
+ M = np.eye(10, dtype=np.float128)
490
502
  assert sqrtm(M).dtype == np.float64
491
503
 
492
504
  def test_data_size_preservation_float_in_comp_out(self):
@@ -519,6 +531,39 @@ class TestSqrtM:
519
531
  assert s.shape == (0, 0)
520
532
  assert s.dtype == s0.dtype
521
533
 
534
+ def test_cf_noncontig_nd_inputs(self):
535
+ # Check that non-contiguous arrays are handled correctly.
536
+ # Generate an L, U pair for invertible random matrix.
537
+ rng = np.random.default_rng(1738151906092737)
538
+ n = 13
539
+ A = rng.uniform(size=(3, 2*n, 2*n))
540
+ L, U = np.tril(A, k=-1) + np.eye(2*n), np.triu(A)
541
+ A = L @ U
542
+ # Create strided views of 3D array.
543
+ A_noncontig_c = A[:, ::2, ::2]
544
+ A_noncontig_f = np.asfortranarray(A)[:, 1::2, 1::2]
545
+ assert_allclose(sqrtm(A[:, ::2, ::2]), sqrtm(A_noncontig_c))
546
+ assert_allclose(sqrtm(A[:, 1::2, 1::2]), sqrtm(A_noncontig_f))
547
+
548
+ def test_empty_sizes(self):
549
+ A = np.empty(shape=[4, 0, 5, 5], dtype=float)
550
+ assert_array_equal(sqrtm(A), A)
551
+
552
+ def test_negative_strides(self):
553
+ rng = np.random.default_rng(1738151906092738)
554
+ A = rng.uniform(size=(3, 5, 5))
555
+ A_negneg_orig = A[:, ::-1, ::-1]
556
+ A_negneg_copy = A[:, ::-1, ::-1].copy()
557
+ assert_allclose(sqrtm(A_negneg_orig), sqrtm(A_negneg_copy))
558
+
559
+ A_posneg_orig = A[:, :, ::-1]
560
+ A_posneg_copy = A[:, :, ::-1].copy()
561
+ assert_allclose(sqrtm(A_posneg_orig), sqrtm(A_posneg_copy))
562
+
563
+ A_negpos_orig = A[:, ::-1, :]
564
+ A_negpos_copy = A[:, ::-1, :].copy()
565
+ assert_allclose(sqrtm(A_negpos_orig), sqrtm(A_negpos_copy))
566
+
522
567
 
523
568
  class TestFractionalMatrixPower:
524
569
  def test_round_trip_random_complex(self):
@@ -586,7 +631,7 @@ class TestFractionalMatrixPower:
586
631
  # to compute the fractional matrix power.
587
632
  # These can be compared because they both use the principal branch.
588
633
  A_power = fractional_matrix_power(A, p)
589
- A_logm, info = logm(A, disp=False)
634
+ A_logm = logm(A)
590
635
  A_power_expm_logm = expm(A_logm * p)
591
636
  assert_allclose(A_power, A_power_expm_logm)
592
637
 
@@ -595,8 +640,8 @@ class TestFractionalMatrixPower:
595
640
  A = _get_al_mohy_higham_2012_experiment_1()
596
641
 
597
642
  # Test remainder matrix power.
598
- A_funm_sqrt, info = funm(A, np.sqrt, disp=False)
599
- A_sqrtm, info = sqrtm(A, disp=False)
643
+ A_funm_sqrt = funm(A, np.sqrt)
644
+ A_sqrtm = sqrtm(A)
600
645
  A_rem_power = _matfuncs_inv_ssq._remainder_matrix_power(A, 0.5)
601
646
  A_power = fractional_matrix_power(A, 0.5)
602
647
  assert_allclose(A_rem_power, A_power, rtol=1e-11)
@@ -1061,3 +1106,13 @@ class TestKhatriRao:
1061
1106
  b = np.empty((5, 0))
1062
1107
  res = khatri_rao(a, b)
1063
1108
  assert_allclose(res, np.empty((15, 0)))
1109
+
1110
+ @pytest.mark.parametrize('func',
1111
+ [logm, sqrtm, signm])
1112
+ def test_disp_dep(func):
1113
+ with pytest.deprecated_call():
1114
+ func(np.eye(2), disp=False)
1115
+
1116
+ def test_blocksize_dep():
1117
+ with pytest.deprecated_call():
1118
+ sqrtm(np.eye(2), blocksize=10)
@@ -10,13 +10,6 @@ from scipy.linalg import orthogonal_procrustes
10
10
  from scipy.sparse._sputils import matrix
11
11
 
12
12
 
13
- def test_orthogonal_procrustes_ndim_too_large():
14
- rng = np.random.RandomState(1234)
15
- A = rng.randn(3, 4, 5)
16
- B = rng.randn(3, 4, 5)
17
- assert_raises(ValueError, orthogonal_procrustes, A, B)
18
-
19
-
20
13
  def test_orthogonal_procrustes_ndim_too_small():
21
14
  rng = np.random.RandomState(1234)
22
15
  A = rng.randn(3)
@@ -39,7 +39,7 @@ def test_multiple_rhs():
39
39
  c = random.randn(4)
40
40
  r = random.randn(4)
41
41
  for offset in [0, 1j]:
42
- for yshape in ((4,), (4, 3), (4, 3, 2)):
42
+ for yshape in ((4,), (4, 3)):
43
43
  y = random.randn(*yshape) + offset
44
44
  actual = solve_toeplitz((c,r), b=y)
45
45
  desired = solve(toeplitz(c, r=r), y)
@@ -172,9 +172,6 @@ class TestBlockDiag:
172
172
  a = block_diag([2, 3], 4)
173
173
  assert_array_equal(a, [[2, 3, 0], [0, 0, 4]])
174
174
 
175
- def test_bad_arg(self):
176
- assert_raises(ValueError, block_diag, [[[1]]])
177
-
178
175
  def test_no_args(self):
179
176
  a = block_diag()
180
177
  assert_equal(a.ndim, 2)
@@ -504,8 +501,7 @@ def test_invpascal():
504
501
  # precision when n is greater than 18. Instead we'll cast both to
505
502
  # object arrays, and then multiply.
506
503
  e = ip.astype(object).dot(p.astype(object))
507
- assert_array_equal(e, eye(n), err_msg="n=%d kind=%r exact=%r" %
508
- (n, kind, exact))
504
+ assert_array_equal(e, eye(n), err_msg=f"n={n} kind={kind!r} exact={exact!r}")
509
505
 
510
506
  kinds = ['symmetric', 'lower', 'upper']
511
507
 
scipy/ndimage/__init__.py CHANGED
@@ -39,6 +39,7 @@ Filters
39
39
  sobel
40
40
  uniform_filter - Multidimensional uniform filter
41
41
  uniform_filter1d - 1-D uniform filter along the given axis
42
+ vectorized_filter
42
43
 
43
44
  Fourier filters
44
45
  ===============
Binary file
@@ -25,7 +25,7 @@ for func in funcs:
25
25
  """
26
26
  import numpy as np
27
27
  from scipy._lib._array_api import array_namespace
28
- from scipy.ndimage._ni_support import _skip_if_dtype, _skip_if_int
28
+ from scipy.ndimage._ni_support import _skip_if_dtype
29
29
 
30
30
 
31
31
  def affine_transform_signature(
@@ -202,7 +202,7 @@ uniform_filter1d_signature = maximum_filter1d_signature
202
202
 
203
203
 
204
204
  def maximum_signature(input, labels=None, index=None):
205
- return array_namespace(input, labels, _skip_if_int(index))
205
+ return array_namespace(input, labels, index)
206
206
 
207
207
  minimum_signature = maximum_signature
208
208
  median_signature = maximum_signature
@@ -288,6 +288,12 @@ def value_indices_signature(arr, *args, **kwds):
288
288
  return array_namespace(arr)
289
289
 
290
290
 
291
+ def vectorized_filter_signature(
292
+ input, function, size=None, footprint=None, output=None, *args, **kwds
293
+ ):
294
+ return array_namespace(input, footprint, _skip_if_dtype(output))
295
+
296
+
291
297
  def watershed_ift_signature(input, markers, structure=None, output=None):
292
298
  return array_namespace(input, markers, structure, _skip_if_dtype(output))
293
299