3

フロートのNumPyレコード配列があります。

import numpy as np
ar = np.array([(238.03, 238.0, 237.0),
               (238.02, 238.0, 237.01),
               (238.05, 238.01, 237.0)], 
              dtype=[('A', 'f'), ('B', 'f'), ('C', 'f')])

このレコード配列から最小/最大を決定するにはどうすればよいですか?私の通常の試みは次のようにar.min()失敗します:

TypeError:フレキシブルタイプではreduceを実行できません

値をより単純なNumPy配列にフラット化する方法がわかりません。

4

3 に答える 3

5

最も簡単で効率的な方法は、おそらく配列をフロートの単純な2D配列として表示することです。

ar_view = ar.view((ar.dtype[0], len(ar.dtype.names)))

これは、構造化配列の2D配列ビューです。

print ar_view.min(axis=0)  # Or whatever…

新しい配列が作成されないため、このメソッドは高速です(変更するとar_viewに変更されますar)。ただし、すべてのレコードフィールドが同じタイプ(ここではfloat32)である場合に限定されます。

1つの利点は、この方法で元の配列の2D構造がそのまま維持されることです。たとえば、各「列」axis=0)で最小値を見つけることができます。

于 2012-07-04T05:58:16.360 に答える
3

できるよ

# construct flattened ndarray
arnew = np.hstack(ar[r] for r in ar.dtype.names)

再配列を平坦化するには、次のような通常のndarray操作を実行できます。

armin, armax = np.min(arnew), np.max(arnew)
print(armin),
print(armax)

結果は

237.0 238.05

基本的にar.dtype.names、再配列名のリストが表示されます。次に、名前から配列を1つずつ取得し、次のようにスタックします。arnew

于 2012-07-04T01:26:54.897 に答える
1

これは他の誰かを助けるかもしれませんが、それを行う別の方法はもっと賢明かもしれません:

import numpy as np
ar = np.array([(238.03, 238.0, 237.0),
              (238.02, 238.0, 237.01),
              (238.05, 238.01, 237.0)], 
              dtype=[('A', 'f'), ('B', 'f'), ('C', 'f')])
arView = ar.view(np.recarray)
arView.A.min()

それは私がただ選んで選ぶことを可能にしました。私の側の問題は、すべての要素のdtypeが同じではないことでした(全体としてかなり複雑な構造体)。

于 2015-06-02T03:22:40.680 に答える