是否有numpy函数可实现按指定列表逐个移除数组对应元素?
需求说明
你需要从原始数组中按指定次数删除对应元素:对remove数组中的每一个元素,仅删除org数组中1个对应值的匹配元素,而非删除所有同值元素,示例如下:
org = [1,1,1,1,2,2,4] remove = [1,1,2] result = foo(org, remove) # 预期结果:[1,1,2,4] # 实际移除了2个1和1个2
结论
NumPy没有原生的现成内置函数可以直接实现该需求。NumPy自带的元素删除类函数均为向量化全量操作,比如np.setdiff1d会删除所有匹配值,np.delete需要指定明确索引,都不支持按指定次数批量删除对应数量的同值元素。
实现方案
纯Python实现(性能足够应对绝大多数场景)
from collections import Counter def foo(org, remove): # 统计需要删除的各元素的次数 del_counter = Counter(remove) res = [] for val in org: if del_counter.get(val, 0) > 0: del_counter[val] -= 1 else: res.append(val) return res
NumPy适配实现
如果输入已经是NumPy数组,可以用以下方式实现,输出仍为NumPy数组:
import numpy as np def foo_numpy(org_arr: np.ndarray, remove_arr: np.ndarray) -> np.ndarray: # 统计待删除元素的次数 vals, del_counts = np.unique(remove_arr, return_counts=True) del_counter = dict(zip(vals, del_counts)) # 生成保留元素的掩码 mask = [] for val in org_arr: if del_counter.get(val, 0) > 0: del_counter[val] -= 1 mask.append(False) else: mask.append(True) return org_arr[mask]
调用示例:
org = np.array([1,1,1,1,2,2,4]) remove = np.array([1,1,2]) print(foo_numpy(org, remove)) # 输出:[1 1 2 4]
内容的提问来源于stack exchange,提问作者Reinhard
相关产品推荐
相关产品推荐

