@@ -662,3 +662,53 @@ def test_datetime_interp_noerror():
662
662
coords = {"time" : pd .date_range ("01-01-2001" , periods = 50 , freq = "H" )},
663
663
)
664
664
a .interp (x = xi , time = xi .time ) # should not raise an error
665
+
666
+
667
+ def interp_1d (data , dim , vals ):
668
+ selectors = {dim : vals }
669
+
670
+ old_coord = data [dim ]
671
+
672
+ lower = data .sel (** selectors , method = 'ffill' ).drop (dim )
673
+ upper = data .sel (** selectors , method = 'bfill' ).drop (dim )
674
+ lower_x = data [dim ].sel (** selectors , method = 'ffill' ).drop (dim )
675
+ upper_x = data [dim ].sel (** selectors , method = 'bfill' ).drop (dim )
676
+
677
+ new_x = lower [dim ]
678
+ weight = np .abs (new_x - lower_x )/ np .abs (upper_x - lower_x )
679
+ ans = lower * (1 - weight ) + upper * weight
680
+ return ans
681
+
682
+
683
+ @pytest .mark .parametrize ('dim' ,[
684
+ 'x' , 'y'
685
+ ])
686
+ def test_new_interp (dim ):
687
+
688
+ data = xr .DataArray (np .arange (10 ), dims = [dim ]).assign_coords ({dim : np .arange (10 )})
689
+ new_x = np .arange (9 ) + .5
690
+ ans = interp_1d (data , dim , new_x )
691
+ np .testing .assert_allclose (new_x , ans .values )
692
+
693
+
694
+ def test_interp_1d_nd_targ ():
695
+
696
+ data = xr .DataArray (np .arange (10 ), dims = ['x' ], coords = {'x' : np .arange (10 )})
697
+ new_x_2d = xr .DataArray (np .tile (np .r_ [:10 ], (3 , 1 )), dims = ['y' , 'x' ])
698
+ ans = interp_1d (data , 'x' , new_x_2d )
699
+ np .testing .assert_allclose (new_x_2d , ans .values )
700
+
701
+
702
+ def test_sel_nd ():
703
+ npdata = np .tile (np .arange (10 ), (5 , 1 ))
704
+ data = xr .DataArray (npdata , dims = ['y' , 'x' ],
705
+ coords = {'x' : np .r_ [:10 ], 'y' : np .r_ [:5 ]})
706
+ idx = xr .DataArray (npdata , dims = ['z' , 'x' ])
707
+
708
+ ans = data .sel (x = idx , method = 'bfill' )
709
+ assert set (ans .dims ) == {'z' , 'y' , 'x' }
710
+ print (ans )
711
+
712
+
713
+
714
+
0 commit comments