NumPy: datos tabulares de impresión bonita

Me gustaría imprimir NumPy datos de matriz tabular, para que se vea bien. Las consolas R y de base de datos parecen demostrar buenas habilidades para hacer esto. Sin embargo, la impresión integrada de matrices tabulares de NumPy parece basura:

import numpy as np dat_dtype = { 'names' : ('column_one', 'col_two', 'column_3'), 'formats' : ('i', 'd', '|S12')} dat = np.zeros(4, dat_dtype) dat['column_one'] = range(4) dat['col_two'] = 10**(-np.arange(4, dtype='d') - 4) dat['column_3'] = 'ABCD' dat['column_3'][2] = 'long string' print(dat) # [(0, 0.0001, 'ABCD') (1, 1.0000000000000001e-005, 'ABCD') # (2, 9.9999999999999995e-007, 'long string') # (3, 9.9999999999999995e-008, 'ABCD')] print(repr(dat)) # array([(0, 0.0001, 'ABCD'), (1, 1.0000000000000001e-005, 'ABCD'), # (2, 9.9999999999999995e-007, 'long string'), # (3, 9.9999999999999995e-008, 'ABCD')], # dtype=[('column_one', '<i4'), ('col_two', '<f8'), ('column_3', '|S12')]) 

Me gustaría algo que se parezca más a lo que escupe una base de datos, por ejemplo, estilo postgres:

  column_one | col_two | column_3 ------------+---------+------------- 0 | 0.0001 | ABCD 1 | 1e-005 | long string 2 | 1e-008 | ABCD 3 | 1e-007 | ABCD 

¿Hay alguna buena biblioteca de Python de terceros para formatear tablas ASCII de buen aspecto?

Estoy usando Python 2.5, NumPy 1.3.0.

Parece que estoy teniendo una buena salida con prettytable :

 from prettytable import PrettyTable x = PrettyTable(dat.dtype.names) for row in dat: x.add_row(row) # Change some column alignments; default was 'c' x.align['column_one'] = 'r' x.align['col_two'] = 'r' x.align['column_3'] = 'l' 

Y la salida no es mala. Incluso hay un cambio de border , entre algunas otras opciones:

 >>> print(x) +------------+---------+-------------+ | column_one | col_two | column_3 | +------------+---------+-------------+ | 0 | 0.0001 | ABCD | | 1 | 1e-005 | ABCD | | 2 | 1e-006 | long string | | 3 | 1e-007 | ABCD | +------------+---------+-------------+ >>> print(x.get_string(border=False)) column_one col_two column_3 0 0.0001 ABCD 1 1e-005 ABCD 2 1e-006 long string 3 1e-007 ABCD 

Puede aprovechar la comprensión de matrices y utilizar cadenas de formato printf:

 for c1, c2, c3 in dat: print "%2f | %8e | %s" % (c1, c2, c3) 

https://en.wikipedia.org/wiki/Printf_format_string
Y puedes personalizarlo aún más si subes a la versión 2.7

El paquete tabulate funciona muy bien para matrices Numpy:

 import numpy as np from tabulate import tabulate m = np.array([[1, 2, 3], [4, 5, 6]]) headers = ["col 1", "col 2", "col 3"] # tabulate data table = tabulate(m, headers, tablefmt="fancy_grid") # output print(table) 

(El código anterior es Python 3; para Python 2 agregue from __future__ import print_function en la parte superior del script)

Salida:

 ╒═════════╤═════════╤═════════╕ │ col 1 │ col 2 │ col 3 │ ╞═════════╪═════════╪═════════╡ │ 1 │ 2 │ 3 │ ├─────────┼─────────┼─────────┤ │ 4 │ 5 │ 6 │ ╘═════════╧═════════╧═════════╛ 

El paquete se instala a través de pip :

 $ pip install tabulate # (use pip3 for Python 3 on some systems) 

Es posible que desee revisar Pandas, que tiene muchas características interesantes para tratar con datos tabulares y que parece mejorar las cosas cuando imprime (está diseñado para ser un reemplazo de Python para R):

http://pandas.pydata.org/