python - 使用 numpy 计算范围内列表值的出现次数
问题描述
我有一个二维范围数组和一个我想过滤的关联值列表。我想获得属于每个范围的过滤值的数量。
例如,考虑:
- 范围矩阵
{{0,1},{1,4}}
; - 和值列表
{5,10,16,21}
。
假设我过滤x < 15
. 这将给出一个过滤后的索引数组{0,1}
,因为只有 5 和 10 小于 15,并且它们分别落在索引 0 和 1 处。
使用这个过滤后的数组,因为 0 在 [0,1) 范围内,1 在 [1,4) 范围内,所以这个函数应该返回 (1,1)。
但是,如果我们过滤x%5 == 1
,过滤后的索引数组将是{2,3}
(因为只有 16 和 21 mod 5 等价于 1,并且 16 和 25 分别具有索引 2 和 3)并且函数应该返回 (0,2) 因为两者2 和 3 大于 1 且小于 4。
我知道如何使用循环来做到这一点,但我也不希望如此。
我不确定在 NumPy 中实现此功能的最佳方法是什么——我正在考虑使用np.where()
,但我不确定具体细节。此外,不确定这是否是解决此问题的最简单方法:是否有更简单的方法来确定一个范围内有多少过滤值?
解决方案
这是一个解决方案(对于范围/箱相邻的情况,这似乎是您的情况):
a = np.array([5,10,16,21])
bins = [[0,1],[1,4]]
bins = [b[0] for b in bins] + [bins[-1][1]]
indices = np.arange(len(a))[a % 5 == 1]
np.histogram(indices, bins)[0]
# array([0, 2])
indices = np.arange(len(a))[a < 15]
np.histogram(indices, bins)[0]
# array([1, 1])
推荐阅读
- javascript - 我打电话时没有定义反应
- python - 在 Python 中定义梯度和 hessian 函数
- ios - 我的自定义框架崩溃'无法在捆绑包中加载 NIB
- javascript - 为什么我不能将我的设置器用于带有模板的纯 JS 中的自定义元素?
- java - 为什么我在 Retrofit2 按 id 删除数据时收到 IllegalArgumentException 错误?以及如何解决?
- angular - 离子 HTTP 客户端发布请求跨源错误,但适用于 Postman
- android - 如何在 Android 中删除 UI xml 中的空格?
- java - 使用十字按钮清除两个编辑文本
- angular - Bootsrap 类在 Angular 中不起作用
- python - 具有可迭代值的正则表达式函数