У меня есть массив 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. , 1. , 1.9]
, а не [20. , 1. , 2. ]
(то же самое для четвертой строки, где она [10. , 2. , 2.1]
, а не [30. , 2. , 1.8]
?
Потому что в третьем столбце моих данных произошло большое изменение. третий столбец в 6-й строке — 8, а в 7-й строке — 1,9. после этого изменения я хочу извлечь первую строку каждого подмножества. Перед большим изменением мне нужна последняя строка каждого подмножества, после этого мне нужна последняя строка. Спасибо, что уделили время моей проблеме.
Хорошо, и есть только одно большое изменение? Или их может быть несколько?
Есть изменения, но это самое большое, что я могу сказать. Но наверняка у меня есть небольшие изменения. Я думаю, что порог, который я рассматривал (sr_y[i,2]+4
), неплох.
Вы можете использовать флаг, чтобы указать, произошел ли уже большой шаг или нет.
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()
соответственно. Важно, чтобы условия оставались в этом порядке. Поскольку на итерации, где возникает большой набор, он должен будет поймать как последнее значение для предыдущего подмножества, так и первое значение из следующего.
Каков ваш критерий выбора первого или последнего элемента для каждого подмножества?