python中2d数组中的条件索引

时间:2014-04-26 15:05:22

标签: python arrays numpy

我有一个二维数组,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

我知道如何在1D数组中使用条件索引,但是2D数组呢?我在这里很困惑,因为我没有根据值来检索要检索的索引,但是我需要一个依赖于索引本身的条件。

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

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

我会做这样的事情:

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

它多一点......一般。行列表可能不是您想要的,但您可以在此之后以您喜欢的任何形式放置数据。