如何在NumPy数组中检查前90个元素是否存在指定值?
解决数组前N个元素的存在性检查问题
Got it, let's adjust your code to check the last 90 elements (or all previous elements if there aren't 90 yet) instead of just the immediately prior one. Here's how to do it cleanly with numpy:
首先明确核心需求:当lachange为1时,要确认最近90次记录里有没有出现过1,如果有,就把当前值改成0存入数组;如果没有,直接存入1。如果lachange是0,直接存入即可。
原来的代码仅对比了上一个元素,现在我们用numpy的切片功能快速获取目标范围的元素,再做存在性判断:
import numpy as np overt = np.array([]) # 这里替换成你实际的frame循环逻辑,比如遍历视频帧或者自定义序列 for frame in range(your_total_frame_count): lachange = get_current_lachange() # 替换成你获取lachange值的实际代码 if frame == 0: overt = np.append(overt, lachange) else: if lachange == 0: overt = np.append(overt, lachange) elif lachange == 1: # 取最近90个元素,数组长度不足90时自动取全部历史元素 recent_elements = overt[-90:] if len(overt) >= 90 else overt # 快速判断是否存在1 if np.any(recent_elements == 1): overt = np.append(overt, 0) lachange = 0 else: overt = np.append(overt, lachange)
关键细节说明
overt[-90:]是numpy的切片语法,完美适配你“前90个元素或从起始到当前所有元素”的需求:数组长度≥90时取最后90个,不足时取整个数组。np.any(recent_elements == 1)是numpy原生的向量级判断,比手动循环遍历效率高得多,尤其适合处理大规模数组。
可选性能优化
如果你的数据量很大,频繁使用np.append会因为数组反复扩容导致性能损耗。可以预先初始化固定大小的数组,用索引赋值的方式优化:
max_expected_frames = 10000 # 替换成你的最大预期frame数量 overt = np.zeros(max_expected_frames, dtype=int) for frame in range(max_expected_frames): lachange = get_current_lachange() if frame == 0: overt[frame] = lachange else: if lachange == 0: overt[frame] = lachange elif lachange == 1: # 计算需要检查的起始索引:从当前frame往前推90位,不小于0 start_idx = max(0, frame - 90) recent_elements = overt[start_idx:frame] if np.any(recent_elements == 1): overt[frame] = 0 lachange = 0 else: overt[frame] = lachange # 最后如果需要只保留有效数据,切片即可 overt = overt[:frame+1]
内容的提问来源于stack exchange,提问作者Dan Ghadimi
相关产品推荐
相关产品推荐

