Групповой список массивов numpy на основе формы. Панды? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть несколько экземпляров класса, содержащего массивы 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 s одинаковы.

Для уточнения это файлы, загруженные из разных папок. В каждой папке у меня есть одинаковые файлы, к которым я применил различную предварительную обработку)

Если я сортирую их, используя метод, показанный выше, я могу получить

Я хочу, чтобы два списка были отсортированы по форме, а также выровнены по их basename

Я думал о том, чтобы сначала выполнить сортировку по форме, а затем по 1010 * basename (функции этого типа). Что-то вроде

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

Однако второй вид может испортить первый. Они должны быть сделаны вместе, так или иначе.

Моя конечная цель - извлечь из двух списков объекты, имеющие одинаковую форму и одинаковое базовое имя

Я пробовал с пандами, но я не настолько знаком с этим. Сначала я выравниваю их по basename , затем создаю список списков и передаю его пандам.

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

Чего не хватает, так это сгруппировать их по форме и выделить разные группы.

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете создать словарь, отображающий (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 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...