为了账号安全,请及时绑定邮箱和手机立即绑定

python将结构数组重塑为普通的numpy数组

python将结构数组重塑为普通的numpy数组

开心每一天1111 2022-03-09 21:18:00
我有一个结构数组,看起来像这样[(1, 2, 3, 4) (5, 6, 7, 8)]我删除了第一列,让它看起来像这样[(2, 3, 4) (6, 7, 8)]但是当我将它重塑为数组时,它看起来像这样[[1 2 3 4] [5 6 7 8]]'1' 和 '5' 不应该在那里这是我的代码import numpy as nparray = np.array([(1,2,3,4), (5,6,7,8)],dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'i4'),('d', 'i4')])names = list(array.dtype.names)new_names=names[1:]data = array[new_names]new_array = data.view('i4').reshape(len(data),-1)我可以知道为什么以及如何编辑它吗?
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

In [128]: array = np.array([(1,2,3,4), (5,6,7,8)],dtype=[('a', 'i4'), ('b', 'i4'), ('c', '

     ...: i4'),('d', 'i4')]) 

     ...: names = list(array.dtype.names) 

     ...: new_names=names[1:] 

     ...: data = array[new_names]                                                         

In [129]: array.dtype                                                                     

Out[129]: dtype([('a', '<i4'), ('b', '<i4'), ('c', '<i4'), ('d', '<i4')])

In [130]: names                                                                           

Out[130]: ['a', 'b', 'c', 'd']

In [131]: data                                                                            

Out[131]: 

array([(2, 3, 4), (6, 7, 8)],

      dtype={'names':['b','c','d'], 'formats':['<i4','<i4','<i4'], 'offsets':[4,8,12], 'itemsize':16})

请注意,data.dtype有offsets. 在最新numpy版本中,选择字段的子集会生成view. array['a']还在那里,只是'隐藏'。


除了这一变化,他们还为以下内容添加了一些功能recfunctions:


In [133]: import numpy.lib.recfunctions as rf 

要制作没有“a”数据的副本:


In [134]: data1 = rf.repack_fields(data)                                                  

In [135]: data1                                                                           

Out[135]: 

array([(2, 3, 4), (6, 7, 8)],

      dtype=[('b', '<i4'), ('c', '<i4'), ('d', '<i4')])

并制作一个非结构化数组:


In [136]: rf.structured_to_unstructured(array)                                            

Out[136]: 

array([[1, 2, 3, 4],

       [5, 6, 7, 8]], dtype=int32)

In [137]: rf.structured_to_unstructured(data)                                             

Out[137]: 

array([[2, 3, 4],

       [6, 7, 8]], dtype=int32)

In [138]: rf.structured_to_unstructured(data1)                                            

Out[138]: 

array([[2, 3, 4],

       [6, 7, 8]], dtype=int32)

这些功能记录在:


https://docs.scipy.org/doc/numpy/user/basics.rec.html#accessing-multiple-fields


由于所有字段都具有相同的 dtype ('i4')view作品 - 在一定程度上


In [142]: data.view('i4')                                                                 

Out[142]: array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int32)

In [143]: data1.view('i4')                                                                

Out[143]: array([2, 3, 4, 6, 7, 8], dtype=int32)

但它是基础数据的视图,形状混乱。早期版本中存在此形状问题。所以最好阅读这些变化,并使用推荐的功能。


在之前的 SO 问题中,我可能建议使用列表作为中介:


In [144]: data.tolist()                                                                   

Out[144]: [(2, 3, 4), (6, 7, 8)]

In [145]: np.array(data.tolist())                                                         

Out[145]: 

array([[2, 3, 4],

       [6, 7, 8]])


查看完整回答
反对 回复 2022-03-09
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

尝试在最后切片:


new_array = data.view('i4').reshape(len(data),-1)[:,1:]

结果:


[[2 3 4]

 [6 7 8]]


查看完整回答
反对 回复 2022-03-09
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信