使用条件检查从numpy数组中删除某些元素

Abh*_*mar 13 python arrays numpy

我想从一个大约一百万个条目的numpy数组中删除一些条目.

这段代码可以做到,但需要很长时间:

a = np.array([1,45,23,23,1234,3432,-1232,-34,233])
for element in a:
    if element<(-100) or element>100:
         some delete command.
Run Code Online (Sandbox Code Playgroud)

我可以用其他方式做到这一点吗?

qww*_*wwq 21

我假设你的意思a < -100 or a > -100,最简洁的方法是使用逻辑索引.

a = a[(a >= -100) & (a <= 100)]
Run Code Online (Sandbox Code Playgroud)

这并不是"删除"条目,而是将数组的副本减去不需要的值并将其分配给先前分配给旧数组的变量.发生这种情况后,旧数组没有剩余的引用并被垃圾收集,这意味着它的内存被释放.

值得注意的是,这种方法不使用常量内存,因为我们使用数组大小​​的内存线性数组来复制数组.如果您的阵列非常庞大,它会达到机器内存的极限,这可能会很糟糕.实际通过并"移除"数组中的每个元素(即使用常量存储器)的过程将是一个非常不同的操作,因为数组中的元素需要被交换并且内存块被调整大小.我不确定你能用numpy数组做到这一点,但是你可以做的一件事就是使用一个numpy蒙面数组:

import numpy.ma as ma
mx = ma.masked_array(a, mask = ((a < -100) | (a > 100)) )
Run Code Online (Sandbox Code Playgroud)

掩码数组上的所有操作都将表现为我们"删除"的元素不存在,但我们并没有真正"删除"它们,它们仍然存在于内存中,只有一个记录,要求现在跳过哪些元素与数组相关联,我们不需要在内存中制作数组的副本.此外,如果我们想要删除我们删除的值,我们可以像这样删除掩码:

mx.mask = ma.nomask
Run Code Online (Sandbox Code Playgroud)


fal*_*tru 9

您可以使用具有反转条件的掩码索引.

>>> a = np.array([1,45,23,23,1234,3432,-1232,-34,233])

>>> a[~((a < -100) | (a > 100))]
array([  1,  45,  23,  23, -34])

>>> a[(a >= -100) & (a <= 100)]
array([  1,  45,  23,  23, -34])

>>> a[abs(a) <= 100]
array([  1,  45,  23,  23, -34])
Run Code Online (Sandbox Code Playgroud)