首先,列表就地數和刪除操作:
In [100]: al=a.tolist(); cnt=0
In [101]: for i in range(len(a)-1,-1,-1):
...: if al[i]==-1:
...: del al[i]
...: cnt += 1
In [102]: al
Out[102]: [1, 2, 0, 3]
In [103]: cnt
Out[103]: 3
它工作在地方,但必須從工作進行到底。列表理解選項創建了一個新列表,但通常更容易編寫和閱讀。
最乾淨的數組操作使用布爾值掩碼。
In [104]: idx = a==-1
In [105]: idx
Out[105]: array([False, False, False, True, False, True, True], dtype=bool)
In [106]: np.sum(idx) # or np.count_nonzero(idx)
Out[106]: 3
In [107]: a[~idx]
Out[107]: array([1, 2, 0, 3])
您必須以某種方式或其他方式識別與目標匹配的所有元素。計數是一項微不足道的操作。掩蔽也很容易。
np.delete
必須告知要刪除的項目;並以某種方式或其他構造一個新的數組,其中包含除'刪除'之外的所有數據。由於它的普遍性,它幾乎總是比這種掩蔽的直接行動慢。
np.where
(又名np.nonzeros
)使用count_nonzero
來確定它將返回多少個值。
所以我提出了和你一樣的行動,但是以更直接的方式。
計數在你的代碼中發生了什麼?刪除'-1'就是:'a [a!= - 1]'? – Divakar
@Divakar我想,OP想要在原地修改數組'a'。 – kmario23