【问题标题】:Drop element in numpy array (or pandas series) if difference to previous element is <N如果与前一个元素的差异为 <N,则在 numpy 数组(或 pandas 系列)中删除元素
【发布时间】:2020-01-31 19:27:57
【问题描述】:

我有一个如下所示的 numpy 数组:

a = np.array([0,10,19,20,30,40,42,49,50,51])

我想删除所有连续差为

a_filtered = np.array([0,10,19,30,40,49])

我如何在 numpy 中做到这一点? (可选)特别感谢如何在 pandas 系列中执行此操作(例如,删除索引差异为

【问题讨论】:

    标签: arrays pandas numpy filter selection


    【解决方案1】:

    IIUC

    s=pd.Series(a)
    s[~(s.diff()<=2)]
    Out[289]: 
    0     0
    1    10
    2    19
    4    30
    5    40
    7    49
    dtype: int32
    

    s[~(s.diff()<=2)].to_numpy()
    Out[292]: array([ 0, 10, 19, 30, 40, 49])
    

    【讨论】:

    • 谢谢!不幸的是,我发现我无法在数据帧的索引上执行此操作,这意味着它不适用于s=df.index。你有解决方案吗?如果s 是一个 numpy 数组,它将如何工作?
    【解决方案2】:

    给你:

    N = 2
    s = pd.Series(a)
    
    mask = ~s.diff().le(2)
    s[mask]
    
    # you can also do
    # a[mask]
    

    输出:

    1    10
    2    19
    4    30
    5    40
    7    49
    dtype: int32
    

    【讨论】:

    • 0 丢失 :-)
    • @WeNYoBen 哎哟。那我就偷你的主意:-)
    • 谢谢!不幸的是,我发现我无法对数据框的索引执行此操作,这意味着它不适用于s=df.index。你有解决方案吗?如果s 是一个 numpy 数组,它将如何工作?
    • s=df.index.to_series()s=df.index.values
    • 如果s是numpy数组?
    【解决方案3】:

    在numpy上,你可以使用np.diffnp.insert来专门处理元素0

    m = np.insert(np.diff(a, 1) > 2, 0, True)
    a[m]
    
    Out[526]: array([ 0, 10, 19, 30, 40, 49])
    

    或者使用np.roll并将掩码的元素0分配给True

    m = (a - np.roll(a, 1)) > 2
    m[0] = True
    a[m]
    
    Out[534]: array([ 0, 10, 19, 30, 40, 49])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2018-11-16
      • 1970-01-01
      • 2014-11-24
      • 2023-01-26
      • 2018-07-11
      相关资源
      最近更新 更多