使用 OR 将 3D 布尔数组简化为 2D
Using OR to reduce a 3D boolean array to 2D
我有一个 3D 布尔数组 (5830L, 6447L, 4L)
,我想通过在第 3 个维度 (4L)
上使用 OR
布尔运算符将其缩减为 (5830L, 6447L)
。因此,我将逐个元素地比较 4L
二维数组。一个简单的一维示例类似于:
a = [True, False, True]
b = [False, False, True]
c = [True, False, True]
mask = [any(tup) for tup in zip(a, b, c)]
print mask
'True, False, True'
第 3 维的大小可以变化,所以我需要在 for
循环中 运行 或 运行 使第 3 维的大小没有像上面那样硬编码。
numpy.logical_or(a, b)
效果很好,但仅适用于 2 个数组元素 (2L
)。
当它有 3 个或更多元素时,任何理想的方法;即第 3 个维度是 > 2L
?
两个选项:使用 .reduce
ufunc method,或使用 any
(与布尔值上的重复 OR 相同):
In [195]: x = np.random.choice([False, True], (5830, 6447, 4))
In [196]: via_reduce = np.logical_or.reduce(x, axis=2)
In [197]: via_any = x.any(axis=2)
In [198]: via_manual = np.logical_or(np.logical_or(np.logical_or(x[..., 0], x[..., 1]), x[..., 2]), x[...,3])
In [199]: np.allclose(via_reduce, via_any)
Out[199]: True
In [200]: np.allclose(via_reduce, via_manual)
Out[200]: True
老实说,我原以为 .any
会快得多,但这里并没有太大区别:
In [201]: %timeit via_reduce = np.logical_or.reduce(x, axis=2)
883 ms ± 2.99 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [202]: %timeit via_any = x.any(axis=2)
895 ms ± 7.16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我有一个 3D 布尔数组 (5830L, 6447L, 4L)
,我想通过在第 3 个维度 (4L)
上使用 OR
布尔运算符将其缩减为 (5830L, 6447L)
。因此,我将逐个元素地比较 4L
二维数组。一个简单的一维示例类似于:
a = [True, False, True]
b = [False, False, True]
c = [True, False, True]
mask = [any(tup) for tup in zip(a, b, c)]
print mask
'True, False, True'
第 3 维的大小可以变化,所以我需要在 for
循环中 运行 或 运行 使第 3 维的大小没有像上面那样硬编码。
numpy.logical_or(a, b)
效果很好,但仅适用于 2 个数组元素 (2L
)。
当它有 3 个或更多元素时,任何理想的方法;即第 3 个维度是 > 2L
?
两个选项:使用 .reduce
ufunc method,或使用 any
(与布尔值上的重复 OR 相同):
In [195]: x = np.random.choice([False, True], (5830, 6447, 4))
In [196]: via_reduce = np.logical_or.reduce(x, axis=2)
In [197]: via_any = x.any(axis=2)
In [198]: via_manual = np.logical_or(np.logical_or(np.logical_or(x[..., 0], x[..., 1]), x[..., 2]), x[...,3])
In [199]: np.allclose(via_reduce, via_any)
Out[199]: True
In [200]: np.allclose(via_reduce, via_manual)
Out[200]: True
老实说,我原以为 .any
会快得多,但这里并没有太大区别:
In [201]: %timeit via_reduce = np.logical_or.reduce(x, axis=2)
883 ms ± 2.99 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [202]: %timeit via_any = x.any(axis=2)
895 ms ± 7.16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)