[SciPy-dev] problem with write_array
Pietro Berkes
p.berkes at biologie.hu-berlin.de
Wed Oct 9 12:27:03 EDT 2002
Hi! There seem to be a problem with write_array in scipy.io, since it cannot
write 1D or 0D arrays, for example:
>>> import scipy as s
>>> s.__version__
'0.2.0_alpha_133.4174'
>>> a = s.zeros((10,))
>>> a
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> fid = open('file.dat','w')
>>> s.io.write_array(fid,a)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File
"/home/scipy/local/lib/python2.2/site-packages/scipy/io/array_import.py",
line 384, in write_array
array_output=0)
File
"/home/scipy/local/lib/python2.2/site-packages/Numeric/ArrayPrinter.py", line
17, in array2string
if len(a.shape) == 0:
AttributeError: 'int' object has no attribute 'shape'
The problem in the 1D case is that Numeric.array2string doesn't accept scalar
quantities as input, while in the 0D case there is an undefined variable.
Here is my suggestion (should replace function write_array in
scipy/io/array_import.py):
def write_array(fileobject, arr, separator=" ", linesep='\n',
precision=5, suppress_small=0):
"""Write a rank-2 or less array to file represented by fileobject.
Inputs:
fileobject -- An open file object or a string to a valid filename.
arr -- The array to write.
separator -- separator to write between elements of the array.
linesep -- separator to write between rows of array
precision -- number of digits after the decimal place to write.
suppress_small -- non-zero to suppress small digits and not write
them in scientific notation.
Outputs:
file -- The open file.
"""
file = get_open_file(fileobject, mode='wa')
rank = len(arr.shape)
if rank > 2:
raise ValueError, "Can-only write up to 2-D arrays."
if rank == 0:
h = 1
rarr = Numeric.reshape(arr, (1,1))
elif rank == 1:
h = arr.shape[0]
rarr = Numeric.reshape(arr, (h,1))
else:
h = arr.shape[0]
for k in range(h):
astr = Numeric.array2string(rarr[k], max_line_width=sys.maxint,
precision=precision,
suppress_small=suppress_small,
separator=' '+separator,
array_output=0)
astr = astr[1:-1]
file.write(astr)
file.write(linesep)
return file
Greetings,
Pietro.
More information about the SciPy-Dev
mailing list