在不使用todense()
方法的情况下,将1/0稀疏矩阵转换为0/1稀疏矩阵的最快方法是什么?
示例:
源矩阵看起来像:
matrix([[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 1, 1, 1, 1, 0, 1],
[0, 0, 1, 1, 1, 0, 1, 0, 0, 1],
[1, 0, 0, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 0, 0, 1, 1, 0, 0, 0, 0]])
结果矩阵是:
matrix([[0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 0, 0, 0, 0, 1, 0],
[1, 1, 0, 0, 0, 1, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 0, 1, 0, 1, 1],
[0, 0, 1, 1, 0, 0, 1, 1, 1, 1]])
源矩阵太大,所以我只能使用矩阵的稀疏表示。
答案 0 :(得分:2)
DSM是正确的。稀疏矩阵有许多表示,但如果使用字典格式,则需要3个数字来表示一个元素(行,列,值)。因此,您需要3*np
内存(np
是非零数)。如果使用密集格式,则需要n*m
内存。因此,稀疏表示仅在np/(n*m) < 3
用于此情况时有用,这意味着稀疏性小于1/3
。
另一方面,如果你翻转1
和0
s,那么稀疏性将是一个减去原始的稀疏度。因此,如果原始矩阵是稀疏的,那么您的翻转矩阵就不可能是稀疏的。
如果您只需要矩阵中的1
和0
,那么我建议您编写自己的压缩稀疏矩阵表示。例如,您可以从左上角,逐行读取矩阵,如果有任何连续1
s或0
s,那么您可以执行类似1 3 0 2 1 0 1 4
的操作,表示“连续三个1
,连续两个0
,1
,0
,连续四个1
”。根据您对矩阵的使用情况,我的建议可能毫无用处,但值得考虑。
答案 1 :(得分:1)
很抱歉垃圾邮件,但第二个想法,如果矩阵只有1和0,那么你可以使用一个int32号来表示32个元素(矩阵需要密集)。然后翻转1和0只是一点点操作,不应该很难。这将使矩阵的大小为1/32,并且操作速度应该大约快32倍。