将 recarray 视为 ndarray
View of recarray as ndarray
在以前的 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
的二维 ndarray。
在 numpy 版本 1.14 中,当我尝试上面的第二行时出现错误:
ValueError: Changing the dtype to a subarray type is only supported if the total itemsize is unchanged
这是因为 data[['a','b']]
的项目大小仍然是 24。好的,没关系,但是有什么方法可以获取那些更新项目大小的数据列的副本,以便我可以制作视图我想要的?
例如,即使复制(或深层复制)data[['a','b']]
仍然会导致项目大小为 24,我不明白。
您是否意识到没有元组,您的 recarray 是 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')])
无论如何,整个数组的视图仍然有效,您可以对其使用常规的列切片:
In [47]: data.view(('float',(3,)))
Out[47]:
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.]]])
In [48]: _.shape
Out[48]: (3, 3, 3)
tolist
是转换 to/from 结构化数组的旧备用。它仍然有效:
In [49]: np.array(data[['a','b']].tolist())
Out[49]:
array([[[0., 0.],
[1., 1.],
[2., 2.]],
[[3., 3.],
[4., 4.],
[5., 5.]],
[[6., 6.],
[7., 7.],
[8., 8.]]])
更改 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.]])
我还没有阅读最新的更改。相反,我使用了过去有用的各种技巧。转换 to/from 结构化数组从未如此简单和万无一失。
在以前的 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
的二维 ndarray。
在 numpy 版本 1.14 中,当我尝试上面的第二行时出现错误:
ValueError: Changing the dtype to a subarray type is only supported if the total itemsize is unchanged
这是因为 data[['a','b']]
的项目大小仍然是 24。好的,没关系,但是有什么方法可以获取那些更新项目大小的数据列的副本,以便我可以制作视图我想要的?
例如,即使复制(或深层复制)data[['a','b']]
仍然会导致项目大小为 24,我不明白。
您是否意识到没有元组,您的 recarray 是 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')])
无论如何,整个数组的视图仍然有效,您可以对其使用常规的列切片:
In [47]: data.view(('float',(3,)))
Out[47]:
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.]]])
In [48]: _.shape
Out[48]: (3, 3, 3)
tolist
是转换 to/from 结构化数组的旧备用。它仍然有效:
In [49]: np.array(data[['a','b']].tolist())
Out[49]:
array([[[0., 0.],
[1., 1.],
[2., 2.]],
[[3., 3.],
[4., 4.],
[5., 5.]],
[[6., 6.],
[7., 7.],
[8., 8.]]])
更改 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.]])
我还没有阅读最新的更改。相反,我使用了过去有用的各种技巧。转换 to/from 结构化数组从未如此简单和万无一失。