根据数据和坐标初始化lil_matrix

1 投票
1 回答
1546 浏览
提问于 2025-04-18 09:36

这是我想做的一个例子:

my_rows = [[1, 3], [0, 2], [], [1]]
my_data = [[1,1], [1,1], [],[1]] 

我想创建一个这样的矩阵:

import numpy as np
from scipy import sparse
my_lil = sparse.lil_matrix(np.array([[0,1,0,1],
                                     [1,0,1,0],
                                     [0,0,0,0],
                                     [0,1,0,0]]))

所以

>>> my_lil.rows
array([[1, 3], [0, 2], [], [1]], dtype=object)

我觉得我可能漏掉了什么很简单的东西,因为我看到初始化 coo_matrix 是多么简单,但我没有找到类似的东西用于 lil_matrix

这是我最好的尝试:

my_lil = sparse.lil_matrix([[1,1], [1,1], [],[1]], [[1, 3], [0, 2], [], [1]])

但是这出现了这个错误:

TypeError: Cannot cast array data from dtype('O') to dtype('bool') according to the rule 'safe'

我正在使用:

>>> scipy.__version__
'0.14.0'

1 个回答

1

根据Scipy的文档,lil_matrix只能通过传入一个密集矩阵或稀疏矩阵来创建,或者直接给出想要的形状(这样会得到一个空矩阵)。我认为lil_matrix不支持这种创建方式的主要原因是,列的数量是无法确定的。

因此,你可以选择创建一个coo_matrix,因为它支持通过传入数据和位置参数来创建,或者你也可以根据自己的需要,设计一种自己的创建方式来处理形状。

class my_lil_matrix(sparse.lil_matrix):
    def __init__(self, *args, **kwargs):
        if len(args) >= 2 and isinstance(args[1], list):
            try:
                data, rows = args
            except:
                raise TypeError("Invalid input format")

            if kwargs.get('shape') is None:
                # Column count will just be the largest value in rows
                M, N = (len(rows), max(np.array(rows).max()) + 1)
            else:
                M, N = shape

            super(my_lil_matrix, self).__init__((M, N), **kwargs)

            self.data = np.array(data, copy=kwargs.get('copy'),
                                 dtype=kwargs.get('dtype'))
            self.rows = np.array(rows, copy=kwargs.get('copy'),
                                 dtype=kwargs.get('dtype'))
        else:
            super(my_lil_matrix, self).__init__(*args, **kwargs)

撰写回答