假设我有一个由:
定义的数组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']
感谢。
答案 0 :(得分: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')
只生成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')])
希望无论如何都有道理......