根据列表中的条件从numpy数组创建新数组

0 投票
1 回答
1551 浏览
提问于 2025-04-16 03:31

假设我有一个数组,定义如下:

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 个回答

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

然后你可以用一个元组来测试你要检查的值,这样就能得到一个一维的布尔数组,显示那些列是否等于你要的值。

不过,对于结构化数组,数据类型必须完全匹配。例如,data[['a1', 'a4']] == ('a1v1', 'a4v1') 只会返回 False,所以我们需要用和要测试的列相同的数据类型来创建一个值的数组。因此,我们需要做一些类似于:

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

希望这些解释能让你明白一些……

撰写回答