Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy:有没有快速计算大电流矩阵的技巧?_Python_Numpy_Matrix_Sparse Matrix_Transpose - Fatal编程技术网

Python numpy:有没有快速计算大电流矩阵的技巧?

Python numpy:有没有快速计算大电流矩阵的技巧?,python,numpy,matrix,sparse-matrix,transpose,Python,Numpy,Matrix,Sparse Matrix,Transpose,我有一个非常大且稀疏的二进制矩阵,其中包含一组样本中某些类的出现: >>> import numpy >>> >>> type(data) <class 'scipy.sparse.dok.dok_matrix'> >>> data.shape (23571, 139045) 我需要计算共现矩阵,大小为23571 X 23571的对称矩阵,它在[I,j]th元素中存储classI与classj一起出现的次数。

我有一个非常大且稀疏的二进制矩阵,其中包含一组样本中某些类的出现:

>>> import numpy
>>> 
>>> type(data)
<class 'scipy.sparse.dok.dok_matrix'>
>>> data.shape
(23571, 139045)
我需要计算共现矩阵,大小为
23571 X 23571
的对称矩阵,它在
[I,j]
th元素中存储class
I
与class
j
一起出现的次数。我尝试将数据矩阵乘以其转置:

coocc = data.dot(data.T)

但是没有了记忆。是否有另一种快速构造矩阵的方法(显然,我试图避免创建一个零
23571 X 23571
矩阵,然后通过显式循环遍历每个样本和计数对来填充每个
[I,j]
位置)

如果
数据
具有形状
(23571,139045)
,那么
数据.T.dot(数据)
具有形状
(139045139045)
。你有错误论点的转置吗?@WarrenWeckesser说得很好,谢谢!我不认为你能比点积做得更好,但是乘以DOK矩阵是非常低效的。在计算点积()之前,您应该转换为CSR或CSC。实际上,诀窍是进行矩阵乘法,但要有效地进行此操作,您应该使用
CSR
矩阵,而不是
dok
类型。另一个问题是,共现矩阵可能根本不是很稀疏。因此,对于shape
(23571,23571)
来说,它可能有严重的内存需求。最后,也许您可以使用比当前使用的更小的
dtype
。根据每行的最大
nnz
,您可以使用例如
uint16
coocc = data.dot(data.T)