gpt4 book ai didi

python - numpy:累积 'greater' 操作

转载 作者:行者123 更新时间:2023-12-04 12:21:40 28 4
gpt4 key购买 nike

我正在尝试编写一个函数来检测所有上升沿 - 向量中值超过特定阈值的索引。这里描述了类似的东西:Python rising/falling edge oscilloscope-like trigger ,但我想添加滞后,以便触发器不会触发,除非值低于另一个限制。
我想出了以下代码:

import numpy as np

arr = np.linspace(-10, 10, 60)
sample_values = np.sin(arr) + 0.6 * np.sin(arr*3)

above_trigger = sample_values > 0.6
below_deadband = sample_values < 0.0
combined = 1 * above_trigger - 1 * below_deadband
现在在 combined数组有 1其中原始值高于上限, -1其中值低于下限和 0值介于两者之间:
>>> combined
array([ 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 0, 0,
1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1,
0, 0, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
1, 0, 0, 1, 1, 1, 0, -1, -1])
我的想法是使用一些巧妙的函数来顺序处理这个向量,并用它们之前的任何非零值替换所有零序列。那么问题将归结为简单地找到值从 -1 变化的位置。至 1 .
我虽然认为 greater如果使用得当,操作将实现此目的: -1编码为 True1False :
  • ( True ("-1") > -1) -> True (“-1”)
  • ( True ("-1") > 1) -> False (“1”)
  • ( True ("-1") > 0) -> True (“-1”)
  • ( False ("1") > -1) -> True (“-1”)
  • ( False ("1") > 1) -> False (“1”)
  • ( False ("1") > 0) -> False (“1”)

  • 但结果并不是我所期望的:
    >>> 1 - 2 * np.greater.accumulate(combined)
    array([-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1])
    看来 greater在这种情况下,函数不能正确地将 bool 值与数值进行比较,即使它在用于标量或成对时工作正常:
    >>> np.greater(False, -1)
    True
    >>> np.greater.outer(False, combined)
    array([False, False, True, True, True, True, True, True, True,
    True, True, False, False, False, False, False, False, False,
    False, False, False, True, True, True, True, True, True,
    True, True, True, False, False, False, False, False, False,
    False, False, False, True, True, True, True, True, True,
    True, True, True, True, False, False, False, False, False,
    False, False, False, False, True, True])
    这是预期的行为吗?我在这里做错了什么,有什么办法可以解决这个问题吗?
    或者,也许您可​​以建议另一种方法来解决这个问题?
    谢谢你。

    最佳答案

    我一直在开发一个名为 ufunclab 的包包括函数 hysteresis_relay 这就是你想要的。我没有把它放在 PyPI 上,所以你必须获取源代码并自己构建它才能使用它。

    In [122]: import numpy as np

    In [123]: from ufunclab import hysteresis_relay

    In [124]: arr = np.linspace(-10, 10, 60)

    In [125]: sample_values = np.sin(arr) + 0.6 * np.sin(arr*3)

    In [126]: hysteresis_relay(sample_values, 0.0, 0.6, -1, 1, 1).astype(int)
    Out[126]:
    array([ 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1,
    1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, -1, -1])

    另一种选择是使用 Pandas(但我怀疑 @bb1 的答案会比这更有效,@bb1 的答案避免依赖另一个库)。
  • 转换 combined到 Pandas 系列。
  • 将 0 替换为 pd.NA系列中。
  • 使用方法fillna()method='ffill' “向前填充”NA值。
  • 使用 to_numpy() 将系列转换回 NumPy 数组方法。
  • In [107]: combined
    Out[107]:
    array([ 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 0, 0,
    1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1,
    0, 0, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
    1, 0, 0, 1, 1, 1, 0, -1, -1])

    In [108]: import pandas as pd

    In [109]: pd.Series(combined).replace(0, pd.NA).fillna(method='ffill').to_numpy()
    Out[109]:
    array([ 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1,
    1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, -1, -1])

    关于python - numpy:累积 'greater' 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68869535/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com