[Numpy-discussion] ndarray.resize that preserve view content ?

Zachary Pincus zachary.pincus at yale.edu
Wed Aug 4 11:56:32 EDT 2010


Oh and PS. Robert's right that there's no general way to do this! What  
I have only works because the data existing in the first 25 elements  
of A that get clobbered by the copy operation aren't the same data  
that are being copied (or where they are, the new copy is identical to  
the old one). Other slices won't have this property... A[:] = A[::-1]  
e.g. will fail totally.



On Aug 4, 2010, at 11:52 AM, Zachary Pincus wrote:

>> Yes it is, but is there a way to do it in-place?
>
> So you want the first 25 elements of the array (in a flat "contiguous"
> view) to contain the 25 elements of A[:5,:5]? This will do that, but
> having to do stuff like this (rather than just copying the memory
> region) might be indicative that maybe your code design might not
> really be right. (Why does it absolutely have to be in-place? Memory
> pressure?)
>
> In [34]: a = numpy.array(numpy.arange(100, dtype=int).reshape(10,10))
>
> In [35]: a
> Out[35]:
> array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
>        [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
>        [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
>        [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
>        [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
>        [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
>        [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
>        [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
>        [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
>        [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
>
> In [36]: a[:5,:5]
> Out[36]:
> array([[ 0,  1,  2,  3,  4],
>        [10, 11, 12, 13, 14],
>        [20, 21, 22, 23, 24],
>        [30, 31, 32, 33, 34],
>        [40, 41, 42, 43, 44]])
>
> In [37]: a.flat[:25] = a[:5,:5]
>
> In [38]: a.resize((5,5))
> ---------------------------------------------------------------------------
> ValueError                                Traceback (most recent call
> last)
>
> /Users/zpincus/<ipython console> in <module>()
>
> ValueError: cannot resize an array that has been referenced or is
> referencing
> another array in this way.  Use the resize function
>
> In [39]: b = numpy.ndarray(buffer=a, shape=(5,5), dtype=int)
> In [40]: b
>
> Out[40]:
> array([[ 0,  1,  2,  3,  4],
>        [10, 11, 12, 13, 14],
>        [20, 21, 22, 23, 24],
>        [30, 31, 32, 33, 34],
>        [40, 41, 42, 43, 44]])
>
>
> In [41]: b.flags.c_contiguous
> Out[41]: True
>
> In [42]: b.flags.owndata
> Out[42]: False
>
>
> Zach
>
>
>> On Wed, Aug 4, 2010 at 5:20 PM, Zachary Pincus <zachary.pincus at yale.edu
>>> wrote:
>>> A[:5,:5] shows the data I want, but it's not contiguous in memory.
>>> A.resize(5,5) is contiguous, but do not contains the data I want.
>>>
>>> How to get both efficiently?
>>
>> A[:5,:5].copy()
>> will give you a new, contiguous array that has the same contents as
>> A[5:,5:], but in a new chunk of memory. Is this what you need?
>>
>>
>>
>>
>> On Aug 4, 2010, at 11:17 AM, Antoine Dechaume wrote:
>>
>>> I forgot to refer to resize, sorry about that.
>>>
>>> A[:5,:5] shows the data I want, but it's not contiguous in memory.
>>> A.resize(5,5) is contiguous, but do not contains the data I want.
>>>
>>> How to get both efficiently?
>>>
>>>
>>> On Wed, Aug 4, 2010 at 5:01 PM, Robert Kern <robert.kern at gmail.com>
>>> wrote:
>>> On Wed, Aug 4, 2010 at 09:29, Antoine Dechaume <boolegue at gmail.com>
>>> wrote:
>>>> Hi,
>>>>
>>>> given A=empty([10,10]), I would like to keep A[:5,:5] as a
>>> contiguous memory
>>>> segment.
>>>>
>>>> How to do it efficiently?
>>>
>>> I'm not sure I understand what you want. Your Subject line and the
>>> body of your email conflict with each other. Can you try to explain
>>> what you want in other words?
>>>
>>> --
>>> 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
>>>
>>> _______________________________________________
>>> NumPy-Discussion mailing list
>>> NumPy-Discussion at scipy.org
>>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion




More information about the NumPy-Discussion mailing list