【问题标题】:Counting repeated sequences in transition table计算转换表中的重复序列
【发布时间】:2021-03-20 21:43:03
【问题描述】:

我正在使用以下函数来生成转换表:

import numpy as np
import pandas as pd
def make_table(allSeq):
 n = max([ max(s) for s in allSeq ]) + 1
 arr = np.zeros((n,n), dtype=int)
 for seq in allSeq:
  ind = (seq[1:], seq[:-1])
  arr[ind] += 1
 return pd.DataFrame(arr).rename_axis(index='Next', columns='Current')

但是,我的结果不正确:

list1 = [1,2,3,4,5,4,5,4,5]
list2 = [4,5,4,5]
make_table([list1, list2])

Current  0  1  2  3  4  5
Next                     
0        0  0  0  0  0  0
1        0  0  0  0  0  0
2        0  1  0  0  0  0
3        0  0  1  0  0  0
4        0  0  0  1  0  2
5        0  0  0  0  2  0

例如,转换 4->5 应计算 5 次,但每个序列仅计算一次 (2)。我知道问题出在arr[ind] += 1 行,但我就是想不通!我是嵌套另一个循环,还是有一种巧妙的方法可以一次添加实例总数?谢谢!

【问题讨论】:

    标签: python arrays pandas numpy


    【解决方案1】:

    想通了!切换到以下:

    def make_table(allSeq):
     n = max([ max(s) for s in allSeq ]) + 1
     arr = np.zeros((n,n), dtype=int)
     for seq in allSeq:
      for i,j in zip(seq[1:],seq[:-1]):
       ind = (i,j)
       arr[ind] += 1
     return pd.DataFrame(arr).rename_axis(index='Next', columns='Current')
    

    【讨论】:

      【解决方案2】:

      另一个循环似乎是最简单的解决方案,使用zip 有点扭曲:

      import numpy as np
      import pandas as pd
      def make_table(allSeq):
          n = max([ max(s) for s in allSeq ]) + 1
          arr = np.zeros((n,n), dtype=int)
          for seq in allSeq:
              ind = zip(seq[1:], seq[:-1])
              for i in ind:
                  arr[i] += 1
          return pd.DataFrame(arr).rename_axis(index='Next', columns='Current')
      list1 = [1,2,3,4,5,4,5,4,5]
      list2 = [4,5,4,5]
      make_table([list1, list2])
      

      返回

        Next    0    1    2    3    4    5
      ------  ---  ---  ---  ---  ---  ---
           0    0    0    0    0    0    0
           1    0    0    0    0    0    0
           2    0    1    0    0    0    0
           3    0    0    1    0    0    0
           4    0    0    0    1    0    3
           5    0    0    0    0    5    0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 2019-02-04
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        相关资源
        最近更新 更多