python - 基于形状的 numpy 数组的分组列表。熊猫?
问题描述
我有一些包含 numpy 数组的类的实例。
import numpy as np
import os.path as osp
class Obj():
def_init__(self, file):
self.file = file
self.data = np.fromfile(file)
self.basename = osp.basename(file)
我有一个此类对象的列表,我想按形状对其进行分组。我可以使用排序来做到这一点:
obj_list = [obj1, obj2, ..., objn]
obj_list.sort(key=lambda obj: obj.data.shape)
现在我有第二个列表,比如 obj_list_2:obj_list_2 中的对象是从不同的文件初始化的,但结果数组的形状与第一个相同(但顺序不同),并且basename也是相同的。
为了澄清这些是从不同文件夹加载的文件。在每个文件夹中,我都有相同的文件,我对其应用了不同的预处理)
如果我使用上面显示的方法对它们进行排序,我最终会得到
我希望这两个列表根据形状排序并根据它们的基本名称对齐
我想先根据形状进行排序,然后根据basename(它的函数)进行排序。就像是
obj_list.sort(key=lambda obj: obj.data.shape)
obj_list.sort(key=lambda obj: obj.basename)
然而,第二种可能会搞砸第一种。他们应该以某种方式一起完成。
我的最终目标是从两个列表中提取具有相同形状和相同基本名称的对象
我尝试过使用熊猫,但我对它不太熟悉。首先,我根据basename对齐它们,然后创建一个列表列表并将其传递给 pandas。
import pandas as pd
obj_list_of_list = [obj_list1, obj_list2]
obj_df = pd.DataFrame.from_records(obj_list_of_list)
缺少的是按形状对它们进行分组并提取不同的组。
解决方案
(file, shape)
您可以使用以下方法创建到list
对象的字典映射collections.defaultdict
:
from collections import defaultdict
d = defaultdict(list)
obj_list = [obj1, obj2, ..., objn]
for obj in obj_list:
d[(obj.filename, obj.data.shape)].append(obj)
同样,只有在您愿意时才能按形状排序:
d_shape = defaultdict(list)
for obj in obj_list:
d_shape[obj.data.shape].append(obj)
然后,您可以通过 访问独特的形状d_shape.keys()
,并通过 访问给定形状的对象列表d_shape[some_shape]
。这种解决方案的好处是您的复杂性是 O(n),而排序将具有更高的复杂性,例如 O( n log n )。
推荐阅读
- rust - CString 到 C 没有 const
- html - Bootstrap:将固定的水平导航栏置于其他元素之上
- php - PHP函数返回具有重复值的数组
- firebase - 获取 Firebase 动态链接的自定义事件分析
- javascript - 带有正则表达式匹配的多个条件 if 语句
- python - 无法在 Flask 中设置 config.py
- python - 具有索引恢复的 QListView
- keras - 使用完全卷积网络的直接热图回归
- azure - Terraform 能否解决 Azure 相互依赖问题,例如重命名资源?
- javascript - 如何创建一个可以通过按钮添加和删除输入的列表?