将行向量转换为稀疏矩阵的 inptrs 的快速向量化方法?
Fast vectorized way to convert row vector to inptrs for sparse matrix?
对于稀疏矩阵,我们通常传入列索引 (indices
) 和索引 indices
向量的 indptr
向量,以便 indices[indptr[i]:indptr[i+1]]
是元素稀疏矩阵中的第 i
行。
是否有快速、矢量化、最好是 numpy 的解决方案来转换连续的矢量
Python?
中的 indptr
行索引
例如,如果这是我的 rows
索引向量:[0,1,1,2,2,2,3,5]
...
indptr
向量将是 [0,1,3,6,7,7,8]
,其中 7 重复,因为行向量缺少第 4 行。
我可以使用一个简单的循环来完成:
for i in range(len(rows)):
indptr[rows[i]+1] += 1
indptr=np.cumsum(indptr)
但我想知道是否有更快的矢量化方法来做到这一点?
我想你要找的是这个:
np.bincount(rows).cumsum()
#[1 3 6 7 7 8]
如果矩阵底部的行可能为空,只需将其作为参数添加到 bincount
(根据@CJR 的建议):
np.bincount(rows, minlength=num_rows).cumsum()
#[1 3 6 7 7 8]
您可能还想在前面插入一个 0
。 bincount
所做的是计算每个 bin/row 中的元素数量,然后 cumsum
将它们相加。这样你也将包括丢失的 bins/rows。
最好的插入0的方法大概是这样:
np.bincount(np.array(rows)+1).cumsum()
#[0 1 3 6 7 7 8]
或者您可以直接通过以下方式进行:
np.insert(np.bincount(rows).cumsum(),0,0)
#[0 1 3 6 7 7 8]
另一个想法是
n = len(rows)
indptr = np.searchsorted(rows, np.arange(-1,n), side='right')
不确定哪个更快/更好
对于稀疏矩阵,我们通常传入列索引 (indices
) 和索引 indices
向量的 indptr
向量,以便 indices[indptr[i]:indptr[i+1]]
是元素稀疏矩阵中的第 i
行。
是否有快速、矢量化、最好是 numpy 的解决方案来转换连续的矢量 Python?
中的indptr
行索引
例如,如果这是我的 rows
索引向量:[0,1,1,2,2,2,3,5]
...
indptr
向量将是 [0,1,3,6,7,7,8]
,其中 7 重复,因为行向量缺少第 4 行。
我可以使用一个简单的循环来完成:
for i in range(len(rows)):
indptr[rows[i]+1] += 1
indptr=np.cumsum(indptr)
但我想知道是否有更快的矢量化方法来做到这一点?
我想你要找的是这个:
np.bincount(rows).cumsum()
#[1 3 6 7 7 8]
如果矩阵底部的行可能为空,只需将其作为参数添加到 bincount
(根据@CJR 的建议):
np.bincount(rows, minlength=num_rows).cumsum()
#[1 3 6 7 7 8]
您可能还想在前面插入一个 0
。 bincount
所做的是计算每个 bin/row 中的元素数量,然后 cumsum
将它们相加。这样你也将包括丢失的 bins/rows。
最好的插入0的方法大概是这样:
np.bincount(np.array(rows)+1).cumsum()
#[0 1 3 6 7 7 8]
或者您可以直接通过以下方式进行:
np.insert(np.bincount(rows).cumsum(),0,0)
#[0 1 3 6 7 7 8]
另一个想法是
n = len(rows)
indptr = np.searchsorted(rows, np.arange(-1,n), side='right')
不确定哪个更快/更好