Coverage for kwave/data.py: 55%

82 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-03-24 12:06 -0700

1from dataclasses import dataclass 

2from typing import Any 

3 

4import numpy as np 

5 

6 

7class Vector(np.ndarray): 

8 def __new__(cls, elements: list): 

9 assert 1 <= len(elements) <= 3 

10 elements = list(elements) 

11 obj = np.array(elements).view(cls) 

12 return obj 

13 

14 @property 

15 def x(self): 

16 return self[0] 

17 

18 @x.setter 

19 def x(self, value): 

20 self[0] = value 

21 

22 @property 

23 def y(self): 

24 if self.shape[0] > 1: 

25 return self[1] 

26 return np.nan 

27 

28 @y.setter 

29 def y(self, value): 

30 if self.shape[0] > 1: 

31 self[1] = value 

32 

33 @property 

34 def z(self): 

35 if self.shape[0] > 2: 

36 return self[2] 

37 return np.nan 

38 

39 @z.setter 

40 def z(self, value): 

41 if self.shape[0] > 2: 

42 self[2] = value 

43 

44 def assign_dim(self, dim: int, val: Any): 

45 self[dim - 1] = val 

46 

47 def append(self, value): 

48 new_coordinates = list(self) + [value] 

49 return Vector(new_coordinates) 

50 

51 

52@dataclass 

53class FlexibleVector(object): 

54 """ 

55 This class is very similar to Numpy.ndarray but there are differences: 

56 - It can have 3 elements at max 

57 - Its elements can be anything 

58 - The elements do not have to be same type, 

59 e.g. this is valid: Array([<scalar>, <List>, <Tuple of Tuples>]) 

60 

61 WARNING: The class will be deprecated once we refactor the kWaveGrid class to use the Vector class instead! 

62 """ 

63 

64 data: list 

65 

66 def __post_init__(self): 

67 assert 1 <= len(self) <= 3 

68 

69 def __len__(self): 

70 return len(self.data) 

71 

72 def __getitem__(self, item): 

73 return self.data[item] 

74 

75 def __setitem__(self, key, value): 

76 self.data[key] = value 

77 

78 @property 

79 def x(self): 

80 return self[0] 

81 

82 @x.setter 

83 def x(self, val): 

84 self[0] = val 

85 

86 @property 

87 def y(self): 

88 return self[1] if len(self) >= 2 else np.nan 

89 

90 @y.setter 

91 def y(self, val): 

92 assert len(self) >= 2 

93 self[1] = val 

94 

95 @property 

96 def z(self): 

97 """ 

98 :return: 3rd dimension element. 0 if not defined 

99 """ 

100 return self[2] if len(self) == 3 else np.nan 

101 

102 @z.setter 

103 def z(self, val): 

104 assert len(self) == 3 

105 self[2] = val 

106 

107 def numpy(self): 

108 return np.asarray(self.data) 

109 

110 def assign_dim(self, dim, val): 

111 if dim == 1: 

112 self.x = val 

113 if dim == 2: 

114 self.y = val 

115 if dim == 3: 

116 self.z = val 

117 

118 def append(self, val): 

119 assert len(self.data) <= 2 

120 self.data.append(val) 

121 return self