Coverage for kwave/data.py: 55%
82 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-24 12:06 -0700
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-24 12:06 -0700
1from dataclasses import dataclass
2from typing import Any
4import numpy as np
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
14 @property
15 def x(self):
16 return self[0]
18 @x.setter
19 def x(self, value):
20 self[0] = value
22 @property
23 def y(self):
24 if self.shape[0] > 1:
25 return self[1]
26 return np.nan
28 @y.setter
29 def y(self, value):
30 if self.shape[0] > 1:
31 self[1] = value
33 @property
34 def z(self):
35 if self.shape[0] > 2:
36 return self[2]
37 return np.nan
39 @z.setter
40 def z(self, value):
41 if self.shape[0] > 2:
42 self[2] = value
44 def assign_dim(self, dim: int, val: Any):
45 self[dim - 1] = val
47 def append(self, value):
48 new_coordinates = list(self) + [value]
49 return Vector(new_coordinates)
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>])
61 WARNING: The class will be deprecated once we refactor the kWaveGrid class to use the Vector class instead!
62 """
64 data: list
66 def __post_init__(self):
67 assert 1 <= len(self) <= 3
69 def __len__(self):
70 return len(self.data)
72 def __getitem__(self, item):
73 return self.data[item]
75 def __setitem__(self, key, value):
76 self.data[key] = value
78 @property
79 def x(self):
80 return self[0]
82 @x.setter
83 def x(self, val):
84 self[0] = val
86 @property
87 def y(self):
88 return self[1] if len(self) >= 2 else np.nan
90 @y.setter
91 def y(self, val):
92 assert len(self) >= 2
93 self[1] = val
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
102 @z.setter
103 def z(self, val):
104 assert len(self) == 3
105 self[2] = val
107 def numpy(self):
108 return np.asarray(self.data)
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
118 def append(self, val):
119 assert len(self.data) <= 2
120 self.data.append(val)
121 return self