105 lines
3.1 KiB
Python
105 lines
3.1 KiB
Python
'''
|
|
Created on 19.09.2012
|
|
|
|
@author: Jakob
|
|
'''
|
|
#from sys import warnoptions
|
|
import sys
|
|
import numpy as np
|
|
|
|
def get_moving_average(vmat, vgoodmat, cfg):
|
|
'''
|
|
return a velocity matrix with horizontally averaged velocity components
|
|
|
|
cfg vars:
|
|
order ... order of averaging. must be an uneven integer
|
|
|
|
'''
|
|
|
|
if not cfg['order'] % 2:
|
|
print(('get_moving_average(): cfg variable "order" must not be even.'.format()))
|
|
|
|
radius = int(cfg['order']/2)
|
|
(rows, columns, dims) = vmat.shape
|
|
avg = np.zeros(shape=(rows, columns, dims), dtype=np.float) # matrix with averaged
|
|
|
|
for r in range(rows):
|
|
lbc = -1 # last bad column
|
|
for c in range(columns):
|
|
if vgoodmat[r,c] == True:
|
|
# do the averaging job
|
|
if False in vgoodmat[r,c+1:]:
|
|
nbc = c + vgoodmat[r,c+1:].tolist().index(False) + 1 # position of next bad neighbor
|
|
temp1 = False
|
|
else:
|
|
nbc = columns-1
|
|
temp1 = True
|
|
|
|
|
|
# averaging submatrix
|
|
x = vmat[r, max(lbc, max(0, c - radius)):min(nbc, min(columns-1, c + radius + 1)),:]
|
|
if x.shape[0] == 0:
|
|
print(('OOPS {}x{:3} bn: {:3} {:3} {}'.format(r, c, lbc, nbc, temp1)))
|
|
# print x.shape, x.mean(axis=0)
|
|
avg[r,c] = x.mean(axis=0)
|
|
|
|
else:
|
|
lbc = c
|
|
|
|
return avg
|
|
|
|
def get_averaged_profile(p, cfg):
|
|
''' return an averager profile
|
|
cfg vars:
|
|
order ... order of averaging. must be an uneven integer
|
|
'''
|
|
from copy import deepcopy
|
|
p = deepcopy(p)
|
|
|
|
import outliers
|
|
cm = outliers.get_cell_matrix(p)
|
|
|
|
velocity_matrix, velocity_matrix_mask = outliers.get_valuematrix_from_cellmatrix(cm, '.velocity.v')
|
|
vma = get_moving_average(velocity_matrix, velocity_matrix_mask, cfg)
|
|
p.update_velocities(vma, velocity_matrix_mask)
|
|
|
|
return p
|
|
|
|
def thin_out(p, cfg):
|
|
''' make only every n'th element stay in ensemble and profile
|
|
cfg vars:
|
|
keep_ensemble
|
|
keep_cell
|
|
'''
|
|
from copy import deepcopy
|
|
p = deepcopy(p)
|
|
|
|
# thin out ensembles
|
|
p.ensembles = p.ensembles[::cfg['keep_ensemble'] if 'keep_ensemble' in cfg else 1]
|
|
|
|
for e in p.ensembles:
|
|
if not e.void:
|
|
e.cells = e.cells[::cfg['keep_cell'] if 'keep_cell' in cfg else 1]
|
|
|
|
return p
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import pickle, time
|
|
# from quickviz import subplot_matrix
|
|
profile = pickle.load(open('../testfiles/demodata.pickle','rb'))
|
|
(cm, vm, vgm, rdm, olm) = pickle.load(open('../testfiles/outliers.pickle','rb'))
|
|
|
|
'''
|
|
cm ... cell matrix
|
|
vm ... value matrix
|
|
vgm ... good value matrix
|
|
rdm ... relative deviation (see http://mathworld.wolfram.com/RelativeDeviation.html)
|
|
olm ... outlier matrix (1=outlier, 0=no outlier)
|
|
'''
|
|
get_moving_average(vm, vgm, dict(order=3))
|
|
get_moving_average(vm, vgm, dict(order=5))
|
|
vma = get_moving_average(vm, vgm, dict(order=9))
|
|
|
|
|
|
|