2017-04-25 154 views
2

重複行在Python,假設我有一個1366×768 numpy的陣列。我想從它刪除每個第二行(第0行仍然存在,除去1,第2遺蹟,第3去除..等),並與這以前,這行重複(未刪除行)更換空的空間與此同時。刪除和numpy的陣列

是否有可能在numpy的?

回答

3

一種方法 -

a[::2].repeat(2,axis=0) 

爲了使陣列中的改變,再次分配給變量。

採樣運行 -

In [105]: a 
Out[105]: 
array([[2, 5, 1, 1], 
     [2, 0, 2, 5], 
     [1, 1, 5, 7], 
     [0, 7, 1, 8], 
     [8, 5, 2, 3], 
     [2, 1, 0, 6], 
     [5, 6, 1, 6], 
     [7, 1, 4, 7], 
     [3, 8, 1, 4], 
     [5, 8, 8, 8]]) 

In [106]: a[::2].repeat(2,axis=0) 
Out[106]: 
array([[2, 5, 1, 1], 
     [2, 5, 1, 1], 
     [1, 1, 5, 7], 
     [1, 1, 5, 7], 
     [8, 5, 2, 3], 
     [8, 5, 2, 3], 
     [5, 6, 1, 6], 
     [5, 6, 1, 6], 
     [3, 8, 1, 4], 
     [3, 8, 1, 4]]) 

如果我們關心性能,這是一個使用NumPy strides另一種方法 -

def strided_app(a): 
    m0,n0 = a.strides 
    m,n = a.shape 
    strided = np.lib.stride_tricks.as_strided 
    return strided(a,shape=(m//2,2,n),strides=(2*m0,0,n0)).reshape(-1,n) 

採樣運行 -

In [154]: a 
Out[154]: 
array([[4, 8, 7, 7], 
     [5, 5, 1, 7], 
     [1, 8, 1, 3], 
     [6, 6, 5, 6], 
     [0, 2, 6, 3], 
     [6, 6, 8, 7], 
     [7, 6, 8, 1], 
     [7, 8, 8, 2], 
     [4, 0, 2, 8], 
     [5, 8, 1, 4]]) 

In [155]: strided_app(a) 
Out[155]: 
array([[4, 8, 7, 7], 
     [4, 8, 7, 7], 
     [1, 8, 1, 3], 
     [1, 8, 1, 3], 
     [0, 2, 6, 3], 
     [0, 2, 6, 3], 
     [7, 6, 8, 1], 
     [7, 6, 8, 1], 
     [4, 0, 2, 8], 
     [4, 0, 2, 8]]) 

計時 -

In [156]: arr = np.arange(1000000).reshape(1000, 1000) 

# Proposed soln-1 
In [157]: %timeit arr[::2].repeat(2,axis=0) 
1000 loops, best of 3: 1.26 ms per loop 

# @Psidom 's soln 
In [158]: %timeit arr[1::2] = arr[::2] 
1000 loops, best of 3: 928 µs per loop 

In [159]: arr = np.arange(1000000).reshape(1000, 1000) 

# Proposed soln-2 
In [160]: %timeit strided_app(arr) 
1000 loops, best of 3: 830 µs per loop 
2

看起來你具有偶數行的,在這種情況下,可以使用分配(分配奇數行中的值與對應偶數行):

arr = np.array([[1,4],[3,1],[2,3],[2,2]]) 
arr[1::2] = arr[::2] 
arr 
#array([[1, 4], 
#  [1, 4], 
#  [2, 3], 
#  [2, 3]]) 

這避免拷貝整個數組,但沒有按如果數組有奇數行,那麼就不會工作。

計時:這是一個時間比較,分配看起來似乎更快。

arr = np.arange(1000000).reshape(1000, 1000) 

%timeit arr[::2].repeat(2,axis=0) 
1000 loops, best of 3: 913 µs per loop 

%timeit arr[1::2] = arr[::2] 
1000 loops, best of 3: 655 µs per loop 
+0

小艾高效就地分配。 – Divakar

+0

@Divakar這可能是。儘管偶數行數組只有一種尷尬的工作。我會添加一些時間。 – Psidom

+1

通過'strides'增加了另一種方法。 「大步」擊敗一個簡單的分配步驟實在太瘋狂了。 – Divakar

0

這適用於偶數行和奇數行。

for i in range(1,len(a),2): 
    a[i] = a[i-1]