代码之家  ›  专栏  ›  技术社区  ›  riza

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

  •  0
  • riza  · 技术社区  · 14 年前

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

    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 = [('a1', 'a1v1'), ('a4', 'a4v1')]
    

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

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

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Joe Kington    14 年前

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

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