根据数据和坐标初始化lil_matrix
这是我想做的一个例子:
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)