[Numpy-discussion] fiddling the strides of an array
Tim Hochberg
tim.hochberg at ieee.org
Mon Nov 20 18:45:54 EST 2006
Filip Wasilewski wrote:
> On 11/20/06, A. M. Archibald <peridot.faceted at gmail.com> wrote:
>
>> On 20/11/06, Tim Hochberg <tim.hochberg at ieee.org> wrote:
>>
>>
>>> I don't know how much help this will be, but, if the input array can be
>>> mapped into a contiguous array using transpose, which looks to be the
>>> case with at least one of the problematic cases you show here, you could
>>> transpose so as to get a contiguous array and grab the buffer from that.
>>> As for how to decide what transposes to do, while it sounds like a fun
>>> problem, I don't have time to delve into it right now.
>>>
>> I thought about that, actually, all you'd have to do is argsort the
>> strides tuple. It still fails for arrays that are of the form a[::2],
>> though, and I'm still hoping to find the secret code to access
>> something I know numpy is perfectly capable of doing, so I don't
>> really want to add such a grotty hack.
>>
>
>
> As a replacement for ndarray.__new__ you can use the array interface
> protocol, at least until someone will come up with a better solution.
> I tried your segment_axis (cut mode) with strided and axis swapped
> multidimensional arrays and I think it works quite. The fiddle part
> goes like this:
>
> class My(object):
> def __init__(self, arr):
> self.__array_interface__ = arr.__array_interface__
> self.__array_interface__["strides"] = newstrides
> self.__array_interface__ai["shape"] = newshape
> a = numpy.asarray(My(arr))
>
>
Clever!
Two cautionary notes: first, you can crash the interpreter if you use
bogus strides or shape, so be careful. Second, and perhaps a little less
obvious, My(arr) needs to hold a reference to the array 'arr'.
Otherwise, if arr goes away before 'a' does, 'a' will be left pointing
to invalid data.
-tim
More information about the NumPy-Discussion
mailing list