Source code for kwave.data

from dataclasses import dataclass
from typing import Any

import numpy as np


[docs] class Vector(np.ndarray):
[docs] def __new__(cls, elements: list): assert 1 <= len(elements) <= 3 elements = list(elements) obj = np.array(elements).view(cls) return obj
@property def x(self): return self[0] @x.setter def x(self, value): self[0] = value @property def y(self): if self.shape[0] > 1: return self[1] return np.nan @y.setter def y(self, value): if self.shape[0] > 1: self[1] = value @property def z(self): if self.shape[0] > 2: return self[2] return np.nan @z.setter def z(self, value): if self.shape[0] > 2: self[2] = value
[docs] def assign_dim(self, dim: int, val: Any): self[dim - 1] = val
[docs] def append(self, value): new_coordinates = list(self) + [value] return Vector(new_coordinates)
[docs] @dataclass class FlexibleVector(object): """ This class is very similar to Numpy.ndarray but there are differences: - It can have 3 elements at max - Its elements can be anything - The elements do not have to be same type, e.g. this is valid: Array([<scalar>, <List>, <Tuple of Tuples>]) WARNING: The class will be deprecated once we refactor the kWaveGrid class to use the Vector class instead! """ data: list def __post_init__(self): assert 1 <= len(self) <= 3 def __len__(self): return len(self.data) def __getitem__(self, item): return self.data[item] def __setitem__(self, key, value): self.data[key] = value @property def x(self): return self[0] @x.setter def x(self, val): self[0] = val @property def y(self): return self[1] if len(self) >= 2 else np.nan @y.setter def y(self, val): assert len(self) >= 2 self[1] = val @property def z(self): """ :return: 3rd dimension element. 0 if not defined """ return self[2] if len(self) == 3 else np.nan @z.setter def z(self, val): assert len(self) == 3 self[2] = val
[docs] def numpy(self): return np.asarray(self.data)
[docs] def assign_dim(self, dim, val): if dim == 1: self.x = val if dim == 2: self.y = val if dim == 3: self.z = val
[docs] def append(self, val): assert len(self.data) <= 2 self.data.append(val) return self