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

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

26.05.2020, 15:39. Показов 5448. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru