简体   繁体   中英

Restructuring Array of Tuples

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM