### Re: Arrays with aliased elements?

Enzo Michelangeli <enzomich <at> gmail.com>

2011-01-02 07:01:24 GMT

Thanks. Meanwhile, I had arrived to a solution similar to the one suggested
by Zachary:
>>> a = array([2,3])
>>> ndarray((3,a.shape[0]), strides=(0,a.itemsize), buffer = a, offset=0,
>>> dtype=a.dtype)
array([[2, 3],
[2, 3],
[2, 3]])
...but I'd say that numpy.broadcast_arrays is the cleanest way of obtaining
pre-broadcasted views to pass to weave.blitz(). But alas, it appears that
blitz doesn't work well with such non-contiguous views:
tsb, pivb = broadcast_arrays(tableau[:,cand:cand+1], pivot)
tableau = tableau - tsb * pivb
...works, but:
tsb, pivb = broadcast_arrays(tableau[:,cand:cand+1], pivot)
weave.blitz('tableau = tableau - tsb * pivb')
...returns wrong results. And, of course, converting them to contiguous
through the array() function defeats the intended savings in memory and CPU
cycles...
Enzo
----- Original Message -----
From: "Robert Kern" <robert.kern <at> gmail.com>
To: "Discussion of Numerical Python" <numpy-discussion <at> scipy.org>
Sent: Sunday, January 02, 2011 10:08 AM
Subject: Re: [Numpy-discussion] Arrays with aliased elements?
> On Sat, Jan 1, 2011 at 19:42, Enzo Michelangeli <enzomich <at> gmail.com>
> wrote:
>> Is there any way, not involving compilation of C code, to define ndarrays
>> where some rows or columns share the same data buffers? For example,
>> something built by a hypothetical variant of the np.repeat() function,
>> such
>> that, if a = array([2,3]), calling:
>>
>> b = np.aliasedrepeat(x, [1, 2], axis=0)
>>
>> would return in b:
>>
>> array([[2, 3],
>> [2, 3],
>> [2, 3]])
>>
>> ...with the understanding that the three rows would actually share the
>> same
>> data, so setting e.g.:
>>
>> b[0,1] = 5
>>
>> ...would change b into:
>>
>> array([[2, 5],
>> [2, 5],
>> [2, 5]])
>>
>> In other words, something with a behaviour similar to a list of lists:
>>
>>>>> a = [2,3]
>>>>> b = [a,a,a]
>>>>> b
>> [[2, 3], [2, 3], [2, 3]]
>>>>> b[0][1] = 5
>>>>> b
>> [[2, 5], [2, 5], [2, 5]]
>>
>> This would save memory (and time spent in unnecessary copying) in some
>> applications with large arrays, and would allow to cope with the current
>> inability of weave.blitz to understand broadcasting rules, e.g. for
>> calculating outer products (I mentioned this in a previous thread).
>
> See numpy.lib.stride_tricks for tools to do this, specifically the
> as_strided() function. See numpy.broadcast_arrays() for the latter
> functionality.
>
> http://docs.scipy.org/doc/numpy/reference/generated/numpy.broadcast_arrays.html
>
> --
> Robert Kern
>
> "I have come to believe that the whole world is an enigma, a harmless
> enigma that is made terrible by our own mad attempt to interpret it as
> though it had an underlying truth."
> -- Umberto Eco
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion <at> scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>