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

时间:2014-01-04 06:18:58

标签: 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.

我能以其他方式这样做吗?

3 个答案:

答案 0 :(得分:14)

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

a = a[(a >= -100) & (a <= 100)]

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

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

import numpy.ma as ma
mx = ma.masked_array(a, mask = ((a < -100) | (a > 100)) )

屏蔽数组上的所有操作都会像我们“删除”的元素不存在一样,但我们并没有真正“删除”它们,它们仍然存在于内存中,只有一个记录哪些元素现在跳过与数组关联,我们不需要在内存中复制数组。此外,如果我们想要删除我们删除的值,我们可以像这样删除掩码:

mx.mask = ma.nomask

答案 1 :(得分:6)

您可以将masked index与反向条件一起使用。

>>> 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])

答案 2 :(得分:2)

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

In [141]: b=a[(-100<=a)&(a<=100)]

In [142]: b
Out[142]: array([  1,  45,  23,  23, -34])