2015-07-21 63 views
1

假設我有以下內容:如何輕鬆(有效地)從數組中刪除單個元素?

a = np.array([0,0,64,64,100,100,130,130,0,183,208,0,255]) 

和我想從該陣列中,例如,刪除單個特定值的單個130

,得到:

[0,0,64,64,100,100,130,0,183,208,0,255] 

它被刪除無關緊要。

在這個例子中,我不想刪除所有'130'(即,而不是a[a != 130])。 計算效率是一個問題,因爲我有幾個大型數組可以通過。

+5

刪除任意元素是一項昂貴的操作。你想達到什麼目的?也許有更好的方法? – Krumelur

+0

@Krumelur。謝謝回覆。是的,我已經意識到這是一種艱難的方式。我需要刪除號碼作爲其他操作的候選人。 – lnNoam

+0

那麼你在這個輸出背後的邏輯是什麼?你想要刪除索引? – Kasramvd

回答

2

用最後一個元素交換元素,然後調整數組的大小。

我做一個小的測試,使用幼稚ndarray.delete功能,例如:

A = numpy.delete(A, 1) 

與交換

A[1] = A[-1] 
A.resize((len(A) - 1,)) 

編輯:@YXD建議用創建的視圖的替換的調整大小

A[1] = A[-1] 
A = A[:-1] 

這是一個更好的(只是我的numpy的知識是有限的d)並在我的回答結束時很好地包裝這個建議。

後者破壞了數組的排序,但不需要memcpy數組的大部分用於每次刪除。

一個小的性能測試:

# Naïve approach 
print timeit.timeit(""" 
import numpy 
A = numpy.array(range(0,10000)) 
while len(A) > 10: 
    A = numpy.delete(A, 1) 
""", number=10) 

# Swap, resize 
print timeit.timeit(""" 
import numpy 
A = numpy.array(range(0,10000)) 
while len(A) > 10: 
    A[1] = A[-1] 
    A.resize((len(A) - 1,)) 
""", number=10) 

# Swap, create view 
print timeit.timeit(""" 
import numpy 
A = numpy.array(range(0,10000)) 
while len(A) > 10: 
    A[1] = A[-1] 
    A = A[:-1] 
""", number=10) 

>>> 2.52913403511 
>>> 0.14426112175 
>>> 0.0972230434418 

所以它看起來像ndarray真的實現爲一個C數組(當然這使得有很大的意義)。交換是我以前學習過的老C技巧:)

+0

您不必刪除 - 您可以執行'A = A [: - 1]'這將返回一個沒有最後一個元素的視圖。 – YXD

+0

這絕對是一種我必須記住的技巧。我認爲自己的評論有些事情要做,但就複雜性和保留原有功能而言,這確實是一個更好的解決方案。 – Aaron

+0

@Krumelur哈哈,感謝您的支持,但您應該讚揚YXD的功勞... – Aaron

0

您不能刪除數組元素。相反,您可以創建具有所有所需元素的輔助數組,然後刪除原始數組。

+0

這可能是提問者發現困難的方法:) – Krumelur