Binning functions
About
This MR adds a general-purpose binning function.
At first I thought dedicated binning functions (for each binning factor) would be faster, but it turns out binning_n
is faster.
Hopefully this will enable to remove some code.
Close #136 (closed)
To do
-
Implement a general-purpose binning function -
Unit tests -
Integrate in pipeline -
End-to-end reconstruction test
Notes
The general-purpose binning function is tested against an array numpy.arange(n0 * n1).reshape((n0, n1))
.
Each entry (i, j)
of this array is equal to i * n1 + j
.
After binning, the binned array at position (p_j, p_j)
is equal to
\dfrac{1}{b_i b_j} \displaystyle\sum_{i=p_i}^{p_i + b_i - 1} \displaystyle\sum_{j=p_j}^{p_j+b_j-1} \left(N_x \cdot i + j\right)
which happens to be equal to
1/2 \cdot \left( N_x b_{i} + 2 N_x p_{i} - N_x + b_{j} + 2 p_{j} - 1 \right)
from sympy import init_session
init_session(quiet=True)
b, p_i, p_j, i, j, Nx, b_i, b_j = symbols("b, p_i, p_j, i, j, Nx, b_i, b_j")
sum_expr = Sum(Sum(Nx*i + j, (j, p_j, p_j+b_i-1)), (i, p_i, p_i+b_j-1))
pretty_print(sum_expr)
sum_result = sum_expr.doit()
sum_result_factorized = factor(sum_result)
pretty_print(sum_result)
bin_result = factor(1/(b_i*b_j) * sum_result)
pretty_print(bin_result)
Edited by Pierre Paleo