如何在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等等),看看它是否适合您。您需要只对总和最大的组进行排序,或者您需要