假設我有以下內容:如何輕鬆(有效地)從數組中刪除單個元素?
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]
)。 計算效率是一個問題,因爲我有幾個大型數組可以通過。
假設我有以下內容:如何輕鬆(有效地)從數組中刪除單個元素?
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]
)。 計算效率是一個問題,因爲我有幾個大型數組可以通過。
用最後一個元素交換元素,然後調整數組的大小。
我做一個小的測試,使用幼稚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技巧:)
刪除任意元素是一項昂貴的操作。你想達到什麼目的?也許有更好的方法? – Krumelur
@Krumelur。謝謝回覆。是的,我已經意識到這是一種艱難的方式。我需要刪除號碼作爲其他操作的候選人。 – lnNoam
那麼你在這個輸出背後的邏輯是什麼?你想要刪除索引? – Kasramvd