我有一个频谱,想要识别不同的通道。通道可以通过电平(val
)与通道之间的边缘区分开。
我已经创建了一个包含列val
的简化表,现在我想计算在此之前和之后有多少行包含大于或等于10
的值。
示例:
- 1.行:
val = 10
,然后是11, 10, 2, 3
-〉next = 2
和prev = 0
- 1.行:
val = 11
,后面是10, 2, 3
,前面是10
-〉next = 1
,prev = 1
- 1.行:
val = 10
,后面是2, 3
,前面是11, 10
-〉next = 0
,prev = 2
- 1.行:
val = 2
,后面是3
,前面是10, 11, 10
-〉next = 0
,prev = 3
- 1.行:
val = 2
,之前为2, 10, 11, 10
-〉prev = 0
在真实数据中,一个通道包含大约20 - 30个测量点,所以我希望有一个解决方案来解决这个问题,而不会在两个方向上产生30个偏移。而且,并非所有通道都具有相同的宽度,因此它应该是动态的。
很高兴得到任何帮助或提示,非常感谢。
MWE
import pandas as pd
df_test = pd.DataFrame({"val":[10,11,10,2,3,10,10,10,4,6,11,7,10,10,11,10,11,10]})
df_test["prev"] = [0,1,2,3,0,0,1,2,3,0,0,1,0,1,2,3,4,5]
df_test["next"] = [2,1,0,0,3,2,1,0,0,1,0,6,5,4,3,2,1,0]
+----+-------+--------+--------+
| | val | prev | next |
|----+-------+--------+--------|
| 0 | 10 | 0 | 2 |
| 1 | 11 | 1 | 1 |
| 2 | 10 | 2 | 0 |
| 3 | 2 | 3 | 0 |
| 4 | 3 | 0 | 3 |
| 5 | 10 | 0 | 2 |
| 6 | 10 | 1 | 1 |
| 7 | 10 | 2 | 0 |
| 8 | 4 | 3 | 0 |
| 9 | 6 | 0 | 1 |
| 10 | 11 | 0 | 0 |
| 11 | 7 | 1 | 6 |
| 12 | 10 | 0 | 5 |
| 13 | 10 | 1 | 4 |
| 14 | 11 | 2 | 3 |
| 15 | 10 | 3 | 2 |
| 16 | 11 | 4 | 1 |
| 17 | 10 | 5 | 0 |
+----+-------+--------+--------+
2条答案
按热度按时间vshtjzan1#
矢量化解决方案
结果
解释功能的工作
为简单起见,我们考虑一个包含5行且
direction
设置为next
的示例 Dataframe ,现在我将逐步完成函数中定义的步骤:将值平铺到2D矩阵中。* 请注意,主对角线表示原始列中的实际值 *
创建一个布尔掩码来标识值
>= 10
,然后使用True
屏蔽下三角形中的值,因为我们只对主对角线右侧的值感兴趣使用
argmin
查找每行中第一个false值的索引,如果没有false值(例如,第5行),则将索引设置为数组的长度从对角线值的索引中减去索引(
ix
),计算出实际代表满足条件的真值个数的距离ktecyv1j2#
我找到了一个有效的解决办法:
让它开一会儿,看看有没有人有更好的主意。