2010-08-31 123 views
0

条件的新数组假设我有一个数组定义为:创建从numpy的阵列基于从列表

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

谢谢。

回答

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

然后,您可以测试这个agains,你检查的值的元组,并得到一个一维数组布尔其中那些列等于这些值。

但是,对于结构化数组,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')]) 

希望这有一定道理,无论如何...

+0

谢谢乔金顿。 – riza 2010-08-31 17:18:35

+0

如果r不符合数据dtype的顺序? 例如,r = [('a4','a4v1'),('a1','a1v1')]。 – riza 2010-08-31 22:32:20

+0

是的,这是该方法的一个难点。列必须以与dtype相同的顺序列出。 (或者,相反,它们将按照dtype的顺序返回,而不管它们的列出顺序如何)。我认为这只是结构化数组的设计限制。邮件列表,(http://www.mail-archive.com/[email protected]/msg24453.html),但它显然从来没有成为numpy的主干版本...... – 2010-09-01 15:07:42