forked from simpeg/simpeg
/
Models.py
35 lines (29 loc) · 1.18 KB
/
Models.py
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
from __future__ import print_function
import numpy as np
from .Maps import IdentityMap
class Model(np.ndarray):
def __new__(cls, input_array, mapping=None):
assert isinstance(mapping, IdentityMap), 'mapping must be a SimPEG.Mapping'
assert isinstance(input_array, np.ndarray), 'input_array must be a numpy array'
assert len(input_array.shape) == 1, 'input_array must be a 1D vector'
obj = np.asarray(input_array).view(cls)
obj._mapping = mapping
if not obj.size == mapping.nP:
raise Exception('Incorrect size for array.')
return obj
def __array_finalize__(self, obj):
if obj is None: return
self._mapping = getattr(obj, '_mapping', None)
@property
def mapping(self):
return self._mapping
@property
def transform(self):
if getattr(self, '_transform', None) is None:
self._transform = self.mapping * self.view(np.ndarray)
return self._transform
@property
def transformDeriv(self):
if getattr(self, '_transformDeriv', None) is None:
self._transformDeriv = self.mapping.deriv(self.view(np.ndarray))
return self._transformDeriv