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

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

01.11.2021, 10:08. Показов 5547. Ответов 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
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
11.11.2021, 14:36  [ТС]
Студворк — интернет-сервис помощи студентам
Gdez, спасибо!
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
15.11.2021, 21:16  [ТС]
Gdez, не подскажете, пожалуйста, если знаете как решить, тоже самое по этой программе необходимо добавить и удалить элемент, используя res (алгоритм на фото). Вводится с клавиатуры также как при нахождении строка и столбец.
То есть при добавлении просто увеличивается res, но указатель при добавлении меняется, а при удалении пишется только указатель.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
15.11.2021, 21:44
yana111, в топике нет фото "про добавление и удаление"...

Добавлено через 1 минуту
Сегодня уже "ночь". Будет время, завтра гляну. А, если честно, то это какой то мозговыверт
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
15.11.2021, 21:55  [ТС]
Gdez, извиняюсь, не прикрепилось
Спасибо!
Миниатюры
Разреженные матрицы  
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
16.11.2021, 08:00
Лучший ответ Сообщение было отмечено yana111 как решение

Решение

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
def search():
    k = i1 = i2 = 0
    cnt = -1
    # поиск индексов в res первого и
    # последнего элементов искомого столбца
    while cnt < col + 1:
        if res[k][2] == 0:
            cnt += 1
            if cnt == col-1:
                i1 = k + 1
            elif cnt == col:
                i2 = k + 1
                return (i1, i2)
        k += 1
    
 
#####################################
# полученный массив записал себе в input1.txt
with open('input1.txt') as f:
    lines = f.read().splitlines()
    res = []
    for line in lines:
        res.append(list(map(int, line.split())))
    #print(res)
#####################################
 
###################
# добавление элемента
row = 287 - 1 #int(input()) - 1
col = 5 - 1 #int(input()) - 1
val = 777 #int(input())
 
i1, i2 = search()
 
cnt = 0
 
# поиск предшествующей, если есть, строки 
while i1+cnt < i2:
    if res[i1+cnt][0] > row:
        t = (i1+cnt)*3
        break
    cnt += 1
 
# по идее все следующие ненулевые 
# ссылки (третийэлемент в подсписке)
# должны сместиться на "+3"
for i in range(i1+cnt, len(res)):
    if res[i][2] != 0:
        res[i][2] += 3
 
# если вставка после последнего 
# элемента в столбце:
if i2 - (i1+cnt) < 1:
    res.insert(i2, [row+1, val, 0])
    res[i2-1][2] = i2*3
# иначе
else:
    res.insert(t//3, [row+1, val, t+3])
print(res)
print()
#################
#..................................
 
 
#################
# удаление элемента
row = 128 - 1 #int(input()) - 1
col = 2 - 1 #int(input()) - 1
 
i1, i2 = search()
 
cnt = 0
# поиск строки 
while True:
    if res[i1+cnt][0] == row+1:
        res[i1+cnt] = [None, None, len(res)*3]
        break
    cnt += 1
 
print(res)
###################
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
16.11.2021, 18:32  [ТС]
Gdez, а если добавление идет не в то место, которое указано. Надо указать строку, столбец и значение, но, как показано на предыдущем фото, добавление идет просто в конец, то есть запись ведется в конец с таким же принципом: номер столбца, значение, но указатель показывает на то место, куда добавилось. Как это реализовать?
А когда удаляешь элемент, то там свободное место образуется и записывается только указатель. И после удаления, если вновь хочешь добавить элемент, то уже добавляется в место удаления, а потом уже также в конец.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
16.11.2021, 19:43
yana111, хорошо, но потом работать не будет - поиск столбцов по "их рекомендациям" идет на основе "0" в конце каждого элемента. То есть все значения элементов i-го столбца между (i-1) и (i) нулями...
Вместо insert нужно тогда append:
Python
1
res.insert(i2, [row+1, val, 0])
Python
1
res.append([row+1, val, 0])
Второй insert также исправить
Про удаление - просто убрать оба None
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
19.11.2021, 22:22  [ТС]
Gdez, спасибо огромное!
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
19.11.2021, 22:26  [ТС]
Gdez, единственное, вопрос, при удалении, возможно я не так понимаю или не то ввожу, но вот при вводе строки и столбца, элемент не удаляется?

Все, на это отвечать не надо, сглупила
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
27.11.2021, 15:21  [ТС]
Gdez, а можно ли как-то сделать, чтоб программа работала бесконечно до ее остановки?
Чтоб удаление работало не только так: удалился один элемент и можно удалять последующие только элементы, стоящие до этого элемента, но и те, которые после?
И добавление, чтоб работало не просто добавлением в конец, а если удалил элемент, то сначала добавленный элемент становился на место удаленного, а потом только в конец.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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)
 
def search_item():
    n = len(res)
    print('Введите элемент, который хотите найти (номер строки и номер стобца)')
    row = int(input()) - 1  # -1 потому что индексация с "0"
    col = int(input()) - 1
 
    # если такого элемента в res нет - значит
    # элемент массива arr нулевой
    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
        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)
 
def add_item():
    # добавление элемента
    def search():
        k = i1 = i2 = 0
        cnt = -1
        # поиск индексов в res первого и
        # последнего элементов искомого столбца
        while cnt < col + 1:
            if res[k][2] == 0:
                cnt += 1
                if cnt == col - 1:
                    i1 = k + 1
                elif cnt == col:
                    i2 = k + 1
                    return (i1, i2)
            k += 1
    print('Введите какой элемент добавить и какое значение')
    row = int(input()) - 1
    col = int(input()) - 1
    val = int(input())
 
    i1, i2 = search()
 
    cnt = 0
 
    # поиск предшествующей, если есть, строки
    while i1 + cnt < i2:
        if res[i1 + cnt][0] > row:
            t = (i1 + cnt) * 3
            break
        cnt += 1
 
    # по идее все следующие ненулевые ссылки (третийэлемент в подсписке)
    # должны сместиться на "+3"
    for i in range(i1 + cnt, len(res)):
        if res[i][2] != 0:
            res[i][2] += 3
 
    # если вставка после последнего элемента в столбце:
    if i2 - (i1 + cnt) < 1:
        res.append([row + 1, val, 0])
        res[i2 - 1][2] = i2 * 3
    # иначе
    else:
        res.append([row + 1, val, t + 3])
    print(res)
    print()
 
def del_item():
    # удаление элемента
    def search():
        k = i1 = i2 = 0
        cnt = -1
        # поиск индексов в res первого и
        # последнего элементов искомого столбца
        while cnt < col + 1:
            if res[k][2] == 0:
                cnt += 1
                if cnt == col - 1:
                    i1 = k + 1
                elif cnt == col:
                    i2 = k + 1
                    return (i1, i2)
            k += 1
    print('Введите какой элемент удалить')
    row = int(input()) - 1
    col = int(input()) - 1
 
    i1, i2 = search()
 
    cnt = 0
    # поиск строки
    while True:
        if res[i1 + cnt][0] == row:
            res[i1 + cnt] = [None, None, len(res) * 3]
            break
        cnt += 1
 
    print(res)
 
print('Введите операцию: поиск, добавление или удаление; или СТОП для завершения программы')
procedure = input()
while procedure != 'СТОП':
    if procedure == 'Поиск':
        search_item()
        print('Введите операцию')
        procedure = input()
    if procedure == 'Добавление':
        add_item()
        print('Введите операцию')
        procedure = input()
    if procedure == 'Удаление':
        del_item()
        print('Введите операцию')
        procedure = input()
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.11.2021, 16:17
yana111, к сожалению, не знаю.
Тут сразу несколько нестыковок:
- если удалять элементы, не удаляя всю их информацию из списка, то смысл задачи (экономия памяти за счет хранения только ненулевых элементов) теряется - при частом удалении и добавлении одинакового количества элементов размер списка будет расти.
- если добавление i-го элемента, например он становится последним ненулевым элементом в столбце, производится в конец списка, то как при следующем добавлении в этот столбец до i-го элемента (новый элемент становится предпоследним в столбце) я узнаю информацию об i-ом элементе - ведь он находится не попорядку, а в конце списка, в котором при определенных условиях (добавление "последних" элементов в одну строку в несколько столбцов) будет много однотипных элементов с возможно разными значениями -> (23, 34, 0), (23, 45, 0) и тп -> и ни у одного нет "маркера" номера столбца
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
27.11.2021, 16:54  [ТС]
Gdez, хорошо, спасибо за разъяснение!
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
30.11.2021, 18:37  [ТС]
Gdez, подскажите, пожалуйста, вот вы написали про второй пункт.
Однотипные элементы можно распознавать, ставя указатель у того элемента, который ссылается на добавленный.
То есть если добавить в 1 столбец 280 строки, то первый элемент изменится на [183, 1, 1488], а последний добавится в конец [280,0,0]. То есть работая через указатели.
Может будет еще какая идея, как можно осуществить бесконечное удаление и добавление в конец, а потом на место удаленного
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
30.11.2021, 19:35
yana111,
То есть если добавить в 1 столбец 280 строки, то первый элемент изменится на [183, 1, 1488], а последний добавится в конец [280,0,0]
Да, но "маркером" последнего элемента столбца в упорядоченном(!) списке является "0" на третьей позиции. И теперь,допустим во втором столбце два элемента - на 279-й и 281-й строках, при этом у "281-го" на третьей позиции "0".
Получается поиск столбца по "0" (условие if res[k][2]==0: .), где "k" изменяется -> k += 1 --- неверно.
Нужно организовать поиск по условию -> if res[res[k][2]//3][2] == 0:. Но тут тогда нужно организовать проверку - этот элемент стоит сразу после res[k] или нет (например res[k][2]//3 - 1 == k), то есть k += 1 + (res[k][2]//3 - 1 == k)
Короче, если завтра будет все нормально, посмотрю...
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 33
30.11.2021, 21:08  [ТС]
Gdez, спасибо, буду очень признательна, если посмотрите
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2021, 21:08
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru