2016-01-15 47 views

回答

3

最簡單的方法假設你擁有了它在numpy的數組是這樣的:(忽略科學記數法)

In [86]: arr 
Out[86]: 
array([[ 1.00000000e+00, 9.00000000e-01, 3.22300000e+03], 
     [ 1.00000000e+00, 8.00000000e-01, 7.89900000e+03], 
     [ 1.00000000e+00, 7.00000000e-01, 2.32110000e+04], 
     [ 1.00000000e+00, 6.00000000e-01, 3.23200000e+03], 
     [ 1.00000000e+00, 5.00000000e-01, 4.47800000e+03], 
     [ 2.00000000e+00, 9.00000000e-01, 3.42000000e+02], 
     [ 2.00000000e+00, 8.00000000e-01, 3.43400000e+03], 
     [ 2.00000000e+00, 7.00000000e-01, 2.42320000e+04], 
     [ 2.00000000e+00, 6.00000000e-01, 3.32000000e+02], 
     [ 2.00000000e+00, 5.00000000e-01, 4.78000000e+02]]) 

你可以這樣做:

arr[np.roll(arr[:,0], k) != arr[:,0],2] 

例子:

In [87]: arr[np.roll(arr[:,0], 2) != arr[:,0],2] 
Out[87]: array([ 3223., 7899., 342., 3434.]) 

說明:

我們轉移ķ位置(卷)C1拿到C1' 。 c1!= c1'的行是每個c1不同值的前k行(或者如果c1的值至少沒有k行,則小於k)。我們使用它來索引原始數組並獲得我們想要的c3值。

它也應該完全矢量化,因此非常有效。 在100000行和1000個不同的c1值(c1從1到1000,c2從100到1,對於每個c1,c3隨機)中,每個c1的前5個值在我的計算機上只需〜2.4ms:

In [132]: c1 = np.repeat(np.linspace(1,1000, 1000), 100) 

In [133]: c2 = np.tile(np.linspace(100, 1, 100), 1000) 

In [134]: c3 = np.random.random_integers(1, 10000, size=100000) 

In [135]: arr = np.column_stack((c1, c2, c3)) 

In [136]: arr 
Out[136]: 
array([[ 1.00000000e+00, 1.00000000e+02, 2.21700000e+03], 
     [ 1.00000000e+00, 9.90000000e+01, 9.23000000e+03], 
     [ 1.00000000e+00, 9.80000000e+01, 1.47900000e+03], 
     ..., 
     [ 1.00000000e+03, 3.00000000e+00, 7.41600000e+03], 
     [ 1.00000000e+03, 2.00000000e+00, 2.08000000e+03], 
     [ 1.00000000e+03, 1.00000000e+00, 3.41300000e+03]]) 

In [137]: %timeit arr[ np.roll(arr[:,0], 5) != arr[:,0], 2] 
100 loops, best of 3: 2.36 ms per loop 
+0

謝謝。這像一個魅力。 – Shweta

相關問題