Как сгруппировать последовательные данные в массиве 2d в python

У меня есть массив 2d NumPy, который выглядит так:

array([[1, 1],
       [1, 2],
       [2, 1],
       [2, 2],
       [3, 1],
       [5, 1],
       [5, 2]])

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

         Col1 Col2
group 1: 1-2, 1-2
group 2: 3-3, 1-1
group 3: 5-5, 1-2

Я хочу сгруппировать столбцы на основе того, являются ли они последовательными.

Таким образом, для уникального значения в столбце 1 сгруппируйте данные во втором столбце, если они следуют друг за другом между строками. Теперь для уникальной группировки столбца 2 сгруппируйте столбец 1, если он последователен между строками.

Результат можно рассматривать как угловые точки сетки. В приведенном выше примере группа 1 — это квадратная сетка, группа 2 — точка, а группа 3 — плоская линия.

Моя система не позволяет мне использовать pandas, поэтому я не могу использовать group_by в этой библиотеке, но я могу использовать другие стандартные библиотеки.

Любая помощь приветствуется. Спасибо

Я не понимаю, как вывод соответствует вводу - не могли бы вы уточнить?

richardec 18.03.2022 23:08

@richardec Сейчас я не могу отредактировать вопрос. Для каждого уникального значения в столбце 1 сгруппируйте столбец 2, если столбец 2 является последовательным. После того, как это сгруппировано, для каждого сгруппированного столбца 2 сгруппируйте столбец 1, если он последовательный. Вы видите, что первые 4 строки образуют квадрат (если он построен). 5-я строка представляет собой точку, если она нанесена. А ряды 6 и 7 образуют ровную линию, если их нарисовать. Это помогает?

Aidan O'Farrell 18.03.2022 23:15

@richardec Я не обновлял вопрос. Спасибо

Aidan O'Farrell 18.03.2022 23:58

Я не понимаю, почему строка [3,1] не принадлежит к группе 1 согласно вашей логике.

Michael Szczesny 19.03.2022 00:41

@MichaelSzczesny, потому что столбец 2 не совпадает со строкой ниже с тем же значением столбца 1. Строка ниже не является тем же значением столбца.

Aidan O'Farrell 19.03.2022 00:55

Если [3,1] не является уникальной группой в соответствии с шагом 1, не должна ли она принадлежать ни одной группе в соответствии с шагом 2 для уникальной группы столбца 2, столбца группы 1...?

Michael Szczesny 19.03.2022 01:17

@MichaelSzczesny, возможно, моя формулировка здесь не совсем верна, и я изо всех сил пытаюсь придумать другой способ описать ее, но, поскольку она уникальна для обоих столбцов, она должна быть в отдельной группе.

Aidan O'Farrell 19.03.2022 09:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
7
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну вот ...

Шаги:

  • Получите список xUnique уникальных значений столбца 1 с сохраненным порядком сортировки.
  • Создайте список xRanges элементов формы [col1_value, [col2_min, col2_max]], содержащий диапазоны столбца 2 для каждого значения столбца 1.
  • Создайте список xGroups элементов вида [[col1_min, col1_max], [col2_min, col2_max]], где часть [col1_min, col1_max] создается путем слияния части col1_value последовательных элементов в xRanges, если они отличаются на 1 и имеют одинаковые диапазоны значений [col2_min, col2_max] для столбца 2.
  • Превратите диапазоны в каждом элементе xGroups в строки и напечатайте с нужными заголовками строк и столбцов.
  • Также упакуйте и распечатайте как numpy.array, чтобы соответствовать форме ввода.
import numpy as np
data = np.array([
    [1, 1],
    [1, 2],    
    [2, 1],    
    [2, 2],
    [3, 1],
    [5, 1],
    [5, 2]])
xUnique = list({pair[0] for pair in data})
xRanges = list(zip(xUnique, [[0, 0] for _ in range(len(xUnique))]))
rows, cols = data.shape
iRange = -1
for i in range(rows):
    if i == 0 or data[i, 0] > data[i - 1, 0]:
        iRange += 1
        xRanges[iRange][1][0] = data[i, 1]
    xRanges[iRange][1][1] = data[i, 1]
xGroups = []
for i in range(len(xRanges)):
    if i and xRanges[i][0] - xRanges[i - 1][0] == 1 and xRanges[i][1] == xRanges[i - 1][1]:
        xGroups[-1][0][1] = xRanges[i][0]
    else:
        xGroups += [[[xRanges[i][0], xRanges[i][0]], xRanges[i][1]]]

xGroupStrs = [ [f'{a}-{b}' for a, b in row] for row in xGroups]

groupArray = np.array(xGroupStrs)
print(groupArray)

print()
print(f'{"":<10}{"Col1":<8}{"Col2":<8}')
[print(f'{"group " + str(i) + ":":<10}{col1:<8}{col2:<8}') for i, (col1, col2) in enumerate(xGroupStrs)]

Выход:

[['1-2' '1-2']
 ['3-3' '1-1']
 ['5-5' '1-2']]

          Col1    Col2
group 0:  1-2     1-2
group 1:  3-3     1-1
group 2:  5-5     1-2

Разрывы для [[1, 1],[2, 1]] и всех последовательных «точечных фигур».

Michael Szczesny 19.03.2022 01:33

@Michael Szczesny [[1, 1], [2, 1]] дает [['1-2' '1-1']] в качестве вывода. Разве это не то, чего вы ожидаете?

constantstranger 19.03.2022 02:51

@constantstranger это ответ, который я ищу - большое спасибо!!

Aidan O'Farrell 19.03.2022 09:43

@ Эйдан О'Фаррелл Спасибо за подтверждение. Вам нужна дополнительная помощь с вашим вопросом?

constantstranger 19.03.2022 13:22

@constantstranger нет, не знаю. Это именно то, что мне нужно, большое спасибо.

Aidan O'Farrell 19.03.2022 14:06

Другие вопросы по теме