2

numpy docsのセクションAccessing multiple fields at onceでは、次のように述べています。

要求された順序に関係なく、フィールドは常に同じ順序で返されることに注意してください

ドキュメントには、次のような例も示されています。

>>> 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 と同じでした。

4

1 に答える 1

1

ドキュメントが古くなっているように見えます。

結果の配列を生成するコードは、関数_index_fields()in にありnumpy/core/_internal.pyます。

2011 年 3 月 22 日に v1.5 と v1.6 の間で変更がありました...

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 で引用されているドキュメントのセクションは、変更の 3 週間前の2011 年 3 月 1 日に追加されました。

于 2013-06-21T16:53:19.240 に答える