Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33

Разреженные матрицы

01.11.2021, 10:08. Показов 5551. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня имеется разреженная матрица (файл New.xlsx). Добавляю файл для чтения в Python.
Python
1
2
import pandas as pd
data = pd.read_excel('/Users/yana/PycharmProjects/SVM/iris/New.xlsx')
Мне необходимо сделать хранение данной матрицы как список списков. То есть необходимо идти по каждому столбцу и хранить только ненулевые элементы, а эти элементы состоят из трех компонент: номер строки, значение элемента, адрес следующего ненулевого компонента.

Подскажите, как организовать это все..
Вложения
Тип файла: xlsx New.xlsx (982.2 Кб, 14 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2021, 10:08
Ответы с готовыми решениями:

Разреженные матрицы
В теме https://www.cyberforum.ru/python-tasks/thread2893251.html была решена задача хранения матрицы (ответ выбран лучшим решением)....

Разреженные матрицы
Матрица называется разрежённой, если только относительно небольшое количество её элементов отлично от 0. В этом случае можно хранить...

Разреженные матрицы
Ребят у меня вопрос! Если я хочу перемножить разреженные матрицы, то мне пользоваться классическим алгоритмом? Просто в разреженных...

34
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
01.11.2021, 12:11
yana111, А не лучше через pandas сохранить в numpy массив. Затем "конвертировать" ненулевые значения (nonzero) в словарь, где ключи - индексы элемента, значения - значение элемента?
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
01.11.2021, 12:42  [ТС]
Gdez,
Конвертировала в numpy:
Python
1
2
3
4
import pandas as pd
 
data = pd.read_excel('/Users/yana/PycharmProjects/SVM/iris/New.xlsx')
my_data = data.to_numpy()
Но условие строго, что необходимо хранить списком (как показано на фото 1), потому что потом необходимо добавлять, удалять и находить элементы, работая с данным списком.
Примерно должен быть такой список (фото 2).
Поэтому не очень пойму, поможет ли здесь numpy.
Миниатюры
Разреженные матрицы   Разреженные матрицы  
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
01.11.2021, 13:33
yana111, Я это имел ввиду (если именно списком)
Python
1
A = [[0, 51], [3, 0.5], [4, 1.5], [5, 31], [9, 16], [11, 8], [14, 7.6], [15, 99]]
Здесь хранение 2*t, в условии 3*t.
Первые элементы - индексы "плоского" списка, которые при "развертывании" массива в двумерный преобразуются в двумерные индексы -> divmod(ind, _count_columns)
А так, понял - у Вас задание - написать код именно по алгоритму, выложенному в условии...
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
01.11.2021, 14:56  [ТС]
Gdez, Да хранение 3*t.
Все верно, мне необходимо написать код по упаковке матрицы в виде этого списка, состоящего из 3 компонент.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
01.11.2021, 19:03
yana111, так?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
import numpy as np
 
arr = pd.read_excel('New.xlsx').to_numpy()
non_zero_arr = np.nonzero(arr)
 
res = np.concatenate(([non_zero_arr[0]], [arr[non_zero_arr]], [non_zero_arr[1]]),0).T
res = res[res[:,2].argsort()]
c = np.arange(103, non_zero_arr[0].shape[0]*3+103, 3).reshape(-1,1)
res = np.concatenate((res, c),1)
res[:, 3] = np.where(res[:,2] == np.roll(res[:, 2],-1), res[:, 3], 0)
res = res[:,[0,1,3]].tolist()
 
print(res)
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
02.11.2021, 11:32  [ТС]
Gdez, программа верна почти во всем, кроме тех вариантов, когда несколько элементов в одном столбце
Если рассматривать мой файл результат должен быть таким:
[183, 1, 0], [128, 1, 156], [156, 1, 0], [55, 1, 0], [10, 1 , 12], [12, 1, 253], [253, 1, 0] и тд.
Мне необходимо идти с первой строки, а не с последней
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
02.11.2021, 13:39
yana111, В задании с картинки говорится о проходе по столбцам, начиная с первого (набери вручную текст с картинки - покажу, где...)

Добавлено через 1 минуту
В Вашем примере "совпало" расположение первого элемента массива - первая строка и первый столбец.
Ниже (на картинке №2) "таблица прохода" (100,101,102,103 и тд) - в ней порядок значений элементов по столбцам с первого столбца.
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
02.11.2021, 14:39  [ТС]
Gdez, если рассматривать на втором столбце, то должно быть [128, 1, 156], [156, 1, 0], а выдает то, что показано на изображении, то есть я понимаю что рассматривание идет с конца столбца, а необходимо сначала.
Миниатюры
Разреженные матрицы  
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
02.11.2021, 14:57
Лучший ответ Сообщение было отмечено yana111 как решение

Решение

yana111, сортировку не до конца сделал...
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd
import numpy as np
 
arr = pd.read_excel('New.xlsx').to_numpy()
non_zero_arr = np.nonzero(arr)
 
res = np.concatenate(([non_zero_arr[0]], [arr[non_zero_arr]], [non_zero_arr[1]]),0).T
 
##########
res = np.array(sorted(res, key=lambda x: (x[2], x[0])))
##########
 
c = np.arange(103, non_zero_arr[0].shape[0]*3+103, 3).reshape(-1,1)
res = np.concatenate((res, c),1)
 
res[:, 3] = np.where(res[:,2] == np.roll(res[:, 2],-1), res[:, 3], 0)
res = res[:,[0,1,3]].tolist()
 
print(res)
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
02.11.2021, 15:03  [ТС]
Gdez, возможно, уже я сама запуталась, но разве вместо выделенных значений не должны быть:
[128, 1, 156]
[10, 1 , 12]
[12, 1, 253]
Миниатюры
Разреженные матрицы  
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
02.11.2021, 15:24  [ТС]
Gdez, да, это моя ошибка, а у вас все верно, это ж просто индексы, а не номер следующей строки
Спасибо!
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
02.11.2021, 15:25
yana111, первые восемь элементов отсортированного массива

[100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
[183...1...0 ] [128...1...1 ] [156...1...1 ] [ 55...1...2 ] [ 10...1...3 ] [ 12...1...3 ] [253...1...3 ] [247...1...4 ]
...............0...............106...... .........0.................0............ ...115............118...............0... ...............0

Первый 0 - потому что следующий элемент уже в следующем столбце (номер столбца - третий элемент в подсписке)
106 - третьи элементы подсписков равны - в одном столбце
0 - третьи элементы подсписков не равны
0 - третьи элементы подсписков не равны
115, 118 - "...равны..."
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
02.11.2021, 15:29  [ТС]
Gdez, спасибо большое! Все теперь абсолютно стало понятно!
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
08.11.2021, 14:56  [ТС]
Gdez, подскажите, если знаете, как добавить в программу, чтобы находить различные элементы, например, элемент, содержащийся во 2 строке и 3 столбце (используя новую матрицу) и другие.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
08.11.2021, 17:41
yana111, первый ноль (в третьей позиции подсписка) - последний элемент первого столбца с индексом "0". Если в примере индексация с "0", то нужно искать "1" на первой позиции подсписка между третьим "0" и четвертым "0" в третьей позиции подсписка -> в коде наверно будет так:
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
res = [
        [183, 1, 0], # закончился первый столбец
        [128, 1, 156],
        [156, 1, 0], # закончился второй столбец
        [1, 1, 0], #закончился третий столбец
        [1, 1 , 12],
        [12, 1, 253],
        [253, 1, 0] # закончился четвертый столбец
        ]
n = len(res)
row = 2 - 1 # -1 потому что индексация с "0"
col = 3 - 1
 
# если такого элемента в res нет - значит 
# элемент массива arr нулевой
val = 0
 
# находим индексы в res последних ненулевых
#  элементов в столбцах 
ind = [k for k in range(n) if res[k][2] == 0]
if col <= ind[-1]:
    # находим в срезе индекс элемента 
    # со значением, равным row на первой позиции в res
    ########
    # условие - для случая, когда
    # в первом столбце один ненулевой элемент
    i1 = 0 if ind[col] == 0 else ind[col-1]
    i2 = ind[col] + 1
    
    i = [k for k in range(i1, i2) if res[k][0] == row]
        
    if len(i):
        val = res[i[0]][1]
 
print(val)
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
09.11.2021, 00:40  [ТС]
Gdez, а если мне нужно найти абсолютно любой элемент. Я исправила, но находит не все элементы верно (например, 4 столбец находит и 11, и 12, и 13, и 14 строки, хотя там только 11 и 13). Где ошибка может быть?

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
import pandas as pd
import numpy as np
 
arr = pd.read_excel('New.xlsx').to_numpy()
non_zero_arr = np.nonzero(arr)
 
res = np.concatenate(([non_zero_arr[0]], [arr[non_zero_arr]], [non_zero_arr[1]]), 0).T
res = np.array(sorted(res, key=lambda x: (x[2], x[0])))
c = np.arange(3, non_zero_arr[0].shape[0] * 3 + 3, 3).reshape(-1, 1)
res = np.concatenate((res, c), 1)
res[:, 3] = np.where(res[:, 2] == np.roll(res[:, 2], -1), res[:, 3], 0)
res = res[:, [0, 1, 3]].tolist()
 
# print(res)
 
 
n = len(res)
 
row = int(input()) - 1  # -1 потому что индексация с "0"
col = int(input()) - 1
 
# если такого элемента в res нет - значит
# элемент массива arr нулевой
val = 0
 
# находим индексы в res последних ненулевых
#  элементов в столбцах
ind = [k for k in range(n) if res[k][2] == 0]
if col <= ind[-1]:
    # находим в срезе индекс элемента
    # со значением, равным row на первой позиции в res
    ########
    # условие - для случая, когда
    # в первом столбце один ненулевой элемент
    i1 = 0 if ind[col] == 0 else ind[col - 1]
    i2 = ind[col] + 1
 
    i = [k for k in range(i1, i2) if res[k][0] == row]
 
    if len(i):
        val = res[i[0]][1]
 
print(val)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
09.11.2021, 12:53
yana111, Вроде все работает:
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
45
import pandas as pd
import numpy as np
 
arr = pd.read_excel('New.xlsx').to_numpy()
non_zero_arr = np.nonzero(arr)
 
res = np.concatenate(([non_zero_arr[0]], [arr[non_zero_arr]], [non_zero_arr[1]]), 0).T
res = np.array(sorted(res, key=lambda x: (x[2], x[0])))
c = np.arange(3, non_zero_arr[0].shape[0] * 3 + 3, 3).reshape(-1, 1)
res = np.concatenate((res, c), 1)
res[:, 3] = np.where(res[:, 2] == np.roll(res[:, 2], -1), res[:, 3], 0)
res = res[:, [0, 1, 3]].tolist()
 
 
n = len(res)
val = 0
 
## проверка по срезу arr[2:4,10:20]
row_list = list(range(10, 20))
col_list = list(range(3,6))
 
ind = [k for k in range(n) if res[k][2] == 0]
 
print(res[ind[col-1]+1:ind[col]+1])
 
if col <= ind[-1]:
    
    ######################################
    for col in col_list:
        col -= 1
        for row in row_list:
            tval = val
            row -= 1
            i1 = 0 if ind[col] == 0 else ind[col - 1] + 1
            i2 = ind[col] + 1
 
            i = [k for k in range(i1, i2) if res[k][0] == row]
 
            if len(i):
                tval = res[i[0]][1]
            if tval:
                print(f'arr[{col}][{row}] = {tval}')
            else:
                print(f'arr[{col}][{row}] = {tval} элемента в res нет - значение в исходном массиве 0')
        print()
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
10.11.2021, 11:21  [ТС]
Gdez, да, теперь все находит верно. Но как именно сделать, чтоб с клавиатуры вводилось row и col и выдавалось только значение, которое там находится, а не значения всех элементов?
Python
1
2
row = int(input()) - 1
col = int(input()) - 1
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
10.11.2021, 13:47
yana111,Так (был выше код, только для i1 в конце "+1" добавил).
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
import pandas as pd
import numpy as np
 
arr = pd.read_excel('New.xlsx').to_numpy()
non_zero_arr = np.nonzero(arr)
 
res = np.concatenate(([non_zero_arr[0]], [arr[non_zero_arr]], [non_zero_arr[1]]), 0).T
res = np.array(sorted(res, key=lambda x: (x[2], x[0])))
c = np.arange(3, non_zero_arr[0].shape[0] * 3 + 3, 3).reshape(-1, 1)
res = np.concatenate((res, c), 1)
res[:, 3] = np.where(res[:, 2] == np.roll(res[:, 2], -1), res[:, 3], 0)
res = res[:, [0, 1, 3]].tolist()
 
n = len(res)
 
row = int(input()) - 1
col = int(input()) - 1
 
############################## 
val = 0
ind = [k for k in range(n) if res[k][2] == 0]
if col <= ind[-1]:
    i1 = 0 if ind[col] == 0 else ind[col - 1] + 1 # вот тут "+1" добавил
    i2 = ind[col] + 1
 
    i = [k for k in range(i1, i2) if res[k][0] == row]
 
    if len(i):
        val = res[i[0]][1]
##############################
 
print(val)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2021, 13:47
Помогаю со студенческими работами здесь

разреженные матрицы
Дана разряженная матрица общего вида и число b.На места ненулевых элементов матрицы вначале поместить все её ненулевые элементы большие b,...

Разреженные матрицы
Здравствуйте, прошу помощи, какие -нибудь примеры, которые могут натолкнуть хотя бы на правильное решение поставленной задачи. Из файла...

Разреженные матрицы
Как в ражреженной матрице найти количество различных элементов.

Разреженные матрицы
Почитал теории по разреженным матрицам, как понял это такие матрицы, где большинство элементов равны 0. Теперь пытаюсь разобраться в...

Разреженные матрицы
Даны две разреженные матрицы общего вида. Сложить их и результат занести в разреженную матрицу CSS. с меня +1)) очень нужно! спасибо...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru