单个python对象中的多个类实例

单个python对象中的多个类实例,python,matlab,Python,Matlab,我在一个学术环境中,一直在使用numpy和scipy将我的一些数据分析代码库从MATLAB翻译成Python 3.x(Anaconda),以便与一些没有MATLAB许可证的合作者合作。我也用它作为一个借口来提高我的python能力,而不仅仅是将它复制到八度音阶,并解决任何突然出现的小问题。目前我已经掌握了一些python的基本经验,但在用python类复制MATLAB代码库中一些数据处理类的行为时遇到了问题。这里讨论的类基本上包含光谱数据块、标识符和一些基本分析 基本上在MATLAB中,我最终得

我在一个学术环境中,一直在使用numpy和scipy将我的一些数据分析代码库从MATLAB翻译成Python 3.x(Anaconda),以便与一些没有MATLAB许可证的合作者合作。我也用它作为一个借口来提高我的python能力,而不仅仅是将它复制到八度音阶,并解决任何突然出现的小问题。目前我已经掌握了一些python的基本经验,但在用python类复制MATLAB代码库中一些数据处理类的行为时遇到了问题。这里讨论的类基本上包含光谱数据块、标识符和一些基本分析

基本上在MATLAB中,我最终得到了这个类的一个Nx1实例。这使我能够通过索引父对象,逐个信号地观察事物,我使用父对象将信号的所有相关数据传递给以后的分析函数

e、 g:

它还可以让我轻松地获得所有信号的值,这使我可以轻松地将其放入电子表格或报告中。e、 g

>> [Data.value_a]'
ans = [195, 250, 280]
(注意:我知道在这个示例中,它只是返回输入,但在实际代码中也有我关心的派生值。)

我一直在试图找出如何在python中复制此行为,因此理想情况下我可以这样做:

positions = np.array([195, 250, 280])
widths = np.array([5, 5, 10])

Data = DataObject(positions, widths)
>>> Data[1]
<A DataObject containing only the data for the first signal>

>>> Data.value_a
array([195, 250, 280])
在_uinit _;方法中,但它只给了我:

TypeError: 'SignalPeak' object is not subscriptable
我所能找到的大多数关于如何拥有一个对象的多个实例的google结果都围绕着将它们放入一个列表中,然后当你想从所有对象中查看一个属性时,手动迭代它们。但我想知道是否有一种方法可以做到这一点,它的行为更类似于我的原始代码,或者至少将这种行为包装到类定义中

MATLAB类定义为:

classdef DataObject
    properties
        value_a
        value_b
    end
    methods
        function obj = DataObject(reference, data)
            % reference: a Nx1 vector 
            % data: a Nx1 vector

            obj(size(reference,1),size(reference,2)) = obj; % Creates a Nx1 SignalPeak object

            % Sets the various values
            for idx = 1:length(centers(:))
                obj(idx).value_a = reference(idx)
                obj(idx).value_b = data(idx)
            end
        end    
    end
end

您可以做一些事情,但我认为没有办法创建一个包装器对象来包装您想要的所有数据对象的列表。这里有一个这样的实现:

In [18]: class DataObject:
    ...:     def __init__(self, a, b):
    ...:         self.a = a
    ...:         self.b = b
    ...:     def __str__(self):
    ...:         return "DataObject: a={a}, b={b}".format(a=self.a, b=self.b)

In [19]: o1 = DataObject(1, 2)

In [20]: print(o1)
Out[20]: DataObject: a=1, b=2

In [21]: o2 = DataObject(3, 4)

In [22]: print(o2)
Out[22]: DataObject: a=3, b=4

In [23]: objects = DataObjects()

In [24]: objects.add(o1)

In [25]: objects.data_objects
Out[25]: [<__main__.DataObject at 0x103a0f610>]

In [26]: objects.add(o2)

In [27]: objects.data_objects
Out[27]: [<__main__.DataObject at 0x103a0f610>, <__main__.DataObject at 0x103842bd0>]

In [28]: objects.data_objects[1]
Out[28]: <__main__.DataObject at 0x103842bd0>

In [29]: objects.data_objects[1].a
Out[29]: 3

In [30]: objects.a
Out[30]: [1, 3]
[18]中的
:类数据对象:
…:定义初始化(self,a,b):
…:self.a=a
…:self.b=b
…:def_uuustr_uuu(self):
…:返回“DataObject:a={a},b={b}”。格式(a=self.a,b=self.b)
在[19]中:o1=数据对象(1,2)
In[20]:打印(o1)
Out[20]:数据对象:a=1,b=2
在[21]中:o2=DataObject(3,4)
In[22]:打印(o2)
Out[22]:数据对象:a=3,b=4
在[23]中:objects=DataObjects()
在[24]中:objects.add(o1)
在[25]中:objects.data\u对象
Out[25]:[]
[26]:对象。添加(o2)
在[27]中:objects.data\u对象
Out[27]:[,]
In[28]:objects.data_objects[1]
出[28]:
[29]中:objects.data\u objects[1].a
Out[29]:3
在[30]中:对象
出[30]:[1,3]

我希望这有帮助

我会用熊猫来做这个

In [1]: import pandas as pd

In [2]: data = pd.DataFrame({'positions':[195, 250, 280], 'widths':[5,5,10]})

In [3]: data
Out[3]:
   positions  widths
0        195       5
1        250       5
2        280      10
获取所有信号的值非常简单:

In [4]: data.positions
Out[4]:
0    195
1    250
2    280
Name: positions, dtype: int64
使用以下方法获取单个信号的数据:

计算简单的派生列很容易,pandas有很多函数来生成数据摘要

In [7]: data['areas'] = data.positions * data.widths

In [8]: data
Out[8]:
   positions  widths  areas
0        195       5    975
1        250       5   1250
2        280      10   2800

剩下的就是更新分析函数以使用数据帧和序列。

一些示例数据会很有用,例如,其中N=3。我认为您可以使用一个对象来实现这一点,该对象包含一个
数据的列表,然后在该列表中迭代。我将尝试写一些东西来演示。对于数字数据,您希望使用numpy或pandas,而不是列表。。。顺便问一下,你考虑过使用八度音阶吗@Alexander我在项目中使用numpy和scipy。我编辑了这个问题以包含这些信息以及一些示例数据和对预期输出的更好描述。这并没有完全完成我想要的。我已经更新了问题,更好地描述了所需的输出!
In [4]: data.positions
Out[4]:
0    195
1    250
2    280
Name: positions, dtype: int64
In [5]: data.iloc[1]
Out[5]:
positions    250
widths         5
Name: 1, dtype: int64
In [7]: data['areas'] = data.positions * data.widths

In [8]: data
Out[8]:
   positions  widths  areas
0        195       5    975
1        250       5   1250
2        280      10   2800