python - 查找(并记录)numpy 数组切片的最大值
问题描述
给定一个 numpy 数组,例如a = [0, 3, 2, 4, 0, 2, 3, 1, 1, 6, 2]
,是否有一种简单的方法可以记录每 3 个值的最大值?数组的长度可能不是 3 的倍数。在这种情况下,结果应该是b = [3, 4, 3, 6]
.
我想到了一些类似的东西
b = [max(a[k:k+3]) for k in range(0, len(a), 3)
但它没有考虑 3 的最后一个倍数之后的值(它应该)。
我还考虑过重新排列 numpy 数组,使其具有 3*n 行,并使用 numpy 模块沿正确的轴取最大值,但是,我不知道如何处理最后一个之后的值3的倍数。
解决方案
方法#1
我们可以 np.ufunc.reduceat
用来执行这种分组/间隔的归约操作。因此,要获得maximum
每个区间内的值,我们将拥有 -
W = 3 # group width
np.maximum.reduceat(a,np.r_[:len(a):W])
样品运行 -
In [166]: a
Out[166]: array([0, 3, 2, 4, 0, 2, 3, 1, 1, 6, 2])
In [167]: W = 3
In [168]: np.maximum.reduceat(a,np.r_[:len(a):W])
Out[168]: array([3, 4, 3, 6])
方法#2
这是另一个slicing
-
def max_interval_slice(a, W=3):
n = len(a)//W
max0 = a[:n*W].reshape(-1,W).max(1)
if n*W==len(a):
return max0
else:
return np.r_[max0, np.max(a[n*W:])]
样品运行 -
# Input array of length NOT multiple of width=3
In [99]: a
Out[99]: array([0, 3, 2, 4, 0, 2, 3, 1, 1, 6, 2])
In [100]: max_interval_slice(a, W=3)
Out[100]: array([3, 4, 3, 6])
# Input array of length multiple of width=3
In [95]: a = a[:9]
In [96]: max_interval_slice(a, W=3)
Out[96]: array([3, 4, 3])
推荐阅读
- javascript - 在运行时更改 settimeout 延迟时间
- php - 替代语法中的 foreach 是否实现为堆栈?
- c++ - C++ CGI - 内部服务器错误 - 何时使用字符串
- javascript - 单击时使文本清除形式
- php - 如何从 000webhost 获取数据
- html - 单选按钮在事件触发时以不同的方式工作,但单选按钮需要点击 2 次才能被选中
- php - PHP删除所有数组项
- c - 在文件中逐行存储一个巨大的数组会导致文件损坏
- java - 如何使用 Repository Hibernate 和 Pageable 与 Java Spring 进行参数搜索?
- linux - zeppelin hortonworks 沙盒的默认用户