[Numpy-discussion] field names on numpy arrays

josef.pktd at gmail.com josef.pktd at gmail.com
Wed Jun 3 20:36:21 EDT 2009


On Wed, Jun 3, 2009 at 8:25 PM,  <josef.pktd at gmail.com> wrote:
> On Wed, Jun 3, 2009 at 7:56 PM,  <josef.pktd at gmail.com> wrote:
>> On Wed, Jun 3, 2009 at 7:33 PM, Pierre GM <pgmdevlist at gmail.com> wrote:
>>>
>>> On Jun 3, 2009, at 7:23 PM, Robert Kern wrote:
>>>
>>>> On Wed, Jun 3, 2009 at 18:20, Pierre GM <pgmdevlist at gmail.com> wrote:
>>>>>
>>>>>
>>>>> Or, as all fields have the same dtype:
>>>>>
>>>>>  >>> a_array.view(dtype=('f',len(a_array.dtype)))
>>>>> array([[ 0.,  1.,  2.,  3.,  4.],
>>>>>        [ 1.,  2.,  3.,  4.,  5.]], dtype=float32)
>>>>>
>>>>> Ain't it fun ?
>>>>
>>>> Ah, yes, there is that niggle, too.
>>>
>>>
>>>
>>> Except that I always get bitten by that:
>>>
>>>  >>> backandforth =
>>> a_array.view(dtype=('f',len(a_array.dtype))).view(a_array.dtype)
>>>  >>> backandforth
>>> array([[(0.0, 1.0, 2.0, 3.0, 4.0)],
>>>        [(1.0, 2.0, 3.0, 4.0, 5.0)]],
>>>       dtype=[('a', '<f4'), ('b', '<f4'), ('c', '<f4'), ('d', '<f4'),
>>> ('e', '<f4')])
>>>  >>> backandforth.shape
>>> (2,1)
>>>
>>> We gained a dimension !
>>>
>>
>> I looked at the archives to my first discovery of views, for sorting
>> rows proposed by Pierre. In this case reshape was not necessary.
>>
>>>>> np.sort(np.array([[4.0, 1.0, 2.0, 3.0, 4.0], [1.0, 2.0, 3.0, 4.0, 5.0]]).view(dt),0).view(float)
>> array([[ 1.,  2.,  3.,  4.,  5.],
>>       [ 4.,  1.,  2.,  3.,  4.]])
>>
>>>>> dt
>> [('a', '<f8'), ('b', '<f8'), ('c', '<f8'), ('d', '<f8'), ('e', '<f8')]
>>
>> looking closer, the extra dimension helps to maintain shape:
>>
>> direct construction of structured array
>>
>>>>> np.array([(0.0, 1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)],dt)
>> array([(0.0, 1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)],
>>      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8'), ('d', '<f8'),
>> ('e', '<f8')])
>>>>> np.array([(0.0, 1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)],dt).shape
>> (2,)
>>
>> structured view on existing array is 2d
>>>>> np.array([(0.0, 1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)]).view(dt).shape
>> (2, 1)
>>
>> view on view returns original shape,
>>>>> np.array([(0.0, 1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)]).view(dt).view(float).shape
>> (2, 5)
>>
>> But sorting in between the two views also preserved original shape.
>> This was the source about my initial confusion about the necessity of
>> reshape.
>>
>
> here is a minimal example for 2d structured array:
>
>>>> dt = dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8'), ('d', '<f8'), ('e', '<f8')]
>>>> ys = np.array([(0.0, 1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)],dt)
>>>> ys.shape
> (2,)
>>>> ys.view(float)
> array([ 0.,  1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.,  5.])
>>>> ys = ys.reshape((len(ys),1))
>>>> ys.shape
> (2, 1)
>>>> ys.view(float)
> array([[ 0.,  1.,  2.,  3.,  4.],
>       [ 1.,  2.,  3.,  4.,  5.]])
>
>

and one more as summary: reshape, change dtype, change array type:

>>> ys = np.array([(0.0, 1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)],dt)
>>> ys.view(float, np.matrix)
matrix([[ 0.,  1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.,  5.]])
>>> ys.view(float, np.matrix).mean(0)
matrix([[ 0.,  1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.,  5.]])
>>> ys.reshape(-1,1).view(float, np.matrix)
matrix([[ 0.,  1.,  2.,  3.,  4.],
        [ 1.,  2.,  3.,  4.,  5.]])
>>> ys.reshape(-1,1).view(float, np.matrix).mean(0)
matrix([[ 0.5,  1.5,  2.5,  3.5,  4.5]])
>>> ys.view(float, np.matrix).reshape(-1,len(ys.dtype)).mean(0)
matrix([[ 0.5,  1.5,  2.5,  3.5,  4.5]])

The End

Josef



More information about the NumPy-Discussion mailing list