Say, I have a numpy array consists of 10
elements, for example:
a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
Now I want to eff
In [7]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [8]: a[a > 10] = 0
In [9]: a
Out[9]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
If you don't want to change your original array
In [1]: import numpy as np
In [2]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [3]: b = np.where(a > 10, 0, a)
In [4]: a
Out[4]: array([ 2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [5]: b
Out[5]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
Generally, list comprehensions are faster than for
loops in python (because python knows that it doesn't need to care for a lot of things that might happen in a regular for
loop):
a = [0 if a_ > thresh else a_ for a_ in a]
but, as @unutbu correctly pointed out, numpy allows list indexing, and element-wise comparison giving you index lists, so:
super_threshold_indices = a > thresh
a[super_threshold_indices] = 0
would be even faster.
Generally, when applying methods on vectors of data, have a look at numpy.ufuncs
, which often perform much better than python functions that you map using any native mechanism.