Как извлечь некоторые определенные строки массива numpy

У меня есть массив unmpy, и я хочу извлечь некоторые строки массива. В моем массиве есть три столбца с координатами x, y и z:

sr_y=np.array([[10., 1., 8.], [20., 1., 8.1], [30., 1., 7.9], [10., 2., 8.],\
              [20., 2., 7.9], [30., 2., 8.], [10., 1., 1.9], [20., 1., 2.],\
              [10., 2., 2.1], [20., 2., 2.2], [30., 2., 1.8]])

Массив отсортирован один. Строки с одинаковыми значениями во втором столбце являются таким подмножеством. Первые три строки sr_y имеют одинаковое значение во втором столбце, поэтому мне нужна последняя строка ([30., 1., 7.9]). Затем снова строки 4, 5 и 6 составляют следующее подмножество, и мне нужна последняя строка (6-я). Затем, от строки 6 до строки 7, сильно меняется третий столбец (от 8 до 1.9). Отсюда и до конца я хочу извлечь первую строку каждого подмножества. Строки 7 и 8 являются подмножеством, и мне нужна строка 7. Из строк 9, 10 и 11 мне нужна первая (9-я строка). Короче говоря, я хочу следующий массив:

np.array([[30., 1., 7.9], [30., 2., 8.], [10., 1., 1.9], [10., 2., 2.1]])

Я попробовал следующий код, но он не дал мне того, что я хочу:

exported_data=np.array([])
for i in range (len(sr_y)-1):
    if sr_y[i,1] != sr_y[i+1,1] or sr_y[i-1,2]>int (sr_y[i,2]+4):
        aa=sr_y[i]
        exported_data=np.append (exported_data,aa)
exported_data=exported_data.reshape(-1,3)

Фактически, он не может изменить роль экспорта после большого изменения третьего столбца. После этого большого изменения я хочу экспортировать первую строку каждого подмножества. Заранее спасибо за любую помощь. Я ценю любой вклад.

Каков ваш критерий выбора первого или последнего элемента для каждого подмножества?

Ivan 10.12.2020 10:12

Уважаемый @Ivan, подмножества сортируются по первому столбцу. первый имеет наименьшее значение, а последний имеет наибольшее значение.

Ali_d 10.12.2020 10:14

Чего я не понимаю, так это почему третья строка вашего результирующего массива равна [10. , 1. , 1.9], а не [20. , 1. , 2. ] (то же самое для четвертой строки, где она [10. , 2. , 2.1], а не [30. , 2. , 1.8]?

Ivan 10.12.2020 10:17

Потому что в третьем столбце моих данных произошло большое изменение. третий столбец в 6-й строке — 8, а в 7-й строке — 1,9. после этого изменения я хочу извлечь первую строку каждого подмножества. Перед большим изменением мне нужна последняя строка каждого подмножества, после этого мне нужна последняя строка. Спасибо, что уделили время моей проблеме.

Ali_d 10.12.2020 10:20

Хорошо, и есть только одно большое изменение? Или их может быть несколько?

Ivan 10.12.2020 10:22

Есть изменения, но это самое большое, что я могу сказать. Но наверняка у меня есть небольшие изменения. Я думаю, что порог, который я рассматривал (sr_y[i,2]+4), неплох.

Ali_d 10.12.2020 10:24
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
230
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать флаг, чтобы указать, произошел ли уже большой шаг или нет.

delta = 4
before = True
for i in range(sr_y.shape[0]-1):
    if before and sr_y[i][0] > sr_y[i+1][0]:
        print('(last)', sr_y[i])
    if sr_y[i][2] > sr_y[i+1][2] + delta:
        before = False
    if not before and sr_y[i][0] > sr_y[i+1][0]:
        print('(first)', sr_y[i+1])

Первое условие захватит последние значения (проверка >) для всех подмножеств перед большим шагом (before). Второе условие обрабатывает переключатель флага. В то время как третье и последнее условие ловит первые значения (проверка >) для всех подмножеств после большого шага (not before).

Примечание. Замените вызовы print() на list.append() соответственно. Важно, чтобы условия оставались в этом порядке. Поскольку на итерации, где возникает большой набор, он должен будет поймать как последнее значение для предыдущего подмножества, так и первое значение из следующего.

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