python – 加速随机矩阵计算
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 加速随机矩阵计算,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2568字,纯文字阅读大概需要4分钟。
内容图文
![python – 加速随机矩阵计算](/upload/InfoBanner/zyjiaocheng/826/473bc54cb03a42ffac96330574964e0f.jpg)
我正在创建随机Toeplitz矩阵来估计它们可逆的概率.我目前的代码是
import random
from scipy.linalg import toeplitz
import numpy as np
for n in xrange(1,25):
rankzero = 0
for repeats in xrange(50000):
column = [random.choice([0,1]) for x in xrange(n)]
row = [column[0]]+[random.choice([0,1]) for x in xrange(n-1)]
matrix = toeplitz(column, row)
if (np.linalg.matrix_rank(matrix) < n):
rankzero += 1
print n, (rankzero*1.0)/50000
这可以加快吗?
我想增加值50000以获得更高的准确度,但目前这样做太慢了.
仅使用x in xrange(10,14)中的n进行分析
400000 9.482 0.000 9.482 0.000 {numpy.linalg.lapack_lite.dgesdd}
4400000 7.591 0.000 11.089 0.000 random.py:272(choice)
200000 6.836 0.000 10.903 0.000 index_tricks.py:144(__getitem__)
1 5.473 5.473 62.668 62.668 toeplitz.py:3(<module>)
800065 4.333 0.000 4.333 0.000 {numpy.core.multiarray.array}
200000 3.513 0.000 19.949 0.000 special_matrices.py:128(toeplitz)
200000 3.484 0.000 20.250 0.000 linalg.py:1194(svd)
6401273/6401237 2.421 0.000 2.421 0.000 {len}
200000 2.252 0.000 26.047 0.000 linalg.py:1417(matrix_rank)
4400000 1.863 0.000 1.863 0.000 {method 'random' of '_random.Random' objects}
2201015 1.240 0.000 1.240 0.000 {isinstance}
[...]
解决方法:
一种方法是通过缓存放置值的索引来重复调用toeplitz()函数来保存一些工作.以下代码比原始代码快约30%.其余的表现是在排名计算中……
而且我不知道对于0和1的toeplitz矩阵是否存在更快的秩计算.
(更新)如果用scipy.linalg.det()== 0替换matrix_rank,代码实际上要快4倍(行列式比小矩阵的秩计算快)
import random
from scipy.linalg import toeplitz, det
import numpy as np,numpy.random
class si:
#cache of info for toeplitz matrix construction
indx = None
l = None
def xtoeplitz(c,r):
vals = np.concatenate((r[-1:0:-1], c))
if si.indx is None or si.l != len(c):
a, b = np.ogrid[0:len(c), len(r) - 1:-1:-1]
si.indx = a + b
si.l = len(c)
# `indx` is a 2D array of indices into the 1D array `vals`, arranged so
# that `vals[indx]` is the Toeplitz matrix.
return vals[si.indx]
def doit():
for n in xrange(1,25):
rankzero = 0
si.indx=None
for repeats in xrange(5000):
column = np.random.randint(0,2,n)
#column=[random.choice([0,1]) for x in xrange(n)] # original code
row = np.r_[column[0], np.random.randint(0,2,n-1)]
#row=[column[0]]+[random.choice([0,1]) for x in xrange(n-1)] #origi
matrix = xtoeplitz(column, row)
#matrix=toeplitz(column,row) # original code
#if (np.linalg.matrix_rank(matrix) < n): # original code
if np.abs(det(matrix))<1e-4: # should be faster for small matrices
rankzero += 1
print n, (rankzero*1.0)/50000
内容总结
以上是互联网集市为您收集整理的python – 加速随机矩阵计算全部内容,希望文章能够帮你解决python – 加速随机矩阵计算所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。