0

次のように定義された配列があるとします。

data = np.array([('a1v1', 'a2v1', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v1', 'a3v1', 'a4v2', 'a5v1'),
       ('a1v3', 'a2v1', 'a3v1', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v1', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v3', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v3', 'a3v2', 'a4v2', 'a5v1'),
       ('a1v3', 'a2v3', 'a3v2', 'a4v2', 'a5v2'),
       ('a1v1', 'a2v2', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v3', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v1', 'a2v2', 'a3v2', 'a4v2', 'a5v2'),
       ('a1v3', 'a2v2', 'a3v1', 'a4v2', 'a5v2'),
       ('a1v3', 'a2v1', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v1', 'a4v2', 'a5v1')],
      dtype=[('a1', '|S4'), ('a2', '|S4'), ('a3', '|S4'),
             ('a4', '|S4'), ('a5', '|S4')])

タプルのリストで指定された条件を使用してデータ要素を行ごとにリストする関数を作成する方法r。

r = [('a1', 'a1v1'), ('a4', 'a4v1')]

私はそれがこのように手動で行うことができることを知っています:

data[(data['a1']=='a1v1') & data['a4']=='a4v1']

rに準拠するデータから行を削除するのはどうですか。

data[(data['a1']!='a1v1') | data['a4']!='a4v1']

ありがとう。

4

1 に答える 1

1

私があなたを正しく理解しているなら、あなたは行全体をリストしたいと思うでしょう、そこでは列の与えられたタプルはある値に等しいです。その場合、これはあなたが望むものでなければなりませんが、それは少し冗長で曖昧です:

test_cols = data[['a1', 'a4']]
test_vals = np.array(('a1v1', 'a4v1'), test_cols.dtype)
data[test_cols == test_vals]

「ネストされたリスト」スタイルのインデックス付けに注意してください...これは、構造化配列の複数の列を選択する最も簡単な方法です。例えば

data[['a1', 'a4']] 

降伏します

array([('a1v1', 'a4v1'), ('a1v1', 'a4v2'), ('a1v3', 'a4v1'),
       ('a1v2', 'a4v1'), ('a1v2', 'a4v1'), ('a1v2', 'a4v2'),
       ('a1v3', 'a4v2'), ('a1v1', 'a4v1'), ('a1v1', 'a4v1'),
       ('a1v2', 'a4v1'), ('a1v1', 'a4v2'), ('a1v3', 'a4v2'),
       ('a1v3', 'a4v1'), ('a1v2', 'a4v2')], 
      dtype=[('a1', '|S4'), ('a4', '|S4')])

次に、これをチェックしている値のタプルに対してテストし、それらの列がそれらの値と等しい1次元のブール配列を取得できます。

ただし、構造化配列の場合、dtypeは完全に一致する必要があります。たとえば、data[['a1', 'a4']] == ('a1v1', 'a4v1')を生成するだけFalseなので、テストする列と同じdtypeを使用して、テストする値の配列を作成する必要があります。したがって、次のようなことを行う必要があります。

test_cols = data[['a1', 'a4']]
test_vals = np.array(('a1v1', 'a4v1'), test_cols.dtype)

これを行う前に:

data[test_cols == test_vals]

これにより、私たちが最初に求めていたものが得られます。

array([('a1v1', 'a2v1', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v2', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v3', 'a3v2', 'a4v1', 'a5v2')], 
      dtype=[('a1', '|S4'), ('a2', '|S4'), ('a3', '|S4'), ('a4', '|S4'), ('a5', '|S4')])

とにかく、それが理にかなっていることを願っています...

于 2010-08-31T15:15:28.360 に答える