<div dir="ltr"><div>For the record, I started a discussion about 6 months ago about a "find_first" type function which avoided running the logic over the whole array (using lambdas instead). This spilled into a discussion about implementing a short-cutted "any" or "all" function: <a href="http://numpy-discussion.10968.n7.nabble.com/Implementing-a-find-first-style-function-tp33085.html">http://numpy-discussion.10968.n7.nabble.com/Implementing-a-find-first-style-function-tp33085.html</a> with some interesting results.<br>
<br>Nothing more has been done with those discussions, but you may find it of interest. (And I'd still be interested in taking it forwards if you have any comments)<br><br>Cheers,<br><br></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On 4 September 2013 13:14, Graeme B. Bell <span dir="ltr"><<a href="mailto:grb@skogoglandskap.no" target="_blank">grb@skogoglandskap.no</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Sorry, I should have been more clear.<br>
<br>
As shown in the benchmark/example, the method is replacing the behaviour of<br>
<br>
   np.any(inputs, 0)<br>
<br>
not the behaviour of<br>
<br>
   np.any(inputs)<br>
<br>
Here, where I'm making decisions based on overlaying layers of raster data in the same shape, I don't want to map the entire dataset to a single boolean, rather I want to preserve the layers' shape but identify if a condition was matched in any of the overlaid layers, generating a mask.<br>

<br>
For example, this type of reasoning:<br>
<br>
def mask():<br>
for all pixel locations in the images, A, B and C:<br>
  if A[location] is 3, 19, or between 21 and 30  AND B[location] is any value AND C[location] is 1-4, 9-13...<br>
  pixel=True<br>
<br>
This naturally fits the any/all metaphor.<br>
<br>
Will update the description on github.<br>
<span class="HOEnZb"><font color="#888888"><br>
Graeme.<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Sep 4, 2013, at 12:05 PM, Graeme Bell <<a href="mailto:grb@skogoglandskap.no">grb@skogoglandskap.no</a>> wrote:<br>
<br>
> In my current GIS raster work I often have a situation where I generate code something like this:<br>
><br>
>         np.any([A>4, A==2, B==5, ...])<br>
><br>
> However, np.any() is quite slow.<br>
><br>
> It's possible to use np.logical_or to solve the problem, but then you get nested logical_or's, since logical_or combines only two parameters.<br>
> It's also possible to use integer maths e.g. (A>4)+(A==2)+(B==5)>0.<br>
><br>
> The question is: which is best (syntactically, in terms of performance, etc)?<br>
><br>
> I've written a little helper function to provide a faster version of any() and all(). It's embarrassingly simple - just a for loop. However, I think there's a syntactic advantage to using a helper function for this situation rather than writing it idiomatically each time; and it reduces the chance of a bug in idiomatic implementation. However, the code does not cover all the use cases currently addressed by np.any() and np.all().<br>

><br>
> I benchmarked to pick the fastest underlying implementation (logical_or rather than integer maths).<br>
><br>
> The result is 14 to 17x faster than np.any() for this use case.*<br>
><br>
> Code & benchmark here:<br>
><br>
>      <a href="https://github.com/gbb/numpy-fast-any-all" target="_blank">https://github.com/gbb/numpy-fast-any-all</a><br>
><br>
> Please feel welcome to use it or improve it :-)<br>
><br>
> Graeme.<br>
><br>
><br>
> * (Should this become an execution path in np.any()... ?)<br>
<br>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
</div></div></blockquote></div><br></div>