belinda thom wrote:
> Hi,
> 
> Is there a way for me to keep adding the next row of a 2d array to a  
> file via load? (matlab's save had a very useful -append option).
> 
> I managed to get 2d laod/save working, e.g.
> 
>    import numpy as N
>    import pylab as P
>    import bthom.utils as U
>    # a numpy 2d array
>    a = N.arange(12,dtype=N.float).reshape((3,4))
>    a[0][0] = N.pi
>    # checking out the matploblib save/load stuff
>    P.save("data.csv", a, fmt="%.4f", delimiter=";")
>    aa = P.load("data.csv", delimiter= ";")
>    x,y,z,w = P.load("data.csv", delimiter=";", unpack=True)
> 
> The above took me longer than it perhaps should have b/c of advice  
> I'd gotten elsewhere recommending trying to keep numpy and pylab  
> separate when possible (to take advantage of all of numpy's features;  
> it seems numpy doesn't even have the all-to-handy load/save  
> functionality).
> 
> When I try similar tricks to write one row at a time, I'm hosed in  
> that the shape is gone:
> 
>    # checking out a way to keep appending
>    fname = "data1.csv"
>    U.clobber_file(fname) #this thing just ensures 0 bytes in file
>    f = open(fname,"a")
>    nrows,ncols = a.shape
>    for i in range(nrows) :
>        P.save(f, a[i,:], fmt="%d", delimiter=";")
>    f.close()
>    aaa = P.load("data1.csv", delimiter= ";")
> 
> in particular:
> 
>    % cat data1.csv
>    3
>    1
>    2
>    4
>    <snip>
>    11
> 
> Thanks in advance,
> --b
> 

This is because pylab.save() writes every 1D-array (like a[i,:]) as 
"column vector". In the definition of the save() function:

[...]
     if len(X.shape)==1:
         origShape = X.shape
         X.shape = len(X), 1
[...]

This reshapes the 1D-array (len(a[i,:].shape) == 1) to a 2D-array of 
shape Nx1 and a loop over the first axis writes the rows (in this case 
one element per row) to file.

There are several ways to do what you want:

#-----------------------------------------------------------------------#

# generate data
a = N.arange(12,dtype=N.float).reshape((3,4))
a[0][0] = N.pi
P.save("data.csv", a, fmt="%.4f", delimiter=";")

# (A)
# rather hackish way, define your own save(), not
# really useful, just to show that it works
def save2(fname, X, fmt='%.18e',delimiter=' '):

     if is_string_like(fname):
         if fname.endswith('.gz'):
             import gzip
             fh = gzip.open(fname,'wb')
         else:
             fh = file(fname,'w')
     elif hasattr(fname, 'seek'):
         fh = fname
     else:
         raise ValueError('fname must be a string or file handle')


     X = N.asarray(X)
     origShape = None
     if len(X.shape)==1:
         origShape = X.shape
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
##        X.shape = len(X), 1
         X.shape = 1, len(X)
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
     for row in X:
         fh.write(delimiter.join([fmt%val for val in row]) + '\n')

     if origShape is not None:
         X.shape = origShape


fname = "data1.csv"
f = open(fname,"a")
nrows,ncols = a.shape
for i in range(nrows) :
     save2(f, a[i,:], fmt="%f", delimiter=";")
f.close()
aaa = P.load("data1.csv", delimiter= ";")
print aaa

print "-----------------------"

# (B)
# do it without a save() function
fname = "data2.csv"
f = open(fname,"a")
nrows,ncols = a.shape
delim = ';'
fmt = '%f'
for i in range(nrows):
     # just like in pylab.save()
     f.write(delim.join([fmt %val for val in a[i,:]]) + '\n')
f.close()
aaa = P.load("data2.csv", delimiter= ";")
print aaa

print "-----------------------"

# (C)
# probably the best: save a 1xn "row vector" per line
fname = "data3.csv"
f = open(fname,"a")
nrows,ncols = a.shape
for i in range(nrows) :
     P.save(f, a[i,:].reshape((1,ncols)), fmt="%f", delimiter=";")
f.close()
aaa = P.load("data3.csv", delimiter= ";")
print aaa


HTH

-- 
cheers,
steve

Random number generation is the art of producing pure gibberish as 
quickly as possible.

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to