python - Numpy数组按升序仅获取项目和索引
问题描述
假设我有以下数组:
arr = [1,2,4,5,6,5,4,3,2,3,4,5,6,7,8]
我只想获取按升序排列的项目,而忽略中间的“反向”。
所以对于这个数组,我想得到:
res = [1,2,4,5,6,7,8]
,在索引处:[0,1,2,4,13,14]
任何想法?
解决方案
我认为你应该使用累积的最大值来解决这个问题,即每个给定步骤的最大值:
>>> arr
array([1, 2, 4, 5, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 8])
>>> np.maximum.accumulate(arr)
array([1, 2, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8])
您可以执行以下操作:
>>> arr[arr == np.maximum.accumulate(arr)]
array([1, 2, 4, 5, 6, 6, 7, 8])
但是,这并不能处理保持不变的数字(你得到额外的 6),要处理这个问题,你可以“滚动”累积的最大数组并添加它不等于滚动数组的条件(即,数组的值不等于之前的最大值):
>>> m = np.maximum.accumulate(arr)
>>> arr[(arr == m) & (arr != np.roll(m, -1))]
array([1, 2, 4, 5, 6, 7, 8])
但实际上,您想要累积最大值的唯一值,因此您也可以将其用于np.unique
:
>>> np.unique(np.maximum.accumulate(arr))
array([1, 2, 4, 5, 6, 7, 8])
不知道哪个会更快,但想出好的测试数据并不是直截了当的。如果您有一个可调整大小的数组,我会对哪种方法对您的数据更快感兴趣。
推荐阅读
- angular - 从 Angular 应用调用 Firebase Cloud Function 后出错
- css - 如何使用 CSS 使滑块的标签在 X 轴上平移以适合滑块的宽度?
- amazon-web-services - Terraform:如何仅在支持请求的实例类型的区域中请求 AWS EC2 实例?
- python - 如何设置 VScode,以便我可以单击调试输出中的文件行
- ruby-on-rails - 在 Windows 10 上的 ubuntu 20.04 WSL 上安装 rmagick gem
- php - Dhru Api - 获取客户意见
- api - Postman 中的 curl 命令
- javascript - 节点找不到模块
- javascript - p5.js 中是否有一种简单的方法可以绘制透明形状而无需将轮廓绘制到该形状上?
- python - 如何计算整个熊猫数据集的成对互信息?