<div dir="ltr"><div>If you are serious about adding this to numpy, an even better option might be to create a pull request with the implementation and solicit comments on that. The problem lends itself to an easy solution in pure Python, so this should not be too hard to do.<br><br></div>    -Joe<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 30, 2017 at 4:08 PM, Mikhail V <span dir="ltr"><<a href="mailto:mikhailwas@gmail.com" target="_blank">mikhailwas@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 30 June 2017 at 03:34, Joseph Fox-Rabinovitz<br>
<span class=""><<a href="mailto:jfoxrabinovitz@gmail.com">jfoxrabinovitz@gmail.com</a>> wrote:<br>
> This is a useful idea certainly. I would recommended extending it to an<br>
> arbitrary number of axes. You could either raise an error if the ndim of the<br>
> two arrays are unequal, or allow a broadcast of a lesser ndimmed src array.<br>
><br>
<br>
<br>
</span>Now I am thinking that there is probably an even better, more generalised<br>
way to provide this functionality.<br>
Say if we had a function "intersect" which would be defined as follows:<br>
<br>
intersect(A, B, offset)<br>
<br>
where A, B are vector endpoints, and the offset is the distance<br>
between their origins.<br>
So to find a needed slice I could simply pass the shapes:<br>
<br>
intersect (DEST.shape, SRC.shape, offset)<br>
<br>
Hmm. there is something to think about. Could be a<br>
better idea to propose this, since it could be used in many<br>
other sitiations, not only for finding slice intersection.<br>
<br>
Although I'll need some time to think out more examples and use cases.<br>
<span class="HOEnZb"><font color="#888888"><br>
Mikhail<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
><br>
> On Jun 29, 2017 20:17, "Mikhail V" <<a href="mailto:mikhailwas@gmail.com">mikhailwas@gmail.com</a>> wrote:<br>
>><br>
>> Hello all<br>
>><br>
>> I often need to copy one array into another array, given an offset.<br>
>> This is how the "blit" function can be understood, i.e. in<br>
>> every graphical lib there is such a function.<br>
>> The common definition is like:<br>
>> blit ( dest, src, offset ):<br>
>> where dest is destination array, src is source array and offset is<br>
>> coordinates in destination where the src should pe blitted.<br>
>> Main feature of such function is that it never gives an error,<br>
>> so if the source does not fit into the destination array, it is simply<br>
>> trimmed.<br>
>> And respectively if there is no intersection area then nothing happens.<br>
>><br>
>> Hope this is clear.<br>
>> So to make it work with Numpy arrays one need to calculate the<br>
>> slices before copying the data.<br>
>> I cannot find any Numpy or Python method to help with that so probably<br>
>> it does not exist yet.<br>
>> If so, my proposal is to add a Numpy method which helps with that.<br>
>> Namely the proposal will be to add a method which returns<br>
>> the slices for the intersection areas of two arbitrary arrays, given an<br>
>> offset,<br>
>> so then one can "blit" the array into another with simple assignment =.<br>
>><br>
>> Here is a Python function I use for 2d arrays now:<br>
>><br>
>> def interslice ( dest, src, offset ):<br>
>>     y,x = offset<br>
>>     H,W = dest.shape<br>
>>     h,w = src.shape<br>
>><br>
>>     dest_starty = max (y,0)<br>
>>     dest_endy = min (y+h,H)<br>
>>     dest_startx = max (x,0)<br>
>>     dest_endx = min (x+w,W)<br>
>><br>
>>     src_starty = 0<br>
>>     src_endy = h<br>
>>     if y<0:     src_starty = -y<br>
>>     by = y+h - H             # Y bleed<br>
>>     if by>0: src_endy = h - by<br>
>><br>
>>     src_startx = 0<br>
>>     src_endx = w<br>
>>     if x<0:  src_startx = -x<br>
>>     bx = x+w - W             # X bleed<br>
>>     if bx>0:  src_endx = w - bx<br>
>><br>
>>     dest_sliceY =  slice(dest_starty,dest_endy)<br>
>>     dest_sliceX =  slice(dest_startx,dest_endx)<br>
>>     src_sliceY = slice(src_starty, src_endy)<br>
>>     src_sliceX = slice(src_startx, src_endx)<br>
>>     if dest_endy <= dest_starty:<br>
>>         print "No Y intersection !"<br>
>>         dest_sliceY = ( slice(0, 0) )<br>
>>         src_sliceY = ( slice(0, 0) )<br>
>>     if dest_endx <= dest_startx:<br>
>>         print "No X intersection !"<br>
>>         dest_sliceX = ( slice(0, 0) )<br>
>>         src_sliceX = ( slice(0, 0) )<br>
>>     dest_slice = ( dest_sliceY, dest_sliceX )<br>
>>     src_slice = ( src_sliceY, src_sliceX )<br>
>>     return ( dest_slice, src_slice )<br>
>><br>
>><br>
>> ------<br>
>><br>
>> I have intentionally made it expanded and without contractions<br>
>> so that it is better understandable.<br>
>> It returns the intersection area of two arrays given an offset.<br>
>> First returned tuple element is the slice for DEST array and the<br>
>> second element is the slice for SRC array.<br>
>> If there is no intersection along one of the axis at all<br>
>> it returns the corresponding slice as (0,0)<br>
>><br>
>> With this helper function one can blit arrays easily e.g. example code:<br>
>><br>
>> W = 8; H = 8<br>
>> DEST = numpy.ones([H,W], dtype = "uint8")<br>
>> w = 4; h = 1<br>
>> SRC = numpy.zeros([h,w], dtype = "uint8")<br>
>> SRC[:]=8<br>
>> offset = (0,9)<br>
>> ds, ss = interslice (DEST, SRC, offset )<br>
>><br>
>> # blit SRC into DEST<br>
>> DEST[ds] = SRC[ss]<br>
>><br>
>> So changing the offset one can observe how the<br>
>> SRC array is trimmed if it is crosses the DEST boundaries.<br>
>> I think it is very useful function in general and it has<br>
>> well defined behaviour. It has usage not only for graphics,<br>
>> but actually any data copying-pasting between arrays.<br>
>><br>
>> So I am looking forward to comments on this proposal.<br>
>><br>
>><br>
>> Mikhail<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>
><br>
><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>
><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>
</div></div></blockquote></div><br></div>