簡體   English   中英

使用 numpy 優化數組計算

[英]Optimizing an array calculation with numpy

我有以下算法,我試圖在 Python 中對其進行優化:

我事先定義了三個邏輯矩陣(X、Y 和 Z)。 每個都有 N 列。 我還定義了兩個非常大的數字 N 和 A,以及一個我稱之為 tot_list 的任意數字數組,其長度為 A。我想通過 X、Y 和 Z,找到每個元素為 1 的位置,然后更改它列表 A_list 中的對應值到隨機浮點數。 當這個操作完成后,我用 A_list 更新 tot_list。 下面是實際代碼:

for i in range(0,N):
    A_list = np.ones([1,A])
    
    A_list[0][np.where(X[:,i]==1)[0]] = np.random.random()
    A_list[0][np.where(Y[:,i]==1)[0]] = np.random.random()
    A_list[0][np.where(Z[:,i]==1)[0]] = np.random.random()
    
    tot_list = tot_list+A_list

上面給出的代碼完全符合我的要求,但運行速度非常慢。 我必須處理巨大的數字(即,A 的數量級為 10^6,N 的數量級為 10^2),並且我必須盡可能地優化上述內容。 我試圖研究擺脫 for 循環,但我不確定如何實現這一點。 歡迎大家提出意見。

好的,沒有示例輸入和輸出,很難知道問題所在,但讓我嘗試回答,如果不正確,我可以進行編輯。

正如我所看到的,您正在遍歷XYZ每一行並找到每個為 1 的元素。您可以通過執行例如X == 1一次對單個數組的每個元素執行此操作。

然后找到 X、Y、Z 等於 1 的位置並將其設置為隨機數,否則將其設置為 1(根據您對A_list的定義)。 所以我們可以找到所有等於 1 的數組元素的OR ,例如

equal_one = (X == 1) | (Y == 1) | (Z == 1)

然后我們可以使用np.where的三參數版本將等於 1 的值設置為隨機數,將不等於 1 的值設置為 1。

out = np.where(equal_one, np.random.random(), 1)

最后,我們沿一個軸對數組的每一行求和。 我認為從你的例子這相當於

tot_list = out.sum(axis=1)

把這一切放在一起

tot_list = np.where(
    (X == 1) | (Y == 1) | (Z == 1),
    np.random.random(),
    1
).sum(axis=1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM