On Wed, Jul 15, 2009 at 14:38, Pauli Virtanen<pav...@iki.fi> wrote: > On 2009-07-15, Robert Kern <robert.k...@gmail.com> wrote: >> On Wed, Jul 15, 2009 at 14:19, Vebjorn Ljosa<vebj...@ljosa.com> wrote: >>> Suppose I have a record array where one of the fields is a nested array: >>> >>> >>> from numpy import * >>> >>> desc = dtype([('point', 'i4', 3), ('unimportant', 'S3')]) >>> >>> a = array([((1,2,3), 'foo'), ((7,8,9), 'bar')], dtype=desc) >>> >>> a >>> array([([1, 2, 3], 'foo'), ([7, 8, 9], 'bar')], >>> dtype=[('point', '<i4', 3), ('unimportant', '|S3')]) >>> >>> a[0] >>> ([1, 2, 3], 'foo') >>> >>> If I try to assign to a[0]['point'], it only works partially: >>> >>> >>> a[0]['point'] = array([4, 5, 6]) >>> >>> a[0] >>> ([4, 2, 3], 'foo') >> > [clip] >> >> Generally, scalars are never views. a[0] pulls out a record scalar. >> Assigning into that scalar does not affect the original memory. >> a['point'] creates an array that is a view and assigning to the [0] >> element of that array modifies the original memory. > > But then, why does it alter the first element of the sub-array? > This seems like a bug...
Hmm, it's worse than I feared. The scalars are indeed views; it's just that the assignment to an array field is buggy. But then, I don't think the records should be mutable at all. In [18]: dt = dtype([('foo', float, 2), ('bar', int)]) In [19]: a = zeros(3, dt) In [20]: a Out[20]: array([([0.0, 0.0], 0), ([0.0, 0.0], 0), ([0.0, 0.0], 0)], dtype=[('foo', '<f8', 2), ('bar', '<i4')]) In [21]: a0 = a[0] In [22]: a0['bar'] = 3 In [23]: a Out[23]: array([([0.0, 0.0], 3), ([0.0, 0.0], 0), ([0.0, 0.0], 0)], dtype=[('foo', '<f8', 2), ('bar', '<i4')]) -- 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@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion