0 / 0 / 0
Регистрация: 13.04.2020
Сообщений: 33

Есть массив, после сортировки надо сохранить первоначальные индексы

27.12.2023, 11:04. Показов 722. Ответов 4

Студворк — интернет-сервис помощи студентам
python 3.8.10

задача = есть массив, после сортировки надо сохранить первоначальные индексы
имеем массив 10х4 (пример, можно из случайных чисел построить)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
data1=np.random.randint(1,22,(10,4))
#не сортированный= data1  
[[ 2 19  7 18]  
 [18  3 12  1]  
 [ 7 10 19 20]  
 [ 6 16  2 19] 
 [ 8  6 18 17] 
 [ 2 13 11 16]  
 [ 8  1  6 10] 
 [18  9  2  7] 
 [ 8 15 19  2]
 [ 3  4  9  7]] 
 
num1=len(data1) # 10 строк
data2=np.sort(data1[0:num1,0:4]) #сортируем
 
#сортированный = data2
[[ 2  7 18 19]
 [ 1  3 12 18]
 [ 7 10 19 20]
 [ 2  6 16 19]
 [ 6  8 17 18]
 [ 2 11 13 16]
 [ 1  6  8 10]
 [ 2  7  9 18]
 [ 2  8 15 19]
 [ 3  4  7  9]]
находим индексы несортированного массива для дальнейшего использования

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for i in range(num1):
    data0=sorted(enumerate(data1[i]), key=lambda j: j[1]) # собираем индексы
    data3.extend(data0) #получаем массив "data 3" состоящий из индекса и числа
 
#[(0, 2), (2, 7), (3, 18), (1, 19), (3, 1), (1, 3), (2, 12), (0, 18), (0, 7), (1, 10), (2, 19), (3, 20), (2, 2), (0, 6), 
#(1, 16), (3, 19), (1, 6), (0, 8), (3, 17), (2, 18), (0, 2), (2, 11), (1, 13), (3, 16), (1, 1), (2, 6), (0, 8), (3, 10), 
#(2, 2), (3, 7), (1, 9), (0, 18), (3, 2), (0, 8), (1, 15), (2, 19), (0, 3), (1, 4), (3, 7), (2, 9)]
#до этого момента как бы все гладко,а вот дальше )))
 
data4= (data3[:1])   # получаем [(0, 2)] первый номер из массива индексов
data4=(' '.join(map(str, data4)))# превращаю в строку символов
s=(data4[4:5])  # получаю число 2 из первой ячейки
cc=(data2[0:num1,0:1]) #  срез первого столбца сортированного массива
 
#далее поиски решения привели к пшику))), провожу сравнение числа в несортированном  
#и сортированном массиве что бы "забрать" индекс
for i in range(num1):
   f=cc[:1]
   f=' '.join(map(str, f))
   if s==f[1:2]:
      print('Yes')
 #далее ??????????????????????? пока не знаю как далее
результатом должен быть список из данных столбцов сортированного массива data2 и индекса:
число - индекс из несортированного массива 1 столбец и т.д.
[2 0]
[1 3]
[7 2]
[2 4]
[6 1]
[2 0]
[1 3]
[2 4]
[2 1]
[3 2]
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.12.2023, 11:04
Ответы с готовыми решениями:

Возможно ли не дублируя в памяти массив сохранить его состояние до и после сортировки?
Вводные: 1. Есть очень большой одномерный динамический массив. 2. Алгоритм программы требует одновременную работу с его содержимым...

Указать первоначальные индексы элементов в готовой программе
Program ABC; Uses crt; Var i,l:integer; n:integer; j:integer; b:array of real; a:array of real; ...

Вывести исходные индексы элементов после сортировки массива
Задача: Дан массив целых чисел. Сформировать массив этих же чисел, упорядоченных по убыванию, и массив индексов этих чисел в...

4
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.12.2023, 13:39
Garri57,
Python
1
2
3
4
5
6
7
8
9
10
import numpy as np 
 
a = np.array([[2,1,3,4],[7,6,5,8],[10,9,12,11]])
b = a.argsort()
rows, cols = a.shape
a = np.sort(a,axis=1)
 
c = np.vstack((a.ravel(),b.ravel())).T.reshape(rows, cols, 2)
res = np.hstack(c).reshape(cols,rows,2)
print(*res, sep='\n')
4
0 / 0 / 0
Регистрация: 13.04.2020
Сообщений: 33
27.12.2023, 15:00  [ТС]
спасибо!
элегантно и красиво!
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
28.12.2023, 07:16
Лучший ответ Сообщение было отмечено Garri57 как решение

Решение

Garri57, оказывается можно проще
Python
1
2
3
4
5
6
7
8
9
import numpy as np 
 
a = np.array([[2,1,3,4],[7,6,5,8],[10,9,12,11]])
 
rows, cols = a.shape
res = np.empty((cols,rows,2), dtype=np.int8)
res[:,:,1] = a.argsort().T
res[:,:,0] = np.sort(a,axis=1).T
print(*res, sep='\n')
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,699
Записей в блоге: 14
28.12.2023, 07:26
Python
1
2
3
4
arr=[6,0,-2,3,7,1,12,0,-7]
tmp=list(zip(arr,range(len(arr))))
for a in sorted(tmp):
    print(*a)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.12.2023, 07:26
Помогаю со студенческими работами здесь

Сохранить ссылки на строки после сортировки
Запутался что-то Есть две сортировки выбором и пузырьком нужно после сортировки узнать к какой строке в исходном списке относится данная...

Построить элементы в убывающей последовательности и вывести первоначальные индексы последовательности
Здравствуйте, уважаемые форумчане!! Помогите разобраться с лабораторной работой Задача -> Построить элементы в убывающей...

Отсортировать массив\список и сохранить куда-то его версию до сортировки
вот только проблема в том, что коллекции являются ссылочными типами, и если сделать что-то в роде: int a = {1, 2, 3, 4 }; int b = a;...

Задание на массив (код есть, надо доделать)
Само задание: Дан одномерный массив. Модифицировать его: если наименьшее значение всего массива находится раньше наибольшего значения...

Получить массив, где будут храниться индексы строк матрицы, в которых есть равные элементы
Дан прямоугольный массив A. Получить линейный массив B, в котором будут храниться номера тех столбцов матрицы A, в которых есть равные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru