[Numpy-discussion] Invalid value encoutered : how to, prevent numpy.where to do this?
Eric Emsellem
eric.emsellem at eso.org
Sat Jan 5 17:07:24 EST 2013
Thanks!
This makes sense of course. And yes the operation I am trying to do is
rather complicated so I need to rely on a prior selection.
Now I would need to optimise this for large arrays and the code does go
through these command line many many times.
When I have to operate on the two different parts of the array, I guess
just using the following is the fastest way (as you indicated) :
result = np.empty_like(data)
mask = (data == 0)
result[mask] = 0.0
result[~mask] = 1.0/data[~mask]
But if I only need to do this on one side of the selection, I guess I
would just do:
result = np.empty_like(data)
mask = (data != 0)
result[mask] += 1.0 / data[mask]
I have tried using three version of "mask = " with the rest of the code
being the same:
1- mask = where(data != 0)
2- mask = np.where(data != 0)
3- mask = (data != 0)
and it looks like #3 is the fastest, then #2 (20% slower) then #1 (50%
slower than #3).
I am not sure why, but Is that making sense? Or is there even a faster
way (for large data arrays, and complicated operations)?
thanks
Eric
> If your operation doesn't factor like this though then you can always
> use something more cumbersome like
> result = np.empty_like(data)
> mask = (data == 0)
> result[mask] = 0
> result[~mask] = 1.0/data[~mask]
>
> Or in 1.7 this could be written
> result = np.zeros_like(data)
> np.divide(1.0, data, where=(data != 0), out=result)
>
> -n
>
More information about the NumPy-Discussion
mailing list