【问题标题】:Splitting numpy array according bool根据 bool 拆分 numpy 数组
【发布时间】:2016-07-30 18:46:37
【问题描述】:

我有一个类似的数组

a = np.array[ 4, 9, 3, 1, 6, 4, 7, 4, 2]

和一个大小相同的布尔数组(所以这是一个掩码)

boo = np.array[ True, True, False, False, True, True, True, False, True]

(boo 也可以以False 开头作为第一个条目...)

现在我想将 a 拆分为具有 2 个条件的新数组:

  • 一个新的子数组只包含True in boo 的值
  • 新的子数组总是在False 之后开始,在False 之前结束。
    所以结果是[[4, 9], [6, 4, 7], [2]]

我的想法是:
我知道我可以使用np.split 作为基础。
在这种情况下,它将是b = np.split(a, [2, 4, 7, 8],然后我只会从b 中提取第二个元素,从第一个元素开始,因为我在boo 中的第一个元素是True。

所以我的问题是:如何获取数组[2, 4, 7, 8]?

(用python循环不是一个选项,因为它太慢了。)

【问题讨论】:

    标签: python arrays numpy split


    【解决方案1】:

    也许这已经足够快了:

    d = np.nonzero(boo != np.roll(boo, 1))[0]
    if d[0] == 0:
        d = d[1:]
    b = np.split(a, d)
    b = b[0::2] if boo[0] else b[1::2]
    

    找到了一种更简单快捷的方法:

    indices = np.nonzero(boo[1:] != boo[:-1])[0] + 1
    b = np.split(a, indices)
    b = b[0::2] if boo[0] else b[1::2]
    

    比较切片的速度至少是 np.roll() 加上 if 语句的两倍。
    此外,np.flatnonzero(...) 看起来会比 np.nonzero(...)[0] 更好,但会稍微慢一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      相关资源
      最近更新 更多