Раскрашивать записи в матричном / двумерном массиве? - PullRequest
1 голос
/ 07 июня 2019

Я изучаю python3, и я хотел бы напечатать матрицу / 2d-массив с цветовой кодировкой (CLI).Допустим, я бы хотел назначить каждому из этих целых чисел определенный цвет фона, создавая стиль мозаики.

Я выяснил, как заполнить матрицу заданного размера случайными целыми числами, ноЯ не могу обдумать, как продолжить, чтобы добиться раскраски фона для каждой отдельной записи в матрице, в зависимости от ее значения.Вот как далеко я зашёл:

from random import randint
import numpy as np

def generate():
    n = 10
    m = 0
    map = np.random.randint(4 + 1, size=(n, n))
    print(map)

    for element in np.nditer(map):
        # iterating over each column is probably not the way to go...


generate()

Есть ли способ сделать это?Я думал об итерации по каждому столбцу матрицы и проверял несколькими из них, соответствуют ли условия входу 0,1,2,3 или 4, и, основываясь на условии, добавляем это значение с определенным цветом фона к новой матрице,но я предполагаю, что есть гораздо более элегантный способ сделать это ...

1 Ответ

1 голос
/ 07 июня 2019

Следующее будет print цветной вывод на консоль ...

>>> map = np.random.randint(4 + 1, size=(10, 10))
>>> def get_color_coded_str(i):
...    return "\033[3{}m{}\033[0m".format(i+1, i)
... 
>>> map_modified = np.vectorize(get_color_coded_str)(map)
>>> print("\n".join([" ".join(["{}"]*10)]*10).format(*[x for y in map_modified.tolist() for x in y]))
>>> 

enter image description here

Чтобы добавить цвет фона, используйте следующее fn

>>> def get_color_coded_str(i):
...    return "\033[4{}m{}\033[0m".format(i+1, i)

enter image description here

from random import randint
import numpy as np

def get_color_coded_str(i):
    return "\033[3{}m{}\033[0m".format(i+1, i)

def get_color_coded_background(i):
    return "\033[4{}m {} \033[0m".format(i+1, i)

def print_a_ndarray(map, row_sep=" "):
    n, m = map.shape
    fmt_str = "\n".join([row_sep.join(["{}"]*m)]*n)
    print(fmt_str.format(*map.ravel()))

n = 10
m = 20
map = np.random.randint(4 + 1, size=(n, m))
map_modified = np.vectorize(get_color_coded_str)(map)
print_a_ndarray(map_modified)
back_map_modified = np.vectorize(get_color_coded_background)(map)
print("-------------------------------------------------------")
print_a_ndarray(back_map_modified, row_sep="")

PS: функция печати изменена в соответствии с предложением @ hpaulj

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