Eu usaria o LaTeX para gerar as tabelas, uma vez que elas parecem elegantes e você pode gerar uma imagem ou colocá-las diretamente em seu documento. Eu usei o seguinte código para conseguir isso:
#!/usr/bin/env
import numpy as np
import os
x = np.array([[1,2],[3,4]])
def generateLatexTable(x):
start = [r'\documentclass[preview]{standalone}', r'\begin{document}', r'\begin{tabular}{%s}' % ('{1}{0}{1}'.format('|'.join(['r'] * x.shape[1]), '|')), r'\hline']
tab = [' & '.join(['%d' % val for val in row]) + r' \\ \hline' for row in x]
end = [r'\end{tabular}', r'\end{document}']
text = '\n'.join(start + tab + end)
return text
with open('table.tex', 'w') as f:
f.write(generateLatexTable(x))
os.system("pdflatex table.tex")
Aqui, previewé usada a classe de documento que retorna uma imagem redimensionada para o conteúdo do documento, ou seja, apenas a tabela. Somente um tabularambiente é usado para apresentar os dados. Existem barras horizontais e verticais entre as células, mas é muito fácil mudar isso. Na variável, tabos dados são processados para cada linha e convertidos em uma sequência. Observe que você precisa especificar o formato de saída nesta posição. Eu configurei para%d que tudo seja convertido em números inteiros.
Se você deseja usar a tabela diretamente em uma fonte de látex, é necessário remover documentclasse \begin{document}também \end{document}as variáveis de starte end. Finalmente, tudo é reunido em uma fonte de látex que é então armazenada no disco como table.tex. Se você deseja apenas a imagem no final, o arquivo resultante é compilado paratable.pdf .
Aqui está a aparência da saída. Mas como eu disse, é muito fácil mudar a aparência, pois é o LaTeX :)

Aqui está outro exemplo com uma matriz grande (14 x 14), preenchida com números aleatórios que variam de 0 a 100:

tableseria um bom lugar para começar. Não usei o suficiente para dar uma boa resposta.