基于形状的 numpy 数组的分组列表。熊猫?

Posted

技术标签:

【中文标题】基于形状的 numpy 数组的分组列表。熊猫?【英文标题】:Group list of numpy arrays based on shape. Pandas? 【发布时间】:2019-02-04 01:25:01 【问题描述】:

我有一些包含 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 中的对象是从不同的文件初始化的,但生成的数组具有与第一个相同的形状(但顺序不同),并且 basenames 是相同的。

为了澄清这些是从不同文件夹加载的文件。在每个文件夹中,我都有相同的文件,我对其应用了不同的预处理)

如果我使用上面显示的方法对它们进行排序,我最终会得到

我希望这两个列表根据形状排序并根据它们的基本名称

对齐

我想先根据形状进行排序,然后根据 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)

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

【问题讨论】:

如何用元组键 (shape, basename) 创建一个字典。这行得通吗? 【参考方案1】:

您可以使用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).

【讨论】:

太棒了!非常感谢。我仍然想知道如何在 Pandas 中做到这一点(以便学习)。 Re: Pandas,老实说,我认为它不太适合这项任务。但也许其他人可能有一个想法。

以上是关于基于形状的 numpy 数组的分组列表。熊猫?的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫数据框转换为numpy数组[重复]

Numpy

为啥 itertools.groupby 可以将 NaN 分组在列表中而不是 numpy 数组中

如何将 4D numpy 数组重塑为 3D 数组

将数组列表作为列附加到具有相同列索引的熊猫数据框中

将列表列表的字符串转换为 Numpy 数组