Find a boolean mask to minimize timing differences.
(t_shorter, t_longer)
| 3949 | |
| 3950 | |
| 3951 | def _minimize_time_diff(t_shorter, t_longer): |
| 3952 | """Find a boolean mask to minimize timing differences.""" |
| 3953 | keep = np.ones((len(t_longer)), dtype=bool) |
| 3954 | # special case: length zero or one |
| 3955 | if len(t_shorter) < 2: # interp1d won't work |
| 3956 | keep.fill(False) |
| 3957 | if len(t_shorter) == 1: |
| 3958 | idx = np.argmin(np.abs(t_longer - t_shorter)) |
| 3959 | keep[idx] = True |
| 3960 | return keep |
| 3961 | scores = np.ones(len(t_longer)) |
| 3962 | x1 = np.arange(len(t_shorter)) |
| 3963 | # The first set of keep masks to test |
| 3964 | kwargs = dict(copy=False, bounds_error=False, assume_sorted=True) |
| 3965 | shorter_interp = interp1d(x1, t_shorter, fill_value=t_shorter[-1], **kwargs) |
| 3966 | for ii in range(len(t_longer) - len(t_shorter)): |
| 3967 | scores.fill(np.inf) |
| 3968 | # set up the keep masks to test, eliminating any rows that are already |
| 3969 | # gone |
| 3970 | keep_mask = ~np.eye(len(t_longer), dtype=bool)[keep] |
| 3971 | keep_mask[:, ~keep] = False |
| 3972 | # Check every possible removal to see if it minimizes |
| 3973 | x2 = np.arange(len(t_longer) - ii - 1) |
| 3974 | t_keeps = np.array([t_longer[km] for km in keep_mask]) |
| 3975 | longer_interp = interp1d( |
| 3976 | x2, t_keeps, axis=1, fill_value=t_keeps[:, -1], **kwargs |
| 3977 | ) |
| 3978 | d1 = longer_interp(x1) - t_shorter |
| 3979 | d2 = shorter_interp(x2) - t_keeps |
| 3980 | scores[keep] = np.abs(d1, d1).sum(axis=1) + np.abs(d2, d2).sum(axis=1) |
| 3981 | keep[np.argmin(scores)] = False |
| 3982 | return keep |
| 3983 | |
| 3984 | |
| 3985 | @verbose |
no test coverage detected