Biostar Beta. Not for public use.
Upper Triangular Matrix From Array --Python
0
Entering edit mode
18 months ago
st.ph.n ♦ 2.5k
Philadelphia, PA

I have a list of 49 values. I've created an array of this list, to print in a matrix, with sequence identifiers from a fasta file. Here is the code:

print my_plist
print len(my_seq_labels)

row_col = len(my_seq_labels)   

size =7
myarray = [my_plist[w:w+size+1] for w in range(0, len(my_plist), size)]

print "\t\t",
for j in range(row_col):
    print my_seq_labels[j],"\t",
print
for i in range(row_col):
    print my_seq_labels[i],"\t",
    for j in range(row_col):
        print "%.4f" % myarray[j][i],"\t\t",
    print

This is the output:

[0.0, 0.006535947712418301, 0.00980392156862745, 0.08496732026143791, 0.08169934640522876, 0.08169934640522876, 0.13398692810457516, 0.006535947712418301, 0.0, 0.00980392156862745, 0.08496732026143791, 0.08169934640522876, 0.08169934640522876, 0.13398692810457516, 0.00980392156862745, 0.00980392156862745, 0.0, 0.0784313725490196, 0.07516339869281045, 0.07516339869281045, 0.12745098039215685, 0.08496732026143791, 0.08496732026143791, 0.0784313725490196, 0.0, 0.0032679738562091504, 0.0032679738562091504, 0.13398692810457516, 0.08169934640522876, 0.08169934640522876, 0.07516339869281045, 0.0032679738562091504, 0.0, 0.006535947712418301, 0.13071895424836602, 0.08169934640522876, 0.08169934640522876, 0.07516339869281045, 0.0032679738562091504, 0.006535947712418301, 0.0, 0.13071895424836602, 0.13398692810457516, 0.13398692810457516, 0.12745098039215685, 0.13398692810457516, 0.13071895424836602, 0.13071895424836602, 0.0]
7
        410488935     410488927     410488931     410488939     410488937     410488923     410488933     
410488935     0.0000         0.0065         0.0098         0.0850         0.0817         0.0817         0.1340         
410488927     0.0065         0.0000         0.0098         0.0850         0.0817         0.0817         0.1340         
410488931     0.0098         0.0098         0.0000         0.0784         0.0752         0.0752         0.1275         
410488939     0.0850         0.0850         0.0784         0.0000         0.0033         0.0033         0.1340         
410488937     0.0817         0.0817         0.0752         0.0033         0.0000         0.0065         0.1307         
410488923     0.0817         0.0817         0.0752         0.0033         0.0065         0.0000         0.1307         
410488933     0.1340         0.1340         0.1275         0.1340         0.1307         0.1307         0.0000

How can this code be modified in the for loop where the array prints, to print in an upper triangular matrix? (as well as lower)

Any help is appreciated.

python • 10k views
ADD COMMENTlink
0
Entering edit mode

May be this can help: numpy.triu (triangle-upper) and numpy.tril (triangle-lower).

ADD REPLYlink
2
Entering edit mode
4.7 years ago
cnluzon • 30
Spain

So, as far as I have understood it, you want to skip the printing of the upper/lower triangle of a matrix because it is a symmetric one, right?

This can be controlled by the inner part of the loop (the part where you go through the columns with the j index).

So, if you want to print only the lower part, something like this should work:

for j in range(row_col):
   print my_seq_labels[j],"\t",
print
for i in range(row_col):
    print my_seq_labels[i],"\t",
    for j in range(i+1):
        print "%.4f" % myarray[i][j],"\t\t",
    print

The result of this is:

        410488935     410488927     410488931     410488939     410488937     410488923     410488933     
410488935     0.0000         
410488927     0.0065         0.0000         
410488931     0.0098         0.0098         0.0000         
410488939     0.0850         0.0850         0.0784         0.0000         
410488937     0.0817         0.0817         0.0752         0.0033         0.0000         
410488923     0.0817         0.0817         0.0752         0.0033         0.0065         0.0000         
410488933     0.1340         0.1340         0.1275         0.1340         0.1307         0.1307         0.0000

If you want to skip the diagonal you can put just "for j in range(i)" instead of i+1.

For the upper matrix you have to justify it with '\t" characters:

for j in range(row_col):
    print my_seq_labels[j],"\t",
print
for i in range(row_col):
    print my_seq_labels[i],"\t",
    for j in range(row_col):
        if j < i:
            print "\t\t",
        else:
            print "%.4f" % myarray[i][j],"\t\t",
    print

The output of this would be the upper side of the matrix. Again, if you want to skip the diagonal, the "if i < j" could be i<=j or i < j+1.

I hope this helped.

ADD COMMENTlink

Login before adding your answer.

Similar Posts
Loading Similar Posts
Powered by the version 2.3.1