Extracting matrix from a text file

Colin J. Williams cjw at ncf.ca
Tue Aug 11 10:45:28 EDT 2009


telekab1 at hotmail.com wrote:
> Hello to all!!
> 
> I am new in python, and I am running it on Mac with Smultron editor. I
> need to read a textfile that includes numbers (in a matrix form),
> indexes, and strings, like this:
> 
> Marsyas-kea distance matrix for MIREX 2007 Audio Similarity Exchange
> Q/R        1                   2                   3
> 4                5
> 1        0                  4.54592        4.36685
> 5.29463        3.85728
> 2        4.54592        0                  3.97667
> 5.02151        4.64284
> 3        4.36685        3.97667        0
> 4.98743        4.83683
> 4        5.29463        5.02151        4.98743
> 0                  6.04393
> 5        3.85728        4.64284        4.83683        6.04393        0
> 
> My code to get this information is:
> 
> matrix = open("dmatrix_5.txt");
> 
> while 1:
>     mat = matrix.readline()
>     if not mat:
>     	break
>     pass # do something
>     print mat
> 
> 
> 
> So I just want to keep the matrix in the "middle" for math
> computations.
> 
>         0                  4.54592        4.36685
> 5.29463        3.85728
>         4.54592        0                  3.97667
> 5.02151        4.64284
>         4.36685        3.97667        0
> 4.98743        4.83683
>         5.29463        5.02151        4.98743
> 0                  6.04393
>         3.85728        4.64284        4.83683        6.04393        0
> 
> 
> I've seen and tried a lot of ways, like split or isinstance.. but
> never get the wanted result.... does anyone have an idea, or hint?
> Thank you once more for your help!
> 
> Best Regards,
> Bea

numpy provides an answer.  See the little script below:

import numpy as _n
import string as _s
a=  "0       4.54592 4.36685 5.29463 3.85728 " + \
   "4.54592 0       3.97667 5.02151 4.64284 "   + \
   '4.36685 3.97667 0       4.98743 4.83683 '   + \
   '5.29463 5.02151 4.98743 0       6.04393 '   + \
   '3.85728 4.64284 4.83683 6.04393 0'

d= _n.mat(_n.reshape(_n.array(a.split(), dtype= _n.float), (5, 5)))
print repr(d)
print 'Default printoptions:', _n.get_printoptions()

for p in range(9):
   _n.set_printoptions(precision= p)
   print 'precision= ', p, '\n', d

When you run this, you'll see that there is a numpy glitch for precisions > 5.

Colin W.



More information about the Python-list mailing list