python中类似matlab的复杂数据结构(numpy/scipy)

python中类似matlab的复杂数据结构(numpy/scipy),python,matlab,numpy,Python,Matlab,Numpy,我目前在Matlab中的数据结构如下 item{i}.attribute1(2,j) 其中,项是i=1中的单元格。。n每个包含多个属性的数据结构,每个属性都是大小为2,j的矩阵,其中j=1。。M属性的数量不是固定的 我必须将此数据结构转换为python,但我不熟悉numpy和python列表。使用numpy/scipy在python中构建此数据的最佳方式是什么 谢谢。我经常看到以下转换方法: matlab数组->python numpy数组 matlab单元数组->python列表 matla

我目前在Matlab中的数据结构如下

item{i}.attribute1(2,j)
其中,项是i=1中的单元格。。n每个包含多个属性的数据结构,每个属性都是大小为2,j的矩阵,其中j=1。。M属性的数量不是固定的

我必须将此数据结构转换为python,但我不熟悉numpy和python列表。使用numpy/scipy在python中构建此数据的最佳方式是什么


谢谢。

我经常看到以下转换方法:

matlab数组->python numpy数组

matlab单元数组->python列表

matlab结构->python dict

在您的例子中,这将对应于一个包含dict的python列表,dict本身包含numpy数组作为条目

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

注意

不要忘记python中的0索引

[更新]

附加:使用类

除了上面给出的简单转换之外,还可以定义一个伪类,例如

class structtype():
    pass
这允许以下类型的使用:

>> 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

如果您正在寻找一个很好的示例,说明如何像在MATLAB中一样在Python中创建结构化数组,那么您可能需要查看scipy主页()

例子 然后,打印输出为:

[([[1.0, 2.0], [1.0, 2.0]], 23.5, 'Stringli')]
不幸的是,我没有发现在不知道结构化数组的大小的情况下如何定义结构化数组。还可以直接使用数组的内容定义数组

x = np.array(([[1, 2], [1, 2]], 23.5, 'Stringli'),
                dtype = [('Table', float64, (2, 2)),
                         ('Number', float),
                         ('String', '|S10')])

# Same result as above but less code (if you know the contents in advance)
print(x)

对于某些应用程序,一个
dict
或字典列表就足够了。然而,如果您真的想在Python中模拟MATLAB
struct
,那么您必须利用它的OOP并形成自己的类似struct的类

这是一个简单的实例示例,它允许您将任意数量的变量存储为属性,也可以初始化为空(仅限Python 3.x)
i
是显示对象中存储了多少属性的索引器:

class Struct:
    def __init__(self, *args, prefix='arg'): # constructor
        self.prefix = prefix
        if len(args) == 0:
            self.i = 0
        else:
            i=0
            for arg in args:
                i+=1
                arg_str = prefix + str(i)
                # store arguments as attributes
                setattr(self, arg_str, arg) #self.arg1 = <value>
            self.i = i
    def add(self, arg):
        self.i += 1
        arg_str = self.prefix + str(self.i)
        setattr(self, arg_str, arg)
将获得对象b的以下结果:

{'prefix': 'arg', 'arg1': 5, 'arg2': -99.99, 'arg3': [1, 5, 15, 20], 'arg4': 'sample', 'arg5': {'key1': 5, 'key2': -100}, 'i': 6, 'arg6': 150.0001}
<class 'list'>
[1, 5]
5

请注意,为对象指定属性是通用的-不仅限于
scipy
/
numpy
对象,而且适用于所有数据类型和自定义对象(数组、数据帧等)。当然,这是一个玩具模型——您可以进一步开发它,使其能够根据您的项目需要进行索引、打印、删除元素、调用等。只需在开始时定义类,然后将其用于存储检索。这就是Python的魅力所在——它并没有你真正想要的东西,特别是如果你来自MATLAB,但它可以做得更多

是@dbouz的答案的简单版本,使用了@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
那你就可以了

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

现在仍然如此

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

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
您可以在matlab中准确地得到myst=struct('a',1,'b',2,'c',3)的预期结果

结构单元的等价物是
结构类型的
列表

mystarr = [ structtype(a=1,b=2) for n in range(10) ]
那会给你什么

mystarr[0].a # == 1
mystarr[0].b # == 2

您需要如何处理这些数据?最简单的方法是将所有内容都转储到一系列嵌套列表中,但我有一个潜在的怀疑,它不支持您正在寻找的功能类型。我可以理解,您希望忠实于matlab格式。。但是功能与dict不一样吗?@zwep不,结构化阵列上有更多功能。NumPy还可以在这种结构化阵列上执行其优化算法。这就是我使用它的原因。谢谢你。这些具有多索引的结构化数组的行为方式似乎与简单数据帧的行为方式相同。太好了!:)嗯,熊猫依赖于努比。它只是将numpy数组封装在一点开销中。因为这个原因,我从未开始使用熊猫。我希望你现在能理解这种相似性的起源。
myst = structtype()
myst.Set(a=1,b=2,c=3)
myst.d = 4 # here, myst.a=1, myst.b=2, myst.c=3, myst.d=4
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
mystarr = [ structtype(a=1,b=2) for n in range(10) ]
mystarr[0].a # == 1
mystarr[0].b # == 2