我有一個rank-1 numpy.array我想製作boxplot。但是,我想排除數組中的所有值等於零......目前,我通過循環數組並將該值複製到新數組(如果不等於零)來解決此問題。然而,由於陣列包含86 000 000個值,我必須多次這樣做,這需要很多耐心。從numpy.array中刪除數據
有沒有更聰明的方法來做到這一點?
我有一個rank-1 numpy.array我想製作boxplot。但是,我想排除數組中的所有值等於零......目前,我通過循環數組並將該值複製到新數組(如果不等於零)來解決此問題。然而,由於陣列包含86 000 000個值,我必須多次這樣做,這需要很多耐心。從numpy.array中刪除數據
有沒有更聰明的方法來做到這一點?
這就是你要使用屏蔽陣列的情況下,它讓你的陣列的形狀,它是由所有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
對於NumPy的陣列a
,可以使用
a[a != 0]
提取不等於零的值。
非常感謝你,這個工作確實很多( !) 更多更快。類似的行爲可以在更高等級的NumMpy陣列或矩陣上完成嗎?因爲在這裏,問題發生,尺寸不再適當地匹配...... – 2011-05-08 12:07:49
@rubae:如果'a'具有更高的維數,結果將是一個扁平(一維)數組。也可以刪除全部爲零的列或行。 – 2011-05-08 12:51:04
我想建議你對這種情況簡單地使用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)
啊,這裏使用NaN確實比較合適,謝謝。因此,我不再需要將我的數據複製到具有不同大小的新數組,但我可以保留原始數組並將其作爲數組中的位置。謝謝 ! – 2011-05-08 17:10:28
你也許知道一種方式來循環使用列表理解?也就是說我有一個字典'a',其中'[k]'是一個NumPy數組,因此我想做'[a [k] [abs(a [k])<。1] = float('NaN' )for k in data]'但這似乎在循環中失敗,而只在循環中執行命令似乎工作... – 2011-05-08 17:29:35
@rubae:我認爲你應該提出一個與這個列表理解問題有關的單獨問題。不幸的是,它不再那麼直截了當地弄清楚你實際上瞄準的是什麼:(就我所能猜到的而言,不要被列表理解所迷惑,也許你只是在尋找像這樣簡單的東西:'for k in data:a [k] [abs(a [k])<.1] = NaN'? – eat 2011-05-08 19:22:39
一個簡單的代碼行可以幫你排除所有的 '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]
link to documentation:http://docs.scipy.org/doc/numpy/reference/routines.ma.html – 2011-05-10 21:51:25