【问题标题】:Conditional index in 2d array in pythonpython中二维数组中的条件索引
【发布时间】:2014-06-12 07:44:10
【问题描述】:

我有一个二维数组,g,如下所示:

np.array([
[1 2 3 4], 
[5 6 7 8], 
[9 10 11 12]
])

所以g[0] 返回第一行,换句话说,当我给出0 的索引时,我得到第一行。当我使用 1 的索引时,我得到第二行:

g[1] = [5 6 7 8]

等等。

但我想返回 g 的索引不是特定值的所有行。 例如。我要回g[x] for all x where x != 1

我知道如何对一维数组使用条件索引,但是二维数组呢?我在这里感到困惑,因为我没有根据值对要检索的索引设置条件,但我需要一个依赖于索引本身的条件。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以使用np.arange(len(g)) != 1 创建布尔索引:

    In [137]: g
    Out[137]: 
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    
    In [138]: g[np.arange(len(g)) != 1]
    Out[138]: 
    array([[ 1,  2,  3,  4],
           [ 9, 10, 11, 12]])
    

    如果您真的只想消除一行,您也可以使用np.concatenate 连接两个基本切片:

    In [143]: np.concatenate([g[:1], g[2:]])
    Out[143]: 
    array([[ 1,  2,  3,  4],
           [ 9, 10, 11, 12]])
    

    对于大型数组,第一种方法似乎更快,但是:

    In [150]: g2 = np.tile(g, (10000,1))
    
    In [153]: %timeit g2[np.arange(len(g)) != 1]
    100000 loops, best of 3: 6.9 µs per loop
    
    In [152]: %timeit np.concatenate([g2[:1], g2[2:]])
    10000 loops, best of 3: 51.8 µs per loop
    

    【讨论】:

    • 这给了我我想要的……但是对于更快的方法,它是如何工作的?我了解 arange 的作用。但是,您给出的条件如何用作索引?这种情况不会产生索引数组吗?但是使用数组作为索引是不行的,比如这样:g [ 0, 1, 2],那么这是怎么做到的呢?
    • NumPy 数组可以是indexed in a variety of ways,主要的三个是基本切片、整数索引和布尔索引。 np.arange(len(g)) != 1 返回一个布尔数组,因此触发布尔索引。查看np.arange(3) != 1 在 Python 交互式会话中输入时返回的内容。你得到array([ True, False, True], dtype=bool)。数组中的每个值都与g 的行相关联,并且每个 True 值都会导致关联的行被选中。顺便说一句,g[[0,2]] 也可以;这是整数索引的示例。
    【解决方案2】:

    unutbu 的答案有效,但我发现将计算放在索引中...... icky。 :/

    我会这样做:

    rowsidontwant = [1, 3]
    listofrows = [ g[i] for i in filter(lambda x: not in rowsidontwant, xrange(len(g))) ]
    

    这有点……一般。行列表可能不是您想要的,但之后您可以将数据以您喜欢的任何形式放置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 2015-08-29
      • 2020-07-30
      • 2016-09-19
      • 2023-03-07
      相关资源
      最近更新 更多