填充scipy.sparse.dok_matrix的最快方法



根据输入列表填充scipy.sparse.dok_matrix最有效的方法是什么?

dok_matrix中的列数或行数都不是预先已知的。

行数是输入列表的长度,列数取决于输入列表中的值。

显而易见:

def get_dok_matrix(values: List[Any]) -> scipy.sparse.dok_matrix:
max_cols = 0
datas = []
for value in values:
data = get_data(values)
datas.append(data)
if len(data) > max_cols:
max_cols = len(data)
dok_matrix = scipy.sparse.dok_matrix((len(values), max_cols))
for i, data in enumerate(datas):
for j, datum in enumerate(data):
dok_matrix[i, j] = datum
return dok_matrix

有两个for循环,一个嵌套的for循环,还有许多len()检查。我无法想象这会非常有效。

我还考虑过:

def get_dok_matrix(values: List[Any]) -> scipy.sparse.dok_matrix:
cols = 0
dok_matrix = scipy.sparse.dok_matrix((0, 0))
for row, value in enumerate(values):
dok_matrix.resize(row + 1, cols)
data = get_data(values)
for col, datum in enumerate(data):
if col + 1 > cols:
cols = col + 1
dok_matrix.resize(row + 1, cols)
dok_matrix[row, col] = datum
return dok_matrix

这在很大程度上取决于scipy.sparse.dok_matrix.resize的效率,而我在文档中找不到这一点。

以下哪一项最有效?

有没有更好的方法可以让我错过(也许我可以一次O(1(设置整行?(?

带有:

def get_dok_matrix(values):
max_cols = 0
datas = []
for value in values:
data = value         # changed
datas.append(data)
if len(data) > max_cols:
max_cols = len(data)
dok_matrix = sparse.dok_matrix((len(values), max_cols))
for i, data in enumerate(datas):
for j, datum in enumerate(data):
dok_matrix[i, j] = datum
return dok_matrix

In [13]: values = [[1],[1,2],[1,2,3],[4,5,6,7],[8,9,10,11,12]]
In [14]: dd = get_dok_matrix(values)
In [15]: dd
Out[15]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
with 15 stored elements in Dictionary Of Keys format>
In [16]: dd.A
Out[16]: 
array([[ 1.,  0.,  0.,  0.,  0.],
[ 1.,  2.,  0.,  0.,  0.],
[ 1.,  2.,  3.,  0.,  0.],
[ 4.,  5.,  6.,  7.,  0.],
[ 8.,  9., 10., 11., 12.]])

我希望你能提供一个values的例子,这样我就不必研究你的代码并创建一个可以使用它的代码

制作coo格式:

def get_coo_matrix(values):
data, row, col = [],[],[]
for i,value in enumerate(values):
n = len(value)
data.extend(value)
row.extend([i]*n)
col.extend(list(range(n)))
return sparse.coo_matrix((data,(row,col)))
In [18]: M = get_coo_matrix(values)
In [19]: M
Out[19]: 
<5x5 sparse matrix of type '<class 'numpy.int64'>'
with 15 stored elements in COOrdinate format>
In [20]: M.A
Out[20]: 
array([[ 1,  0,  0,  0,  0],
[ 1,  2,  0,  0,  0],
[ 1,  2,  3,  0,  0],
[ 4,  5,  6,  7,  0],
[ 8,  9, 10, 11, 12]])

次数:

In [22]: timeit dd = get_dok_matrix(values)
431 µs ± 10.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [23]: timeit M = get_coo_matrix(values)
152 µs ± 524 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

最新更新