Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Complex matlab-like data structure in python (numpy/scipy)

I have data currently structured as following in Matlab

item{i}.attribute1(2,j)

Where item is a cell from i = 1 .. n each containing the data structure of multiple attributes each a matrix of size 2,j where j = 1 .. m. The number of attributes is not fixed.

I have to translate this data structure to python, but I am new to numpy and python lists. What is the best way of structuring this data in python with numpy/scipy?

Thanks.

like image 867
SkyNT Avatar asked Jul 24 '12 18:07

SkyNT


People also ask

Is NumPy similar to MATLAB?

NumPy (Numerical Python)NumPy arrays are the equivalent to the basic array data structure in MATLAB. With NumPy arrays, you can do things like inner and outer products, transposition, and element-wise operations.

Is NumPy a data structure?

NumPy is a Python library that can be used for scientific and numerical applications and is the tool to use for linear algebra operations. The main data structure in NumPy is the ndarray, which is a shorthand name for N-dimensional array.

Which is faster MATLAB or NumPy?

The time matlab takes to complete the task is 0.252454 seconds while numpy 0.973672151566, that is almost four times more.


2 Answers

I've often seen the following conversion approaches:

matlab array -> python numpy array

matlab cell array -> python list

matlab structure -> python dict

So in your case that would correspond to a python list containing dicts, which themselves contain numpy arrays as entries

item[i]['attribute1'][2,j]

Note

Don't forget the 0-indexing in python!

[Update]

Additional: Use of classes

Further to the simple conversion given above, you could also define a dummy class, e.g.

class structtype():
    pass

This allows the following type of usage:

>> s1 = structtype()
>> print s1.a
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-40-7734865fddd4> in <module>()
----> 1 print s1.a
AttributeError: structtype instance has no attribute 'a'
>> s1.a=10
>> print s1.a
10

Your example in this case becomes, e.g.

>> item = [ structtype() for i in range(10)]
>> item[9].a = numpy.array([1,2,3])
>> item[9].a[1]
2
like image 111
jmetz Avatar answered Oct 04 '22 02:10

jmetz


A simple version of the answer by @dbouz , using the idea by @jmetz

class structtype():
    def __init__(self,**kwargs):
        self.Set(**kwargs)
    def Set(self,**kwargs):
        self.__dict__.update(kwargs)
    def SetAttr(self,lab,val):
        self.__dict__[lab] = val

then you can do

myst = structtype(a=1,b=2,c=3)

or

myst = structtype()
myst.Set(a=1,b=2,c=3)

and still do

myst.d = 4 # here, myst.a=1, myst.b=2, myst.c=3, myst.d=4

or even

myst = structtype(a=1,b=2,c=3)
lab = 'a'
myst.SetAttr(lab,10) # a=10,b=2,c=3 ... equivalent to myst.(lab)=10 in MATLAB

and you get exactly what you'd expect in matlab for myst=struct('a',1,'b',2,'c',3).

The equivalent of a cell of structs would be a list of structtype

mystarr = [ structtype(a=1,b=2) for n in range(10) ]

which would give you

mystarr[0].a # == 1
mystarr[0].b # == 2
like image 29
Girardi Avatar answered Oct 04 '22 03:10

Girardi