【发布时间】:2016-11-08 17:44:13
【问题描述】:
我正在开发处理稀疏矩阵的软件。它们并不大(从 15x15 到 ~300x300)。我希望能够将矩阵的表示形式存储在一个短字符串中,以便我可以将它作为一个值存储在 CSV 文件中(以及许多其他内容)。
到目前为止,我尝试将矩阵视为二进制字符串,convert to base62:
import numpy as np
import networkx as nx
def graphToHash(a,numnodes):
def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"):
return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])
return str(numnodes) + '!' + baseN(int(''.join([str(i) for i in flatten_list(a)]),2), 62)
def flatten_list(l):
l1=[item for sublist in l if isinstance(sublist,list) or isinstance(sublist,np.ndarray) for item in sublist]
l=l1+[item for item in l if not isinstance(item,list) and not isinstance(item,np.ndarray)]
return l
# example
import sys
sys.setrecursionlimit(10000)
a=np.array(nx.to_numpy_matrix(nx.connected_watts_strogatz_graph(160,8,.3,1000))).astype(int)
hash=graphToHash(a,160)
len(hash) # ~4300 characters
这适用于小图(30 个节点约为 150 个字符)。但是较大的图有点笨拙(160 个节点约为 4300,需要我增加递归限制)。
因为图是二元和稀疏的,我知道我可以做得更好。理想情况下,我想继续使用 {0-9,a-z,A-Z} 字符串,因为我知道这些不会在我的 CSV 文件中造成任何问题。
压缩二元稀疏矩阵最有效的方法是什么?
【问题讨论】:
-
它实际上工作正常,谢谢。不过仍在寻找更好的方法。
-
我可以,但它不会使字符串更短。我读过提高递归限制是不好的,但我不知道为什么,所以这不是我主要关心的问题。
-
你能不能把
cpickle.dumps对象变成一个字符串,然后zlib.compress,然后编码为base62? -
如果您要限制自己使用字母数字,您不妨采用可读性和易于编码/解码的方式,并且只使用十进制 0-9。如果你真的想要压缩和可靠性,你应该放弃这些限制
-
好的,我在另一条 4-5% 的评论中找到了我正在寻找的部分内容。其他问题是 a) 对角线全为零,即它是一个简单的图形吗? b) 矩阵是对称的,即如果是图,它是有向的还是无向的?您能否在问题中包含示例 160x160、4-5% 填充矩阵?
标签: python graph compression sparse-matrix