2011-09-28 68 views
2

我有这样numpy的数组的数组如何切片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]] 

我需要2个独立的阵列dd[:,1] ==1dd[:,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确实工作

回答

6

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

@ wim哪个更快? – Merlin

+0

第一个例子(花式索引)约快两倍。 – wim

+2

+1。花式索引速度更快,而且阅读起来也更容易。 – mtrw