[SciPy-user] Using savemat with (nested) NumPy record arrays?

Christopher A Mejia camejia at raytheon.com
Wed Apr 22 12:50:17 EDT 2009


Hi,

I'm trying to write a NumPy record array using the savemat function, using 
the format='5' default, but I am not having much success.  Here's an 
example using a NumPy record array defined in the NumPy User Guide:

-----------------------------------------

>>> import numpy as np
>>> x = np.zeros(3, 
dtype=[(’x’,’f4’),(’y’,np.float32),(’value’,’f4’,(2,2))])
SyntaxError: invalid syntax
>>> x = np.zeros(3, 
dtype=[('x','f4'),('y',np.float32),('value','f4',(2,2))])
>>> x
array([(0.0, 0.0, [[0.0, 0.0], [0.0, 0.0]]),
       (0.0, 0.0, [[0.0, 0.0], [0.0, 0.0]]),
       (0.0, 0.0, [[0.0, 0.0], [0.0, 0.0]])], 
      dtype=[('x', '<f4'), ('y', '<f4'), ('value', '<f4', (2, 2))])
>>> from scipy.io.matlab.mio import savemat
>>> savemat('record_array_test.mat', {'x': x})

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    savemat('record_array_test.mat', {'x': x})
  File "C:\Python25\lib\site-packages\scipy\io\matlab\mio.py", line 159, 
in savemat
    MW.put_variables(mdict)
  File "C:\Python25\lib\site-packages\scipy\io\matlab\mio5.py", line 974, 
in put_variables
    mat_writer.write()
  File "C:\Python25\lib\site-packages\scipy\io\matlab\mio5.py", line 736, 
in write
    self.arr = self.arr.astype('f8')
ValueError: setting an array element with a sequence.
>>> 

-----------------------------------------

Actually, what I'd like to do is to be able to handle an arbitrarily 
nested record array, as in:

-----------------------------------------

>>> spam = np.zeros(2, dtype=[('a','f4'), ('b', [('x', 'f4'), ('y', 'f4', 
(2,2))])])
>>> spam
array([(0.0, (0.0, [[0.0, 0.0], [0.0, 0.0]])),
       (0.0, (0.0, [[0.0, 0.0], [0.0, 0.0]]))], 
      dtype=[('a', '<f4'), ('b', [('x', '<f4'), ('y', '<f4', (2, 2))])])
>>> savemat('record_array_test2.mat', {'spam': spam})

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    savemat('record_array_test2.mat', {'spam': spam})
  File "C:\Python25\lib\site-packages\scipy\io\matlab\mio.py", line 159, 
in savemat
    MW.put_variables(mdict)
  File "C:\Python25\lib\site-packages\scipy\io\matlab\mio5.py", line 974, 
in put_variables
    mat_writer.write()
  File "C:\Python25\lib\site-packages\scipy\io\matlab\mio5.py", line 736, 
in write
    self.arr = self.arr.astype('f8')
ValueError: setting an array element with a sequence.

-----------------------------------------

As you can see, I get the same error for the nested case.  I know what I 
am trying to do is possible, because I can generate my desired nested 
structure array in MATLAB, then do a "round-trip" 
loadmat(,struct_as_record=True) and savemat() to get back the same thing 
in MATLAB.  However, I cannot seem to reverse engineer what 
loadmat(,struct_as_record=True) does to create the NumPy record array. Two 
differences appear to be that the dtype definition created by 
loadmat(,struct_as_record=True) does not print out as being nested, it 
just shows a '|04' type (set by the keyword "object"); also scalars and 
one-dimensional vectors appear to be upconverted to 2-d matrices.  Perhaps 
someone has a routine that I can use to pre-process my nested record array 
so it works with savemat?

FYI, I'm using Python 2.5.4, NumPy 1.2.1 and SciPy 0.7.0.

Thanks in advance for any help,
--Chris

( P.S.  I apologize in advance if this post shows up twice...my first 
attempt seems to have gotten lost.)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20090422/3d344ad6/attachment.html>


More information about the SciPy-User mailing list