最簡單的方法假設你擁有了它在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
謝謝。這像一個魅力。 – Shweta