2012-03-14 11 views
13

Desidero stampare i dati di un array di tabelle NumPy, in modo che risultino gradevoli. Le console di database e R sembrano dimostrare buone capacità per farlo. Tuttavia, la stampa built-in di NumPy di ​​array tabulari sembra spazzatura:NumPy: Pretty tabular data

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')]) 

Vorrei qualcosa che assomiglia più a quello di un database sputa fuori, per esempio, 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 

Are Esistono buone librerie Python di terze parti per formattare tabelle ASCII dall'aspetto gradevole?

Sto usando Python 2.5, NumPy 1.3.0.

+0

Questa domanda [Python:? Pretty-stampa di tabelle ASCII] (http://stackoverflow.com/q/5909873/404469) può aiutare. – gary

risposta

19

Mi sembra di avere una buona uscita 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' 

E l'uscita non è male. C'è anche un interruttore border, tra le poche altre opzioni:

>>> 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

Volevo semplicemente aggiungere un commento che "prettytable" ora fa parte di PyPI a partire dal 7 aprile 2013: https://pypi.python.org/pypi/PrettyTable. In quanto tale, puoi semplicemente utilizzare 'pip' o' easy_install' per installarlo ora invece di scaricarlo tramite Google Code. BTW grazie per il suggerimento qui. +1. – rayryeng

5

Si potrebbe voler controllare Panda che ha un sacco di caratteristiche interessanti per trattare con i dati tabulari e sembra gettare le cose meglio quando si stampa (E 'stato progettato essere un sostituto pitone per R):

http://pandas.pydata.org/

0

Il pacchetto tabulate funziona bene per gli array 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) 

(Sopra il codice è Python 3; per Python 2 aggiungere from __future__ import print_function in alto dello script)

uscita:

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

Il pacchetto installa via pip:

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