关于recarray的多字段索引的文档

时间:2013-06-19 01:47:11

标签: python numpy recarray

numpy docs一次访问多个字段部分中说:

请注意,无论要求 的顺序如何,字段始终以的顺序返回。

文档还举例说明如下:

>>> x = np.array([(1.5,2.5,(1.0,2.0)),(3.,4.,(4.,5.)),(1.,3.,(2.,6.))],
        dtype=[('x','f4'),('y',np.float32),('value','f4',(2,2))])
>>> x[['x','y']]
array([(1.5, 2.5), (3.0, 4.0), (1.0, 3.0)],
     dtype=[('x', '<f4'), ('y', '<f4')])
>>> x[['y','x']]
array([(1.5, 2.5), (3.0, 4.0), (1.0, 3.0)],
     dtype=[('x', '<f4'), ('y', '<f4')])

但是,我自己用numpy 1.6.1运行代码并得到了不同的结果:

In [20]: x = np.array([(1.5,2.5,(1.0,2.0)),(3.,4.,(4.,5.)),(1.,3.,(2.,6.))],
   ....:         dtype=[('x','f4'),('y',np.float32),('value','f4',(2,2))])

In [21]: x[['x','y']]
Out[21]:
array([(1.5, 2.5), (3.0, 4.0), (1.0, 3.0)],
      dtype=[('x', '<f4'), ('y', '<f4')])

In [22]: x[['y','x']]
Out[22]:
array([(2.5, 1.5), (4.0, 3.0), (3.0, 1.0)],
      dtype=[('y', '<f4'), ('x', '<f4')])

这种行为是否从numpy 1.6变为1.7或者我错过了什么?

编辑我测试了numpy 1.7.1中的代码,结果与numpy 1.6相同。

1 个答案:

答案 0 :(得分:1)

看起来好像文档已经过时了。

生成结果数组的代码位于numpy/core/_internal.py的函数_index_fields()中。

来自......的a change between v1.5 and v1.6 on March 22nd, 2011

new_dtype = [(name, dt[name]) for name in dt.names if name in fields]

...到...

new_dtype = [(name, dt[name]) for name in fields if name in dt.names]

...因此,结果数组中字段的顺序从原始数据类型中指定的顺序更改为您在访问它们时指定字段的顺序。

但是,OP中引用的文档部分是added on March 1st, 2011,在变更前三周。