Skip to main content
 首页 » 编程设计

python之使用迭代从 numpy 数组中删除元素

2025年05月04日32yyy_WW

从 numpy 数组中删除元素并同时检索其初始位置的最快方法是什么。以下代码没有返回它应该返回的所有元素:

list = [] 
for pos,i in enumerate(ARRAY): 
    if i < some_condition: 
        list.append(pos)  #This is where the loop fails 
 
for _ in list: 
    ARRAY = np.delete(ARRAY, _) 

请您参考如下方法:

确实感觉您的处理效率很低。您可能应该使用更多内置的 numpy 功能——例如np.where,或 bool 索引。在这样的循环中使用 np.delete 会破坏使用 numpy 获得的任何性能提升...

例如(使用 bool 索引):

keep = np.ones(ARRAY.shape, dtype=bool) 
for pos, val in enumerate(ARRAY): 
    if val < some_condition: 
        keep[pos] = False 
ARRAY = ARRAY[keep] 

当然,这可能会进一步简化(和概括):

ARRAY = ARRAY[ARRAY >= some_condition] 

编辑

您在评论中指出您也需要相同的掩码来对其他数组进行操作——这不是问题。您可以在掩码上保留句柄并将其用于其他数组:

mask = ARRAY >= some_condition 
ARRAY = ARRAY[mask] 
OTHER_ARRAY = OTHER_ARRAY[mask] 
... 

此外(也许这就是您的原始代码无法正常工作的原因),一旦您从循环中的数组中删除第一个索引,所有其他项目都会将一个索引向左移动,所以您我们实际上并没有删除您在初始阶段“标记”的相同项目。

举个例子,假设您的原始数组是 [a, b, c, d, e] 并且在原始传递中,您在索引 [0, 2 处标记了元素] for deletion (a, c)... 在删除循环的第一遍中,您将删除索引 0 处的项目——将使您的数组:

[b, c, d, e] 

现在在删除循环的第二次迭代中,您将删除新数组中索引 2 处的项目:

[b, c, e] 

但是看,我们并没有像我们想要的那样删除 c,我们实际上删除了 d!快点!

要解决这个问题,您可能会在 reversed(list) 上编写循环,但这仍然不会导致快速操作。