2016-06-08 62 views
3

我有一個如下的numpy數組,我想刪除所有的零。從numpy數組中刪除某些元素而不破壞結構

a = [[ 5 2 0 9 4] 
[ 2 0 9 4 2] 
[ 0 9 4 2 6] 
[ 9 4 2 6 8] 
[ 4 2 6 8 0] 
[ 2 6 8 0 3] 
[ 6 8 0 3 11] 
[ 8 0 3 11 7] 
[ 0 3 11 7 1] 
[ 3 11 7 1 5] 
[11 7 1 5 21] 
[ 7 1 5 21 8] 
[ 1 5 21 8 0] 
[ 5 21 8 0 18] 
[21 8 0 18 12] 
[ 8 0 18 12 3] 
[ 0 18 12 3 9]] 

我想刪除所有零後,如下是:

b = [[ 5 2 9 4] 
[ 2 9 4 2] 
[ 9 4 2 6] 
[ 9 4 2 6 8] 
[ 4 2 6 8] 
[ 2 6 8 3] 
[ 6 8 3 11] 
[ 8 3 11 7] 
[ 3 11 7 1] 
[ 3 11 7 1 5] 
[11 7 1 5 21] 
[ 7 1 5 21 8] 
[ 1 5 21 8] 
[ 5 21 8 18] 
[21 8 18 12] 
[ 8 18 12 3] 
[18 12 3 9]] 

我試圖a[a>0]但它返回一維數組:[ 5 2 9 4 2 9 4 2 9 4 2 6 9 4 2 6 8 4 2 6 8 2 6 8 3 6 8 3 11 8 3 11 7 3 11 7 1 3 11 7 1 5 11 7 1 5 21 7 1 5 21 8 1 5 21 8 5 21 8 18 21 8 18 12 8 18 12 3 18 12 3 9]。我不知道是否有像這樣的命令a[a>0,axis=1]刪除所有的零而不破壞它的結構?

+0

看看這個答案:http://stackoverflow.com/a/15773628/2666859 – Serenity

+0

不完全一樣...這個問題/答案是關於[如何屏蔽元素(https://開頭計算器.com/questions/15773570 /試圖掩蓋2d-numpy-arrays-based-values-in-one-column/15773628),而不是如何刪除元素。 – jkdev

+0

Numpy數組_具有一致的維度,沿着特定的軸線,所有的子數組需要具有相同的長度 – Finwood

回答

2

結果數組不能是一個numpy數組,因爲它的形狀不是恆定的。因此,一個可能的解決辦法是做標準的Python的方式:

b = [row[row>0] for row in a] 
+1

謝謝,它的工作原理。但我有一個愚蠢的問題。我怎麼能計算每個b的子陣列的中位數?我使用'np.median(b)',但失敗了。 –

+2

'[np.median(c)for c in b]' – DomTomCat

+2

試試這個:'map(np.median,b)' – jkdev

1

看來你要刪除的零,如果有也正是在每列零的相同的數字。請注意,在您的示例中,這不(可能)。

b=np.hstack([y.reshape((len(y),1)) for y in [x[x>0] for x in [a[:,i] for i in range(a.shape[1])]]]) 
+0

其實我的真實數據可能在每個子數組中有不同數量的零。對困惑感到抱歉。我嘗試儘可能高效地實現它,因爲它是我的滾動中值計算函數的一部分。非常感謝。 –