簡體   English   中英

基於形狀的numpy數組的組列表。 熊貓?

[英]Group list of numpy arrays based on shape. Pandas?

我有一些包含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)

我有一個這樣的對象列表,我想按形狀分組。 我可以使用sort來做到這一點:

obj_list = [obj1, obj2, ..., objn]
obj_list.sort(key=lambda obj: obj.data.shape)

現在我有第二個列表,比如obj_list_2:obj_list_2中的對象是從不同的文件初始化的,但結果數組的形狀與第一個相同(但順序不同), 基本名稱也相同。

澄清這些是從不同文件夾加載的文件。 在每個文件夾中,我都有相同的文件,我應用了不同的預處理)

如果我使用上面顯示的方法對它們進行排序,我最終會得到它

我希望這兩個列表根據形狀排序,並根據它們的基本名稱進行對齊

我想先做一個基於形狀的排序,后面跟一個基於basename (它的函數)的形狀。 就像是

obj_list.sort(key=lambda obj: obj.data.shape)
obj_list.sort(key=lambda obj: obj.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 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM