【发布时间】:2018-10-19 19:50:12
【问题描述】:
给定一个逻辑数组(True/False 值)和一个可能不是从 0 开始的索引范围,我想创建一个与该范围相同大小的新数组,其中每个元素包含最近的前面 True 的索引.
具有逻辑数组的示例,例如:
[1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0]
以及索引子集:[0, 1, 2, 3, 4, 5, 6, 7](此处,从 0 开始,但可能不必)
结果是:
[0, 0, 0, 3, 4, 5, 5, 7]
我有一个可行的解决方案(如下),但我正在寻找更快和/或更优雅和/或更可读的替代方案,因为数组的大小可能从数千到数百万不等。
import numpy as np
def map_nearest_preceding_true_indices(tmask, irange):
true_indices = np.where(tmask)[0]
mapped_indices = np.empty(len(irange), dtype=np.int)
for i, index in enumerate(irange):
index_loc = np.where(true_indices <= index)[0][-1]
mapped_indices[i] = true_indices[index_loc]
return mapped_indices
【问题讨论】:
-
如果整个数组都是0怎么办?
-
@SruthiV 强制执行的总体方案不会在涉及该功能时发生。
-
对更新的解决方案有任何反馈吗?
-
@Divakar 刚刚测试。效果很好!谢谢你。我用更大的数组对这两种解决方案进行了计时,tmask 大小为 5000,True/False 随机调度,idx_range 大小为 1000。您的解决方案需要 ~0.3 ms,而来自“agubelu”的解决方案需要 ~ 1.2 ms。我很惊讶后者使用生成器的速度较慢。
-
@Wall-E 我感觉到那里对 NumPy 的认识不足 :) NumPy 是为了性能,因此,我并不感到惊讶。
标签: python numpy indexing mapping conditional-statements