Python 稀疏矩阵行向量到inptrs的快速矢量化转换方法?

Python 稀疏矩阵行向量到inptrs的快速矢量化转换方法?,python,arrays,numpy,scipy,sparse-matrix,Python,Arrays,Numpy,Scipy,Sparse Matrix,对于稀疏矩阵,我们通常传入列索引(index)和索引索引的indptr向量,以便索引[indptr[i]:indptr[i+1]]是稀疏矩阵中行i的元素 是否有一种快速、矢量化、最好是numpy的解决方案来转换连续数据的矢量 在Python中,行索引到indptr 例如,如果这是我的行索引向量:[0,1,1,2,2,2,3,5] indptr向量将是[0,1,3,6,7,7,8],其中7重复,因为行向量缺少第4行 我可以使用一个简单的循环: for i in range(len(rows)):

对于稀疏矩阵,我们通常传入列索引(
index
)和索引
索引的
indptr
向量,以便
索引[indptr[i]:indptr[i+1]]
是稀疏矩阵中行
i
的元素

是否有一种快速、矢量化、最好是numpy的解决方案来转换连续数据的矢量 在Python中,行索引到
indptr

例如,如果这是我的
索引向量:
[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的建议):

您可能还想在前面插入一个
0
bincount
所做的是计算每个bin/行中的元素数量,然后将它们相加。这样,您也将包括丢失的箱子/行

插入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')

不确定代码中哪个更快/更好,哪些是
,哪些是
indptr
的初始值?目前尚不清楚
[0,1,3,6,7,7,8]
是如何从
[0,1,1,2,2,3,5]
@Ehsan rows是数据的行索引,并且是从上到下排序的。因此,如果矩阵看起来像[[1,2],[3,4]],那么数据数组应该是[1,2,3,4],行索引应该是[0,0,1,1],列索引应该是[0,1,0,1]。转换为INDPTR的行索引将为[0,2,4]。请查看发布的答案是否是您要查找的。如果是,请随意接受。如果没有,请详细说明如何构建阵列
indptr
@narcissa欢迎您。请查看如何在SO上接受答案。谢谢。请确保将bincount中的
minlength
设置为矩阵中的#行,否则将丢失indptr数组末尾的空行。
n = len(rows)
indptr = np.searchsorted(rows, np.arange(-1,n), side='right')