2012-03-14 23 views
13

Chciałbym wydrukować dane tablicowe NumPy, aby wyglądały ładnie. R i konsole baz danych zdają się wykazywać dobre zdolności do robienia tego. Jednak NumPy jest wbudowany drukowanie tabelarycznych tablic wygląda śmieci:NumPy: Ładne wydruki tabelaryczne

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

chciałbym coś, co wygląda bardziej jak co baza wypluwa, na przykład, PostgreSQL-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 istnieją dobre biblioteki Pythona innych firm do formatowania ładnie wyglądających tabel ASCII?

Używam Pythona 2.5, NumPy 1.3.0.

+0

To pytanie [Python: ładna, drukowanie tabel ascii] (http://stackoverflow.com/q/5909873/404469) może pomóc. – gary

Odpowiedz

19

I wydaje się mieć dobre wyjście z 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' 

a wyjście nie jest zły. Jest nawet border przełącznik między kilka innych opcji:

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

Po prostu chciałem dodać komentarz, że 'prettytable' jest teraz częścią PyPI od 7 kwietnia 2013 r .: https://pypi.python.org/pypi/PrettyTable. W związku z tym możesz po prostu użyć 'pip' lub' easy_install', aby zainstalować teraz, zamiast pobierać go przez Google Code. Przy okazji dziękuję za poradę tutaj. +1. – rayryeng

5

Możesz chcieć sprawdzić Pandy, która ma wiele ciekawych funkcji do czynienia z danych tabelarycznych i wydaje się układać rzeczy lepiej podczas drukowania (Został on zaprojektowany jako zamiennik python dla R):

http://pandas.pydata.org/

0

Pakiet tabulate działa ładnie na NumPy tablic:

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) 

(Powyższy kod jest Python 3; dla Python 2 dodać from __future__ import print_function na szczycie skryptu)

wyjściowa:

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

Pakiet instaluje poprzez pip:

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