On Tue, Feb 28, 2012 at 23:01, Kurt Smith <kwmsm...@gmail.com> wrote: > For an arbitrary numpy array 'a', what does 'a.flags.owndata' indicate? > > I originally thought that owndata is False iff 'a' is a view. But > that is incorrect. > > Consider the following: > > In [119]: a = np.zeros((3,3)) > > In [120]: a.flags.owndata # should be True; zeros() creates and > returns a non-view array. > Out[120]: True > > In [121]: a_view1 = a[2:, :] > > In [122]: a_view1.flags.owndata # expected to be False > Out[122]: False > > In [123]: a_fancy1 = a[[0,1], :] > > In [124]: a_fancy1.flags.owndata # expected to be True, a_fancy1 is a > fancy-indexed array. > Out[124]: True > > In [125]: a_fancy2 = a[:, [0,1]] > > In [126]: a_fancy2.flags.owndata # expected to be True, a_fancy2 is a > fancy-indexed array. > Out[126]: False > > So when I query an array's flags.owndata, what is it telling me? What > I want to know is whether an array is a view or not. If flags.owndata > has nothing to do with the 'viewness' of an array, how would I > determine if an array is a view? > > In the previous example, a_fancy2 does not own its data, as indicated > by 'owndata' being False. But when I modify a_fancy2, 'a' is not > modified, as expected, but contrary to what 'owndata' would seem to > indicate. > > The numpybook's documentation of owndata could perhaps be a bit > clearer on the subject: > > """ > OWNDATA (O) the array owns the memory it uses or if it borrows it from > another object (if this is False, the base attribute retrieves a > reference to the object this array obtained its data from) > """ > > >From my reading, owndata has nothing to do with the 'viewness' of an > array. Is this correct? What is the intent of this flag, then? Its > wording could perhaps be improved: owndata is True iff (1) the array > owns the memory it uses or (2) the array borrows it from another > object. The second clause seems to indicate that the array **does > not** own its data since it is borrowing it from another object. > However, flags.owndata will be true in this case. > > If I cannot use flags.owndata, what is a reliable way to determine > whether or not an array is a view?
Your original intuition was correct. It's just that sometimes an operation will make a copy of the input data, but then make a view on that copy. The output object is a view, just not a view on the input object. -- Robert Kern _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion