Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 检测矩阵中的对角线_Python_Numpy_Scipy_Sparse Matrix_Prediction - Fatal编程技术网

Python 检测矩阵中的对角线

Python 检测矩阵中的对角线,python,numpy,scipy,sparse-matrix,prediction,Python,Numpy,Scipy,Sparse Matrix,Prediction,我有一个产生数据趋势的过程的输出,如下所示: 数据输出似乎有对角线的趋势,但我不确定如何跟踪这一趋势。最终,我知道每个16个数字样本中的前15个数字,并想预测第16个数字。看起来你应该可以用一些近似的方法,包括矩阵数学或者傅里叶级数中可能的相移。有没有一种方法可以做到这一点?如果有一个可以通过Python使用的解决方案是首选的。下面是一个如何检查对角对角线是否只包含1s的示例,如您的示例: In [52]: from scipy.sparse import eye 让我们创建一个对角线相反的

我有一个产生数据趋势的过程的输出,如下所示:


数据输出似乎有对角线的趋势,但我不确定如何跟踪这一趋势。最终,我知道每个16个数字样本中的前15个数字,并想预测第16个数字。看起来你应该可以用一些近似的方法,包括矩阵数学或者傅里叶级数中可能的相移。有没有一种方法可以做到这一点?如果有一个可以通过Python使用的解决方案是首选的。

下面是一个如何检查对角对角线是否只包含
1
s的示例,如您的示例:

In [52]: from scipy.sparse import eye
让我们创建一个对角线相反的矩阵

In [53]: a = np.fliplr(eye(5, 8, k=1).toarray())

In [54]: a
Out[54]:
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.]])
沿左/右方向翻转阵列

In [55]: f = np.fliplr(a)

In [56]: f
Out[56]:
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.]])
也可以这样做:

In [71]: a[::-1,:]
Out[71]:
array([[ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.]])
得到对角线

In [57]: np.diag(f, k=1)
Out[57]: array([ 1.,  1.,  1.,  1.,  1.])

In [58]: np.diag(f, k=-1)
Out[58]: array([ 0.,  0.,  0.,  0.])

In [111]: a[::-1].diagonal(2)
Out[111]: array([ 1.,  1.,  1.,  1.,  1.])
检查整个对角线是否包含
1
s

In [61]: np.all(np.diag(f, k=1) == 1)
Out[61]: True

将帮助您找到所有对角线


PS我是numpy的新手,所以我很确定一定会有更快、更优雅的解决方案,我不知道
NumPy
是否有一个简洁的函数,但是你可以总是在行上循环,然后在列上循环,检查
j
th行中的
i
th元素是否等于
i+1
th行中的元素,并且
j-1
th列。显然,要确保对指数范围采取保护措施。此外,当你说你希望跟踪/检测这一趋势时,你的意思是什么?你想用它做什么?@PPG我尝试了一种类似于你描述的方法。问题是,从A1移动到A2是在时间上向前移动,因此在尝试预测P1时,不一定知道。这是显示的历史数据。我试着创建一个数据库来搜索,但这个数据库太大了,以至于它越来越接近0或1的50%概率。我想取前15个数字,然后确定第16个数字是0还是1。如果它像你展示的那样规则,第16列应该正好等于第15列,在y轴上由负1滚动。。。不?本杰明,你能详细说明一下吗。我想我明白你的意思,但还不完全明白。我必须通读这篇文章和链接的文章,了解一些细节。我会尽快与您联系。这似乎可以用于识别矩阵中的对角线,但对于我的问题,我不知道足够的信息来准确使用它。
rot90
也是一个有用的函数,在这种情况下需要记住。
In [64]: (np.diag(f, k=1) == 1).all()
Out[64]: True

In [65]: (np.diag(f, k=0) == 1).all()
Out[65]: False