【问题标题】:Count sign changes for cases when positives are followed by negatives with Numpy当 Numpy 的正数后跟负数时,计数符号会发生变化
【发布时间】:2022-01-02 09:17:31
【问题描述】:

我发现这个有用的起点可以通过正号计算上升沿:Efficiently detect sign-changes in python

def crossings_nonzero_all(data):
    pos = data > 0
    npos = ~pos
    return ((pos[:-1] & npos[1:]) | (npos[:-1] & pos[1:])).nonzero()[0]

但是,我宁愿只找到那些先是正数,然后是负数的指数,并折扣那些有正数,后跟零,然后又是正号的指数。

[0, 1, 2, -1, 0, 1, 2, 0] 应该只选择一种情况,因为从正 2 变为负 -1。 [2, 0] 不算数,因为零之前没有负号。

你能帮我实现这个吗?

添加了更好的数据示例:

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2102.4937, 2359.4937, 2359.4937, 2615.4937, 2872.4937, 3129.4937, 3385.4937, 3642.4937, 4155.4937, 4412.4937, 4669.4937, 4925.4937, 5439.4937, 5695.4937, 6209.4937, 6465.4937, 6979.4937, 7492.4937, 8006.4937, 8519.4937, 9032.4937, 9546.4937, 10059.4937, 10829.4937, 11342.4937, 11856.4937, 12626.4937, 13396.4937, 13909.4937, 14679.4937, 15449.4937, 15963.4937, 16733.4937, 17503.4937, 18273.4937, 19043.4937, 19813.4937, 20583.4937, 21353.4937, 22123.4937, 22893.4937, 23920.4937, 24690.4937, 25460.4937, 26230.4937, 27000.4937, 27770.4937, 28540.4937, 29310.4937, 30080.4937, 30593.4937, 31363.4937, 31877.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32561.4937, 32133.4937, 31363.4937, 30593.4937, 30080.4937, 29567.4937, 28797.4937, 28283.4937, 27770.4937, 27257.4937, 26743.4937, 26230.4937, 25716.4937, 25203.4937, 24690.4937, 24176.4937, 23663.4937, 23150.4937, 22636.4937, 22123.4937, 21610.4937, 21096.4937, 20583.4937, 20070.4937, 19556.4937, 19043.4937, 18786.4937, 18273.4937, 17759.4937, 17246.4937, 16733.4937, 16219.4937, 15963.4937, 15449.4937, 14936.4937, 14423.4937, 13909.4937, 13653.4937, 12882.4937, 12626.4937, 12112.4937, 11599.4937, 11086.4937, 10829.4937, 10316.4937, 9802.4937, 9289.4937, 9032.4937, 8519.4937, 8262.4937, 7749.4937, 7236.4937, 6979.4937, 6465.4937, 5952.4937, 5695.4937, 5182.4937, 4925.4937, 4412.4937, 4155.4937, 3642.4937, 3385.4937, 3129.4937, 2615.4937, 2359.4937, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2260.5063, 2516.5063, 2773.5063, 3030.5063, 3286.5063, 3543.5063, 3800.5063, 4056.5063, 4313.5063, 4570.5063, 4826.5063, 5083.5063, 5340.5063, 5596.5063, 5853.5063, 5853.5063, 6110.5063, 6366.5063, 6623.5063, 6880.5063, 6880.5063, 7137.5063, 7393.5063, 7393.5063, 7650.5063, 7907.5063, 7907.5063, 8163.5063, 8420.5063, 8420.5063, 8677.5063, 8677.5063, 8933.5063, 9190.5063, 9190.5063, 9447.5063, 9447.5063, 9703.5063, 9703.5063, 9703.5063, 9960.5063, 10217.5063, 10217.5063, 10217.5063, 10217.5063, 10473.5063, 10473.5063, 10473.5063, 10473.5063, 10730.5063, 10730.5063, 10730.5063, 10987.5063, 10987.5063, 10987.5063, 10987.5063, 11243.5063, 11243.5063, 11243.5063, 11243.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11757.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11500.5063, 11243.5063, 11243.5063, 11243.5063, 11243.5063, 11243.5063, 11243.5063, 11243.5063, 10987.5063, 10987.5063, 10987.5063, 10987.5063, 10987.5063, 10987.5063, 10730.5063, 10730.5063, 10730.5063, 10730.5063, 10473.5063, 10730.5063, 10473.5063, 10473.5063, 10473.5063, 10217.5063, 10217.5063, 10217.5063, 10217.5063, 10217.5063, 9960.5063, 9960.5063, 9960.5063, 9960.5063, 9703.5063, 9703.5063, 9703.5063, 9703.5063, 9447.5063, 9447.5063, 9447.5063, 9447.5063, 9190.5063, 9190.5063, 9190.5063, 9190.5063, 9190.5063, 8933.5063, 8933.5063, 8677.5063, 8677.5063, 8677.5063, 8420.5063, 8420.5063, 8420.5063, 8420.5063, 8163.5063, 8163.5063, 8163.5063, 7907.5063, 8163.5063, 7907.5063, 7907.5063, 7907.5063, 7650.5063, 7650.5063, 7650.5063, 7393.5063, 7650.5063, 7393.5063, 7393.5063, 7393.5063, 7137.5063, 7137.5063, 7137.5063, 7137.5063, 6880.5063, 6880.5063, 6880.5063, 6623.5063, 6623.5063, 6623.5063, 6623.5063, 6366.5063, 6366.5063, 6366.5063, 6366.5063, 6366.5063, 6110.5063, 6110.5063, 6110.5063, 5853.5063, 5853.5063, 5853.5063, 5853.5063, 5853.5063, 5596.5063, 5596.5063, 5596.5063, 5340.5063, 5340.5063, 5340.5063, 5340.5063, 5340.5063, 5083.5063, 5083.5063, 5083.5063, 4826.5063, 4826.5063, 4826.5063, 4826.5063, 4826.5063, 4826.5063, 4570.5063, 4570.5063, 4570.5063, 4570.5063, 4570.5063, 4313.5063, 4313.5063, 4313.5063, 4313.5063, 4056.5063, 4056.5063, 4056.5063, 4056.5063, 4056.5063, 4056.5063, 3800.5063, 3800.5063, 3800.5063, 3800.5063, 3800.5063, 3800.5063, 3543.5063, 3543.5063, 3543.5063, 3543.5063, 3543.5063, 3286.5063, 3286.5063, 3286.5063, 3286.5063, 3286.5063, 3286.5063, 3286.5063, 3030.5063, 3030.5063, 3030.5063, 3030.5063, 3030.5063, 2773.5063, 2773.5063, 2773.5063, 2773.5063, 2773.5063, 2773.5063, 2773.5063, 2773.5063, 2773.5063, 2516.5063, 2516.5063, 2516.5063, 2516.5063, 2516.5063, 2516.5063, 2516.5063, 2260.5063, 2260.5063, 2260.5063, 2260.5063, 2260.5063, 2260.5063, 2260.5063, 0.0, 0.0, 2260.5063, 2260.5063, 0.0, 0.0]

这应该给出来自 [0.0, 2102.4937] 和 [0.0, 2260.5063] 的索引,而不是来自 [0.0, 2296.8233] 的索引,因为没有下降的值,只是在最后一个样本中上升。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您可以拨打np.sign,然后拨打np.diff,例如:

    a = np.array([0, 1, 2, -1, 0, 1, 2, 0])
    idx, = np.where(np.diff(np.sign(a)) == -2)
    # idx == array([2]), corresponding to sign difference of -2 = sign(-1) - sign(2). 
    

    【讨论】:

    • 谢谢。我宁愿有一个独立于价值观的更一般的形式,只是找出它们是上升还是下降。我在双 diff 和比较索引 (n, n+1) 上的结果值方面做得更好: d = np.diff(np.sign(data), n=2); np.where((d[1:] == -1) & (d[:-1] == 1))[0] 但它仍然不完全正确。算法不应该计算在零之前只有正号的情况。请查看我的 OP 更好的示例数据,如果您想更多地思考并编辑您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多