如何在python中对这些3D数据进行排序?

如何在python中对这些3D数据进行排序?,python,algorithm,numpy,sorting,data-structures,Python,Algorithm,Numpy,Sorting,Data Structures,我有以下数据: 团体 在每个组中都有宽度 每个宽度有一米 例如: Group 1: |Width|Meters| -------------- |144 |500 | -------------- |142 | 450 | Group 2: |Width|Meters| -------------- |140 |500 | -------------- |156 | 450 | 现在我需要创建一个排序算法,它将首先选择米数总和较大的组,然后按降序对宽度进行排序 我不知道

我有以下数据:

  • 团体
  • 在每个组中都有宽度
  • 每个宽度有一米
  • 例如:

     Group 1:
    |Width|Meters|
    --------------
    |144  |500   |
    --------------
    |142  | 450  |
    
    Group 2:
    |Width|Meters|
    --------------
    |140  |500   |
    --------------
    |156  | 450  |
    
    现在我需要创建一个排序算法,它将首先选择米数总和较大的组,然后按降序对宽度进行排序 我不知道如何存储这些数据?它应该是字典还是3d数组?还是三张名单? 有了正确的数据结构,我怎样才能真正地对它进行排序。即使您引导我走向正确的道路,我也不会要求提供完整的代码。谢谢使用numpy:

    #                 Width Meters   
    data = np.array([[[144, 500],    # Group 1
                      [142, 450]],
    
                     [[140, 500],    # Group 2
                      [156, 460]]])
    
    # Pick the group with the largest sum of Meters
    group_index = np.argmax(data.sum(1)[:,1])
    print(f'Group with the largest sum of Meters: Group {group_index + 1}')
    
    result = data[group_index]
    
    # sort by Width in descending order
    result = result[np.argsort(result[:,0])[::-1]]
    
    结果:

    array([[156, 460],
           [140, 500]]) 
    
    array([[[156, 460],
            [145, 300],
            [140, 500]],
    
           [[180, 455],
            [170, 500],
            [160, 300]],
    
           [[150, 300],
            [144, 500],
            [142, 450]]])
    
    编辑:

    data = np.array([[[144, 500],
                      [142, 450],
                      [150, 300]],  
    
                     [[140, 500],
                      [156, 460],
                      [145, 300]],
    
                     [[170, 500],
                      [180, 455],
                      [160, 300]]])
    
    # Sort Groups by the sum of Meters
    group_inds = np.argsort(data.sum(1)[:, 1])[::-1]
    result = data[group_inds]
    
    # Sort by Width in each group
    result = result[np.arange(data.shape[0])[:, None], 
                    np.argsort(result[..., 0], axis=1)[:,::-1]]
    
    结果:

    array([[156, 460],
           [140, 500]]) 
    
    array([[[156, 460],
            [145, 300],
            [140, 500]],
    
           [[180, 455],
            [170, 500],
            [160, 300]],
    
           [[150, 300],
            [144, 500],
            [142, 450]]])
    
    使用numpy:

    #                 Width Meters   
    data = np.array([[[144, 500],    # Group 1
                      [142, 450]],
    
                     [[140, 500],    # Group 2
                      [156, 460]]])
    
    # Pick the group with the largest sum of Meters
    group_index = np.argmax(data.sum(1)[:,1])
    print(f'Group with the largest sum of Meters: Group {group_index + 1}')
    
    result = data[group_index]
    
    # sort by Width in descending order
    result = result[np.argsort(result[:,0])[::-1]]
    
    结果:

    array([[156, 460],
           [140, 500]]) 
    
    array([[[156, 460],
            [145, 300],
            [140, 500]],
    
           [[180, 455],
            [170, 500],
            [160, 300]],
    
           [[150, 300],
            [144, 500],
            [142, 450]]])
    
    编辑:

    data = np.array([[[144, 500],
                      [142, 450],
                      [150, 300]],  
    
                     [[140, 500],
                      [156, 460],
                      [145, 300]],
    
                     [[170, 500],
                      [180, 455],
                      [160, 300]]])
    
    # Sort Groups by the sum of Meters
    group_inds = np.argsort(data.sum(1)[:, 1])[::-1]
    result = data[group_inds]
    
    # Sort by Width in each group
    result = result[np.arange(data.shape[0])[:, None], 
                    np.argsort(result[..., 0], axis=1)[:,::-1]]
    
    结果:

    array([[156, 460],
           [140, 500]]) 
    
    array([[[156, 460],
            [145, 300],
            [140, 500]],
    
           [[180, 455],
            [170, 500],
            [160, 300]],
    
           [[150, 300],
            [144, 500],
            [142, 450]]])
    

    排序算法可以简单地用除法创建。
    事实上,分组排序和(宽度、米)对排序是我们可以独立解决的不同问题

    数据结构的选择取决于您的需要;例如,一个组可以是一个名为tuple(width,meter)的列表,或者如果您需要更高效的2d numpy阵列Nx2。
    如果不需要命名组,则各种组的容器可以是一个列表(或numpy数组)、一个(名称、数据)元组列表或一个字典名->数据;没有严格的规则,每种可能性都有优点和缺点(例如,在(名称、数据)列表中,可能很难有效地找到知道名称的数据,但排序非常简单,1 LOC。虽然字典提供了一种很好的检索数据的方法,但排序可能会有点混乱)

    这里是一个配置示例,我使用字典名->数据来存储各种组(不会排序!);一个列表,该列表将以排序方式仅包含组的名称;数据的namedtuple列表。
    通过这种方式,我可以轻松检索数据,如果我想查看顺序,我可以访问名称列表,然后访问数据字典

    从集合导入namedtuple
    GroupData=namedtuple(“GroupData”、[“Width”、“Meters”])
    #分组容器:
    groups={“group1”:[GroupData(144500),GroupData(142650)],
    “第二组”:[GroupData(140800),GroupData(156450)]
    #分组名称的排序列表
    已排序的组=已排序([组中名称的名称],
    key=lambda name:sum(组[name]中数据的data.Meters),
    反向=真)
    #对每组进行排序
    对于groups.values()中的group_数据:
    group_data.sort(key=lambda data:data.Width,reverse=True)
    打印(组)
    打印(已排序的组)
    
    排序算法可以简单地用除法创建。
    事实上,分组排序和(宽度、米)对排序是我们可以独立解决的不同问题

    数据结构的选择取决于您的需要;例如,一个组可以是一个名为tuple(width,meter)的列表,或者如果您需要更高效的2d numpy阵列Nx2。
    如果不需要命名组,则各种组的容器可以是一个列表(或numpy数组)、一个(名称、数据)元组列表或一个字典名->数据;没有严格的规则,每种可能性都有优点和缺点(例如,在(名称、数据)列表中,可能很难有效地找到知道名称的数据,但排序非常简单,1 LOC。虽然字典提供了一种很好的检索数据的方法,但排序可能会有点混乱)

    这里是一个配置示例,我使用字典名->数据来存储各种组(不会排序!);一个列表,该列表将以排序方式仅包含组的名称;数据的namedtuple列表。
    通过这种方式,我可以轻松检索数据,如果我想查看顺序,我可以访问名称列表,然后访问数据字典

    从集合导入namedtuple
    GroupData=namedtuple(“GroupData”、[“Width”、“Meters”])
    #分组容器:
    groups={“group1”:[GroupData(144500),GroupData(142650)],
    “第二组”:[GroupData(140800),GroupData(156450)]
    #分组名称的排序列表
    已排序的组=已排序([组中名称的名称],
    key=lambda name:sum(组[name]中数据的data.Meters),
    反向=真)
    #对每组进行排序
    对于groups.values()中的group_数据:
    group_data.sort(key=lambda data:data.Width,reverse=True)
    打印(组)
    打印(已排序的组)
    
    如果不进一步了解问题,就有点难说。DICT是清晰优雅代码的良好起点。如果速度很关键,numpy阵列可能会很有用。我建议从嵌套的dict开始(dict包含组,每个组本身就是一个dict等等),看看它是否适合你。你只需要对最大和的组进行排序,或者你需要按组的米和对组进行排序,然后对每个组排序成对宽度表?@MarcoZamboni-后者,需要按总和对组集进行排序,选择总和较大的组,然后对成对宽度米进行排序。@JussiNurminen我能提供更多信息吗?我将看看嵌套的dict。@JussiNurminen将其视为一个用于组的“for loop”,其中一个用于宽度的“for loop”,其中米将用于计算。该算法应该从具有最高米数和最大宽度的组开始,从而进行排序。我还可以提供其他信息让它变得更好吗?如果不知道更多关于这个问题的信息,就有点难说了。DICT是清晰优雅代码的良好起点。如果速度很关键,numpy阵列可能会很有用。我建议从嵌套的dict开始(dict包含组,每个组本身就是一个dict等等),看看它是否适合您。您需要只对总和最大的组进行排序,或者您需要