NumPy where作为范围指数

2024-03-19 05:41:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的纽比阵列:

a = numpy.array([1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0])

目标是找到0和1、起始和结束索引的范围。我想在另一个包含时间戳的numpy数组中使用这个范围,以找出每个零相位需要多少时间。像这样:

^{2}$

但是,numpy where给出了我所有的指数:

numpy.where(a==0)
(array([ 3,  4,  5,  9, 10, 11], dtype=int64),)

我只需要每个零相位的起始和结束idx,比如[[3,5],[9,11]]。我怎么才能做到呢?在


Tags: numpy目标时间数组指数wherearraydtype
1条回答
网友
1楼 · 发布于 2024-03-19 05:41:39

有一种方法-

def start_stop(a, val=0):
    n = np.concatenate(([False], a==val,[False]))
    idx = np.flatnonzero(np.diff(n))
    # or idx = np.flatnonzero(n[1:] != n[:-1])
    return idx[::2], idx[1::2]-1

更短的路-

^{pr2}$

一个班轮-

np.flatnonzero(np.diff(np.r_[0,a==0,0])).reshape(-1,2) - [0,1]

样本运行-

In [324]: a
Out[324]: array([1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0])

In [325]: start_stop(a, val=0)
Out[325]: (array([3, 9]), array([ 5, 11]))

In [326]: start_stop_v2(a, val=0)
Out[326]: (array([3, 9]), array([ 5, 11]))

In [327]: np.flatnonzero(np.diff(np.r_[0,a==0,0])).reshape(-1,2) - [0,1]
Out[327]: 
array([[ 3,  5],
       [ 9, 11]])

重复使用np.where(a==val)

要解决此问题,请重新使用np.where(a==val)-

In [388]: idx = numpy.where(a==0)[0]

In [389]: mask = np.r_[True,np.diff(idx)!=1,True]

In [390]: idx[mask[:-1]] # starts
Out[390]: array([3, 9])

In [391]: idx[mask[1:]] # stops
Out[391]: array([ 5, 11])

相关问题 更多 >