使用OR将3D布尔数组缩减为2D

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用OR将3D布尔数组缩减为2D相关的知识,希望对你有一定的参考价值。

我有一个3D布尔数组(5830L, 6447L, 4L),我希望通过在第三维(5830L, 6447L)上使用OR布尔运算符减少到(4L)。因此,我将通过4L 2D数组的元素比较进行元素。一个简单的一维示例如下:

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'

第三维的大小可以变化,因此我需要在for循环中运行它,或者以第三维的大小不是硬编码的方式运行它。 numpy.logical_or(a, b)效果很好,但只适用于2个数组元素(2L)。

任何理想如何在其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)

以上是关于使用OR将3D布尔数组缩减为2D的主要内容,如果未能解决你的问题,请参考以下文章

将 3d 数组中的工作表行绑定为 2d 数组

Python将3d数组重塑为2d

将 2D 数组附加到 3D 数组,扩展第三维

2D 数组到 3D 数组的数量,扩展第三维

numpy with python:将3d数组转换为2d

Python 2d 数组布尔减少