Skip to content

Commit b5d2675

Browse files
committed
Optimize nanmean with engine="flox"
1 parent 24dc7fd commit b5d2675

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

flox/aggregate_flox.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,28 @@ def nansum_of_squares(group_idx, array, *, axis=-1, size=None, fill_value=None,
9999

100100

101101
def nanlen(group_idx, array, *args, **kwargs):
102-
return sum(group_idx, (~isnull(array)).astype(int), *args, **kwargs)
102+
if np.issubdtype(array.dtype, bool):
103+
array = ~array
104+
else:
105+
array = ~isnull(array)
106+
return sum(group_idx, array.view(np.int8), *args, **kwargs)
103107

104108

105109
def mean(group_idx, array, *, axis=-1, size=None, fill_value=None, dtype=None):
106110
if fill_value is None:
107111
fill_value = 0
108112
out = sum(group_idx, array, axis=axis, size=size, dtype=dtype, fill_value=fill_value)
109113
with np.errstate(invalid="ignore", divide="ignore"):
110-
out /= nanlen(group_idx, array, size=size, axis=axis, fill_value=0)
114+
out /= nanlen(group_idx, array, size=size, axis=axis, fill_value=0, dtype=np.intp)
111115
return out
112116

113117

114118
def nanmean(group_idx, array, *, axis=-1, size=None, fill_value=None, dtype=None):
115119
if fill_value is None:
116120
fill_value = 0
117-
out = nansum(group_idx, array, size=size, axis=axis, dtype=dtype, fill_value=fill_value)
121+
mask = isnull(array)
122+
masked = np.where(mask, 0, array)
123+
out = sum(group_idx, masked, size=size, axis=axis, dtype=dtype, fill_value=fill_value)
118124
with np.errstate(invalid="ignore", divide="ignore"):
119-
out /= nanlen(group_idx, array, size=size, axis=axis, fill_value=0)
125+
out /= nanlen(group_idx, mask, size=size, axis=axis, fill_value=0, dtype=np.intp)
120126
return out

0 commit comments

Comments
 (0)