Я хочу сравнить два массива с одинаковыми формами. Для простоты рассмотрим следующие матрицы:
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
Однако это не работает, так как префикс цвета находится внутри экранированной строки.