python - 根据 bool 拆分 numpy 数组

标签 python arrays numpy split

我有一个类似的数组

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

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

boo = np.array[真,真,假,假,真,真,真,假,真]

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

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

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

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

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

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

最佳答案

也许这已经足够快了:

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] 更好,但速度稍慢。

关于python - 根据 bool 拆分 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36517645/

相关文章:

python - 如何找到数据帧不同子部分的最大值和总和并将其写入新数据帧?

ruby - 将数组拆分为 m 大小的 n 组?

C++ 如何从函数返回一个数组?

javascript - 使用 jSTL 数组填充 javascript 数组

python - NumPy - 使用强度值矩阵的图像(矩阵)阈值处理。

python - 如何使用 python win32com 访问除默认文件夹(如收件箱、已发送)以外的 outlook 文件夹?

python - 解析 PDF 文档中的表格

python - 如何获得列表的旋转输出?

python - 如何计算 numpy 数组/矩阵的稀疏度百分比?

python - 单个位置索引器超出范围