красочный принт сравнения 2-х массивов - PullRequest
0 голосов
/ 23 октября 2019

Я хочу сравнить два массива с одинаковыми формами. Для простоты рассмотрим следующие матрицы:

foo = np.array([[1+1.001*1j,0.0000005],[0,-100.00049]])
target = np.array([[1+1j,0],[0,-1]])

На выходе должна быть матрица foo, где элементы имеют зеленый цвет, если элементы находятся близко к целевой матрице, и красный цвет, если они не близки. Было бы неплохо иметь возможность определить точность и подавление малых значений в выходных данных. Например, вывод для сравнения foo и target с точностью = 4 и активированным подавлением должен дать:

[ [ <green>1.+1.j</green>, <green>0.</green>],
  [ <green>0.</green>,  <red>-100.0005</red>] ]

Сравнение должно быть в состоянии распознавать близкие значения. Я знаю, что np.islcose() может проверить на близость. Однако я не знаю, как использовать эти результаты в цветной печати.

Я мог бы добиться вывода, можно добиться яркого вывода отдельных элементов следующим образом:

import numpy as np
from colorama import init, Fore, Back, Style
init(convert=True)

def printComp_single(el,el_target,precision=4,suppress=True):
    c = Fore.GREEN if np.isclose(el,el_target) else Fore.RED
    rep = np.array2string(np.array(el),precision=precision,suppress_small=suppress)
    return f'{c}{rep}'

Как я могу объединить эти два подхода? Я думал примерно так:

def printComp(mat,target,precision=4,suppress=True):
    orig_shape = mat.shape
    mat = mat.flatten()
    target = target.flatten()
    rep_str = []
    for el, el_target in zip(mat,target):
        rep_str.append(printComp_single(el,el_target,precision,suppress))

    result = np.array(rep_str).reshape(orig_shape)
    print(result)
    return result

Однако это не работает, так как префикс цвета находится внутри экранированной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...