python - 根据形状对 numpy 数组列表进行分组。 Pandas ?

标签 python python-3.x pandas list 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对齐

我想首先根据形状进行排序,然后根据 basename(它的函数)进行排序。有点像

obj_list.sort(key=lambda obj: obj.data.shape)
obj_list.sort(key=lambda obj: obj.basename)

然而,第二种可能会搞砸第一种。它们应该以某种方式一起完成。

我的最终目标是从两个列表中提取具有相同形状和相同基本名称的对象

我尝试过使用 pandas,但我对它不是很熟悉。 首先,我根据 basename 对齐它们,然后创建一个列表列表并将其传递给 pandas。

import pandas as pd
obj_list_of_list = [obj_list1, obj_list2]
obj_df = pd.DataFrame.from_records(obj_list_of_list)

缺少的是按形状对它们进行分组并提取不同的组。

最佳答案

您可以使用 collections.defaultdict 创建字典映射 (file, shape)list 对象:

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).

关于python - 根据形状对 numpy 数组列表进行分组。 Pandas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52074332/

相关文章:

python动态数组访问[:0]

Python G数据导入

python - 满足条件后使用 pandas 删除组中的所有观察结果

python - 提高for循环效率

python - 将每个 seaborn 图形附加到 for 循环内的 PDF

python - 无需重新分配即可在 pandas.DataFrame 中快速删除和添加行

python - 循环访问数据帧列表时功能不起作用

python - 更新当前显示的变量

没有 "if __name__ == ' __main_ _':"的 python3.x 多处理循环

python-3.x - Python ValueError : Duplicated level name: "REPORTED_DATE", 分配给级别 1,已用于级别 0