Python中二维数组的条件索引
我有一个二维数组,叫做 g
,它的样子是这样的:
np.array([
[1 2 3 4],
[5 6 7 8],
[9 10 11 12]
])
所以当我用 0
作为索引时,g[0]
会返回第一行,也就是说,索引为 0
时,我得到的是第一行。当我用索引 1
时,我得到的是第二行:
g[1] = [5 6 7 8]
依此类推。
但是我想要返回所有行,前提是 g
的索引不是某个特定的值。比如说,我想返回 g[x]
,条件是 x != 1
。
我知道如何在一维数组中使用条件索引,但对于二维数组我该怎么做呢?我有点困惑,因为我不是根据值来设置条件,而是需要根据索引本身来设置条件。
2 个回答
1
unutbu的回答是有效的,但我觉得把计算放在索引里...有点不太好。:/
我会这样做:
rowsidontwant = [1, 3]
listofrows = [ g[i] for i in filter(lambda x: not in rowsidontwant, xrange(len(g))) ]
这样做会更...通用一些。虽然行的列表可能不是你想要的,但在那之后你可以把数据整理成任何你喜欢的形式。
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