Source code for rsatoolbox.rdm.pairs

"""Functions to select pairs
"""
# pylint: disable=redefined-builtin
from __future__ import annotations
from typing import TYPE_CHECKING
from pandas import DataFrame
import numpy
from scipy.stats import rankdata
if TYPE_CHECKING:
    from rsatoolbox.rdm.rdms import RDMs


[docs]def pairs_by_percentile(rdms: RDMs, min: float = 0, max: float = 100, **kwargs) -> DataFrame: """Select pairs within a percentile range. Filter pairs first by providing the `with_pattern` argument. Args: rdms (RDMs): RDMs object min (float, optional): Lower percentile bound. Defaults to 0. max (float, optional): Upper percentile bound. Defaults to 100. kwargs: Pattern Descriptor value to match. Returns: DataFrame: Wide form DataFrame where each row represents a pair. """ (desc, val) = list(kwargs.items())[0] row_mask = rdms.pattern_descriptors[desc] == val mats = rdms.get_matrices() row = mats[0, row_mask, :].squeeze() pair_dissims = row[~row_mask] percs = rankdata(pair_dissims, 'average') / pair_dissims.size * 100 matches = numpy.logical_and(percs >= min, percs <= max) matches_mask = numpy.full_like(row, False, dtype=bool) matches_mask[~row_mask] = matches columns = dict() columns[desc] = rdms.pattern_descriptors[desc][matches_mask] columns['dissim'] = row[matches_mask] return DataFrame(columns)