Code Duplication    Length = 24-28 lines in 2 locations

metpy/calc/tools.py 2 locations

@@ 390-417 (lines=28) @@
387
    for var in variables:
388
        var = var[below] + ((log_x_array - log_xp[below]) /
389
                            (log_xp[above] - log_xp[below])) * (var[above] -
390
                                                                var[below])
391
392
        # set to nan if extrap=set_nan
393
        if extrap == 'set_nan':
394
            var[minv == xp.shape[axis]] = np.nan
395
            var[minv == 0] = np.nan
396
397
        # Output to list
398
        ret.append(var)
399
    if len(ret) == 1:
400
        return ret[0]
401
    else:
402
        return ret
403
404
405
def broadcast_indices(x, minv, ndim, axis):
406
    """Calculate index values to properly broadcast index array within data array.
407
408
    See usage in log_interp.
409
    """
410
    ret = []
411
    for dim in range(ndim):
412
        if dim == axis:
413
            ret.append(minv)
414
        else:
415
            broadcast_slice = [np.newaxis] * ndim
416
            broadcast_slice[dim] = slice(None)
417
            dim_inds = np.arange(x.shape[dim])
418
            ret.append(dim_inds[broadcast_slice])
419
    return ret
420
@@ 364-387 (lines=24) @@
361
362
    # Calculate value above interpolated value
363
    minv = np.apply_along_axis(np.searchsorted, axis, xp[sorter], x[sort_x])
364
    minv2 = np.copy(minv)
365
366
    # If extrap is none and data is out of bounds, raise value error
367
    if ((np.max(minv) == xp.shape[axis]) or (np.min(minv) == 0)) and extrap == 'none':
368
        raise ValueError('Interpolation point out of data bounds encountered')
369
370
    # Warn if interpolated values are outside data bounds, will make these the values
371
    # at end of data range.
372
    if np.max(minv) == xp.shape[axis]:
373
        warnings.warn('Interpolation point out of data bounds encountered')
374
        minv2[minv == xp.shape[axis]] = xp.shape[axis] - 1
375
    if np.max(minv) == 0:
376
        warnings.warn('Interpolation point out of data bounds encountered')
377
        minv2[minv == 0] = 1
378
379
    # Get indicies for broadcasting arrays
380
    above = broadcast_indices(xp, minv2, ndim, axis)
381
    below = broadcast_indices(xp, minv2 - 1, ndim, axis)
382
383
    # Create empty output list
384
    ret = []
385
386
    # Calculate interpolation for each variable
387
    for var in variables:
388
        var = var[below] + ((log_x_array - log_xp[below]) /
389
                            (log_xp[above] - log_xp[below])) * (var[above] -
390
                                                                var[below])