You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:54:08