<div dir="ltr">So, this is a kernel mechanism?<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 4, 2017 at 6:31 PM, Joseph Fox-Rabinovitz <span dir="ltr"><<a href="mailto:jfoxrabinovitz@gmail.com" target="_blank">jfoxrabinovitz@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I would like to propose the addition of a new function,<br>
`np.neighborwise` in PR#9514. It is based on the discussion relating<br>
to my proposal for `np.ratio` (PR#9481) and Eric Wieser's<br>
`np.neighborwise` in PR#9428. This function accepts an array `a`, a<br>
vectorized function of two arguments `func`, and applies the function<br>
to all of the neighboring elements of the array across multiple<br>
dimensions. There are options for masking out parts of the calculation<br>
and for applying the function recursively.<br>
<br>
The name of the function is not written in stone. The current name is<br>
taken directly from PR#9428 because I can not think of a better one.<br>
<br>
This function can serve as a backend for the existing `np.diff`, which<br>
has been re-implemented in this PR, as well as for the `ratio`<br>
function I propsed earlier. This adds the diagonal diffs feature,<br>
which is tested and backwards compatible. `ratio` can be implemented<br>
very simply with or without a mask. With a mask, it can be expressed<br>
`np.neighborwise(a, np.*_divide, axis=axis, n=n, mask=lambda *args:<br>
args[1])` (The conversion to bool is done automatically).<br>
<br>
The one potentially non-backwards-compatible API change that this PR<br>
introduces is that `np.diff` now returns an `ndarray` version of the<br>
input, instead of the original array itself if `n==0`. Previously, the<br>
exact input reference was returned for `n==0`. I very seriously doubt<br>
that this feature was ever used outside the numpy test suite anyway.<br>
The advantage of this change is that an invalid axis input can now be<br>
caught before returning the unaltered array. If this change is<br>
considered too drastic, I can remove it without removing the axis<br>
check.<br>
<br>
The two main differences between this PR and PR#9428 are the addition<br>
of masks to the computation, and the interpretation of multiple axes.<br>
PR#9428 applies `func` successively along each axis. This provides no<br>
way of doing diagonal diffs. I chose to shift along all the axes<br>
simultaneously before applying `func`. To clarify with an example, if<br>
we take `a=[[1, 2], [3, 4]]`, `axis=[0, 1]` and `func=np.subtract`,<br>
PR#9428 would take two diffs, `(4 - 2) - (3 - 1) = 0`, while the<br>
version I propose here just takes the diagonal diff `4 - 1 = 3`.<br>
Besides being more intuitive in my opinion, taking diagonal diffs<br>
actually adds a new feature that can not be obtained directly by<br>
taking successive diffs.<br>
<br>
Please let me know your thoughts.<br>
<br>
Regards,<br>
<br>
    -Joe<br>
______________________________<wbr>_________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/numpy-<wbr>discussion</a><br>
</blockquote></div><br></div>