scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp313-cp313-musllinux_1_2_aarch64.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 (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +263 -157
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313-aarch64-linux-musl.so +0 -0
  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-313-aarch64-linux-musl.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-313-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-313-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-313-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-313-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-313-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-313-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-313-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-313-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-313-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-313-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-313-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-313-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-313-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-313-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-313-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-313-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-313-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -12,10 +12,8 @@ import pytest
12
12
 
13
13
  from scipy import ndimage
14
14
 
15
- from scipy.conftest import array_api_compatible
16
15
  skip_xp_backends = pytest.mark.skip_xp_backends
17
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends"),
18
- skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'],)]
16
+ pytestmark = [skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'])]
19
17
 
20
18
 
21
19
  @skip_xp_backends('jax.numpy', reason="jax-ml/jax#23827")
@@ -177,12 +175,12 @@ class TestNdimageFourier:
177
175
  ndimage.fourier_gaussian,
178
176
  ndimage.fourier_uniform])
179
177
  def test_fourier_zero_length_dims(self, shape, dtype, test_func, xp):
180
- if is_cupy(xp):
181
- if (test_func.__name__ == "fourier_ellipsoid" and
182
- math.prod(shape) == 0):
183
- pytest.xfail(
184
- "CuPy's fourier_ellipsoid does not accept size==0 arrays"
185
- )
178
+ if (
179
+ is_cupy(xp)
180
+ and test_func.__name__ == "fourier_ellipsoid"
181
+ and math.prod(shape) == 0
182
+ ):
183
+ pytest.xfail("CuPy's fourier_ellipsoid does not accept size==0 arrays")
186
184
  dtype = getattr(xp, dtype)
187
185
  a = xp.ones(shape, dtype=dtype)
188
186
  b = test_func(a, 3)
@@ -3,10 +3,10 @@ import sys
3
3
  import numpy as np
4
4
  from numpy.testing import suppress_warnings
5
5
  from scipy._lib._array_api import (
6
+ _asarray, assert_array_almost_equal,
7
+ is_jax, np_compat,
6
8
  xp_assert_equal, xp_assert_close,
7
- assert_array_almost_equal,
8
9
  )
9
- from scipy._lib._array_api import is_cupy, is_jax, _asarray, array_namespace
10
10
 
11
11
  import pytest
12
12
  from pytest import raises as assert_raises
@@ -14,10 +14,9 @@ import scipy.ndimage as ndimage
14
14
 
15
15
  from . import types
16
16
 
17
- from scipy.conftest import array_api_compatible
18
17
  skip_xp_backends = pytest.mark.skip_xp_backends
19
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends"),
20
- skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'],)]
18
+ xfail_xp_backends = pytest.mark.xfail_xp_backends
19
+ pytestmark = [skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'])]
21
20
 
22
21
 
23
22
  eps = 1e-12
@@ -91,14 +90,13 @@ class TestBoundaries:
91
90
  np_data = np.arange(-6, 7, dtype=np.float64)
92
91
  data = xp.asarray(np_data)
93
92
  x = xp.asarray(np.linspace(-8, 15, num=1000))
94
- newaxis = array_namespace(x).newaxis
95
- y = ndimage.map_coordinates(data, x[newaxis, ...], order=order, mode=mode)
93
+ y = ndimage.map_coordinates(data, x[xp.newaxis, ...], order=order, mode=mode)
96
94
 
97
95
  # compute expected value using explicit padding via np.pad
98
96
  npad = 32
99
97
  pad_mode = ndimage_to_numpy_mode.get(mode)
100
98
  padded = xp.asarray(np.pad(np_data, npad, mode=pad_mode))
101
- coords = xp.asarray(npad + x)[newaxis, ...]
99
+ coords = xp.asarray(npad + x)[xp.newaxis, ...]
102
100
  expected = ndimage.map_coordinates(padded, coords, order=order, mode=mode)
103
101
 
104
102
  atol = 1e-5 if mode == 'grid-constant' else 1e-12
@@ -121,7 +119,8 @@ class TestSpline:
121
119
  out = ndimage.spline_filter(data, order=order)
122
120
  assert_array_almost_equal(out, xp.asarray([1]))
123
121
 
124
- @skip_xp_backends(np_only=True, reason='output=dtype is numpy-specific')
122
+ @skip_xp_backends(np_only=True, exceptions=["cupy"],
123
+ reason='output=dtype is numpy-specific')
125
124
  def test_spline03(self, dtype, order, xp):
126
125
  dtype = getattr(xp, dtype)
127
126
  data = xp.ones([], dtype=dtype)
@@ -199,8 +198,7 @@ class TestGeometricTransform:
199
198
  [0, 1, 1, 1],
200
199
  [0, 1, 1, 1]], dtype=dtype)
201
200
 
202
- isdtype = array_namespace(data).isdtype
203
- if isdtype(data.dtype, 'complex floating'):
201
+ if xp.isdtype(data.dtype, 'complex floating'):
204
202
  data -= 1j * data
205
203
  expected -= 1j * expected
206
204
 
@@ -294,54 +292,58 @@ class TestGeometricTransform:
294
292
  assert_array_almost_equal(out, xp.asarray([1, 2, 3, 4], dtype=out.dtype))
295
293
 
296
294
  def test_geometric_transform15(self, order, xp):
297
- data = [1, 2, 3, 4]
295
+ data = xp.asarray([1, 2, 3, 4])
298
296
 
299
297
  def mapping(x):
300
298
  return (x[0] / 2,)
301
299
 
302
300
  out = ndimage.geometric_transform(data, mapping, [8], order=order)
303
- assert_array_almost_equal(out[::2], [1, 2, 3, 4])
301
+ assert_array_almost_equal(out[::2], xp.asarray([1, 2, 3, 4]))
304
302
 
305
303
  def test_geometric_transform16(self, order, xp):
306
304
  data = [[1, 2, 3, 4],
307
305
  [5, 6, 7, 8],
308
306
  [9.0, 10, 11, 12]]
307
+ data = xp.asarray(data)
309
308
 
310
309
  def mapping(x):
311
310
  return (x[0], x[1] * 2)
312
311
 
313
312
  out = ndimage.geometric_transform(data, mapping, (3, 2),
314
313
  order=order)
315
- assert_array_almost_equal(out, [[1, 3], [5, 7], [9, 11]])
314
+ assert_array_almost_equal(out, xp.asarray([[1, 3], [5, 7], [9, 11]]))
316
315
 
317
316
  def test_geometric_transform17(self, order, xp):
318
317
  data = [[1, 2, 3, 4],
319
318
  [5, 6, 7, 8],
320
319
  [9, 10, 11, 12]]
320
+ data = xp.asarray(data)
321
321
 
322
322
  def mapping(x):
323
323
  return (x[0] * 2, x[1])
324
324
 
325
325
  out = ndimage.geometric_transform(data, mapping, (1, 4),
326
326
  order=order)
327
- assert_array_almost_equal(out, [[1, 2, 3, 4]])
327
+ assert_array_almost_equal(out, xp.asarray([[1, 2, 3, 4]]))
328
328
 
329
329
  def test_geometric_transform18(self, order, xp):
330
330
  data = [[1, 2, 3, 4],
331
331
  [5, 6, 7, 8],
332
332
  [9, 10, 11, 12]]
333
+ data = xp.asarray(data)
333
334
 
334
335
  def mapping(x):
335
336
  return (x[0] * 2, x[1] * 2)
336
337
 
337
338
  out = ndimage.geometric_transform(data, mapping, (1, 2),
338
339
  order=order)
339
- assert_array_almost_equal(out, [[1, 3]])
340
+ assert_array_almost_equal(out, xp.asarray([[1, 3]]))
340
341
 
341
342
  def test_geometric_transform19(self, order, xp):
342
343
  data = [[1, 2, 3, 4],
343
344
  [5, 6, 7, 8],
344
345
  [9, 10, 11, 12]]
346
+ data = xp.asarray(data)
345
347
 
346
348
  def mapping(x):
347
349
  return (x[0], x[1] / 2)
@@ -354,6 +356,7 @@ class TestGeometricTransform:
354
356
  data = [[1, 2, 3, 4],
355
357
  [5, 6, 7, 8],
356
358
  [9, 10, 11, 12]]
359
+ data = xp.asarray(data)
357
360
 
358
361
  def mapping(x):
359
362
  return (x[0] / 2, x[1])
@@ -366,6 +369,7 @@ class TestGeometricTransform:
366
369
  data = [[1, 2, 3, 4],
367
370
  [5, 6, 7, 8],
368
371
  [9, 10, 11, 12]]
372
+ data = xp.asarray(data)
369
373
 
370
374
  def mapping(x):
371
375
  return (x[0] / 2, x[1] / 2)
@@ -375,9 +379,10 @@ class TestGeometricTransform:
375
379
  assert_array_almost_equal(out[::2, ::2], data)
376
380
 
377
381
  def test_geometric_transform22(self, order, xp):
378
- data = xp.asarray([[1, 2, 3, 4],
379
- [5, 6, 7, 8],
380
- [9, 10, 11, 12]], dtype=xp.float64)
382
+ data = [[1, 2, 3, 4],
383
+ [5, 6, 7, 8],
384
+ [9, 10, 11, 12]]
385
+ data = xp.asarray(data, dtype=xp.float64)
381
386
 
382
387
  def mapping1(x):
383
388
  return (x[0] / 2, x[1] / 2)
@@ -395,18 +400,19 @@ class TestGeometricTransform:
395
400
  data = [[1, 2, 3, 4],
396
401
  [5, 6, 7, 8],
397
402
  [9, 10, 11, 12]]
403
+ data = xp.asarray(data)
398
404
 
399
405
  def mapping(x):
400
406
  return (1, x[0] * 2)
401
407
 
402
408
  out = ndimage.geometric_transform(data, mapping, (2,), order=order)
403
- out = out.astype(np.int32)
404
- assert_array_almost_equal(out, [5, 7])
409
+ assert_array_almost_equal(out, xp.asarray([5, 7]))
405
410
 
406
411
  def test_geometric_transform24(self, order, xp):
407
412
  data = [[1, 2, 3, 4],
408
413
  [5, 6, 7, 8],
409
414
  [9, 10, 11, 12]]
415
+ data = xp.asarray(data)
410
416
 
411
417
  def mapping(x, a, b):
412
418
  return (a, x[0] * b)
@@ -414,7 +420,7 @@ class TestGeometricTransform:
414
420
  out = ndimage.geometric_transform(
415
421
  data, mapping, (2,), order=order, extra_arguments=(1,),
416
422
  extra_keywords={'b': 2})
417
- assert_array_almost_equal(out, [5, 7])
423
+ assert_array_almost_equal(out, xp.asarray([5, 7]))
418
424
 
419
425
 
420
426
  @skip_xp_backends("cupy", reason="CuPy does not have geometric_transform")
@@ -509,8 +515,7 @@ class TestMapCoordinates:
509
515
  expected = xp.asarray([[0, 0, 0, 0],
510
516
  [0, 4, 1, 3],
511
517
  [0, 7, 6, 8]])
512
- isdtype = array_namespace(data).isdtype
513
- if isdtype(data.dtype, 'complex floating'):
518
+ if xp.isdtype(data.dtype, 'complex floating'):
514
519
  data = data - 1j * data
515
520
  expected = expected - 1j * expected
516
521
 
@@ -596,6 +601,7 @@ class TestMapCoordinates:
596
601
  assert out.dtype is np.dtype('f')
597
602
  assert_array_almost_equal(out, xp.asarray([[1]]))
598
603
 
604
+ @pytest.mark.skip_xp_backends(cpu_only=True)
599
605
  @pytest.mark.skipif('win32' in sys.platform or np.intp(0).itemsize < 8,
600
606
  reason='do not run on 32 bit or windows '
601
607
  '(no sparse memory)')
@@ -650,8 +656,7 @@ class TestAffineTransform:
650
656
  expected = xp.asarray([[0, 1, 1, 1],
651
657
  [0, 1, 1, 1],
652
658
  [0, 1, 1, 1]], dtype=dtype)
653
- isdtype = array_namespace(data).isdtype
654
- if isdtype(data.dtype, 'complex floating'):
659
+ if xp.isdtype(data.dtype, 'complex floating'):
655
660
  data -= 1j * data
656
661
  expected -= 1j * expected
657
662
  out = ndimage.affine_transform(data, xp.asarray([[1, 0], [0, 1]]),
@@ -796,11 +801,9 @@ class TestAffineTransform:
796
801
  (3, 4), order=order)
797
802
  assert_array_almost_equal(out, data)
798
803
 
804
+ @xfail_xp_backends("cupy", reason="https://github.com/cupy/cupy/issues/8394")
799
805
  @pytest.mark.parametrize('order', range(0, 6))
800
806
  def test_affine_transform20(self, order, xp):
801
- if is_cupy(xp):
802
- pytest.xfail("https://github.com/cupy/cupy/issues/8394")
803
-
804
807
  data = [[1, 2, 3, 4],
805
808
  [5, 6, 7, 8],
806
809
  [9, 10, 11, 12]]
@@ -809,11 +812,9 @@ class TestAffineTransform:
809
812
  order=order)
810
813
  assert_array_almost_equal(out, xp.asarray([1, 3]))
811
814
 
815
+ @xfail_xp_backends("cupy", reason="https://github.com/cupy/cupy/issues/8394")
812
816
  @pytest.mark.parametrize('order', range(0, 6))
813
817
  def test_affine_transform21(self, order, xp):
814
- if is_cupy(xp):
815
- pytest.xfail("https://github.com/cupy/cupy/issues/8394")
816
-
817
818
  data = [[1, 2, 3, 4],
818
819
  [5, 6, 7, 8],
819
820
  [9, 10, 11, 12]]
@@ -875,9 +876,8 @@ class TestAffineTransform:
875
876
  tform_original = xp.eye(2)
876
877
  offset_original = -xp.ones((2, 1))
877
878
 
878
- concat = array_namespace(tform_original, offset_original).concat
879
- tform_h1 = concat((tform_original, offset_original), axis=1) # hstack
880
- tform_h2 = concat( (tform_h1, xp.asarray([[0.0, 0, 1]])), axis=0) # vstack
879
+ tform_h1 = xp.concat((tform_original, offset_original), axis=1) # hstack
880
+ tform_h2 = xp.concat((tform_h1, xp.asarray([[0.0, 0, 1]])), axis=0) # vstack
881
881
 
882
882
  offs = [float(x) for x in xp.reshape(offset_original, (-1,))]
883
883
 
@@ -893,17 +893,14 @@ class TestAffineTransform:
893
893
  [0, 4, 1, 3],
894
894
  [0, 7, 6, 8]]))
895
895
 
896
+ @xfail_xp_backends("cupy", reason="does not raise")
896
897
  def test_affine_transform27(self, xp):
897
- if is_cupy(xp):
898
- pytest.xfail("CuPy does not raise")
899
-
900
898
  # test valid homogeneous transformation matrix
901
899
  data = xp.asarray([[4, 1, 3, 2],
902
900
  [7, 6, 8, 5],
903
901
  [3, 5, 3, 6]])
904
- concat = array_namespace(data).concat
905
- tform_h1 = concat( (xp.eye(2), -xp.ones((2, 1))) , axis=1) # vstack
906
- tform_h2 = concat((tform_h1, xp.asarray([[5.0, 2, 1]])), axis=0) # hstack
902
+ tform_h1 = xp.concat((xp.eye(2), -xp.ones((2, 1))) , axis=1) # vstack
903
+ tform_h2 = xp.concat((tform_h1, xp.asarray([[5.0, 2, 1]])), axis=0) # hstack
907
904
 
908
905
  assert_raises(ValueError, ndimage.affine_transform, data, tform_h2)
909
906
 
@@ -1038,8 +1035,7 @@ class TestShift:
1038
1035
  expected = xp.asarray([[0, 1, 1, 1],
1039
1036
  [0, 1, 1, 1],
1040
1037
  [0, 1, 1, 1]], dtype=dtype)
1041
- isdtype = array_namespace(data).isdtype
1042
- if isdtype(data.dtype, 'complex floating'):
1038
+ if xp.isdtype(data.dtype, 'complex floating'):
1043
1039
  data -= 1j * data
1044
1040
  expected -= 1j * expected
1045
1041
  out = ndimage.shift(data, [0, 1], order=order)
@@ -1057,8 +1053,7 @@ class TestShift:
1057
1053
  [0, 1, 1, 1],
1058
1054
  [0, 1, 1, 1]], dtype=dtype)
1059
1055
 
1060
- isdtype = array_namespace(data).isdtype
1061
- if isdtype(data.dtype, 'complex floating'):
1056
+ if np_compat.isdtype(data.dtype, 'complex floating'):
1062
1057
  data -= 1j * data
1063
1058
  expected -= 1j * expected
1064
1059
  cval = 5.0
@@ -1237,8 +1232,7 @@ class TestZoom:
1237
1232
  data = xp.asarray([[1, 2, 3, 4],
1238
1233
  [5, 6, 7, 8],
1239
1234
  [9, 10, 11, 12]], dtype=dtype)
1240
- isdtype = array_namespace(data).isdtype
1241
- if isdtype(data.dtype, 'complex floating'):
1235
+ if xp.isdtype(data.dtype, 'complex floating'):
1242
1236
  data -= 1j * data
1243
1237
  with suppress_warnings() as sup:
1244
1238
  sup.filter(UserWarning,
@@ -1314,7 +1308,8 @@ class TestZoom:
1314
1308
  match="It is recommended to use mode"):
1315
1309
  ndimage.zoom(x, 2, mode=mode, grid_mode=True),
1316
1310
 
1317
- @skip_xp_backends(np_only=True, reason='inplace output= is numpy-specific')
1311
+ @skip_xp_backends("dask.array", reason="output=array requires buffer view")
1312
+ @skip_xp_backends("jax.numpy", reason="output=array requires buffer view")
1318
1313
  def test_zoom_output_shape(self, xp):
1319
1314
  """Ticket #643"""
1320
1315
  x = xp.reshape(xp.arange(12), (3, 4))
@@ -1328,6 +1323,23 @@ class TestZoom:
1328
1323
  expected = ndimage.zoom(a, factor)
1329
1324
  xp_assert_close(actual, expected)
1330
1325
 
1326
+ @xfail_xp_backends("cupy", reason="CuPy `zoom` needs similar fix.")
1327
+ def test_zoom_1_gh20999(self, xp):
1328
+ # gh-20999 reported that zoom with `zoom=1` (or sequence of ones)
1329
+ # introduced noise. Check that this is resolved.
1330
+ x = xp.eye(3)
1331
+ xp_assert_equal(ndimage.zoom(x, 1), x)
1332
+ xp_assert_equal(ndimage.zoom(x, (1, 1)), x)
1333
+
1334
+ @xfail_xp_backends("cupy", reason="CuPy `zoom` needs similar fix.")
1335
+ @skip_xp_backends("jax.numpy", reason="read-only backend")
1336
+ @xfail_xp_backends("dask.array", reason="numpy round-trip")
1337
+ def test_zoom_1_gh20999_output(self, xp):
1338
+ x = xp.eye(3)
1339
+ output = xp.zeros_like(x)
1340
+ ndimage.zoom(x, 1, output=output)
1341
+ xp_assert_equal(output, x)
1342
+
1331
1343
 
1332
1344
  class TestRotate:
1333
1345
 
@@ -1363,8 +1375,7 @@ class TestRotate:
1363
1375
  [0, 1, 0],
1364
1376
  [0, 1, 0],
1365
1377
  [0, 0, 0]], dtype=dtype)
1366
- isdtype = array_namespace(data).isdtype
1367
- if isdtype(data.dtype, 'complex floating'):
1378
+ if xp.isdtype(data.dtype, 'complex floating'):
1368
1379
  data -= 1j * data
1369
1380
  expected -= 1j * expected
1370
1381
  out = ndimage.rotate(data, 90, order=order)
@@ -1418,14 +1429,13 @@ class TestRotate:
1418
1429
  data = xp.asarray([[[0, 0, 0, 0, 0],
1419
1430
  [0, 1, 1, 0, 0],
1420
1431
  [0, 0, 0, 0, 0]]] * 2, dtype=xp.float64)
1421
- permute_dims = array_namespace(data).permute_dims
1422
- data = permute_dims(data, (2, 1, 0))
1432
+ data = xp.permute_dims(data, (2, 1, 0))
1423
1433
  expected = xp.asarray([[[0, 0, 0],
1424
1434
  [0, 1, 0],
1425
1435
  [0, 1, 0],
1426
1436
  [0, 0, 0],
1427
1437
  [0, 0, 0]]] * 2, dtype=xp.float64)
1428
- expected = permute_dims(expected, (2, 1, 0))
1438
+ expected = xp.permute_dims(expected, (2, 1, 0))
1429
1439
  out = ndimage.rotate(data, 90, axes=(0, 1), order=order)
1430
1440
  assert_array_almost_equal(out, expected)
1431
1441
 
@@ -1434,13 +1444,11 @@ class TestRotate:
1434
1444
  data = xp.asarray([[[0, 0, 0, 0, 0],
1435
1445
  [0, 1, 1, 0, 0],
1436
1446
  [0, 0, 0, 0, 0]]] * 2, dtype=xp.float64)
1437
- permute_dims = array_namespace(data).permute_dims
1438
- data = permute_dims(data, (2, 1, 0)) # == np.transpose
1447
+ data = xp.permute_dims(data, (2, 1, 0)) # == np.transpose
1439
1448
  expected = xp.asarray([[[0, 0, 1, 0, 0],
1440
1449
  [0, 0, 1, 0, 0],
1441
1450
  [0, 0, 0, 0, 0]]] * 2, dtype=xp.float64)
1442
- permute_dims = array_namespace(data).permute_dims
1443
- expected = permute_dims(expected, (2, 1, 0))
1451
+ expected = xp.permute_dims(expected, (2, 1, 0))
1444
1452
  out = ndimage.rotate(data, 90, axes=(0, 1), reshape=False, order=order)
1445
1453
  assert_array_almost_equal(out, expected)
1446
1454
 
@@ -1475,10 +1483,9 @@ class TestRotate:
1475
1483
  #assert_array_almost_equal(out, expected)
1476
1484
  xp_assert_close(out, expected, rtol=1e-6, atol=2e-6)
1477
1485
 
1478
- def test_rotate_exact_180(self, xp):
1479
- if is_cupy(xp):
1480
- pytest.xfail("https://github.com/cupy/cupy/issues/8400")
1481
1486
 
1482
- a = np.tile(xp.arange(5), (5, 1))
1487
+ @xfail_xp_backends("cupy", reason="https://github.com/cupy/cupy/issues/8400")
1488
+ def test_rotate_exact_180(self, xp):
1489
+ a = xp.asarray(np.tile(np.arange(5), (5, 1)))
1483
1490
  b = ndimage.rotate(ndimage.rotate(a, 180), -180)
1484
1491
  xp_assert_equal(a, b)
@@ -5,9 +5,7 @@ import numpy as np
5
5
  from numpy.testing import suppress_warnings
6
6
 
7
7
  from scipy._lib._array_api import (
8
- is_jax,
9
8
  is_torch,
10
- array_namespace,
11
9
  xp_assert_equal,
12
10
  xp_assert_close,
13
11
  assert_array_almost_equal,
@@ -21,10 +19,8 @@ import scipy.ndimage as ndimage
21
19
 
22
20
  from . import types
23
21
 
24
- from scipy.conftest import array_api_compatible
25
22
  skip_xp_backends = pytest.mark.skip_xp_backends
26
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends"),
27
- skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'],)]
23
+ pytestmark = [skip_xp_backends(cpu_only=True, exceptions=['cupy', 'jax.numpy'])]
28
24
 
29
25
  IS_WINDOWS_AND_NP1 = os.name == 'nt' and np.__version__ < '2'
30
26
 
@@ -112,6 +108,7 @@ class Test_measurements_stats:
112
108
  xp_assert_equal(centers, np.asarray([0.5, 8.0]))
113
109
 
114
110
 
111
+ @skip_xp_backends(np_only=True, reason='test internal numpy-only helpers')
115
112
  class Test_measurements_select:
116
113
  """ndimage._measurements._select() is a utility used by other functions."""
117
114
 
@@ -151,20 +148,19 @@ class Test_measurements_select:
151
148
 
152
149
 
153
150
  def test_label01(xp):
154
- data = xp.ones([])
151
+ data = xp.ones(())
155
152
  out, n = ndimage.label(data)
156
153
  assert out == 1
157
154
  assert n == 1
158
155
 
159
156
 
160
157
  def test_label02(xp):
161
- data = xp.zeros([])
158
+ data = xp.zeros(())
162
159
  out, n = ndimage.label(data)
163
160
  assert out == 0
164
161
  assert n == 0
165
162
 
166
163
 
167
- @pytest.mark.thread_unsafe # due to Cython fused types, see cython#6506
168
164
  def test_label03(xp):
169
165
  data = xp.ones([1])
170
166
  out, n = ndimage.label(data)
@@ -342,7 +338,8 @@ def test_label13(xp):
342
338
  assert n == 1
343
339
 
344
340
 
345
- @skip_xp_backends(np_only=True, reason='output=dtype is numpy-specific')
341
+ @skip_xp_backends(np_only=True, exceptions=["cupy"],
342
+ reason='output=dtype is numpy-specific')
346
343
  def test_label_output_typed(xp):
347
344
  data = xp.ones([5])
348
345
  for t in types:
@@ -354,7 +351,8 @@ def test_label_output_typed(xp):
354
351
  assert n == 1
355
352
 
356
353
 
357
- @skip_xp_backends(np_only=True, reason='output=dtype is numpy-specific')
354
+ @skip_xp_backends(np_only=True, exceptions=["cupy"],
355
+ reason='output=dtype is numpy-specific')
358
356
  def test_label_output_dtype(xp):
359
357
  data = xp.ones([5])
360
358
  for t in types:
@@ -365,17 +363,13 @@ def test_label_output_dtype(xp):
365
363
  assert output.dtype == t
366
364
 
367
365
 
366
+ @skip_xp_backends(np_only=True, reason="in-place output is numpy-specific")
368
367
  def test_label_output_wrong_size(xp):
369
- if is_jax(xp):
370
- pytest.xfail("JAX does not raise")
371
-
372
368
  data = xp.ones([5])
373
369
  for t in types:
374
370
  dtype = getattr(xp, t)
375
371
  output = xp.zeros([10], dtype=dtype)
376
- # TypeError is from non-numpy arrays as output
377
- assert_raises((ValueError, TypeError),
378
- ndimage.label, data, output=output)
372
+ assert_raises(ValueError, ndimage.label, data, output=output)
379
373
 
380
374
 
381
375
  def test_label_structuring_elements(xp):
@@ -400,9 +394,7 @@ def test_label_structuring_elements(xp):
400
394
  xp_assert_equal(ndimage.label(d, s)[0], results[r, :, :], check_dtype=False)
401
395
  r += 1
402
396
 
403
- @skip_xp_backends("cupy",
404
- reason="`cupyx.scipy.ndimage` does not have `find_objects`"
405
- )
397
+ @skip_xp_backends("cupy", reason="`cupyx.scipy.ndimage` does not have `find_objects`")
406
398
  def test_ticket_742(xp):
407
399
  def SE(img, thresh=.7, size=4):
408
400
  mask = img > thresh
@@ -533,11 +525,7 @@ def test_value_indices01(xp):
533
525
  true_keys = [1, 2, 4]
534
526
  assert list(vi.keys()) == true_keys
535
527
 
536
- nnz_kwd = {'as_tuple': True} if is_torch(xp) else {}
537
-
538
- truevi = {}
539
- for k in true_keys:
540
- truevi[k] = xp.nonzero(data == k, **nnz_kwd)
528
+ truevi = {k: xp.nonzero(data == k) for k in true_keys}
541
529
 
542
530
  vi = ndimage.value_indices(data, ignore_value=0)
543
531
  assert vi.keys() == truevi.keys()
@@ -558,17 +546,15 @@ def test_value_indices02(xp):
558
546
  def test_value_indices03(xp):
559
547
  "Test different input array shapes, from 1-D to 4-D"
560
548
  for shape in [(36,), (18, 2), (3, 3, 4), (3, 3, 2, 2)]:
561
- a = xp.asarray((12*[1]+12*[2]+12*[3]), dtype=xp.int32)
562
- a = xp.reshape(a, shape)
549
+ a = np.asarray((12*[1]+12*[2]+12*[3]), dtype=np.int32)
550
+ a = np.reshape(a, shape)
563
551
 
564
- nnz_kwd = {'as_tuple': True} if is_torch(xp) else {}
565
-
566
- unique_values = array_namespace(a).unique_values
567
- trueKeys = unique_values(a)
552
+ trueKeys = np.unique(a)
553
+ a = xp.asarray(a)
568
554
  vi = ndimage.value_indices(a)
569
555
  assert list(vi.keys()) == list(trueKeys)
570
556
  for k in [int(x) for x in trueKeys]:
571
- trueNdx = xp.nonzero(a == k, **nnz_kwd)
557
+ trueNdx = xp.nonzero(a == k)
572
558
  assert len(vi[k]) == len(trueNdx)
573
559
  for vik, true_vik in zip(vi[k], trueNdx):
574
560
  xp_assert_equal(vik, true_vik)
@@ -1139,9 +1125,6 @@ def test_maximum_position06(xp):
1139
1125
 
1140
1126
  def test_maximum_position07(xp):
1141
1127
  # Test float labels
1142
- if is_torch(xp):
1143
- pytest.xfail("output[1] is wrong on pytorch")
1144
-
1145
1128
  labels = xp.asarray([1.0, 2.5, 0.0, 4.5])
1146
1129
  for type in types:
1147
1130
  dtype = getattr(xp, type)
@@ -1586,7 +1569,7 @@ class TestWatershedIft:
1586
1569
  [1, 1]]
1587
1570
  assert_array_almost_equal(out, xp.asarray(expected))
1588
1571
 
1589
- @skip_xp_backends("cupy", reason="no watershed_ift on CuPy" )
1572
+ @skip_xp_backends("cupy", reason="no watershed_ift on CuPy")
1590
1573
  def test_watershed_ift09(self, xp):
1591
1574
  # Test large cost. See gh-19575
1592
1575
  data = xp.asarray([[xp.iinfo(xp.uint16).max, 0],