Module pairwiseprediction.combination

Expand source code
import numpy as np


def pairwise_diff(A, B, pct=False):
    """
    >>> from numpy.random import default_rng
    >>> rnd = default_rng(0)
    >>> X = rnd.random(size=(3, 2))
    >>> X
    array([[0.63696169, 0.26978671],
           [0.04097352, 0.01652764],
           [0.81327024, 0.91275558]])
    >>> pairwise_diff(X[:1,:], X)
    array([[ 0.        ,  0.        ],
           [ 0.59598816,  0.25325908],
           [-0.17630855, -0.64296886]])
    """
    B_last_col = pairwise_hstack(A, B)[:, -1:] if pct else None
    A = A[:, np.newaxis, :]
    B = B[np.newaxis, :, :]
    D = A - B
    D = D.reshape(-1, D.shape[2])
    if pct:
        return np.hstack((D[:, :-1], D[:, -1:] / B_last_col))
    else:
        return D


def pairwise_hstack(A, B, handle_last_as_y=False):
    """
    >>> from numpy.random import default_rng
    >>> rnd = default_rng(0)
    >>> X = rnd.random(size=(3, 2))
    >>> X
    array([[0.63696169, 0.26978671],
           [0.04097352, 0.01652764],
           [0.81327024, 0.91275558]])
    >>> pairwise_hstack(X, X)
    array([[0.63696169, 0.26978671, 0.63696169, 0.26978671],
           [0.63696169, 0.26978671, 0.04097352, 0.01652764],
           [0.63696169, 0.26978671, 0.81327024, 0.91275558],
           [0.04097352, 0.01652764, 0.63696169, 0.26978671],
           [0.04097352, 0.01652764, 0.04097352, 0.01652764],
           [0.04097352, 0.01652764, 0.81327024, 0.91275558],
           [0.81327024, 0.91275558, 0.63696169, 0.26978671],
           [0.81327024, 0.91275558, 0.04097352, 0.01652764],
           [0.81327024, 0.91275558, 0.81327024, 0.91275558]])
    """
    tA = np.tile(A[:, np.newaxis, :], [B.shape[0], 1]).reshape(-1, A.shape[1])
    tB = np.tile(B[:, :], [A.shape[0], 1])
    if handle_last_as_y is True:
        D = tA[:, -1:] - tB[:, -1:]
        return np.hstack((tA[:, :-1], tB[:, :-1], D))
    elif handle_last_as_y == "%":
        D = tA[:, -1:] - tB[:, -1:]
        return np.hstack((tA[:, :-1], tB[:, :-1], D / tB[:, -1:]))
    else:
        return np.hstack((tA, tB))


def pair_rows(M, reflexive):
    """
    >>> from numpy.random import default_rng
    >>> X = np.array([[0.1, 0.26978671], [0.2, 0.01652764], [0.3, 0.91275558]])
    >>> X
    array([[0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.3       , 0.91275558]])
    >>> pair_rows(X, False)
    array([[0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.1       , 0.26978671],
           [0.3       , 0.91275558],
           [0.2       , 0.01652764],
           [0.3       , 0.91275558]])
    >>> pair_rows(X, True)
    array([[0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.2       , 0.01652764],
           [0.1       , 0.26978671],
           [0.1       , 0.26978671],
           [0.3       , 0.91275558],
           [0.3       , 0.91275558],
           [0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.3       , 0.91275558],
           [0.3       , 0.91275558],
           [0.2       , 0.01652764]])
    """
    lst = []
    for i in range(M.shape[0]):
        a = M[i]
        for j in range(i + 1, M.shape[0]):
            b = M[j]
            lst.extend([a, b])
            if reflexive:
                lst.extend([b, a])
    return np.array(lst)

Functions

def pair_rows(M, reflexive)
>>> from numpy.random import default_rng
>>> X = np.array([[0.1, 0.26978671], [0.2, 0.01652764], [0.3, 0.91275558]])
>>> X
array([[0.1       , 0.26978671],
       [0.2       , 0.01652764],
       [0.3       , 0.91275558]])
>>> pair_rows(X, False)
array([[0.1       , 0.26978671],
       [0.2       , 0.01652764],
       [0.1       , 0.26978671],
       [0.3       , 0.91275558],
       [0.2       , 0.01652764],
       [0.3       , 0.91275558]])
>>> pair_rows(X, True)
array([[0.1       , 0.26978671],
       [0.2       , 0.01652764],
       [0.2       , 0.01652764],
       [0.1       , 0.26978671],
       [0.1       , 0.26978671],
       [0.3       , 0.91275558],
       [0.3       , 0.91275558],
       [0.1       , 0.26978671],
       [0.2       , 0.01652764],
       [0.3       , 0.91275558],
       [0.3       , 0.91275558],
       [0.2       , 0.01652764]])
Expand source code
def pair_rows(M, reflexive):
    """
    >>> from numpy.random import default_rng
    >>> X = np.array([[0.1, 0.26978671], [0.2, 0.01652764], [0.3, 0.91275558]])
    >>> X
    array([[0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.3       , 0.91275558]])
    >>> pair_rows(X, False)
    array([[0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.1       , 0.26978671],
           [0.3       , 0.91275558],
           [0.2       , 0.01652764],
           [0.3       , 0.91275558]])
    >>> pair_rows(X, True)
    array([[0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.2       , 0.01652764],
           [0.1       , 0.26978671],
           [0.1       , 0.26978671],
           [0.3       , 0.91275558],
           [0.3       , 0.91275558],
           [0.1       , 0.26978671],
           [0.2       , 0.01652764],
           [0.3       , 0.91275558],
           [0.3       , 0.91275558],
           [0.2       , 0.01652764]])
    """
    lst = []
    for i in range(M.shape[0]):
        a = M[i]
        for j in range(i + 1, M.shape[0]):
            b = M[j]
            lst.extend([a, b])
            if reflexive:
                lst.extend([b, a])
    return np.array(lst)
def pairwise_diff(A, B, pct=False)
>>> from numpy.random import default_rng
>>> rnd = default_rng(0)
>>> X = rnd.random(size=(3, 2))
>>> X
array([[0.63696169, 0.26978671],
       [0.04097352, 0.01652764],
       [0.81327024, 0.91275558]])
>>> pairwise_diff(X[:1,:], X)
array([[ 0.        ,  0.        ],
       [ 0.59598816,  0.25325908],
       [-0.17630855, -0.64296886]])
Expand source code
def pairwise_diff(A, B, pct=False):
    """
    >>> from numpy.random import default_rng
    >>> rnd = default_rng(0)
    >>> X = rnd.random(size=(3, 2))
    >>> X
    array([[0.63696169, 0.26978671],
           [0.04097352, 0.01652764],
           [0.81327024, 0.91275558]])
    >>> pairwise_diff(X[:1,:], X)
    array([[ 0.        ,  0.        ],
           [ 0.59598816,  0.25325908],
           [-0.17630855, -0.64296886]])
    """
    B_last_col = pairwise_hstack(A, B)[:, -1:] if pct else None
    A = A[:, np.newaxis, :]
    B = B[np.newaxis, :, :]
    D = A - B
    D = D.reshape(-1, D.shape[2])
    if pct:
        return np.hstack((D[:, :-1], D[:, -1:] / B_last_col))
    else:
        return D
def pairwise_hstack(A, B, handle_last_as_y=False)
>>> from numpy.random import default_rng
>>> rnd = default_rng(0)
>>> X = rnd.random(size=(3, 2))
>>> X
array([[0.63696169, 0.26978671],
       [0.04097352, 0.01652764],
       [0.81327024, 0.91275558]])
>>> pairwise_hstack(X, X)
array([[0.63696169, 0.26978671, 0.63696169, 0.26978671],
       [0.63696169, 0.26978671, 0.04097352, 0.01652764],
       [0.63696169, 0.26978671, 0.81327024, 0.91275558],
       [0.04097352, 0.01652764, 0.63696169, 0.26978671],
       [0.04097352, 0.01652764, 0.04097352, 0.01652764],
       [0.04097352, 0.01652764, 0.81327024, 0.91275558],
       [0.81327024, 0.91275558, 0.63696169, 0.26978671],
       [0.81327024, 0.91275558, 0.04097352, 0.01652764],
       [0.81327024, 0.91275558, 0.81327024, 0.91275558]])
Expand source code
def pairwise_hstack(A, B, handle_last_as_y=False):
    """
    >>> from numpy.random import default_rng
    >>> rnd = default_rng(0)
    >>> X = rnd.random(size=(3, 2))
    >>> X
    array([[0.63696169, 0.26978671],
           [0.04097352, 0.01652764],
           [0.81327024, 0.91275558]])
    >>> pairwise_hstack(X, X)
    array([[0.63696169, 0.26978671, 0.63696169, 0.26978671],
           [0.63696169, 0.26978671, 0.04097352, 0.01652764],
           [0.63696169, 0.26978671, 0.81327024, 0.91275558],
           [0.04097352, 0.01652764, 0.63696169, 0.26978671],
           [0.04097352, 0.01652764, 0.04097352, 0.01652764],
           [0.04097352, 0.01652764, 0.81327024, 0.91275558],
           [0.81327024, 0.91275558, 0.63696169, 0.26978671],
           [0.81327024, 0.91275558, 0.04097352, 0.01652764],
           [0.81327024, 0.91275558, 0.81327024, 0.91275558]])
    """
    tA = np.tile(A[:, np.newaxis, :], [B.shape[0], 1]).reshape(-1, A.shape[1])
    tB = np.tile(B[:, :], [A.shape[0], 1])
    if handle_last_as_y is True:
        D = tA[:, -1:] - tB[:, -1:]
        return np.hstack((tA[:, :-1], tB[:, :-1], D))
    elif handle_last_as_y == "%":
        D = tA[:, -1:] - tB[:, -1:]
        return np.hstack((tA[:, :-1], tB[:, :-1], D / tB[:, -1:]))
    else:
        return np.hstack((tA, tB))