根据lis的条件从numpy数组创建一个新数组

2024-09-29 21:48:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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中给定的条件按行列出数据元素

^{pr2}$

我知道可以这样手动完成:

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

从符合r的数据中删除行怎么样

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

谢谢。在


Tags: dataa1s4a1v2a2v3a2v2a4v2a4v1
1条回答
网友
1楼 · 发布于 2024-09-29 21:48:05

如果我理解正确的话,您需要列出整个行,其中给定的列元组等于某个值。在这种情况下,这应该是您想要的,尽管它有点冗长和晦涩:

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

注意“嵌套列表”样式索引。。。这是选择结构化数组的多个列的最简单方法。E、 g

^{pr2}$

会屈服的

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

然后,您可以重新测试这个值的元组,并得到一个一维布尔数组,其中这些列等于这些值。在

但是,对于结构化数组,数据类型必须完全匹配。E、 g.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')])

希望这有点道理,不管怎样。。。在

相关问题 更多 >

    热门问题