28

たとえば、フィールド名のリストを使用してインデックスを作成することにより、構造化配列に複数の列(fields)を一度に表示できます。numpy

import numpy as np

a = np.array([(1.5, 2.5, (1.0,2.0)), (3.,4.,(4.,5.)), (1.,3.,(2.,6.))],
        dtype=[('x',float), ('y',float), ('value',float,(2,2))])

print a[['x','y']]
#[(1.5, 2.5) (3.0, 4.0) (1.0, 3.0)]

print a[['x','y']].dtype
#[('x', '<f4') ('y', '<f4')])

しかし、問題は、それがビューではなくコピーのように見えることです。

b = a[['x','y']]
b[0] = (9.,9.)

print b
#[(9.0, 9.0) (3.0, 4.0) (1.0, 3.0)]

print a[['x','y']]
#[(1.5, 2.5) (3.0, 4.0) (1.0, 3.0)]

1つの列のみを選択すると、それはビューになります。

c = x['y']
c[0] = 99.

print c
#[ 99.  4.   3. ]

print a['y']
#[ 99.  4.   3. ]

一度に複数の列のビュー動作を取得する方法はありますか?

2つの回避策があります。1つは列をループするだけで、もう1つは階層を作成することdtypeです。これにより、1つの列が実際に必要な2つ(またはそれ以上)のフィールドを持つ構造化配列を返します。残念ながら、zipコピーも返されるので、私はできません:

x = a['x']; y = a['y']
z = zip(x,y)
z[0] = (9.,9.)
4

5 に答える 5

11

@HYRYの回答に基づいて、ndarrayのメソッドを使用することもできますgetfield

def fields_view(array, fields):
    return array.getfield(numpy.dtype(
        {name: array.dtype.fields[name] for name in fields}
    ))
于 2016-08-26T04:32:06.197 に答える
4

あなたが望むものを達成する簡単な方法はないと思います。一般に、任意のビューを配列に取り込むことはできません。次のことを試してください。

>>> a
array([(1.5, 2.5, [[1.0, 2.0], [1.0, 2.0]]),
       (3.0, 4.0, [[4.0, 5.0], [4.0, 5.0]]),
       (1.0, 3.0, [[2.0, 6.0], [2.0, 6.0]])], 
      dtype=[('x', '<f8'), ('y', '<f8'), ('value', '<f8', (2, 2))])
>>> a.view(float)
array([ 1.5,  2.5,  1. ,  2. ,  1. ,  2. ,  3. ,  4. ,  4. ,  5. ,  4. ,
        5. ,  1. ,  3. ,  2. ,  6. ,  2. ,  6. ])

レコード配列の float ビューは、実際のデータがメモリにどのように格納されているかを示します。このデータへのビューは、上記のデータへの形状、ストライド、およびオフセットの組み合わせとして表現できる必要があります。したがって、たとえば'x'and'y'のみのビューが必要な場合は、次のようにすることができます。

>>> from numpy.lib.stride_tricks import as_strided
>>> b = as_strided(a.view(float), shape=a.shape + (2,),
                   strides=a.strides + a.view(float).strides)
>>> b
array([[ 1.5,  2.5],
       [ 3. ,  4. ],
       [ 1. ,  3. ]])

as_strided、おそらく理解しやすいものと同じことを行います。

>>> bb = a.view(float).reshape(a.shape + (-1,))[:, :2]
>>> bb
array([[ 1.5,  2.5],
       [ 3. ,  4. ],
       [ 1. ,  3. ]])

これはいずれも次のビュー aです。

>>> b[0,0] =0
>>> a
array([(0.0, 2.5, [[0.0, 2.0], [1.0, 2.0]]),
       (3.0, 4.0, [[4.0, 5.0], [4.0, 5.0]]),
       (1.0, 3.0, [[2.0, 6.0], [2.0, 6.0]])], 
      dtype=[('x', '<f8'), ('y', '<f8'), ('value', '<f8', (2, 2))])
>>> bb[2, 1] = 0
>>> a
array([(0.0, 2.5, [[0.0, 2.0], [1.0, 2.0]]),
       (3.0, 4.0, [[4.0, 5.0], [4.0, 5.0]]),
       (1.0, 0.0, [[2.0, 6.0], [2.0, 6.0]])], 
      dtype=[('x', '<f8'), ('y', '<f8'), ('value', '<f8', (2, 2))])

これのいずれかをレコード配列に変換できればいいのですが、numpy はそうするのを拒否します。その理由は私にはそれほど明確ではありません。

>>> b.view([('x',float), ('y',float)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: new type not compatible with array.

もちろん、たとえば と の場合、機能するもの (一種) と機能しないものがある'x'ため、一般的に答えは次のとおりです。それはできません。'y''x''value'

于 2013-03-03T07:47:06.250 に答える