python - 提高稀疏矩阵的幂
问题描述
我有一个 10001 行 + 10001 列(有很多 0)的稀疏矩阵,
我试图提高这个稀疏矩阵的力量
IE
A = [[1,1],[1,0]]
AS = sparse.csr_matrix(A)
AS
def matrixMul(AS, n):
if(n <= 1):
return AS
else:
return np.matmul(matrixMul(AS, n-1), AS)
matrixMul(AS, 10)
如果我将 AS 提高到 2 的幂,预期结果应该是 [[2, 1] [1, 1]]
我想找到 AS ^ 10
我应该调用什么函数?我已经尝试了上面的代码,但收到了这个错误。
谢谢你。
ValueError Traceback (最近一次调用最后一次) in () 9 return np.matmul(matrixMul(AS, n-1), AS) 10 ---> 11 matrixMul(AS, 10)
matrixMul(AS, n) 中的 8 帧 7 返回 AS 8 else: ----> 9 return np.matmul(matrixMul(AS, n-1), AS) 10 11 matrixMul(AS, 10)
ValueError:matmul:输入操作数0没有足够的维度(有0,带有签名的gufunc核心(n?,k),(k,m?)->(n?,m?)需要1)
解决方案
In [3]: from scipy import sparse
In [4]: A = [[1,1],[1,0]]
...: AS = sparse.csr_matrix(A)
In [5]: AS
Out[5]:
<2x2 sparse matrix of type '<class 'numpy.int64'>'
with 3 stored elements in Compressed Sparse Row format>
In [6]: AS.A
Out[6]:
array([[1, 1],
[1, 0]])
In [7]: (AS@AS@AS).A
Out[7]:
array([[3, 2],
[2, 1]])
@
映射到AS.__matmul__
,但np.matmul
不以这种方式委派它。
In [8]: np.matmul(AS,AS)
Traceback (most recent call last):
File "<ipython-input-8-37972b025121>", line 1, in <module>
np.matmul(AS,AS)
ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
更正:
In [9]: def matrixMul(AS, n):
...: if(n <= 1):
...: return AS
...: else:
...: return matrixMul(AS, n-1)@ AS
...:
In [10]: matrixMul(AS,3)
Out[10]:
<2x2 sparse matrix of type '<class 'numpy.int64'>'
with 4 stored elements in Compressed Sparse Row format>
In [11]: _.A
Out[11]:
array([[3, 2],
[2, 1]])
In [12]: matrixMul(AS,10).A
Out[12]:
array([[89, 55],
[55, 34]])
如评论中所示,**
电源有效:
In [15]: (AS**10).A
Out[15]:
array([[89, 55],
[55, 34]])
稀疏矩阵建模于np.matrix
。 *
是矩阵乘法,**
是矩阵幂。
此幂次与此半智能显式乘法大致相同:
def foo(AS):
AS2=AS@AS
return AS2@AS2@AS2@AS2@AS2
In [33]: timeit foo(AS).A
865 µs ± 378 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [34]: timeit AS**10
767 µs ± 189 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
推荐阅读
- amazon-web-services - AppSync $util.autoId() 和 DynamoDB 分区和排序键设计问题
- haskell - 未解决的重载 - 尝试为自己的类创建 Int 实例
- visualization - 如何向此 Vega 可视化添加图例
- javascript - 使用花括号的 Javascript 属性声明
- html - 我的一个 div 被幻象顶部填充所困扰,似乎忽略了我的 css 文件
- python - numpy 数组上的 lambda 函数。这段代码有什么问题?
- mysql - Mysql 查询分组和限制 1 Desc
- carousel - 如何调整引导轮播以调整图像大小并使图像可链接?
- typescript - String.fromCharCode vs '0x' 的 TypeScript 错误
- php - Laravel 将外部 url 渲染为路由内容