重新排列为nArray的视图

2024-09-28 21:18:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在以前版本的numpy中,我可以这样做:

data = np.array([(0,1,2),(3,4,5),(6,7,8)], dtype=np.dtype([('a','<f8'), ('b','<f8'),('c','<f8')]))


data_nd = data[['a','b']].view(('<f8',2))

这将给我一个原始排列data的视图,它是np.float32类型的二维nArray。在

在numpy版本1.14中,当我尝试上面的第二行时,我得到错误:

^{pr2}$

这是因为data[['a','b']]的itemsize仍然是24。好吧,没问题,但是有没有什么方法可以获得更新itemsize的数据列的副本,这样我就可以生成我想要的视图了?在

例如,即使复制data[['a','b']]的副本(或深层副本),仍然会导致itemsize为24,这一点我无法理解。在


Tags: 版本numpyview视图类型datanp副本
1条回答
网友
1楼 · 发布于 2024-09-28 21:18:49

您是否意识到,没有元组,您的重新排列是3x3,具有复制的字段值:

In [46]: data
Out[46]: 
array([[(0., 0., 0.), (1., 1., 1.), (2., 2., 2.)],
       [(3., 3., 3.), (4., 4., 4.), (5., 5., 5.)],
       [(6., 6., 6.), (7., 7., 7.), (8., 8., 8.)]],
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])

无论如何,整个数组的视图仍然有效,您可以使用传统的列切片:

^{pr2}$

tolist是转换到/从结构化数组转换的旧备用。它仍然有效:

^{3}$

data创建更改为包含元组,实际上并不会更改视图行为,但可能更接近于您想要的(或无论如何我想要的):

In [50]: data1 = np.array([(0,1,2),(3,4,5),(6,7,8)], dtype=np.dtype([('a','<f8')
    ...: , ('b','<f8'),('c','<f8')]))
In [51]: data1
Out[51]: 
array([(0., 1., 2.), (3., 4., 5.), (6., 7., 8.)],
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])

请注意,子字段显示现在包括偏移参数。在

In [53]: data1[['a','b']]
Out[53]: 
array([(0., 1.), (3., 4.), (6., 7.)],
      dtype={'names':['a','b'], 'formats':['<f8','<f8'], 'offsets':[0,8], 'itemsize':24})

基础数据库是相同的,因此3列视图可以使用或不使用子字段索引:

In [54]: data1[['a','b']].view((float,(3,)))
Out[54]: 
array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]])
In [55]: data1.view((float,(3,)))
Out[55]: 
array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]])

我还没有读过最新的变化。取而代之的是,我使用了过去行之有效的各种技巧。从结构化数组转换到/从中转换从来都不是简单和万无一失的。在

相关问题 更多 >