【问题标题】:How to make an indexable array of collections如何制作可索引的集合数组
【发布时间】:2021-06-02 05:32:33
【问题描述】:

我正在解析来自我运行的各种测试的多个数据文件,并且我想将来自每个测试的值分组到属于集合的变量中。例如一对集合是:

type_GA_RX1 = collections.namedtuple('type_GA_RX1',
                                    ['GA_RX1',
                                    'GA_RX1logmag',
                                    'GA_RX1mag',
                                    'GA_RX1ph'])

type_GA_RX2 = collections.namedtuple('type_GA_RX2',
                                        ['GA_RX2',
                                        'GA_RX2logmag',
                                        'GA_RX2mag',
                                        'GA_RX2ph'])

当我遍历文件时,我想做这样的事情:

keys=dataGA.keys()   # dictionary of parsed file data 
for key in keys:
        if len(dataGA[key]) >0:
            GA_RX1logmag   = np.array(dataGA[key].RX1_log_mag)
            GA_RX1mag      = 10**(GA_RX1logmag/20)
            GA_RX1         = np.array(dataGA[key].RX1_real +1j*dataGA[key].RX1_imag)
            GA_RX1ph       = np.array(dataGA[key].RX1_phase)

然后将这些分配给集合类型:

type_GA_RX1[key].GA_RX1logmag =  GA_RX1logmag
type_GA_RX1[key].GA_RX1mag    =  GA_RX1mag
type_GA_RX1[key].GA_RX1       =  GA_RX1
type_GA_RX1[key].GA_RX1ph     =  GA_RX1ph

但是,我无法索引到“类型”对象;我收到此错误:

type_GA_RX1[key].GA_RX1logmag=  GA_RX1logmag
TypeError: 'type' object is not subscriptable

我该怎么做?或者,这不是我想做的吗?如何创建集合数组?

为了清楚起见,dataGA 看起来像这样(摘录):

    {0:      RX1_real  RX1_imag  RX2_real  ...  distance  RX2_log_mag  RX1_log_mag
 61  -0.019780 -0.005127  0.010010  ...       1.0   -38.426806   -33.793076
 62  -0.018310 -0.010740  0.007812  ...       4.0   -38.190809   -33.462052
 63  -0.016600 -0.012450  0.006348  ...       8.0   -38.523323   -33.659638
 64  -0.020510 -0.005127  0.010010  ...      18.0   -38.426806   -33.497447
 65  -0.015140 -0.013670  0.005127  ...      25.0   -38.488333   -33.808143
 ..        ...       ...       ...  ...       ...          ...          ...
 477 -0.006104 -0.018310 -0.009521  ...    9795.0   -37.416049   -34.288563
 478 -0.008545  0.017820  0.013180  ...    9799.0   -37.482664   -34.083018
 479  0.000000  0.019290  0.010990  ...    9802.0   -37.584010   -34.293355
 495  0.018800  0.004395 -0.005127  ...    9803.0   -36.574736   -34.285753
 480 -0.008301 -0.017330 -0.007324  ...    9804.0   -37.062341   -34.326965
 
 [401 rows x 9 columns],
 1:      RX1_real  RX1_imag  RX2_real  ...  distance  RX2_log_mag  RX1_log_mag
 61  -0.019780 -0.005127  0.010010  ...       1.0   -38.426806   -33.793076
 62  -0.018310 -0.010740  0.007812  ...       4.0   -38.190809   -33.462052
 63  -0.016600 -0.012450  0.006348  ...       8.0   -38.523323   -33.659638

【问题讨论】:

    标签: python python-3.x dictionary indexing collections


    【解决方案1】:
    type_GA_RX1[key].GA_RX1logmag =  GA_RX1logmag
    type_GA_RX1[key].GA_RX1mag    =  GA_RX1mag
    type_GA_RX1[key].GA_RX1       =  GA_RX1
    type_GA_RX1[key].GA_RX1ph     =  GA_RX1ph
    

    这里有两三个问题:

    1. 您永远不会创建type_GA_RX1实例
    2. 如果您确实创建了一个,namedtuple 实例是不可变的,因此您无法在创建它们后分配属性。您需要将值直接传递给初始化程序。
    3. 您似乎尝试使用type_GA_RX1[key],就好像type_GA_RX1 是一本字典,但您没有在任何地方创建字典。
    4. 我还怀疑您实际上并不想将整个值数组放入一个 type_GA_RX1 实例中,而只想放入一个值。

    我认为您的意思如下:

    GA_RX1_instances = {}
    
    for key, data in dataGA.items():
        if len(data) > 0:
            logmag = data.RX1_log_mag
            GA_RX1_instances[key] = type_GA_RX1(
                GA_RX1logmag = logmag
                GA_RX1mag    = 10**(logmag/20)
                GA_RX1       = data.RX1_real + 1j*data.RX1_imag
                GA_RX1ph     = data.RX1_phase
            )
    

    其中GA_RX1logmag = ...等不是局部变量,而是关键字参数。

    【讨论】:

    • 感谢您的回复——我不是软件专家,所以请多多包涵。我以为我是在上面的第一个代码块中创建实例。 ---啊,等等,我知道你在那里做了什么……让我试试看。谢谢。
    • 我想我确实想要整个数组......我希望能够为每次运行绘制这些数据;即,类似于(在伪代码中)“plot(file1.distance,file1.GA_RX1mag), plot(file2.distance,file2.GA_RX1mag)”等......
    • 那我觉得namedtuples字典不是你想要的数据结构。也许是 Pandas 数据框?
    • 我在想我可以使用collections.namedtuple 作为每组相关值(RX1、RX2 等)的结构,然后可以使用结构数组。然后,这将使我能够根据需要将整个结构(甚至结构数组)传递给不同的函数。再说一次,我不是软件人,所以也许我说的不对。如果我使用 pandas.dataframe,我会失去将相关值分组到一个通用结构中。
    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多