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

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

01.11.2021, 10:08. Показов 5820. Ответов 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,320
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,320
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,320
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,320
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,320
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
Ответ Создать тему
Новые блоги и статьи
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru