【问题标题】:Detecting Diagonals in a matrix检测矩阵中的对角线
【发布时间】:2016-06-05 18:24:15
【问题描述】:

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

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

【问题讨论】:

  • 我不知道NumPy 是否有一个简洁的功能,但你总是可以循环遍历行然后循环遍历列并检查ith 元素是否在@987654324 @th 行等于i+1th 行和j-1th 列中的元素。显然,请确保您为索引范围设置了保障措施。
  • 另外,当您说您希望跟踪/检测这种趋势时,您是什么意思?你想用它做什么?
  • @PPG 我尝试了一种类似于您描述的方法。问题是从 A1 移动到 A2 是在时间上向前移动,因此在尝试预测 P1 时不一定知道。这是显示的历史数据。我尝试创建一个数据库进行搜索,但它必须如此之大,以至于它越来越接近 0 或 1 的 50% 的概率。我想取前 15 个数字并确定第 16 个数字是否为 0或 1.
  • 如果它和你显示的一样规则,第 16 列应该正好等于第 15 列,在 y 轴上滚动一个负数...不是吗?
  • @Benjamin 你能详细说明一下吗?我想我明白你在说什么,但并不完全。

标签: python numpy scipy sparse-matrix prediction


【解决方案1】:

您可以使用我的对角线检测矩阵,它是为类似的问题而开发的,有时,它被 Omran Matrix 引用。您所需要的只是将图像(您的矩阵)与我的矩阵相乘,并对输出的第一行求和,这将为您提供图像中对角线的数量。矩阵也很灵活,可以是垂直的矩形矩阵,我用了一些物理意义上的技巧来求逆。我于 2010 年在苏黎世开发了它,当时我正在攻读博士学位,以检测视觉声音图像中扫描的对角线或泛音。该矩阵发布在Detecting diagonal activity to quantify harmonic structure preservation with cochlear implant mappingformal link。博士论文被称为mechanism of music perception using cochlear implants, University of Zurich, 2011 by Sherif Omran。如果你写论文,请引用我,祝你好运

这里是类似的带有泛音的图像,我用我的矩阵来检测这些对角线活动,它们看起来非常接近你的。

【讨论】:

    【解决方案2】:

    这是一个如何检查对角线是否仅包含1s 的示例,就像您的情况一样:

    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.])
    

    检查整个对角线是否包含1s

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

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

    This answer 将帮助您找到所有对角线

    PS 我是 numpy 的新手,所以我很确定一定有更快、更优雅的解决方案

    【讨论】:

    • 我将不得不通读这篇文章和链接的帖子,并提供一些细节来理解它。我会尽快与您联系。
    • 这看起来可以用于识别矩阵中的对角线,但对于我的问题,我不知道足够的信息来准确地使用它。
    • rot90 在这种情况下也是一个有用的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    相关资源
    最近更新 更多