The dtype
is important here. The closest I can come to your display is with a nested dtype
In [182]: dt1=np.dtype('i,i,f')
In [183]: dt=np.dtype([('a',dt1,),('b',dt1,),('c',dt1,)])
In [184]: x=np.ones(1,dtype=dt)
In [185]: print(x)
[((1, 1, 1.0), (1, 1, 1.0), (1, 1, 1.0))]
(no final ,
)
If I use the repr
rather than print's default str
, I see the dtype as well:
In [186]: print(repr(x))
array([((1, 1, 1.0), (1, 1, 1.0), (1, 1, 1.0))],
dtype=[('a', [('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4')]), ('b', [('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4')]), ('c', [('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4')])])
Reshape or squeeze does not work here because it is already 1d. view
or astype
can work. Do you want to just flatten the dtype, or make it all float? What kind of shape do you expect? Currently each record consists of 9 numbers.
With a compatible dtype I can view this array as a record of 9 values:
In [195]: dt2=np.dtype('i,i,f,i,i,f,i,i,f')
In [196]: x.view(dt2)
Out[196]:
array([(1, 1, 1.0, 1, 1, 1.0, 1, 1, 1.0)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<f4'), ('f6', '<i4'), ('f7', '<i4'), ('f8', '<f4')])
The simplest way to turn this x
into an array of floats is with tolist
(it's not fastest):
In [256]: x['c']=(20,21,22)
In [257]: x['b']=(10,11,12)
In [258]: x['a']=(1,2,3)
In [263]: print(x)
[((1, 2, 3.0), (10, 11, 12.0), (20, 21, 22.0))]
In [264]: np.array(x.tolist())
Out[264]:
array([[[ 1., 2., 3.],
[ 10., 11., 12.],
[ 20., 21., 22.]]])