SciPy:将1/0稀疏矩阵转换为0/1稀疏矩阵

时间:2014-04-15 16:13:54

标签: python numpy matrix scipy

在不使用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]])

源矩阵太大,所以我只能使用矩阵的稀疏表示。

2 个答案:

答案 0 :(得分:2)

DSM是正确的。稀疏矩阵有许多表示,但如果使用字典格式,则需要3个数字来表示一个元素(行,列,值)。因此,您需要3*np内存(np是非零数)。如果使用密集格式,则需要n*m内存。因此,稀疏表示仅在np/(n*m) < 3用于此情况时有用,这意味着稀疏性小于1/3

另一方面,如果你翻转10 s,那么稀疏性将是一个减去原始的稀疏度。因此,如果原始矩阵是稀疏的,那么您的翻转矩阵就不可能是稀疏的。

如果您只需要矩阵中的10,那么我建议您编写自己的压缩稀疏矩阵表示。例如,您可以从左上角,逐行读取矩阵,如果有任何连续1 s或0 s,那么您可以执行类似1 3 0 2 1 0 1 4的操作,表示“连续三个1,连续两个010,连续四个1”。根据您对矩阵的使用情况,我的建议可能毫无用处,但值得考虑。

答案 1 :(得分:1)

很抱歉垃圾邮件,但第二个想法,如果矩阵只有1和0,那么你可以使用一个int32号来表示32个元素(矩阵需要密集)。然后翻转1和0只是一点点操作,不应该很难。这将使矩阵的大小为1/32,并且操作速度应该大约快32倍。