【发布时间】:2021-11-18 16:45:46
【问题描述】:
感谢您花时间查看我的问题。
我正在尝试创建一个程序,该程序可以将值数组添加到稀疏矩阵中的每个“列”,如下所示:
A = [[1,1,0],
[0,0,1],
[1,0,1]]
B = [[1],
[0],
[1]]
A + B = [[2,2,1],
[0,0,1],
[2,1,2]]
以稀疏矩阵的坐标格式表示,如下所示:
A = [[0,0,1],
[2,0,1],
[0,1,1],
[1,2,1],
[2,2,1]]
B = [[0,0,1],
[2,0,1]]
A + B = [[0,0,2],
[2,0,2],
[0,1,2],
[2,1,1],
[0,2,1],
[1,2,1],
[2,2,2]]
我正在处理由于其大小而必须以稀疏方式表示的大型矩阵。我需要能够向矩阵中的每一列添加一列值,但需要使用专门处理稀疏三元组的算法。
我花了一整天的时间来解决这个问题,实际上是连续 10 个小时,我真的很震惊,我无法在任何地方找到一个好的答案。使用乘法执行此操作既简单又高效,但是 scipy 或 numpy 中似乎没有任何时间和空间高效的解决方案来执行此操作,或者如果有,当我发现时它会杀了我。我试图实施一个解决方案,但最终效率极低。
基本上,我的解决方案在技术上确实可行,但时间效率极差,它遵循以下步骤:
- 检查 A 和 B 行之间的共享值,将相关的三元组值相加
- 添加来自 A 的唯一值
- 在矩阵的列中为 i 添加 B_row_i、x_i、B_value_i,检查我们没有添加 A 三元组中的逐字值。
至少,我认为这就是它的作用......我现在完全筋疲力尽了,我开始在编码时逐步退出。如果有人能提出快速解决方案,将不胜感激!
from scipy.sparse import coo_matrix
from tqdm import tqdm
class SparseCoordinates:
def __init__(self,coo_a,coo_b):
self.shape = coo_a.shape
self.coo_a_rows = coo_a.row
self.coo_a_cols = coo_a.col
self.coo_a_data = coo_a.data
self.coo_b_rows = coo_b.row
self.coo_b_cols = coo_b.col
self.coo_b_data = coo_b.data
self.coo_c_rows = []
self.coo_c_cols = []
self.coo_c_data = []
def __check(self,a,b,c,lr,lc,lv):
for i in range(len(lr)):
if lr[i] == a and lc[i] == b and lv[i] == c:
return True
return False
def __check_shared_rows(self):
for i in tqdm(range(len(self.coo_a_rows))):
for j in range(len(self.coo_b_rows)):
if self.coo_a_rows[i] == self.coo_b_rows[j]:
self.coo_c_rows.append(self.coo_a_rows[i])
self.coo_c_cols.append(self.coo_a_cols[i])
self.coo_c_data.append(self.coo_a_data[i] + self.coo_b_data[j])
def __add_unique_from_a(self):
a_unique = set(self.coo_a_rows) - set(self.coo_b_rows)
for i in tqdm(range(len(self.coo_a_rows))):
if self.coo_a_rows[i] in a_unique:
self.coo_c_rows.append(self.coo_a_rows[i])
self.coo_c_cols.append(self.coo_a_cols[i])
self.coo_c_data.append(self.coo_a_data[i])
def __add_all_remaining_from_b(self):
for i in tqdm(range(len(self.coo_b_rows))):
for j in range(self.shape[1]):
if not self.__check(self.coo_b_rows[i],j,self.coo_b_data[i],
self.coo_a_rows,self.coo_a_cols,self.coo_a_data):
self.coo_c_rows.append(self.coo_b_rows[i])
self.coo_c_cols.append(j)
self.coo_c_data.append(self.coo_b_data[i])
def add(self):
self.__check_shared_rows()
self.__add_unique_from_a()
self.__add_all_remaining_from_b()
return coo_matrix((self.coo_c_data,(self.coo_c_rows,self.coo_c_cols)),shape=self.shape)
【问题讨论】:
-
您能否构建一个稀疏矩阵,其中每列都是您要添加的列,然后执行以下操作:[stackoverflow.com/questions/4565685/… ?
-
我可以做这样的事情。最初我觉得为了加法的目的用相同的值填充稀疏矩阵可能效率低下,但考虑到您的响应和其他响应,这可能是最好的方法。您认为这是最有效的方法,还是有另一种方法可以通过 2D 矩阵的每个 1D 切片添加 1D 数组?
标签: python numpy scipy linear-algebra sparse-matrix