Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146

Преобразование "двухмерного" tuple в numpy array

28.08.2022, 09:00. Показов 2268. Ответов 13

Студворк — интернет-сервис помощи студентам
Всем привет, пытаюсь решить такую проблему:
Получаю из БД кортеж в таком виде - [(6309591266,), (2878946108,), (6939697459,), (5307832590,)]
Хочу преобразовать этот кортеж в numpy array, но функция типа numpy.asarray() возвращает мне двухмерный массив, а мне нужен одномерный.
Решил проблему "в лоб" таким способом:
Python
1
2
3
4
5
6
7
        blacklist = DB.get_blacklist()  # получаем наш кортеж
        banned_users = np.empty(len(blacklist), dtype=np.int64)  # инициируем массив под заданный размер
        index = 0
        for one_user in blacklist:
            user_id, *_ = one_user   # извлекаем нужное значение из кортежа
            banned_users[index] = user_id   # вставляем значение в массив
            index+=1  # продвигаем индекс
Результат - своих целей я достигаю, но код выглядит не очень, ищу более элегантное решение.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.08.2022, 09:00
Ответы с готовыми решениями:

Numpy array
Пытаюсь разобраться с такой штукой, как numpy. Вот что-то не очень получается с ним работать.. Напишите функцию, принимающую на вход...

Memory Error in numpy array
Добрый день! Подскажите, пожалуйста: моя программа обрабатывает порядка 100 текстов, строя из расcчитанных из них характеристик матрицу: ...

Как сохранить QTableWidget в Numpy Array?
Здравствуйте. Собственно, сабж: может кто-нибудь знает каким образом можно сохранить tablewidget в массив numpy ? Нужно строить граф с...

13
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
28.08.2022, 09:13
Це?
Python
1
n = np.array(sum(map(list, blacklist), []))
2
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
28.08.2022, 09:23
vkiper, два варианта:
Python
1
2
3
4
5
6
7
8
import numpy as np
blacklist=[(6309591266,), (2878946108,), (6939697459,), (5307832590,)]
#1
banned_users=np.squeeze(np.asarray(blacklist))
print(banned_users)
#2
banned_users=np.ravel(np.asarray(blacklist))
print(banned_users)
6
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146
28.08.2022, 09:53  [ТС]
Ура, все варианты работают, спасибо!
Потом чуть позже сделаю симуляцию на пару миллионов ID, выберу кто из них быстрее бежит, отпишусь здесь.
Всем 10х
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
28.08.2022, 09:55
Python
1
2
3
#3
banned_users=np.asarray(blacklist).reshape(-1)
print(banned_users)
Совет: не используйте for, если работаете с Numpy, Pandas etc.
1
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146
28.08.2022, 22:06  [ТС]
Итак, сделал тесты, отписываюсь.

Первый метод:
Python
1
n = np.array(sum(map(list, blacklist), []))
на 10,000 показал вот столько: 0.2501349449157715 seconds
на 50,000 вот столько: 6.3473570346832275 seconds
на 100,000 я понял, что не дождусь...
Как я понял, это из-за многочисленного преобразования коллекций, да еще на чистом Питоне, без "ускорителей".
Следующие методы делал на 1000,000 элементов:
Python
1
banned_users=np.squeeze(np.asarray(blacklist))
результат: 0.2998199462890625 seconds

Python
1
banned_users=np.ravel(np.asarray(blacklist))
результат: 0.29184722900390625 seconds

Python
1
banned_users=np.asarray(blacklist).reshape(-1)
результат: 0.298811674118042 seconds

По факту результаты отличаются на стат. погрешность.

Вот код если кто захочет повторить:
Python
1
2
3
4
5
6
7
8
9
10
11
        blacklist = []
        for num in range(1000_000):
            _ud = random.randint(1041950320, 9941950000)
            blacklist.append((_ud,))
        start_time = time.time()
        #banned_users = np.array(sum(map(list, blacklist), []))
        #banned_users = np.squeeze(np.asarray(blacklist))
        #banned_users = np.ravel(np.asarray(blacklist))
        banned_users = np.asarray(blacklist).reshape(-1)
        end_time = time.time()
        print(f"--- {end_time - start_time} seconds ")
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
29.08.2022, 07:35
vkiper, Вот так не быстрее?
Python
1
2
3
4
5
6
7
8
9
10
import random
import numpy as np
import time
blacklist=[(randint(1041950320, 9941950000   ),) for i in range(1000_000)]
 
start_time = time.time()
iter1=(i[0] for i in arr)
banned_user=np.fromiter(iter1, dtype=np.int64);
end_time = time.time()
print(f"--- {end_time - start_time} seconds ")
0
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146
29.08.2022, 20:29  [ТС]
start_time = time.time()
iter1=(i[0] for i in arr)
banned_user=np.fromiter(iter1, dtype=np.int64);
end_time = time.time()
Замерил несколько раз, результат вокруг этой цифры:
0.5966732501983643 seconds
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
29.08.2022, 20:35
vkiper, странно... у меня с fromiter в 2.5..3 раза быстрее.. причем и на компьютере, и на телефоне..
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from  random import randint
import numpy as np
import time
blacklist=[(randint(1041950320, 9941950000   ),) for i in range(1000_000)]
 
start_time = time.time()
iter1=(i[0] for i in blacklist)
banned_user=np.fromiter(iter1, dtype=np.int64);
end_time = time.time()
print(f"--- {end_time - start_time} seconds ")
 
 
start_time = time.time()
#banned_users = np.array(sum(map(list, blacklist), []))
#banned_users = np.squeeze(np.asarray(blacklist))
#banned_users = np.ravel(np.asarray(blacklist))
banned_users = np.asarray(blacklist).reshape(-1)
end_time = time.time()
print(f"--- {end_time - start_time} seconds ")
может версия numpy у вас старая...?
0
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146
30.08.2022, 11:43  [ТС]
numpy version 1.23.2
Поставил только что на чистом компе

Результаты по тесту, три повтора:
0.7432808876037598 seconds
0.5274021625518799 seconds
0.576697587966919 seconds
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
30.08.2022, 15:08
vkiper, еще вопрос: какая у вас версия Python? У меня 3.10.5 на телефоне. И с fromiter 1сек, без - 2.5 сек.
0
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146
30.08.2022, 16:17  [ТС]
vkiper, еще вопрос: какая у вас версия Python? У меня 3.10.5 на телефоне. И с fromiter 1сек, без - 2.5 сек.
3.10.6
Работаю с PyCharm
Комп Dell ноут, Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
30.08.2022, 19:46
vkiper, у меня на ноутбуке мой код из Преобразование "двухмерного" tuple в numpy array :
i5-7300hq 2.5 GHz
--- 0.09574460983276367 seconds (banned_user=np.fromiter(iter1, dtype=np.int64))
--- 0.27922487258911133 seconds (np.asarray(blacklist).reshape(-1))
0
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146
30.08.2022, 22:31  [ТС]
интересный результат... но объяснить вряд ли смогу, может как-нибудь будет чуть больше времени провести еще эксперименты
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.08.2022, 22:31
Помогаю со студенческими работами здесь

Сравнение значений числового ряда numpy.array
Добра! Код: import pandas as pd car = {'A': , 'B': , 'C': , 'D': } df_car = pd.DataFrame(data=car) b = np.array(df_car) ...

Как вывести запятую во множестве array numpy
data = , , , , , , , , , , , , ] import numpy as np def preprocess_data(data): data_1 = np.array(data) data_dat1 =...

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

Ошибки при работе с переменными типа list и np.array(NumPy библотека)
Есть переменная train типа лист, которая содержит 2 элемента - массив картинок и массив меток. Я пытался в переменную X записать массив...

Как получить график спектра (преобразование Фурье, NumPy)
Всем привет! Вопрос может показатся глупым, но, тем не менее, мне не удалось найти внятного объяснения в интернете. Есть массив фаз...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
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. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru