Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127

Преобразовать данные в массив

10.01.2020, 11:46. Показов 4059. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть список [5;3;0; 9;6;3; 7;6;4; 11;8;5; 15;12;10]
В этом списке 5 троек данных. Каждая тройка представляет собой максимальное, установившееся и минимальное значения.
Данный список нужно преобразовать в двумерный массив. По горизонтали - кол-во пар (5), по вертикали значения (к примеру 11).
Получается окно 10х5.
Рассмотрим первую пару (5;0) - первый столбец матрицы должен выглядеть (1;1;1;0.5;1;1;0;0;0;0;0), значения от максимума до минимума заполняем - 1, кроме установившегося, которое равно 0.5, все что не вошло - 0.

Сложность заключается в том, что значения могут выходить за пределы окна (11), нужно вписать список троек в это окно по такому правилу:
1. Если значения в списке не выходят за пределы окна, то просто вписываем.
2. Если значения в списке выходят за пределы окна:
В этом случае ориентируемся на последнее установившееся значение, в данном примере 12. Размер окно у нас 10, делим окно пополам и помещаем туда точку 12. Сморим выходят ли максимум и минимум за эти пределы: 15-12=3 (верхняя граница),
12-0=12 (нижняя граница). Верхняя граница не выходит, это будет точка максимума окна, минимум будет равен 15-10=5
Если бы и максимум и минимум вышли за пределы 1\2 окна, то вписали бы просто 5 значений вверх и 5 вниз.
Если объяснить простым языком, у нас есть картинка какого-то размера(NxM), берем окно размером по горизонтали (M), а по вертикале размером 11 и накладываем на картинку.

Добавлено через 8 минут
Ошибся - окно размером 11х5
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2020, 11:46
Ответы с готовыми решениями:

Как преобразовать данные из JSON в обычный массив
Всем привет! Есть данные в формате JSON: {'time': 1618977514201, 'price': '0.31350000', 'quantity': '127.00000000'} нужно...

Массив: Как строчные данные заданного формата преобразовать в массив с такой же структурой?
Есть строка с таким содержимым: , , , , ... , ]

Как преобразовать данные файла в массив?
Здравствуйте.Столкнулся с такой проблемой при решении поставленной мною задаче. У меня имеется файл(я добавляю в него записи): Допустим...

33
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
11.01.2020, 19:22  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Для первой картинки:
Для первой работает норм.
А дальше как, делать такие модули для каждого случая и по условию выполнять?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
11.01.2020, 19:28
Там всего ветвление дописать. Если нужно обрезать с двух сторон или наоборот добить нулями.
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
12.01.2020, 14:44  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Там всего ветвление дописать.
У меня на вход прилетает пачка (batch) списков, допустим 5 штук. Код должен принять эти 5 списков и выплюнуть 5 массивов. Можно ли как-то придумать в моем случае такое решение?
Получается, что прежде чем мне обработать входные данные, мне нужно с помощью условия определить сырой массив больше или меньше моего окна, если меньше, то добиваем нулями, если больше, то смотрим последний столбец, далее смотрим в какую сторону (вверх, вниз или в обе стороны больше)...
Вся засада именно в этом, как мне процесс распараллелить.
Раньше я легко это решал с помощью функций zip(map), но условия изменились.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
13.01.2020, 11:35  [ТС]
По поводу пачек, я думаю решу вопрос, пока делал так
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
import numpy as np
ls = [[5,3,0, 9,6,3, 7,6,4, 11,8,5, 15,12,10],[5,3,0, 9,6,3, 15,13,10, 11,8,5, 7,6,4]]
def func(ls):
    window = 11
    ls2 = [(ls[i+2], ls[i+1], ls[i]) for i in range(0, len(ls), 3)]
    result = np.zeros((len(ls2), max(ls)+1))
    for i, (mi, cur, ma) in enumerate(ls2):
        result[i][mi:ma+1] = 1
        result[i][cur] = 2
    result2 = result.T
    print(result2, result2.shape)
    zero = np.nonzero([2 in row for row in result2])[0][-1]  # todo
    print(zero)
    half = window // 2
    if zero + half > result2.shape[0]:
        result2 = result2[-window:]
    else:
        raise NotImplementedError
    #print(result2, result2.shape)
    return result2
 
 
y=list(map(func, ls))
print(y)
В функцию func добавлю ветвление, должно правильно отрабатывать

Но есть одна непонятка. первый список отрабатывает правильно (значение zero=12, а второе не правильно, zero считает не по последнему столбцу, а по третьему... получается она ищет столбец, где значение 2 наибольшее, что не верно. Нужно искать только в последнем столбце

Code
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
28
29
30
31
32
33
34
[[1. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [2. 1. 0. 0. 0.]
 [1. 1. 1. 0. 0.]
 [1. 1. 1. 1. 0.]
 [0. 2. 2. 1. 0.]
 [0. 1. 1. 1. 0.]
 [0. 1. 0. 2. 0.]
 [0. 1. 0. 1. 0.]
 [0. 0. 0. 1. 1.]
 [0. 0. 0. 1. 1.]
 [0. 0. 0. 0. 2.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]] (16, 5)
12
[[1. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [2. 1. 0. 0. 0.]
 [1. 1. 0. 0. 1.]
 [1. 1. 0. 1. 1.]
 [0. 2. 0. 1. 2.]
 [0. 1. 0. 1. 1.]
 [0. 1. 0. 2. 0.]
 [0. 1. 0. 1. 0.]
 [0. 0. 1. 1. 0.]
 [0. 0. 1. 1. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 2. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0.]] (16, 5)
13
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.01.2020, 11:37
Цитата Сообщение от slavavs Посмотреть сообщение
получается она ищет столбец, где значение 2 наибольшее, что не верно. Нужно искать только в последнем столбце
Так это намного проще!
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
13.01.2020, 11:44  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Так это намного проще!
Python
1
zero = np.nonzero([2 in row for row in result2])[0][-1]  # todo
Я не могу понять эту строчку, как она работает
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.01.2020, 11:48
Я тоже Раньше она возвращала индексы всех элементов, равных 2.

Добавлено через 1 минуту
Цитата Сообщение от slavavs Посмотреть сообщение
Нужно искать только в последнем столбце
Тебе индекс уже известен. Вот он:
Code
1
2
[5,3,0, 9,6,3, 15,13,10, 11,8,5, 7,6,4]
                                   ^
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
13.01.2020, 11:51  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Тебе индекс уже известен. Вот он:
Блин, ну в этом случае известен, следующий список будет с другим индексом)))
Подскажи, как взять индекс в последнем столбце со значением 2
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.01.2020, 11:55
Я тебе говорю, что нужное значение есть во входных данных.

Но ты всегда можешь потратить процессорное время на поиск:
Python
1
2
3
>>> ls = [0,0,0,1,1,1,2,1,1,0]
>>> ls.index(2)
6
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
13.01.2020, 12:34
slavavs, сорри, что вклиниваюсь с опозданием.
Такие вещи хорошо делать на numpy - по настоящему. Рыжий Лис, при всём уважении, формально подключает numpy, но не использует его возможности.
Изменение размерности массива с сохранением общего размера (типа 15x1 -> 5x3) делается через функцию reshape.

Добавлено через 3 минуты
"Обрезка" массивы делается через индексацию.
Python
1
new_arr = old_arr[:N, :M]
или как-то так.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.01.2020, 12:36
Оно смысла большого нет:
Python
1
2
ls = np.array([5,3,0, 9,6,3, 7,6,4, 11,8,5, 15,12,10])
print(ls.reshape((-1, 3)))
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
13.01.2020, 15:37  [ТС]
Глянь что я тут наворотил, в принципе вроде все работает, может можно что-то улучшить, ускорить?

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import numpy as np
#ls = [[5,3,0, 10,6,3, 7,6,4, 11,8,5, 15,12,10],[5,3,0, 9,6,3, 7,5,1, 9,8,5, 7,6,4]]
ls = [[15,12,10, 10,6,3, 7,6,4, 11,8,5, 8,7,0],[5,3,0, 7,6,3, 5,3,1, 8,7,5, 6,5,4]]
def func(ls):
    window = 11
    if max(ls) > 10:
        ls2 = [(ls[i+2], ls[i+1], ls[i]) for i in range(0, len(ls), 3)]
        result = np.zeros((len(ls2), max(ls)+1))
        for i, (mi, cur, ma) in enumerate(ls2):
            result[i][mi:ma+1] = 1
            result[i][cur] = 2
        result2 = result.T
        print(result2, result2.shape)
        zero_up = ls[-2]
        zero_down = max(ls) - zero_up
        half = window // 2
        if zero_down < half:
            result2 = result2[-window:]
        elif zero_up < half:
            result2 = result2[:window+1]
        else:
            result2 = result2[zero_up-half:zero_up+half+1]
            #raise NotImplementedError
        print(result2, result2.shape)
        return result2
    
    elif max(ls) == window:
        ls2 = [(ls[i+2], ls[i+1], ls[i]) for i in range(0, len(ls), 3)]
        result = np.zeros((len(ls2), max(ls)+1))
        for i, (mi, cur, ma) in enumerate(ls2):
            result[i][mi:ma+1] = 1
            result[i][cur] = 2
        result2 = result.T
        print(result2, result2.shape)
    else: #if max(ls) < window
        ls2 = [(ls[i+2], ls[i+1], ls[i]) for i in range(0, len(ls), 3)]
        result = np.zeros((len(ls2), window))
        for i, (mi, cur, ma) in enumerate(ls2):
            result[i][mi:ma+1] = 1
            result[i][cur] = 2
        result2 = result.T
        print(result2, result2.shape)
 
y=list(map(func, ls))
Добавлено через 56 минут
Получил я на выходе массив двумерный (result2). Как мне строки теперь перевернуть? типа реверс строк сделать.

Добавлено через 14 минут
Вроде вот это работает
Python
1
result2[::-1]
Добавлено через 30 минут
Цитата Сообщение от dondublon Посмотреть сообщение
Рыжий Лис, при всём уважении, формально подключает numpy
При всем уважении к Вам, Рыжий Лис единственный, как мне кажется, кто отвечает развернуто всегда.
Numpy действительно хорошая библиотека, но как тут ее применить?
Цитата Сообщение от dondublon Посмотреть сообщение
(типа 15x1 -> 5x3)
Это вроде у меня не применяется. Я создаю нулевой массив, заполняю его, далее транспонирую и переворачиваю.
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
13.01.2020, 15:41
slavavs, ну, я посоветовал в соответствии с изначальным заданием:
Данный список нужно преобразовать в двумерный массив. По горизонтали - кол-во пар (5), по вертикали значения (к примеру 11).
Получается окно 10х5.
Наше дело - предложить.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
13.01.2020, 15:45  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Наше дело - предложить.
Я понял, спасибо. Просто вы не совсем въехали в задачу, тут писанины много получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2020, 15:45

Преобразовать данные DataTable в массив строк
Есть программа с одним TextBox. Мне надо было реализовать раскрывающийся список этого TexBox'а. Сделал с помощью цикла. Но программа...

Массив: Преобразовать массив, прибавив к четным числам, входящим в массив, значение первого элемента.
Есть задача С клавиатуры вводятся элементы целочисленного массива размера N. Преобразовать его, прибавив к четным числам, входящим в...

В массив выводить данные-id клиента, данные серверу и данные, отправленные сервером
Здравствуйте. Имеется клиент-серверное приложение, вопрос по стороне сервера. Имеется backgroundworker-bw_clientReceining: ...

JSON, преобразовать данные
Есть JSON-объект: { &quot;22&quot; : , &quot;34&quot; : } нужно преобразовать к виду: {

Преобразовать данные столбца
Здравствуйте! есть такая таблица: customerid, address и исправленный address Нужно в последнем столбце удалить цифры и знаки...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru