Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141

NumPy, сортировка массива

26.05.2020, 15:39. Показов 5480. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как с помощью NumPy мне создать массив не используя циклы , в который попадут все повторяющиеся элементы другого массива, а, остальные расположатся в порядке убывания, чтобы массив не превысил 6(исходный массив длинен)?
Пример1:
[604, 546, 546, 75, 14, 8, 6 2, 1, 0, 0]
Вывод: [546, 546, 0, 0, 604, 75]
Пример2:
[604, 546, 546, 546, 375, 375, 141, 73]
Вывод: [546, 546, 546, 375,375, 604]
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.05.2020, 15:39
Ответы с готовыми решениями:

Получить элемент многомерного массива numpy
Есть n-мерный массив. Есть одномерный массив из n элементов, в нем лежат индексы элемента из первого массива. Нужно получить элемент...

Индексы максимальных элементов массива (NumPy)
С клавиатуры вводится двумерный массив чисел, необходимо заменить максимальные элементы строк на сумму элементов этих строк. Из...

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

23
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
27.05.2020, 06:09  [ТС]
Решил вот таким образом:
Python
1
2
3
4
    unique,pos = np.unique(A,return_inverse=True)
    counts = np.bincount(pos)                     
    maxsort = counts.argsort()[::-1]
    sorted = ((unique[maxsort],counts[maxsort]))
Но к большому сожалению, данный код работает очень медленно. Есть варианты как можно это исправить?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
27.05.2020, 11:10
После bincount надо продолжить тем, что взять counts > 1. Ну а там - по собстоятельствам, я так в итоге и не понял, что нужно, а именно - какие "остальные" и куда денутся повторяющиеся.

Добавлено через 12 минут
Python
1
2
3
4
5
6
7
8
9
10
import numpy as np
arr = [604, 546, 546, 75, 14, 8, 6, 2, 1, 0, 0]
print("unique", np.unique(arr))
counts = np.bincount(arr)
print("bincount", counts)
n = len(counts)
print("n", n)
r = np.arange(n)
print(r[counts>1])
print(r[counts==1])
При этом стоит иметь в виду, что bincount - жоркая до памяти функция. Но если максимум небольшой - то можно.
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
27.05.2020, 11:35
Странная задача. Это условие которое вам выдали или пересказ?
0
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
28.05.2020, 02:05  [ТС]
dondublon, Большое спасибо за ответ. Понял что можно не использовать unique. Но все равно не до конца понял как реализовать мою задачу. Пока имею вот такой код:
Python
1
2
3
4
5
import numpy as np
arr = [23, 10, 2, 10, 2, 2, 14]
counts = np.bincount(arr)
maxsort = counts.argsort()[::-1]
sorted_arr = ((maxsort,counts[maxsort]))
На выходе получаю: (array([ 2, 10, 23, 14, 1, 3, 4, 5, 6, 7, 8, 9, 11, 22, 12, 13, 15,
16, 17, 18, 19, 20, 21, 0], dtype=int64), array([3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0], dtype=int64))
А хочу: [2, 10, 23, 14] [3, 2, 1, 1]
Подскажите пожалуйста как это можно сделать. Очень важна скорость этой сортировки.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
28.05.2020, 09:30
vpip75pfr3, по поводу задачи - я же объяснил, что задача пока непонятна.
В любом случае, я вам привёл, как отделить повтряющиеся значения от неповторяющихся. А уж с ними вы можете делать что хотите - сортировать, к примеру. Я думаю, все будет вполне быстро.
1
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
28.05.2020, 22:54  [ТС]
dondublon, Попробую еще раз объяснить)
На вход поступает массив с цифрами, необходимо вывести 2 массива, в первом вначале идут значения отфильтрованные по наиболее часто встречающихся и по убыванию, а во втором массиве написано какое кол-во раз встречается цифра из первого массива.
Ввод: [23, 10, 2, 10, 2, 2, 14]
Вывод: [2, 10, 23, 14] [3, 2, 1, 1] Так как двойка встречается чаще чем другие цифры, то она первая. Если бы в массиве было 3- десятки, то в начале шли бы 10, а потом уже 2.
В первом моем варианте, все это делается, но очень медленно.
В последнем печатаются лишние цифры.
К сожалению, из за моего низкого уровня программирования, у меня не получилось воспользоваться Вашим кодом.
Буду очень благодарен, если Вы мне поможете с моим.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
29.05.2020, 14:38
Цитата Сообщение от vpip75pfr3 Посмотреть сообщение
в первом вначале идут значения отфильтрованные по наиболее часто встречающихся и по убыванию,
Простите, а вы сами своё объяснение читали?

По какому признаку фильтровать? Что значит по "наиболее часто встречающихся"? Частота здесь - это доля появлений в массиве или абсолютное число появлений?
Напомню, вначале речь шла вообще о повторяемости. На мой взгляд, это значит, что встречается 2 или более раз.

По убыванию чего? Частоты? Или самих чисел? В первоначальном вопросе по убыванию требуется отсортировать некие "остальные". Теперь этого нет. Что в итоге сортируем?

Если вам надо отсортировать по частоте появления - так и скажите. Это будет элементарная, но понятная задача, которую вы сможете потом дополнить до вашей цели.

Добавлено через 12 минут
Python
1
np.sort(a.view('i4,i4'), order=['f1'], axis=0).view(np.int)
Эта операция сортирует массив из двух колонок по одной из них. Источник https://stackoverflow.com/ques... -by-column .

Добавлено через 2 минуты
Python
1
2
print(r[counts>1], counts[r[counts>1]])
print(r[counts==1], counts[r[counts==1]])
Модификация того решения - вместе с повторяющимися числами выдаёт, сколько раз они встречаются.

Для того, чтобы"слепить" вместе две колонки, используйте np.column_stack.

Ну, теперь у вас есть все ингредиенты. Творите

Добавлено через 2 часа 20 минут
Порядок операций.
1. Получить частоту каждого числа. См. фрагмент
Python
1
2
print(r[counts>1], counts[r[counts>1]])
print(r[counts==1], counts[r[counts==1]])
2. "Слепить" две колонки - сами числа и их частоты.
3. Отсортировать. Для этого во фрагмент
Python
1
np.sort(a.view('i4,i4'), order=['f1'], axis=0).view(np.int)
добавляем order=['f1', 'f0']. Где fn, очевидно, номер колонки. Да, я согласен, тут сортировка не очень очевидна, но уж как есть.
2
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
29.05.2020, 14:47  [ТС]
dondublon, Вот эта сортировка очень медленная. 3 сек за 100 000 итераций.
Python
1
np.sort(a.view('i4,i4'), order=['f1'], axis=0).view(np.int)
Вот эта 0,57с. за 100 000:
Подскажите пожалуйста как из нее убрать лишние цифры.

Python
1
2
3
4
5
import numpy as np
arr = [23, 10, 2, 10, 2, 2, 14]
counts = np.bincount(arr)
maxsort = counts.argsort()[::-1]
sorted_arr = ((maxsort,counts[maxsort]))
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
29.05.2020, 16:43
vpip75pfr3, возможно, в ходе первой идут какие-то преобразования внутри view, я точно не в курсе.
У вас какой тип входного массива?
Но если вам нужна двойная сортировка, то деваться особо некуда.
1
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
29.05.2020, 16:52  [ТС]
dondublon, Тип массива- <class 'list'>. Если Вы про это)
В целом мой последний вариант работает. Просто меня немного смущает, что по длинному циклу бегает массив, где больше половина значений мне не нужна)
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
29.05.2020, 17:28
vpip75pfr3, но если у вас list, это уже не numpy. Должен быть numpy.ndarray.
0
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
30.05.2020, 11:38  [ТС]
dondublon, Спасибо за помощь!
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
31.05.2020, 10:35
vpip75pfr3, обращайтесь.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
31.05.2020, 11:29
и зачем тут numpy?
Python
1
2
3
4
5
from collections import Counter
arr = [23, 10, 2, 10, 2, 2, 14]
d = dict(sorted(Counter(arr).items(), key=lambda x: x[1], reverse=True))
print(*d.keys())
print(*d.values())
у меня на 100_000 элементов в среднем 0.07 секунд формируется словарь.
1
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
31.05.2020, 12:53  [ТС]
eaa, Спасибо, большое за помощь это именно то, что нужно. Только не понимаю, почему у Вас это делается с такой скоростью) У меня с Вашим кодом обрабатывается за 1.19s
Python
1
2
3
4
5
6
7
8
9
10
from collections import Counter
from time import perf_counter
arr = [23, 10, 2, 10, 2, 2, 14]
x = 0
t1_start = perf_counter() 
while x < 100000:
    x+=1
    d = dict(sorted(Counter(arr).items(), key=lambda x: x[1], reverse=True))
t1_stop = perf_counter()
print(round(t1_stop-t1_start, 2), 's')
А вот этот вариант за 0,57
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from time import perf_counter
import numpy as np
arr = [23, 10, 2, 10, 2, 2, 14]
 
 
x = 0
t1_start = perf_counter() 
while x < 100000:
    x+=1
    counts = np.bincount(arr)
    maxsort = counts.argsort()[::-1]
    sorted_arr = ((maxsort,counts[maxsort]))
 
t1_stop = perf_counter()
print(round(t1_stop-t1_start, 2), 's')
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
31.05.2020, 13:25
я проверял количество элементов в arr 100 тыс, а не 100 тыс запусков.
0
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
31.05.2020, 14:06  [ТС]
eaa, Запустил Ваш код в pycharm, ускорение в 4 раза по сравнению с VS.)
Большое спасибо, но все же вариант с numpy чуть быстрее)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
31.05.2020, 14:10
dict в 3й строке можно убрать и оставить список из кортежей, будет еще прибавка.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
31.05.2020, 21:25
vpip75pfr3, внимание, этот вопрос ещё никто не задавал. Какой интервал значений в вашем массиве на 100к элементов? Судя по документации numpy.bincount
The number of bins (of size 1) is one larger than the largest value in x.
Делаю вывод что это сортировка подсчётом. Самая быстрая из мне известных, но у неё есть ограничение связанное с задаваемым вопросом.

Если у вас задача выучить numpy, тогда, пожалуй, у вас уже есть решение. Но алгоритм такой себе, мягко говоря. Задачу легко сделать простой структурой данных и одним проходом по numpy массиву. Так как в numpy данные занимают меньше памяти и к ним быстрее доступ чем к пинотовским объектам, загонять весь массив в collections.Counter - кощунство, по хорошему, надо его обрезать до нужных размеров и не хранить лишнего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.05.2020, 21:25
Помогаю со студенческими работами здесь

Почему стандартный list быстрее массива Numpy?
Простой тест: import numpy as np import time fields = fields2 = np.array() time1 = time.time() i = 0

Индекс максимального значения двумерного массива NumPy
Добрый день! Нужно найти индекс столбца и колонки массива для максимального значения. Пересмотрел все форумы, так и не нашел ответа....

Векторизация массива в numpy
Есть массив numpy, который содержит номера классов 1,2,3 необходимо представить эти классы в следующем виде: 1= 2= 3= Внизу массив...

Векторизация массива numpy
Есть массив numpy, который содержит номера классов 1,2,3 необходимо представить эти классы в следующем виде: 1= 2= 3= Внизу массив...

Сортировка массива каждым из 3 способов (пузырьковая сортировка, сортировка выбором, сортировка вставкой)
1. Напишите программу, которая выполняет следующие функции: • заполнение элементов массива вещественными числами с заданной ...


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

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