1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

# Copyright (C) 2003-2005 Peter J. Verveer 

# 

# Redistribution and use in source and binary forms, with or without 

# modification, are permitted provided that the following conditions 

# are met: 

# 

# 1. Redistributions of source code must retain the above copyright 

# notice, this list of conditions and the following disclaimer. 

# 

# 2. Redistributions in binary form must reproduce the above 

# copyright notice, this list of conditions and the following 

# disclaimer in the documentation and/or other materials provided 

# with the distribution. 

# 

# 3. The name of the author may not be used to endorse or promote 

# products derived from this software without specific prior 

# written permission. 

# 

# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 

# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 

# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 

# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 

# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 

# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 

# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 

# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 

# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 

# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 

# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 

 

from __future__ import division, print_function, absolute_import 

 

import numpy 

 

from scipy._lib.six import string_types 

 

 

def _extend_mode_to_code(mode): 

"""Convert an extension mode to the corresponding integer code. 

""" 

if mode == 'nearest': 

return 0 

elif mode == 'wrap': 

return 1 

elif mode == 'reflect': 

return 2 

elif mode == 'mirror': 

return 3 

elif mode == 'constant': 

return 4 

else: 

raise RuntimeError('boundary mode not supported') 

 

 

def _normalize_sequence(input, rank): 

"""If input is a scalar, create a sequence of length equal to the 

rank by duplicating the input. If input is a sequence, 

check if its length is equal to the length of array. 

""" 

is_str = isinstance(input, string_types) 

if hasattr(input, '__iter__') and not is_str: 

normalized = list(input) 

if len(normalized) != rank: 

err = "sequence argument must have length equal to input rank" 

raise RuntimeError(err) 

else: 

normalized = [input] * rank 

return normalized 

 

 

def _get_output(output, input, shape=None): 

if shape is None: 

shape = input.shape 

if output is None: 

output = numpy.zeros(shape, dtype=input.dtype.name) 

elif type(output) in [type(type), type(numpy.zeros((4,)).dtype)]: 

output = numpy.zeros(shape, dtype=output) 

elif type(output) in string_types: 

output = numpy.typeDict[output] 

output = numpy.zeros(shape, dtype=output) 

elif output.shape != shape: 

raise RuntimeError("output shape not correct") 

return output 

 

 

def _check_axis(axis, rank): 

if axis < 0: 

axis += rank 

if axis < 0 or axis >= rank: 

raise ValueError('invalid axis') 

return axis