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')])

然后,您可以再次测试您正在检查的值的元组,并获得一个一维布尔数组,其中这些列等于这些值。

但是,对于结构化数组,dtype 必须完全匹配。例如data[['a1', 'a4']] == ('a1v1', 'a4v1')只是 yield 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 回答