18
18
is_float , is_integer , is_complex ,
19
19
is_float_dtype ,
20
20
is_complex_dtype , is_integer_dtype ,
21
+ is_unsigned_integer_dtype ,
21
22
is_bool_dtype , is_object_dtype ,
22
23
is_datetime64_dtype , is_timedelta64_dtype ,
23
24
is_datetime_or_timedelta_dtype , _get_dtype ,
@@ -67,21 +68,7 @@ def f(values, axis=None, skipna=True, **kwds):
67
68
if k not in kwds :
68
69
kwds [k ] = v
69
70
try :
70
- if self .zero_value is not None and values .size == 0 :
71
- if values .ndim == 1 :
72
-
73
- # wrap the 0's if needed
74
- if is_timedelta64_dtype (values ):
75
- return lib .Timedelta (0 )
76
- return 0
77
- else :
78
- result_shape = (values .shape [:axis ] +
79
- values .shape [axis + 1 :])
80
- result = np .empty (result_shape )
81
- result .fill (0 )
82
- return result
83
-
84
- if _USE_BOTTLENECK and skipna and _bn_ok_dtype (values .dtype ,
71
+ if values .size != 0 and _USE_BOTTLENECK and skipna and _bn_ok_dtype (values .dtype ,
85
72
bn_name ):
86
73
result = bn_func (values , axis = axis , ** kwds )
87
74
@@ -187,7 +174,10 @@ def _get_values(values, skipna, fill_value=None, fill_value_typ=None,
187
174
# return a platform independent precision dtype
188
175
dtype_max = dtype
189
176
if is_integer_dtype (dtype ) or is_bool_dtype (dtype ):
190
- dtype_max = np .int64
177
+ if is_unsigned_integer_dtype (dtype ):
178
+ dtype_max = np .uint64
179
+ else :
180
+ dtype_max = np .int64
191
181
elif is_float_dtype (dtype ):
192
182
dtype_max = np .float64
193
183
@@ -241,14 +231,14 @@ def nanall(values, axis=None, skipna=True):
241
231
242
232
243
233
@disallow ('M8' )
244
- @bottleneck_switch (zero_value = 0 )
234
+ @bottleneck_switch ()
245
235
def nansum (values , axis = None , skipna = True ):
246
236
values , mask , dtype , dtype_max = _get_values (values , skipna , 0 )
247
237
dtype_sum = dtype_max
248
238
if is_float_dtype (dtype ):
249
239
dtype_sum = dtype
250
240
the_sum = values .sum (axis , dtype = dtype_sum )
251
- the_sum = _maybe_null_out (the_sum , axis , mask )
241
+ the_sum = _maybe_null_out (the_sum , axis , mask , False )
252
242
253
243
return _wrap_results (the_sum , dtype )
254
244
@@ -414,7 +404,7 @@ def nanmin(values, axis=None, skipna=True):
414
404
result = values .min (axis )
415
405
416
406
result = _wrap_results (result , dtype )
417
- return _maybe_null_out (result , axis , mask )
407
+ return _maybe_null_out (result , axis , mask , True )
418
408
419
409
420
410
@bottleneck_switch ()
@@ -445,7 +435,7 @@ def nanmax(values, axis=None, skipna=True):
445
435
result = values .max (axis )
446
436
447
437
result = _wrap_results (result , dtype )
448
- return _maybe_null_out (result , axis , mask )
438
+ return _maybe_null_out (result , axis , mask , True )
449
439
450
440
451
441
def nanargmax (values , axis = None , skipna = True ):
@@ -554,7 +544,7 @@ def nanprod(values, axis=None, skipna=True):
554
544
values = values .copy ()
555
545
values [mask ] = 1
556
546
result = values .prod (axis )
557
- return _maybe_null_out (result , axis , mask )
547
+ return _maybe_null_out (result , axis , mask , False )
558
548
559
549
560
550
def _maybe_arg_null_out (result , axis , mask , skipna ):
@@ -588,9 +578,11 @@ def _get_counts(mask, axis, dtype=float):
588
578
return np .array (count , dtype = dtype )
589
579
590
580
591
- def _maybe_null_out (result , axis , mask ):
581
+ def _maybe_null_out (result , axis , mask , null_on_empty ):
592
582
if axis is not None and getattr (result , 'ndim' , False ):
593
583
null_mask = (mask .shape [axis ] - mask .sum (axis )) == 0
584
+ if not null_on_empty :
585
+ null_mask = null_mask & (mask .shape [axis ] > 0 )
594
586
if np .any (null_mask ):
595
587
if np .iscomplexobj (result ):
596
588
result = result .astype ('c16' )
@@ -599,9 +591,8 @@ def _maybe_null_out(result, axis, mask):
599
591
result [null_mask ] = np .nan
600
592
else :
601
593
null_mask = mask .size - mask .sum ()
602
- if null_mask == 0 :
603
- result = np .nan
604
-
594
+ if null_mask == 0 and (mask .size > 0 or null_on_empty ):
595
+ return np .nan
605
596
return result
606
597
607
598
0 commit comments