@@ -577,43 +577,69 @@ def interpolate_1d_fill(
577
577
578
578
579
579
def interpolate_2d (
580
- values , method = "pad" , axis = 0 , limit = None , fill_value = None , dtype = None
580
+ values ,
581
+ method = "pad" ,
582
+ axis = 0 ,
583
+ limit = None ,
584
+ fill_value = None ,
585
+ limit_area = None ,
586
+ dtype = None ,
581
587
):
582
588
"""
583
589
Perform an actual interpolation of values, values will be make 2-d if
584
590
needed fills inplace, returns the result.
585
591
"""
586
592
orig_values = values
587
593
588
- transf = (lambda x : x ) if axis == 0 else (lambda x : x .T )
589
-
590
- # reshape a 1 dim if needed
591
- ndim = values .ndim
592
- if values .ndim == 1 :
593
- if axis != 0 : # pragma: no cover
594
- raise AssertionError ("cannot interpolate on a ndim == 1 with axis != 0" )
595
- values = values .reshape (tuple ((1 ,) + values .shape ))
594
+ # We have to distinguish two cases:
595
+ # 1. When kwarg `limit_area` is used: It is not
596
+ # supported by `pad_2d` and `backfill_2d`. Using this kwarg only
597
+ # works by applying the fill along a certain axis.
598
+ # 2. All other cases.
599
+ if limit_area is not None :
596
600
597
- if fill_value is None :
598
- mask = None
599
- else : # todo create faster fill func without masking
600
- mask = mask_missing (transf (values ), fill_value )
601
+ def func (x ):
602
+ return interpolate_1d_fill (
603
+ x ,
604
+ method = method ,
605
+ limit = limit ,
606
+ limit_area = limit_area ,
607
+ fill_value = fill_value ,
608
+ dtype = dtype ,
609
+ )
601
610
602
- method = clean_fill_method (method )
603
- if method == "pad" :
604
- values = transf (pad_2d (transf (values ), limit = limit , mask = mask , dtype = dtype ))
611
+ # Beware that this also changes the input array `values`!
612
+ values = np .apply_along_axis (func , axis , values )
605
613
else :
606
- values = transf (
607
- backfill_2d (transf (values ), limit = limit , mask = mask , dtype = dtype )
608
- )
614
+ transf = (lambda x : x ) if axis == 0 else (lambda x : x .T )
615
+
616
+ # reshape a 1 dim if needed
617
+ ndim = values .ndim
618
+ if values .ndim == 1 :
619
+ if axis != 0 : # pragma: no cover
620
+ raise AssertionError ("cannot interpolate on a ndim == 1 with axis != 0" )
621
+ values = values .reshape (tuple ((1 ,) + values .shape ))
622
+
623
+ if fill_value is None :
624
+ mask = None
625
+ else : # todo create faster fill func without masking
626
+ mask = mask_missing (transf (values ), fill_value )
627
+
628
+ method = clean_fill_method (method )
629
+ if method == "pad" :
630
+ values = transf (pad_2d (transf (values ), limit = limit , mask = mask , dtype = dtype ))
631
+ else :
632
+ values = transf (
633
+ backfill_2d (transf (values ), limit = limit , mask = mask , dtype = dtype )
634
+ )
609
635
610
- # reshape back
611
- if ndim == 1 :
612
- values = values [0 ]
636
+ # reshape back
637
+ if ndim == 1 :
638
+ values = values [0 ]
613
639
614
- if orig_values .dtype .kind == "M" :
615
- # convert float back to datetime64
616
- values = values .astype (orig_values .dtype )
640
+ if orig_values .dtype .kind == "M" :
641
+ # convert float back to datetime64
642
+ values = values .astype (orig_values .dtype )
617
643
618
644
return values
619
645
0 commit comments