radiobee-aligner / radiobee /cmat2tset.py
freemt
Update before sent-align
4c04f50
"""Gen triple-set from a matrix."""
# pylint: disable=unused-import
from typing import List, Tuple, Union # noqa
import numpy as np
import pandas as pd
# fmt: off
def cmat2tset(
cmat1: Union[List[List[float]], np.ndarray, pd.DataFrame],
# thirdcol: bool = True
) -> np.ndarray:
# ) -> List[Union[Tuple[int, int], Tuple[int, int, float]]]:
# fmt: on
"""Gen triple-set from a matrix.
Args
cmat: 2d-array or list, correlation or other metric matrix
# thirdcol: bool, whether to output a third column (max value)
Returns
Obtain the max and argmax for each column, erase the row afterwards to eliminate one single row that would dominate
every column.
"""
# if isinstance(cmat, list):
cmat = np.array(cmat1)
if not np.prod(cmat.shape):
raise SystemError("data not 2d...")
_ = """
# y00 = range(cmat.shape[1]) # cmat.shape[0] long time wasting bug
yargmax = cmat.argmax(axis=0)
if thirdcol:
ymax = cmat.max(axis=0)
res = [*zip(y00, yargmax, ymax)] # type: ignore
# to unzip
# a, b, c = zip(*res)
return res
_ = [*zip(y00, yargmax)] # type: ignore
return _
"""
low_ = cmat.min() - 1
argmax_max = []
src_len, tgt_len = cmat.shape # ylim, xlim
for _ in range(min(src_len, tgt_len)):
argmax = int(cmat.argmax())
row, col = divmod(argmax, tgt_len)
argmax_max.append([col, row, cmat.max()]) # x-axis, y-axis
# erase row-th row and col-th col of cmat
cmat[row, :] = low_
cmat[:, col] = low_
return np.array(argmax_max)