<div dir="ltr">I tend to use ndarray.copy() in python code -- no reason you couldn't do the same in Cython.<div><br></div><div>If you want to take any array-like object that may not have a copy() method, you could call asanyarray() first:</div><div><br></div><div>-CHB</div><div><br></div><div><br><div><br></div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 12, 2016 at 9:00 AM, Pavlyk, Oleksandr <span dir="ltr"><<a href="mailto:oleksandr.pavlyk@intel.com" target="_blank">oleksandr.pavlyk@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="m_-7307842767700914766WordSection1">
<p class="MsoNormal">Hi, <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">In my Cython code a function processes it argument x as follows:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">    x_arr = PyArray_CheckFromAny(<u></u><u></u></p>
<p class="MsoNormal">          x, NULL, 0, 0,<u></u><u></u></p>
<p class="MsoNormal">          cnp.NPY_ELEMENTSTRIDES | cnp.NPY_ENSUREARRAY | cnp.NPY_NOTSWAPPED, NULL)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">    if x_arr is not x:<u></u><u></u></p>
<p class="MsoNormal">       in_place = 1  # a copy was made, so we can work in place.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The logic is of the last line turns out to be incorrect, because the input x can be a class with an array interface:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">class FakeArray(object):<u></u><u></u></p>
<p class="MsoNormal">    def __init__(self, data):<u></u><u></u></p>
<p class="MsoNormal">        self._data = data<u></u><u></u></p>
<p class="MsoNormal">        self.__array_interface__ = data.__array_interface__<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Feeding my function FakeArray(xx),  x_arr will point into the content of xx, resulting in unwarranted content
<br>
overwrite of xx.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I am trying to replace that condition with <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">    if x_arr is not x and cnp.PyArray_Check(x):<u></u><u></u></p>
<p class="MsoNormal">       # a copy was made, so we can work in place.<u></u><u></u></p>
<p class="MsoNormal">       in_place = 1 if cnp.PyArray_CHKFLAGS(x_arr, cnp.NPY_WRITEABLE) else 0<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I am wondering if I perhaps overlooked some case.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thank you,<u></u><u></u></p>
<p class="MsoNormal">Sasha<u></u><u></u></p>
</div>
</div>

<br>______________________________<wbr>_________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="https://mail.scipy.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.scipy.org/<wbr>mailman/listinfo/numpy-<wbr>discussion</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div>