def masked_arith_op(x, y, op):
    """
    If the given arithmetic operation fails, attempt it again on
    only the non-null elements of the input array(s).

    Parameters
    ----------
    x : np.ndarray
    y : np.ndarray, Series, Index
    op : binary operator
    """
    # For Series `x` is 1D so ravel() is a no-op; calling it anyway makes
    # the logic valid for both Series and DataFrame ops.
    xrav = x.ravel()
    assert isinstance(x, (np.ndarray, ABCSeries)), type(x)
    if isinstance(y, (np.ndarray, ABCSeries, ABCIndexClass)):
        dtype = find_common_type([x.dtype, y.dtype])
        result = np.empty(x.size, dtype=dtype)

        # PeriodIndex.ravel() returns int64 dtype, so we have
        # to work around that case.  See GH#19956
        yrav = y if is_period_dtype(y) else y.ravel()
        mask = notna(xrav) & notna(yrav)

        if yrav.shape != mask.shape:
            # FIXME: GH#5284, GH#5035, GH#19448
            # Without specifically raising here we get mismatched
            # errors in Py3 (TypeError) vs Py2 (ValueError)
            # Note: Only = an issue in DataFrame case
            raise ValueError('Cannot broadcast operands together.')

        if mask.any():
            with np.errstate(all='ignore'):
                result[mask] = op(xrav[mask],
                                  com.values_from_object(yrav[mask]))

    else:
        assert is_scalar(y), type(y)
        assert isinstance(x, np.ndarray), type(x)
        # mask is only meaningful for x
        result = np.empty(x.size, dtype=x.dtype)
        mask = notna(xrav)

        # 1 ** np.nan is 1. So we have to unmask those.
        if op == pow:
            mask = np.where(x == 1, False, mask)
        elif op == rpow:
            mask = np.where(y == 1, False, mask)

        if mask.any():
            with np.errstate(all='ignore'):
                result[mask] = op(xrav[mask], y)

    result, changed = maybe_upcast_putmask(result, ~mask, np.nan)
    result = result.reshape(x.shape)  # 2D compat
    return result
def masked_arith_op ( x , y , op ) : xrav = x . ravel ( ) assert isinstance ( x , ( np . ndarray , ABCSeries ) ) , type ( x ) if isinstance ( y , ( np . ndarray , ABCSeries , ABCIndexClass ) ) : dtype = find_common_type ( [ x . dtype , y . dtype ] ) result = np . empty ( x . size , dtype = dtype ) yrav = y if is_period_dtype ( y ) else y . ravel ( ) mask = notna ( xrav ) & notna ( yrav ) if yrav . shape != mask . shape : raise ValueError ( 'Cannot broadcast operands together.' ) if mask . any ( ) : with np . errstate ( all = 'ignore' ) : result [ mask ] = op ( xrav [ mask ] , com . values_from_object ( yrav [ mask ] ) ) else : assert is_scalar ( y ) , type ( y ) assert isinstance ( x , np . ndarray ) , type ( x ) result = np . empty ( x . size , dtype = x . dtype ) mask = notna ( xrav ) if op == pow : mask = np . where ( x == 1 , False , mask ) elif op == rpow : mask = np . where ( y == 1 , False , mask ) if mask . any ( ) : with np . errstate ( all = 'ignore' ) : result [ mask ] = op ( xrav [ mask ] , y ) result , changed = maybe_upcast_putmask ( result , ~ mask , np . nan ) result = result . reshape ( x . shape ) return result
If the given arithmetic operation fails, attempt it again on
    only the non-null elements of the input array(s).

    Parameters
    ----------
    x : np.ndarray
    y : np.ndarray, Series, Index
    op : binary operator