如何按列值切片Numpy数组

2 投票
1 回答
7026 浏览
提问于 2025-04-17 03:14

我有一个像这样的数组,使用的是numpy库

 dd =[[0.567 2 0.611]
      [0.469 1 0.479]
      [0.220 2 0.269]
      [0.480 1 0.508]
      [0.324 1 0.324]]

我需要两个单独的数组,一个是dd[:,1] ==1,另一个是dd[:,1] ==2

这两个数组就是我想要的:

 na =[[0.469 1 0.479]
      [0.480 1 0.508]
      [0.324 1 0.324]]

 na2 =[[0.567 2 0.611]
       [0.220 2 0.269]]

我试过用np.where,但并没有成功

1 个回答

7

你可以使用numpy的花式索引:

[~/repo/py]
|32>dd[dd[:,1] == 1]
[32] 
array([[ 0.469,  1.   ,  0.479],
       [ 0.48 ,  1.   ,  0.508],
       [ 0.324,  1.   ,  0.324]])

[~/repo/py]
|33>dd[dd[:,1] == 2]
[33] 
array([[ 0.567,  2.   ,  0.611],
       [ 0.22 ,  2.   ,  0.269]])

另外,你也可以用列表推导式:

[~/repo/py]
|21>np.array([row for row in dd if row[1] == 1])
[21] 
array([[ 0.469,  1.   ,  0.479],
       [ 0.48 ,  1.   ,  0.508],
       [ 0.324,  1.   ,  0.324]])

[~/repo/py]
|22>np.array([row for row in dd if row[1] == 2])
[22] 
array([[ 0.567,  2.   ,  0.611],
       [ 0.22 ,  2.   ,  0.269]])

补充:

在ipython中如何计时这些操作:

[~/repo/py]
|36>timeit dd[dd[:,1] == 1]
100000 loops, best of 3: 6 us per loop

[~/repo/py]
|37>timeit np.array([row for row in dd if row[1] == 1])
100000 loops, best of 3: 11.5 us per loop

撰写回答