从 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) 上编写循环,但这仍然不会导致快速操作。
