Skip to main content
 首页 » 编程设计

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

2025年05月04日798°冷暖

在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 相同。

请您参考如下方法:

看起来好像文档刚刚过时。

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

有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 ,更改前三周。