-
Notifications
You must be signed in to change notification settings - Fork 589
/
grids.py
145 lines (119 loc) 路 4.33 KB
/
grids.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
__author__ = 'maartenbreddels'
import numpy as np
import vaex.vaexfast
from vaex.utils import filesize_format
import logging
import vaex.utils
total_bytes = 0
logger = logging.getLogger("vaex.grids")
def dog(grid, sigma1, sigma2):
return gf(grid, sigma1) - gf(grid, sigma2)
def gf(grid, sigma, **kwargs):
import scipy.ndimage
return scipy.ndimage.gaussian_filter(grid, sigma=sigma, **kwargs)
functions = {}
functions["dog"] = dog
functions["gf"] = gf
def grid_average(scope, counts_name="counts", weighted_name="weighted"):
counts = scope.evaluate(counts_name)
weighted = scope.evaluate(weighted_name)
logger.debug("evaluating average: counts=%r weighted=%r" % (counts, weighted))
mask = counts == 0
average = np.zeros(counts.shape, dtype=np.float64)
average[~mask] = weighted[~mask] / counts[~mask]
average[mask] = np.nan
return average
class GridScope(object):
def __init__(self, locals=None, globals=None):
# self.locals = locals or {}
# if locals:
# self.__dict__.update(locals)
self.globals = globals or {}
self.lazy = {}
self.lazy["average"] = grid_average
self.globals["cumulative"] = self.cumulative
self.globals["normalize"] = self.normalize
self.globals.update(functions)
self.user_added = set()
def cumulative(self, array, normalize=True):
mask = (np.isnan(array) | np.isinf(array))
values = array * 1
values[mask] = 0
c = np.cumsum(values)
if normalize:
return c / c[-1]
else:
return c
def normalize(self, array):
mask = (np.isnan(array) | np.isinf(array))
values = array * 1
total = np.sum(values[~mask])
return values / total
def setter(self, key):
def apply(value, key=key):
self[key] = value
return value
return apply
def add_lazy(self, key, f):
self.lazy[key] = f
def __contains__(self, item):
return (item in self.__dict__) or (item in self.lazy)
def __setitem__(self, key, value):
# logger.debug("%r.__setitem__(%r, %r)" % (self, key, value))
self.__dict__[key] = value
self.user_added.add(key)
def __getitem__(self, key):
logger.debug("%r.__getitem__(%r)" % (self, key))
if key in self.lazy and key not in self.__dict__:
logger.debug("%r lazy item %r" % (self, key))
f = self.lazy[key]
self.__dict__[key] = f(self)
return self.__dict__[key]
def evaluate(self, expression):
if 0:
locals = dict(self.__dict__)
del locals["globals"]
logger.debug("evaluating: %r locals=%r", expression, locals)
return eval(expression, self.globals, self)
def slice(self, slice):
gridscope = GridScope(globals=self.globals)
for key in self.user_added:
value = self[key]
if isinstance(value, np.ndarray):
grid = value
sliced = np.sum(grid[slice, ...], axis=0)
logger.debug("sliced %s from %r to %r", key, grid.shape, sliced.shape)
gridscope[key] = sliced
else:
gridscope[key] = value
return gridscope
def disjoined(self):
gridscope = GridScope(globals=self.globals)
for key in self.user_added:
value = self[key]
if isinstance(value, np.ndarray):
grid = vaex.utils.disjoined(value)
gridscope[key] = grid
else:
gridscope[key] = value
return gridscope
def marginal2d(self, i, j):
gridscope = GridScope(globals=self.globals)
for key in self.user_added:
value = self[key]
if isinstance(value, np.ndarray):
dimension = len(value.shape)
axes = list(range(dimension))
axes.remove(i)
axes.remove(j)
grid = vaex.utils.multisum(value, axes)
gridscope[key] = grid
else:
gridscope[key] = value
return gridscope
def add_mem(bytes, *info):
global total_bytes
total_bytes += bytes
added = filesize_format(bytes)
total = filesize_format(total_bytes)
print(("MEMORY USAGE: added %s, total %s (%r)" % (added, total, info)))