2017-04-12 21 views
0

我想統計numpy數組中特定值(在本例中爲-1)的出現次數,並同時刪除它們。計算特定值的出現次數並同時將它們刪除

我能做到這一點所以這裏是我做了什麼:

a = np.array([1, 2, 0, -1, 3, -1, -1]) 
b = a[a==-1] 
a = np.delete(a, np.where(a==-1)) 
print("a -> ", a) # a -> [1 2 0 3] 
print("b -> ", b) # b -> 3 

有沒有更優化的方式做到這一點?

+3

計數在你的代碼中發生了什麼?刪除'-1'就是:'a [a!= - 1]'? – Divakar

+1

@Divakar我想,OP想要在原地修改數組'a'。 – kmario23

回答

-1

這樣的事情? 儘管像你一樣使用numpy可能會更優化。

a = [x for x in a if x != -1] 
-1

首先,列表就地數和刪除操作:

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來確定它將返回多少個值。

所以我提出了和你一樣的行動,但是以更直接的方式。

相關問題