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