python - 使用 OR 将 3D 布尔数组缩减为 2D
问题描述
我有一个 3D 布尔数组(5830L, 6447L, 4L)
,我想通过在 3rd 维度上(5830L, 6447L)
使用布尔运算符来减少它。因此,我将对二维数组进行逐个元素的比较。一个简单的 1D 示例类似于:OR
(4L)
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 个或更多元素时执行此操作;即第三维是 > 2L
?
解决方案
两个选项:使用.reduce
ufunc 方法,或使用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)
推荐阅读
- node.js - 如何从 mongdb find() 中检索键值
- sorting - 删除重复项,计数器增加
- sql - 当同一列中的值不匹配但不同列重复时将返回结果的 SQL 查询
- pine-script - Pine Script:我想编写一个条件,其中任何 3 个连续的红色蜡烛收盘低于 ma
- javascript - 如何访问通过类组件中传递的查询参数?
- java - Android Studio 北极狐:加载小部件时出现问题
- java - 创建一个基于 Java 中的用户输入创建更多文本字段的方法
- git - 我正在尝试从 Visual Studio Code 推送到 GitHub 存储库,但我无法进行身份验证
- python - django-crontab 不适用于 docker python:3.9-buster 图像
- webview2 - WebView2 环境异常(请求的资源正在使用中)