I try to convert a 10x2 array to a record, by giving names to each column.
I tried it so:
t = arange (10)
>>> n = dstack([t,
roll (t, 1),
roll (t, -1)])[0]
... ... >>>
>>> n = n[:,1:3]
>>> n
array([[9, 1],
[0, 2],
[1, 3],
[2, 4],
[3, 5],
[4, 6],
[5, 7],
[6, 8],
[7, 9],
[8, 0]])
>>> nt = [('left', int), ('right', int)]
>>> array (n, nt)
array([[(9, 9), (1, 1)],
[(0, 0), (2, 2)],
[(1, 1), (3, 3)],
[(2, 2), (4, 4)],
[(3, 3), (5, 5)],
[(4, 4), (6, 6)],
[(5, 5), (7, 7)],
[(6, 6), (8, 8)],
[(7, 7), (9, 9)],
[(8, 8), (0, 0)]],
dtype=[('left', '<i8'), ('right', '<i8')])
>>>
To my surprize, the elements of each row are tuples instead of numbers of type int.
How can I correct this, and make each row of n look like [ 9,1 ] instead of [(9, 9), (1, 1)] ?
You can create a view with a new dtype and it looks a the same data:
In [150]: nt = [('left',np.int),('right',np.int)]
In [151]: n
Out[151]:
array([[9, 1],
[0, 2],
[1, 3],
[2, 4],
[3, 5],
[4, 6],
[5, 7],
[6, 8],
[7, 9],
[8, 0]])
In [152]: n.view(nt)
Out[152]:
array([[(9, 1)],
[(0, 2)],
[(1, 3)],
[(2, 4)],
[(3, 5)],
[(4, 6)],
[(5, 7)],
[(6, 8)],
[(7, 9)],
[(8, 0)]],
dtype=[('left', '<i8'), ('right', '<i8')])
This maintains the 2d shape, though:
In [160]: n_struct = n.view(nt)
In [161]: n_struct.shape
Out[161]: (10, 1)
In [162]: n_struct = n.view(nt).reshape(n.shape[0])
In [163]: n_struct
Out[163]:
array([(9, 1), (0, 2), (1, 3), (2, 4), (3, 5), (4, 6), (5, 7), (6, 8),
(7, 9), (8, 0)],
dtype=[('left', '<i8'), ('right', '<i8')])
As you asked, access is as such:
In [170]: n_struct['left']
Out[170]: array([9, 0, 1, 2, 3, 4, 5, 6, 7, 8])
In [171]: n_struct['right']
Out[171]: array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
A warning, from @Ophion, is that this only works if the dtypes are compatible, because ndarray.view(dtype) interprets the original data as if it were the given dtype, it does not convert the data to the new given dtype. In other words, (from the documentation),
a.view(some_dtype)constructs a view of the array's memory with a different data-type. This can cause a reinterpretation of the bytes of memory.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With