根据bool拆分numpy数组

dpiehjr4  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(85)

我有一个数组,
第一个月
和一个大小相同的布尔数组(所以这是一个掩码),如
boo = np.array[ True, True, False, False, True, True, True, False, True]
boo也可以以False作为第一个条目开始.)
现在我想把a拆分成新的数组,有两个条件:

  • 一个新的子数组只包含boo中的True
  • 新的子阵列总是在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循环不是一个选择,因为它太慢了。

agyaoht7

agyaoht71#

也许这足够快:

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

字符串
找到一个更简单、更快捷的方法:

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


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

展开查看全部
ycl3bljg

ycl3bljg2#

总结一下最佳解决方案:

  1. def splitByMask(a, mask):
  2. return numpy.split(a, numpy.flatnonzero(numpy.diff(mask)) + 1)

字符串
结果如下:

  1. >>> myArray = numpy.array([4, 9, 3, 1, 6, 4, 7, 4, 2])
  2. >>> myMask = numpy.array([1, 1, 0, 0, 1, 1, 1, 0, 1]) # or True / False
  3. >>> splitByMask(myArray, myMask)
  4. [array([4, 9]), array([3, 1]), array([6, 4, 7]), array([4]), array([2])]


这也适用于零长度数组和布尔掩码。

相关问题