第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

減少使用 numpy 的一行代碼的內(nèi)存使用量

減少使用 numpy 的一行代碼的內(nèi)存使用量

ibeautiful 2021-06-13 18:45:11
我正在使用python圖書館:https://github.com/ficusss/PyGMNormalize用于規(guī)范化我的數(shù)據(jù)集 ( scRNAseq) 和庫文件中的最后一行utils.py:https://github.com/ficusss/PyGMNormalize/blob/master/pygmnormalize/utils.py使用太多內(nèi)存:np.percentile(matrix[np.any(matrix > 0, axis=1)], p, axis=0)有沒有什么好辦法重寫這行代碼來提高內(nèi)存使用率?我的意思是我200Gb RAM可以在集群上訪問,并且matrix像20Gb這條線這樣的東西無法正常工作,但我相信應該有辦法讓它工作。
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻1725條經(jīng)驗 獲得超8個贊

如果的所有元素matrix都 >=0,那么您可以執(zhí)行以下操作:


np.percentile(matrix[np.any(matrix, axis = 1)], p, axis = 0)

這使用了這樣一個事實,即任何浮點數(shù)或整數(shù)都0被解釋為True當被視為布爾值時(np.any在內(nèi)部執(zhí)行)。使您無需單獨構(gòu)建那個大的布爾矩陣。


由于您在 中進行布爾索引matrix[...],因此您正在創(chuàng)建一個臨時副本,您并不真正關(guān)心它是否在此percentile過程中被覆蓋。因此,您可以使用它overwrite_input = True來節(jié)省更多內(nèi)存。


mat = matrix.copy()

perc = np.percentile(matrix[np.any(matrix, axis = 1)], p, axis = 0, overwrite_input = True)

np.array_equals(mat, matrix) # is `matrix` still the same?


True

最后,這取決于你的其他archetecture,我建議你尋找到做matrix的一些味道scipy.sparse,(雖然有一些缺點,這取決于你所使用的類型),這應該siginficantly再次減少內(nèi)存的使用情況。


查看完整回答
反對 回復 2021-06-15
?
搖曳的薔薇

TA貢獻1793條經(jīng)驗 獲得超6個贊

我將其作為答案,因為評論中包含的內(nèi)容太多了,盡管它可能不完整。有兩個可疑的事情 - 如果您的機器有 200Gb 的可用內(nèi)存,那么第一個百分位數(shù)應該在 20Gb 矩陣上運行良好。那是很多內(nèi)存,所以開始研究還有什么可能會使用它。從top- 是否有其他進程或您的 python 程序使用所有這些?


第二個可疑的事情是文檔utils.percentile與它的實際行為不匹配。這是您鏈接到的代碼中的相關(guān)位:


def percentile(matrix, p):

    """

    Estimation of percentile without zeros.

    ....

    Returns

    -------

    float

        Calculated percentile.

    """

    return np.percentile(matrix[np.any(matrix > 0, axis=1)], p, axis=0)

它實際做的是返回為不全為零的行計算的(按列)百分位數(shù)。編輯那是包含至少一個正元素的行。如果值是非負的,那是一樣的,但總的來說,這將是一個非常不同的結(jié)果。


np.any(matrix > 0, axis=1)返回一個布爾數(shù)組來索引不全為零的行。例如


>>> np.any(array([[3, 4], [0, 0]]) > 0, axis=1)

    array([ True, False])


>>> np.any(array([[3, 4], [1, 0]]) > 0, axis=1)

    array([ True,  True])


>>> np.any(array([[3, 0], [1, 0]]) > 0, axis=1)

    array([ True,  True])

該數(shù)組用于 index matrix,它僅選擇不全為零的行并返回那些行。如果您不熟悉這種索引方式,您應該閱讀用于索引的 numpy 文檔。


計算需要大量內(nèi)存 -matrix > 0創(chuàng)建一個與矩陣維度相同的布爾數(shù)組,然后索引創(chuàng)建一個matrix可能包含大部分行的副本。

因此,布爾數(shù)組可能為 2-4Gb,副本可能接近 20Gb。


可以減少,


## Find rows with all zeros, one row at a time to reduce memory

mask = [np.any(r > 0) for r in matrix]  

 ## Find percentile for each column, excluding rows with all zeros

perc = [np.percentile(c[mask], p) for c in matrix.T] 

但是,如前所述,這與功能文檔不匹配。


這種邏輯可能是有原因的,但很奇怪。如果您不知道原因,您可能可以np.percentile直接調(diào)用- 只需檢查它是否為較小的數(shù)據(jù)子集返回了一個接近值。還有nanpercentile, 可以以相同的方式使用,但忽略nan值。

您可以使用布爾索引來替換您不想包含在nan(ie matrix[matrix < 0] = np.nan) 中的值,然后調(diào)用它。


查看完整回答
反對 回復 2021-06-15
  • 2 回答
  • 0 關(guān)注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號