2011-05-08 61 views
14

我有一個rank-1 numpy.array我想製作boxplot。但是,我想排除數組中的所有值等於零......目前,我通過循環數組並將該值複製到新數組(如果不等於零)來解決此問題。然而,由於陣列包含86 000 000個值,我必須多次這樣做,這需要很多耐心。從numpy.array中刪除數據

有沒有更聰明的方法來做到這一點?

回答

11

這就是你要使用屏蔽陣列的情況下,它讓你的陣列的形狀,它是由所有numpy的和matplotlib功能自動識別。

X = np.random.randn(1e3, 5) 
X[np.abs(X)< .1]= 0 # some zeros 
X = np.ma.masked_equal(X,0) 
plt.boxplot(X) #masked values are not plotted 

#other functionalities of masked arrays 
X.compressed() # get normal array with masked values removed 
X.mask # get a boolean array of the mask 
X.mean() # it automatically discards masked values 
+0

link to documentation:http://docs.scipy.org/doc/numpy/reference/routines.ma.html – 2011-05-10 21:51:25

27

對於NumPy的陣列a,可以使用

a[a != 0] 

提取不等於零的值。

+0

非常感謝你,這個工作確實很多( !) 更多更快。類似的行爲可以在更高等級的NumMpy陣列或矩陣上完成嗎?因爲在這裏,問題發生,尺寸不再適當地匹配...... – 2011-05-08 12:07:49

+0

@rubae:如果'a'具有更高的維數,結果將是一個扁平(一維)數組。也可以刪除全部爲零的列或行。 – 2011-05-08 12:51:04

2

我想建議你對這種情況簡單地使用NaN,你會忽略一些值,但仍然希望保持統計過程儘可能有意義。所以

In []: X= randn(1e3, 5) 
In []: X[abs(X)< .1]= NaN 
In []: isnan(X).sum(0) 
Out[: array([82, 84, 71, 81, 73]) 
In []: boxplot(X) 

enter image description here

+0

啊,這裏使用NaN確實比較合適,謝謝。因此,我不再需要將我的數據複製到具有不同大小的新數組,但我可以保留原始數組並將其作爲數組中的位置。謝謝 ! – 2011-05-08 17:10:28

+0

你也許知道一種方式來循環使用列表理解?也就是說我有一個字典'a',其中'[k]'是一個NumPy數組,因此我想做'[a [k] [abs(a [k])<。1] = float('NaN' )for k in data]'但這似乎在循環中失敗,而只在循環中執行命令似乎工作... – 2011-05-08 17:29:35

+0

@rubae:我認爲你應該提出一個與這個列表理解問題有關的單獨問題。不幸的是,它不再那麼直截了當地弄清楚你實際上瞄準的是什麼:(就我所能猜到的而言,不要被列表理解所迷惑,也許你只是在尋找像這樣簡單的東西:'for k in data:a [k] [abs(a [k])<.1] = NaN'? – eat 2011-05-08 19:22:39

0

一個簡單的代碼行可以幫你排除所有的 '0' 值的數組:

np.argwhere(*array*) 

例如:

import numpy as np 
array = [0, 1, 0, 3, 4, 5, 0] 
array2 = np.argwhere(array) 
print array2 

[1, 3, 4, 5]