2011-02-19 12 views
7

क्या उचित लेबल के साथ 2 डी सरणी प्राप्त करने के लिए print numpy.array की सही रिक्ति सुविधा का उपयोग करने का कोई शानदार तरीका है, जो ठीक से संरेखित है? उदाहरण के लिए, 4 पंक्तियों और 5 कॉलम के साथ एक सरणी दी गई है, मैं इस तरह दिखने वाले कुछ आउटपुट उत्पन्न करने के लिए पंक्ति और हेडर कॉलम से संबंधित सरणी और उचित रूप से आकार की सूचियां कैसे प्रदान कर सकता हूं?मैं (टेक्स्ट) पंक्ति और कॉलम लेबल के साथ एक गठबंधन numpy सरणी कैसे मुद्रित करूं?

 A B C D E 
Z [[ 85 86 87 88 89] 
Y [ 90 191 192 93 94] 
X [ 95 96 97 98 99] 
W [100 101 102 103 104]] 

अगर मैं भोलेपन से प्रयास करें:

import numpy 
x = numpy.array([[85, 86, 87, 88, 89], \ 
       [90, 191, 192, 93, 94], \ 
       [95, 96, 97, 98, 99], \ 
       [100,101,102,103,104]]) 

row_labels = ['Z', 'Y', 'X', 'W'] 


print "  A B C D E" 
for row, row_index in enumerate(x): 
    print row_labels[row_index], row 

मैं:

 A B C D E 
Z [85 86 87 88 89] 
Y [90 191 192 93 94] 
X [95 96 97 98 99] 
W [100 101 102 103 104] 

वहाँ किसी भी तरह से मैं चीजों को समझदारी से लाइन अप करने के लिए मिल सकता है? अगर मेरी समस्या को हल करने का एक बेहतर तरीका है तो मैं निश्चित रूप से किसी अन्य पुस्तकालय का उपयोग करने के लिए खुला हूं।

उत्तर

6

सभी मैट्रिक्स संख्या मान लिया जाये कि सबसे 3 अंक पर, तो आप इस के साथ अंतिम भाग की जगह सकता है:

print "  A B C D E" 
for row_label, row in zip(row_labels, x): 
    print '%s [%s]' % (row_label, ' '.join('%03s' % i for i in row)) 

कौन सा आउटपुट:

 A B C D E 
Z [ 85 86 87 88 89] 
Y [ 90 191 192 93 94] 
X [ 95 96 97 98 99] 
W [100 101 102 103 104] 

लंबाई 3 की एक श्रंखला के साथ '%03s' परिणाम का प्रारूपण बाएं पैडिंग के साथ (रिक्त स्थान का उपयोग)। लंबाई 4 के लिए '%04s' का उपयोग करें और इसी तरह। पाइथन दस्तावेज में पूर्ण format string syntax समझाया गया है।

5

यहां सरणी मुद्रण कार्यों का लाभ उठाने का एक तरीका है। मैं शायद इसका उपयोग नहीं करता, लेकिन यह आपकी आवश्यकताओं को पूरा करने के करीब आता है!

a = np.random.rand(5,4) 
x = np.array('col1 col2 col3 col4'.split()) 
y = np.array('row1 row2 row3 row4 row5'.split()) 
b = numpy.zeros((6,5),object) 
b[1:,1:]=a 
b[0,1:]=x 
b[1:,0]=y 
b[0,0]='' 
printer = np.vectorize(lambda x:'{0:5}'.format(x,)) 
print printer(b).astype(object) 

[[  col1 col2 col3 col4] 
[row1 0.95 0.71 0.03 0.56] 
[row2 0.56 0.46 0.35 0.90] 
[row3 0.24 0.08 0.29 0.40] 
[row4 0.90 0.44 0.69 0.48] 
[row5 0.27 0.10 0.62 0.04]] 
5

आप IPython notebook + Pandas कि के लिए उपयोग कर सकते हैं। IPython नोटबुक में अपने मूल उदाहरण टाइप करें:

import pandas 
df = pandas.DataFrame(x, columns=column_labels, index=row_labels) 

और फिर यह देखने:

import numpy 
x = numpy.array([[85, 86, 87, 88, 89], 
       [90, 191, 192, 93, 94], 
       [95, 96, 97, 98, 99], 
       [100,101,102,103,104]]) 

row_labels = ['Z', 'Y', 'X', 'W'] 
column_labels = ['A', 'B', 'C', 'D', 'E'] 

फिर एक DataFrame बनाने

enter image description here

0

इस कोड को अनिवार्य रूप से scoffey के ऊपर के एक कार्यान्वयन है , लेकिन इसमें तीन वर्ण सीमा नहीं है और यह थोड़ा अधिक शक्तिशाली है। यहाँ मेरी कोड है:

def format__1(digits,num): 
     if digits<len(str(num)): 
      raise Exception("digits<len(str(num))") 
     return ' '*(digits-len(str(num))) + str(num) 
    def printmat(arr,row_labels=[], col_labels=[]): #print a 2d numpy array (maybe) or nested list 
     max_chars = max([len(str(item)) for item in flattenList(arr)+col_labels]) #the maximum number of chars required to display any item in list 
     if row_labels==[] and col_labels==[]: 
      for row in arr: 
       print '[%s]' %(' '.join(format__1(max_chars,i) for i in row)) 
     elif row_labels!=[] and col_labels!=[]: 
      rw = max([len(str(item)) for item in row_labels]) #max char width of row__labels 
      print '%s %s' % (' '*(rw+1), ' '.join(format__1(max_chars,i) for i in col_labels)) 
      for row_label, row in zip(row_labels, arr): 
       print '%s [%s]' % (format__1(rw,row_label), ' '.join(format__1(max_chars,i) for i in row)) 
     else: 
      raise Exception("This case is not implemented...either both row_labels and col_labels must be given or neither.") 

import numpy 
    x = numpy.array([[85, 86, 87, 88, 89], 
        [90, 191, 192, 93, 94], 
        [95, 96, 97, 98, 99], 
        [100,101,102,103,104]]) 
    row_labels = ['Z', 'Y', 'X', 'W'] 
    column_labels = ['A', 'B', 'C', 'D', 'E'] 
    printmat(x,row_labels=row_labels, col_labels=column_labels) 

चल देता है

  A B C D E 
    Z [ 85 86 87 88 89] 
    Y [ 90 191 192 93 94] 
    X [ 95 96 97 98 99] 
    W [100 101 102 103 104] 

यह भी उत्पादन करता है, तो 'एक्स' थे सिर्फ एक नेस्टेड अजगर सूची के बजाय एक numpy सरणी होगा।

संबंधित मुद्दे