首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析带有二进制条纹的表以选择较大的组元素

解析带有二进制条纹的表以选择较大的组元素
EN

Stack Overflow用户
提问于 2017-12-21 07:16:00
回答 1查看 47关注 0票数 2

我有一个类似于下表的表(只有更长):

代码语言:javascript
运行
复制
#    time    binary    frequency

0     2.1      0         0.65
1     3.2      1         0.72
2     5.8      0         0.64
3     7.1      0         0.63
4     9.5      1         0.72
5     14.1     1         0.74
6     21.5     0         0.62
7     27.3     0         0.61
8     29.5     1         1.00
9     32.1     1         1.12
10    35.5     1         0.99

我只想收集对应于binary == 1的所有times,并且在小组中,收集那些对应frequency值较高的小组。在上表中,这将导致:

代码语言:javascript
运行
复制
times = 3.2, 14.1, 32.1

我不确定首先如何接近表的顺序性,然后如何比较它们之间的值,只返回相应的时间(而不是,例如,最大频率)。时间隐藏了周期性,所以我会避免构建另一个只包含binary == 1元素的表。

有了我的timebinaryfrequency数组,我可以通过以下方式隔离相关元素:

代码语言:javascript
运行
复制
condition = (binary == 1)
time1 = time(condition)
frequency1 = frequency(condition)

但我不知道如何继续隔离各种条纹。我可以使用哪些有用的函数?

EN

回答 1

Stack Overflow用户

发布于 2017-12-21 07:49:55

我不知道有什么聪明的函数可以用来做这件事。下面是一些可以完成这项工作的代码。请注意,我从您的文件中删除了头文件。

binary可以是0,也可以是1,这取决于行和其他值是否包含在一个组中。最初,in_group设置为False,表示没有启动任何组。在读取行时,如果binary为零,则如果代码一直在读取组的行,因此in_group为True,则将in_group设置为False,因为现在遇到了零,该组已结束。由于组的处理已经结束,是时候打印它的结果了。当读取行时,当binary为1时,如果in_group为True,则代码已经开始处理行是一个组,并且代码检查最新的frequency是否大于之前看到的值。如果是这样,它将同时更新rep_timerep_frequency。如果in_group为False,则这是新组的第一行,in_group设置为True,并设置rep_timerep_frequency的初始值。

代码语言:javascript
运行
复制
with open('pyser.txt') as pyser:
    in_group = False
    for line in pyser:
        _, time, binary, frequency = [float(_) for _ in line.rstrip().split()]
        if binary == 0:
            if in_group:
                in_group = False
                print (rep_time)
        else:
            if in_group:
                if frequency > rep_frequency:
                    rep_time, rep_frequency = time, frequency 
            else:
                in_group = True
                rep_time, rep_frequency = time, frequency 
if in_group:
    print (rep_time)

输出:

代码语言:javascript
运行
复制
3.2
14.1
32.1

编辑:我们似乎使用了不同的问题定义。

在第一组中,我们同意。但在第二组中,最大振幅约为4.07E-01,对应的时间约为5.4740E+04。

我还用Pandas编写了代码:

代码语言:javascript
运行
复制
>>> import pandas as pd
>>> df = pd.read_csv('Gyd9P1rb.txt', sep='\s+', skiprows=2, header=None, names='Row TSTOP PSRTIME DETECTED FDOTMAX AMPLITUDE AMPLITUDE_ERR'.split())
>>> del df['Row']
>>> del df['TSTOP']
>>> del df['FDOTMAX']
>>> del df['AMPLITUDE_ERR']
>>> groups = []
>>> in_group = False
>>> group_number = 1
>>> for b in df['DETECTED']:
...     if b:
...         if not in_group:
...             group_number +=1
...             in_group = True
...         groups.append(group_number)
...     else:
...         groups.append(0)
...         in_group = False
... 

>>> df['groups'] = pd.Series(groups, index=df.index)
>>> df.head()
        PSRTIME  DETECTED  AMPLITUDE  groups
0  54695.471283         1   0.466410       2
1  54698.532412         1   0.389607       2
2  54701.520814         1   0.252858       2
3  54704.557583         0   0.103460       0
4  54707.557563         0   0.088215       0
>>> gb = df.groupby(by=df['groups'])
>>> def f(x):
...     the_max = x['AMPLITUDE'].idxmax()
...     print ( x['groups'][the_max], x['PSRTIME'][the_max])
... 
>>> gb.apply(f)
0 58064.3656376
0 58064.3656376
2 54695.4712834
3 54740.4917137
4 54788.477571
5 54836.472922
6 54881.4605511
7 54926.4664883
8 54971.4932866
9 55019.5021472
10 55064.5029133
11 55109.4948108
12 55154.414381
13 55202.488766
14 55247.4721132
15 55292.5301332
16 55340.4728542
17 55385.5229596
18 55430.5332147
19 55478.4812671
20 55523.4894451
21 55568.4626766
22 55616.4630348
23 55661.4969604
24 55709.4504634
25 55754.4711994
26 55799.4736923
27 55844.5050404
28 55892.4699313
29 55937.4721754
30 55985.4677572
31 56030.5119765
32 56075.5517149
33 56168.4447074
34 56213.507484
35 56306.5133063
36 56351.4943058
37 56396.579122
38 56441.5683651
39 56489.5321173
40 56534.4838082
41 56582.469025
42 56627.4135202
43 56672.4926625
44 56720.582296
45 56768.5232469
46 56813.4997925
47 56858.3890558
48 56903.5182596
49 56951.4892721
50 56996.5787435
51 57086.3948136
52 57179.5421833
53 57272.5059448
54 57362.452523
55 57635.5013047
56 57728.4925251
57 57773.5235416
58 57821.5390364
59 57866.5205882
60 57911.5590132
61 57956.5699637
62 58001.4331976
Empty DataFrame
Columns: []
Index: []

这两种方法的结果是相同的,只是表示精度不同。

我还创建了一组很小的数据,可以很容易地计算出结果。就是这个。原始程序运行正常。

代码语言:javascript
运行
复制
0 -1 0 -1
1 0 1 2
2 -1 0 -1
3 -1 0 -1
4 0 1 0
5 1 1 1
6 -1 0 -1
7 -1 0 -1
8 -1 0 -1
9 0 1 4
10 1 1 3
11 2 1 2
12 -1 0 -1
13 -1 0 -1
14 -1 0 -1
15 -1 0 -1
16 0 1 0
17 1 1 1
18 2 1 2
19 3 1 3
20 -1 0 -1
21 -1 0 -1
22 -1 0 -1
23 -1 0 -1
24 -1 0 -1
25 0 1 6
26 1 1 5
27 2 1 4
28 3 1 3
29 4 1 2
30 -1 0 -1
31 -1 0 -1
32 -1 0 -1
33 -1 0 -1
34 -1 0 -1
35 -1 0 -1
36 0 1 0
37 1 1 1
38 2 1 2
39 3 1 3
40 4 1 4
41 5 1 5
41 -1 0 -1
41 -1 0 -1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47915691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档