I have an array of tuples of tuples where the second level should not be a tuple and I want to convert it all to something like a 2-d array. Is there a quick way to restructure from this messy 1-d to a nice clean 2-d or structured array?
Note: These tuples do contain various types. I would like to be able to transpose and 2-d slice etc.. this data.
ie...
[((1,-4,7.0),)
((2,-5,8.0),)
((3,-6,9.0),)]
Edited to try and accommodate issues people pointed out with the original question
您可以使用np.squeeze
np.squeeze(<your array>)
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.]]])
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.