@@ -1912,24 +1912,28 @@ def grid_count(self, bins, intern=False, center=False, filter=slice(None)):
1912
1912
),
1913
1913
centered = True ,
1914
1914
)
1915
- debug_active = logger .getEffectiveLevel () == logging .DEBUG
1916
1915
if center :
1917
1916
x , y = (self .longitude [filter ] - x0 ) % 360 + x0 , self .latitude [filter ]
1918
1917
grid [:] = histogram2d (x , y , (x_bins , y_bins ))[0 ]
1919
1918
grid .mask = grid .data == 0
1920
1919
else :
1921
1920
x_ref = ((self .longitude [filter ] - x0 ) % 360 + x0 - 180 ).reshape (- 1 , 1 )
1922
- nb = x_ref .shape [0 ]
1923
- for i_ , (x , y_ ) in enumerate (
1924
- zip (self [x_name ][filter ], self [y_name ][filter ])
1925
- ):
1926
- x_ = (x - x_ref [i_ ]) % 360 + x_ref [i_ ]
1927
- if debug_active and i_ % 10000 == 0 :
1928
- print (f"{ i_ } /{ nb } " , end = "\r " )
1929
- i , j = BasePath (create_vertice (x_ , y_ )).pixels_in (regular_grid )
1930
- grid_count_ (grid , i , j )
1931
- if debug_active :
1932
- print ()
1921
+ x_contour , y_contour = self [x_name ][filter ], self [y_name ][filter ]
1922
+ grid_count_pixel_in (
1923
+ grid ,
1924
+ x_contour ,
1925
+ y_contour ,
1926
+ x_ref ,
1927
+ regular_grid .x_bounds ,
1928
+ regular_grid .y_bounds ,
1929
+ regular_grid .xstep ,
1930
+ regular_grid .ystep ,
1931
+ regular_grid .N ,
1932
+ regular_grid .is_circular (),
1933
+ regular_grid .x_size ,
1934
+ regular_grid .x_c ,
1935
+ regular_grid .y_c ,
1936
+ )
1933
1937
grid .mask = grid == 0
1934
1938
return regular_grid
1935
1939
@@ -2083,6 +2087,59 @@ def grid_count_(grid, i, j):
2083
2087
grid [i_ , j_ ] += 1
2084
2088
2085
2089
2090
+ @njit (cache = True )
2091
+ def grid_count_pixel_in (
2092
+ grid ,
2093
+ x ,
2094
+ y ,
2095
+ x_ref ,
2096
+ x_bounds ,
2097
+ y_bounds ,
2098
+ xstep ,
2099
+ ystep ,
2100
+ N ,
2101
+ is_circular ,
2102
+ x_size ,
2103
+ x_c ,
2104
+ y_c ,
2105
+ ):
2106
+ """
2107
+ Count how many time a pixel is used.
2108
+
2109
+ :param array grid:
2110
+ :param array x: x for all contour
2111
+ :param array y: y for all contour
2112
+ :param array x_ref: x reference for wrapping
2113
+ :param array x_bounds: grid longitude
2114
+ :param array y_bounds: grid latitude
2115
+ :param float xstep: step between two longitude
2116
+ :param float ystep: step between two latitude
2117
+ :param int N: shift of index to enlarge window
2118
+ :param bool is_circular: To know if grid is wrappable
2119
+ :param int x_size: Number of longitude
2120
+ :param array x_c: longitude coordinate of grid
2121
+ :param array y_c: latitude coordinate of grid
2122
+ """
2123
+ nb = x_ref .shape [0 ]
2124
+ for i_ in range (nb ):
2125
+ x_ , y_ , x_ref_ = x [i_ ], y [i_ ], x_ref [i_ ]
2126
+ x_ = (x_ - x_ref_ ) % 360 + x_ref_
2127
+ v = create_vertice (x_ , y_ )
2128
+ (x_start , x_stop ), (y_start , y_stop ) = bbox_indice_regular (
2129
+ v ,
2130
+ x_bounds ,
2131
+ y_bounds ,
2132
+ xstep ,
2133
+ ystep ,
2134
+ N ,
2135
+ is_circular ,
2136
+ x_size ,
2137
+ )
2138
+
2139
+ i , j = get_pixel_in_regular (v , x_c , y_c , x_start , x_stop , y_start , y_stop )
2140
+ grid_count_ (grid , i , j )
2141
+
2142
+
2086
2143
@njit (cache = True )
2087
2144
def insidepoly (x_p , y_p , x_c , y_c ):
2088
2145
"""
0 commit comments