2012-03-14 7 views
13

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

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 parece más a lo que es una base de datos escupe, por ejemplo, postgres-style:

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

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

Estoy usando Python 2.5, NumPy 1.3.0.

+0

Esta pregunta [Python:? De impresión legible tablas ASCII] (http://stackoverflow.com/q/5909873/404469) puede ayudar. – gary

Respuesta

19

Me parece estar teniendo 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 malo. Incluso hay un interruptor 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   
+0

Solo quería agregar un comentario que 'prettytable' ahora es parte de PyPI desde el 7 de abril de 2013: https://pypi.python.org/pypi/PrettyTable. Como tal, puedes simplemente usar 'pip' o' easy_install' para instalarlo ahora en lugar de descargarlo a través de Google Code. Por cierto, gracias por el consejo aquí. +1. – rayryeng

5

Es posible que desee echa un vistazo a las pandas que tiene una gran cantidad de características agradables para trabajar con datos tabulares y parece sentar las cosas mejor cuando se imprime (Está diseñado ser un reemplazo pitón para R):

http://pandas.pydata.org/

0

El paquete tabulate funciona muy bien para numpy matrices:

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) 

(Por encima de código es Python 3; para Python 2 añadir from __future__ import print_function en la parte superior de la escritura)

salida:

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

El paquete instala a través de pip:

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