conditional mean code using binning
This commit is contained in:
parent
2ae719750d
commit
f6e9c2ad55
1 changed files with 107 additions and 0 deletions
107
binning_v_given_c.py
Normal file
107
binning_v_given_c.py
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
#!/usr/bin/env python
|
||||
# coding: utf-8
|
||||
|
||||
import sys
|
||||
import argparse
|
||||
import numpy as np
|
||||
|
||||
|
||||
# Commandline argument parser
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-x", "--xindex", help="sampling x index", type=int, required=True)
|
||||
parser.add_argument("-v", "--variable", help="file containing variable to calculate conditional mean", required=True)
|
||||
parser.add_argument("-n", "--nbins", help="number of bins per condtion c interval", default=45, )
|
||||
parser.add_argument("-b", "--boundary", help="width of boundary region for fine mesh", default=0.06, )
|
||||
args = parser.parse_args()
|
||||
params = vars(args)
|
||||
|
||||
|
||||
# Parameters
|
||||
xidx = int(params["xindex"])
|
||||
vfilename = params["variable"]
|
||||
|
||||
nbins = int(params["nbins"])
|
||||
boundary = float(params["boundary"])
|
||||
|
||||
cfile = "c.dat"
|
||||
ufile = vfilename # "u.dat"
|
||||
|
||||
|
||||
|
||||
print ("Computing conditional mean at {}".format(xidx))
|
||||
|
||||
|
||||
|
||||
def cmean_binning (c, v, nbins=100, boundary=0.1, quiet=False):
|
||||
'''
|
||||
Compute conditional mean of v given condition c by binning
|
||||
'''
|
||||
c_bins = np.hstack(
|
||||
(np.linspace(0, boundary, nbins),
|
||||
np.linspace(boundary, 1-boundary, nbins)[1:],
|
||||
np.linspace(1-boundary, 1, nbins)[1:],
|
||||
)
|
||||
)
|
||||
c_bins[0] = -np.finfo(np.float).eps
|
||||
|
||||
cstar = np.zeros(c_bins.size + 1)
|
||||
cstar[1:-1] = (c_bins[1:]+c_bins[:-1])/2.
|
||||
cstar[-1] = 1.0
|
||||
|
||||
v_sums = np.zeros(c_bins.size)
|
||||
v_counts = np.zeros(c_bins.size, dtype=int)
|
||||
|
||||
ntimes = c.shape[0]
|
||||
|
||||
progress_view = 0
|
||||
indicator_length = 50
|
||||
|
||||
if not quiet: print (indicator_length * "|")
|
||||
|
||||
for tidx, cplane in enumerate(c):
|
||||
|
||||
progress = indicator_length * (tidx / ntimes)
|
||||
if np.floor(progress) > progress_view:
|
||||
for j in range(int(np.floor(progress) - progress_view)):
|
||||
if not quiet: print("=", end='')
|
||||
progress_view = np.floor(progress)
|
||||
|
||||
v_plane = v[tidx]
|
||||
|
||||
bin_indices = np.digitize(cplane, c_bins, right=True)
|
||||
|
||||
for i in range(1, c_bins.size):
|
||||
binned = v_plane[bin_indices == i]
|
||||
v_sums[i] += binned.sum()
|
||||
v_counts[i] += binned.size
|
||||
|
||||
v_avg = np.zeros(v_sums.size+1)
|
||||
v_avg[:-1] = v_sums / v_counts
|
||||
|
||||
return cstar, v_avg, c_bins, v_counts
|
||||
|
||||
|
||||
# Load data
|
||||
|
||||
sc = np.memmap(cfile, mode="r", dtype=np.double).reshape((512,-1,256,256))
|
||||
sv = np.memmap(ufile, mode="r", dtype=np.double).reshape((512,-1,256,256))
|
||||
|
||||
c_at_x = sc[xidx]
|
||||
v_at_x = sv[xidx]
|
||||
|
||||
print ("Completed loading data".format(xidx))
|
||||
|
||||
|
||||
# Compute conditional mean
|
||||
|
||||
cstar, cmean, bin_edges, count = cmean_binning(c_at_x, v_at_x, nbins=nbins, boundary=boundary, quiet=True)
|
||||
|
||||
|
||||
# Save result
|
||||
arr_dict = {}
|
||||
arr_dict["cstar"] = np.asarray(cstar)
|
||||
arr_dict["cmean"] = np.asarray(cmean)
|
||||
arr_dict["bins"] = np.asarray(bin_edges)
|
||||
arr_dict["count"] = np.asarray(count)
|
||||
|
||||
np.savez("cmean_u_given_c_{:03d}".format(xidx), **arr_dict)
|
||||
Loading…
Add table
Reference in a new issue