_delegators.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. """Delegators for alternative backends in scipy.ndimage.
  2. The signature of `func_signature` must match the signature of ndimage.func.
  3. The job of a `func_signature` is to know which arguments of `ndimage.func`
  4. are arrays.
  5. * signatures are generated by
  6. --------------
  7. import inspect
  8. from scipy import ndimage
  9. names = [x for x in dir(ndimage) if not x.startswith('_')]
  10. objs = [getattr(ndimage, name) for name in names]
  11. funcs = [obj for obj in objs if inspect.isroutine(obj)]
  12. for func in funcs:
  13. sig = inspect.signature(func)
  14. print(f"def {func.__name__}_signature{sig}:\n\tpass\n\n")
  15. ---------------
  16. * which arguments to delegate on: manually trawled the documentation for
  17. array-like and array arguments
  18. """
  19. import numpy as np
  20. from scipy._lib._array_api import array_namespace
  21. from scipy.ndimage._ni_support import _skip_if_dtype
  22. def affine_transform_signature(
  23. input, matrix, offset=0.0, output_shape=None, output=None, *args, **kwds
  24. ):
  25. return array_namespace(input, matrix, _skip_if_dtype(output))
  26. def binary_closing_signature(
  27. input, structure=None, iterations=1, output=None, *args, **kwds
  28. ):
  29. return array_namespace(input, structure, _skip_if_dtype(output))
  30. binary_opening_signature = binary_closing_signature
  31. def binary_dilation_signature(
  32. input, structure=None, iterations=1, mask=None, output=None, *args, **kwds
  33. ):
  34. return array_namespace(input, structure, _skip_if_dtype(output), mask)
  35. binary_erosion_signature = binary_dilation_signature
  36. def binary_fill_holes_signature(
  37. input, structure=None, output=None, origin=0, *args, **kwargs
  38. ):
  39. return array_namespace(input, structure, _skip_if_dtype(output))
  40. def label_signature(input, structure=None, output=None, origin=0):
  41. return array_namespace(input, structure, _skip_if_dtype(output))
  42. def binary_hit_or_miss_signature(
  43. input, structure1=None, structure2=None, output=None, *args, **kwds
  44. ):
  45. return array_namespace(input, structure1, structure2, _skip_if_dtype(output))
  46. def binary_propagation_signature(
  47. input, structure=None, mask=None, output=None, *args, **kwds
  48. ):
  49. return array_namespace(input, structure, mask, _skip_if_dtype(output))
  50. def convolve_signature(input, weights, output=None, *args, **kwds):
  51. return array_namespace(input, weights, _skip_if_dtype(output))
  52. correlate_signature = convolve_signature
  53. def convolve1d_signature(input, weights, axis=-1, output=None, *args, **kwds):
  54. return array_namespace(input, weights, _skip_if_dtype(output))
  55. correlate1d_signature = convolve1d_signature
  56. def distance_transform_bf_signature(
  57. input, metric='euclidean', sampling=None, return_distances=True,
  58. return_indices=False, distances=None, indices=None
  59. ):
  60. return array_namespace(input, distances, indices)
  61. def distance_transform_cdt_signature(
  62. input, metric='chessboard', return_distances=True, return_indices=False,
  63. distances=None, indices=None
  64. ):
  65. return array_namespace(input, distances, indices)
  66. def distance_transform_edt_signature(
  67. input, sampling=None, return_distances=True, return_indices=False,
  68. distances=None, indices=None
  69. ):
  70. return array_namespace(input, distances, indices)
  71. def find_objects_signature(input, max_label=0):
  72. return array_namespace(input)
  73. def fourier_ellipsoid_signature(input, size, n=-1, axis=-1, output=None):
  74. return array_namespace(input, _skip_if_dtype(output))
  75. fourier_uniform_signature = fourier_ellipsoid_signature
  76. def fourier_gaussian_signature(input, sigma, n=-1, axis=-1, output=None):
  77. return array_namespace(input, _skip_if_dtype(output))
  78. def fourier_shift_signature(input, shift, n=-1, axis=-1, output=None):
  79. return array_namespace(input, _skip_if_dtype(output))
  80. def gaussian_filter_signature(input, sigma, order=0, output=None, *args, **kwds):
  81. return array_namespace(input, _skip_if_dtype(output))
  82. def gaussian_filter1d_signature(
  83. input, sigma, axis=-1, order=0, output=None, *args, **kwds
  84. ):
  85. return array_namespace(input, _skip_if_dtype(output))
  86. def gaussian_gradient_magnitude_signature(input, sigma, output=None, *args, **kwds):
  87. return array_namespace(input, _skip_if_dtype(output))
  88. gaussian_laplace_signature = gaussian_gradient_magnitude_signature
  89. def generate_binary_structure_signature(rank, connectivity):
  90. # XXX: no input arrays; always return numpy
  91. return np
  92. def generic_filter_signature(
  93. input, function, size=None, footprint=None, output=None, *args, **kwds
  94. ):
  95. # XXX: function LowLevelCallable w/backends
  96. return array_namespace(input, footprint, _skip_if_dtype(output))
  97. def generic_filter1d_signature(
  98. input, function, filter_size, axis=-1, output=None, *args, **kwds
  99. ):
  100. return array_namespace(input, _skip_if_dtype(output))
  101. def generic_gradient_magnitude_signature(
  102. input, derivative, output=None, *args, **kwds
  103. ):
  104. # XXX: function LowLevelCallable w/backends
  105. return array_namespace(input, _skip_if_dtype(output))
  106. def generic_laplace_signature(input, derivative2, output=None, *args, **kwds):
  107. # XXX: function LowLevelCallable w/backends
  108. return array_namespace(input, _skip_if_dtype(output))
  109. def geometric_transform_signature(
  110. input, mapping, output_shape=None, output=None, *args, **kwds
  111. ):
  112. return array_namespace(input, _skip_if_dtype(output))
  113. def histogram_signature(input, min, max, bins, labels=None, index=None):
  114. return array_namespace(input, labels)
  115. def iterate_structure_signature(structure, iterations, origin=None):
  116. return array_namespace(structure)
  117. def labeled_comprehension_signature(input, labels, *args, **kwds):
  118. return array_namespace(input, labels)
  119. def laplace_signature(input, output=None, *args, **kwds):
  120. return array_namespace(input, _skip_if_dtype(output))
  121. def map_coordinates_signature(input, coordinates, output=None, *args, **kwds):
  122. return array_namespace(input, coordinates, _skip_if_dtype(output))
  123. def maximum_filter1d_signature(input, size, axis=-1, output=None, *args, **kwds):
  124. return array_namespace(input, _skip_if_dtype(output))
  125. minimum_filter1d_signature = maximum_filter1d_signature
  126. uniform_filter1d_signature = maximum_filter1d_signature
  127. def maximum_signature(input, labels=None, index=None):
  128. return array_namespace(input, labels, index)
  129. minimum_signature = maximum_signature
  130. median_signature = maximum_signature
  131. mean_signature = maximum_signature
  132. variance_signature = maximum_signature
  133. standard_deviation_signature = maximum_signature
  134. sum_labels_signature = maximum_signature
  135. sum_signature = maximum_signature # ndimage.sum is sum_labels
  136. maximum_position_signature = maximum_signature
  137. minimum_position_signature = maximum_signature
  138. extrema_signature = maximum_signature
  139. center_of_mass_signature = extrema_signature
  140. def median_filter_signature(
  141. input, size=None, footprint=None, output=None, *args, **kwds
  142. ):
  143. return array_namespace(input, footprint, _skip_if_dtype(output))
  144. minimum_filter_signature = median_filter_signature
  145. maximum_filter_signature = median_filter_signature
  146. def morphological_gradient_signature(
  147. input, size=None, footprint=None, structure=None, output=None, *args, **kwds
  148. ):
  149. return array_namespace(input, footprint, structure, _skip_if_dtype(output))
  150. morphological_laplace_signature = morphological_gradient_signature
  151. white_tophat_signature = morphological_gradient_signature
  152. black_tophat_signature = morphological_gradient_signature
  153. grey_closing_signature = morphological_gradient_signature
  154. grey_dilation_signature = morphological_gradient_signature
  155. grey_erosion_signature = morphological_gradient_signature
  156. grey_opening_signature = morphological_gradient_signature
  157. def percentile_filter_signature(
  158. input, percentile, size=None, footprint=None, output=None, *args, **kwds
  159. ):
  160. return array_namespace(input, footprint, _skip_if_dtype(output))
  161. def prewitt_signature(input, axis=-1, output=None, *args, **kwds):
  162. return array_namespace(input, _skip_if_dtype(output))
  163. sobel_signature = prewitt_signature
  164. def rank_filter_signature(
  165. input, rank, size=None, footprint=None, output=None, *args, **kwds
  166. ):
  167. return array_namespace(input, footprint, _skip_if_dtype(output))
  168. def rotate_signature(
  169. input, angle, axes=(1, 0), reshape=True, output=None , *args, **kwds
  170. ):
  171. return array_namespace(input, _skip_if_dtype(output))
  172. def shift_signature(input, shift, output=None, *args, **kwds):
  173. return array_namespace(input, _skip_if_dtype(output))
  174. def spline_filter_signature(input, order=3, output=np.float64, *args, **kwds):
  175. return array_namespace(input, _skip_if_dtype(output))
  176. def spline_filter1d_signature(
  177. input, order=3, axis=-1, output=np.float64, *args, **kwds
  178. ):
  179. return array_namespace(input, _skip_if_dtype(output))
  180. def uniform_filter_signature(input, size=3, output=None, *args, **kwds):
  181. return array_namespace(input, _skip_if_dtype(output))
  182. def value_indices_signature(arr, *args, **kwds):
  183. return array_namespace(arr)
  184. def vectorized_filter_signature(
  185. input, function, size=None, footprint=None, output=None, *args, **kwds
  186. ):
  187. return array_namespace(input, footprint, _skip_if_dtype(output))
  188. def watershed_ift_signature(input, markers, structure=None, output=None):
  189. return array_namespace(input, markers, structure, _skip_if_dtype(output))
  190. def zoom_signature(input, zoom, output=None, *args, **kwds):
  191. return array_namespace(input, _skip_if_dtype(output))