【问题标题】:First occurrence of consecutive elements in a numpy arraynumpy数组中连续元素的第一次出现
【发布时间】:2019-01-07 05:30:04
【问题描述】:

我有一个二进制 numpy 掩码数组,我想在至少 3 次连续出现 1 时找到沿轴 = 0 的元素的索引。如果没有出现,则 -999 或 NaN 或任何显示它的东西不是索引。 所以例如我的数组是这样的:

masked_array(
data=[[[1.0, 0.0],
     [0.0, 1.0]],

    [[0.0, 1.0],
     [0.0, 1.0]],

    [[1.0, 1.0],
     [1.0, 1.0]],

    [[1.0, 1.0],
     [1.0, 0.0]],

    [[1.0, --],
     [0.0, 1.0]],

    [[1.0, 1.0],
     [1.0, 1.0]]])

我想得到这样的东西:

array([[   2,    1],
       [-999,    0]])

最pythonic的方式是什么?任何提示将不胜感激。

【问题讨论】:

    标签: python-2.7 pandas numpy


    【解决方案1】:

    IIUC,您可以先将您的 np 数组设为 2D 并构建一个数据框,这会使一切变得更容易。看看

    row, cols = m.shape[0], m.shape[1] * m.shape[2]
    df = pd.DataFrame(m.reshape(row, cols))
    
        0   1   2   3
    0   1.0 0.0 0.0 1.0
    1   0.0 1.0 0.0 1.0
    2   1.0 1.0 1.0 1.0
    3   1.0 1.0 1.0 0.0
    4   1.0 0.0 0.0 1.0
    5   1.0 1.0 1.0 1.0
    

    现在您可以在axis=0 上使用3 的反向rolling 窗口并检查all 元素是否为1

    ndf = df[::-1].rolling(3, axis=0).apply(all, raw=True)[::-1]
    
        0   1   2   3
    0   NaN NaN NaN 1.0
    1   NaN 1.0 NaN NaN
    2   1.0 NaN NaN NaN
    3   1.0 NaN NaN NaN
    4   NaN NaN NaN NaN
    5   NaN NaN NaN NaN
    

    并使用idxmax()获取第一个1出现的索引

    ndf[ndf>=1].idxmax()
    
    0    2.0
    1    1.0
    2    NaN
    3    0.0
    dtype: float
    

    要可视化您描述的方式,只需重塑输出

    ndf[ndf>=1].idxmax().values.reshape(m.shape[1], m.shape[2])
    
    array([[ 2.,  1.],
           [nan,  0.]])
    

    【讨论】:

    • 绝妙的解决方案!非常感谢。虽然它解决了我的问题,但只是想知道是否可以只使用 numpy 而不是 pandas 来完成?
    猜你喜欢
    • 2020-11-26
    • 2023-03-12
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多