我是否更喜欢使用numpy.where或数组索引来掩盖值?

时间:2014-03-16 17:37:58

标签: numpy

我使用数组索引相当数量来清除数组中的无效值。像这样:

  

array [array == 0] = invalid_value

对于这些类型的面具,我应该使用numpy.where作为:

  

array = numpy.where(array == 0,invalid_value,array)

1 个答案:

答案 0 :(得分:2)

这取决于你的意图。第一个操作会修改array,而第二个操作会复制并覆盖引用。

如果您不介意就地修改,我的快速测试显示第一个选项大约快4倍。

In [7]: foo = np.random.randint(0, 10, 10000)

In [8]: invalid = -1

In [9]: bar = foo.copy()

In [10]: %timeit bar[foo==0] = invalid
10000 loops, best of 3: 45.5 us per loop

In [11]: %timeit np.where(foo==0, invalid, foo)
1000 loops, best of 3: 209 us per loop

请注意,foo未更改,而bar已修改:

In [12]: np.count_nonzero(foo)
Out[12]: 8984

In [13]: np.count_nonzero(bar)
Out[13]: 10000