<div dir="auto">This is a useful idea certainly. I would recommended extending it to an arbitrary number of axes. You could either raise an error if the ndim of the two arrays are unequal, or allow a broadcast of a lesser ndimmed src array.<div dir="auto"><br></div><div dir="auto">- Joe </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Jun 29, 2017 20:17, "Mikhail V" <<a href="mailto:mikhailwas@gmail.com">mikhailwas@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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 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 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>
</blockquote></div></div>