我有一个二维数组,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数组呢?我在这里很困惑,因为我没有根据值来检索要检索的索引,但是我需要一个依赖于索引本身的条件。
答案 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))) ]
它多一点......一般。行列表可能不是您想要的,但您可以在此之后以您喜欢的任何形式放置数据。