Python中二维数组的条件索引

3 投票
2 回答
2306 浏览
提问于 2025-04-18 04:22

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

撰写回答