簡體   English   中英

有沒有更有效的方法在 python 中使用兩個 for 循環?

[英]Is there a more efficient way to use two for loops in python?

我聽說在彼此中使用兩個 for 循環需要很長時間。 但是,我不確定如何解決這個問題。 我的每個 for 循環都是 ~40,000 循環,所以時間很長。 我基本上是在嘗試比較兩個 DataFrame 的條目。 如果某行中的三個條目(幀、x 和 y)在兩者之間匹配,那么我想將其保存到新的數據數組中。 我的最終結果是有一個 dataframe 具有框架、x、y、粒子 # 和兩個不同的強度)。 我相信我正在做的事情會奏效,但需要 5 個多小時才能得到結果。 無論如何我可以讓這段代碼更快更高效嗎? 非常感謝,我的代碼貼在下面。

intensity = np.zeros((tracks.shape[0], 2))
location = np.zeros((tracks.shape[0], 2))
frame = np.zeros((tracks.shape[0], 1))
particle = np.zeros((tracks.shape[0], 1))

for r in range(red_masked_tracks.shape[0]):
    for g in range(green_masked_tracks.shape[0]):
        if red_masked_tracks['frame'][r] == green_masked_tracks['frame'][g]:
            if round(red_masked_tracks['x'][r]) == round(green_masked_tracks['x'][g]) and round(red_masked_tracks['y'][r]) == round(green_masked_tracks['y'][g]):
                intensity[g] = [red_masked_tracks['mass'][r], green_masked_tracks['mass'][g]]
                location[g] = [red_masked_tracks['x'][r], red_masked_tracks['y'][r]]
                frame[g] = red_masked_tracks['frame'][r]
                particle[g] = red_masked_tracks['particle'][r]
                break

使用內部合並過濾xyframe匹配的行。

# example data
red = pd.DataFrame({"x": [1.2, 3.3, 5.4, 1], "y": [1.1, 10.7, 9.3, 1.1], "frame": ["a", "b", "c", "a"], "mass": [10, 20, 30, 40]})
green = pd.DataFrame({"x": [1.2, 2.3, 3.4, 1], "y": [1.1, 4.7, 6.3, 1.1], "frame": ["a", "b", "c", "a"], "mass": [50, 60, 70, 80]})

# Add rounded versions of x and y
for df in [red, green]:
    df["xr"] = df["x"].round()
    df["yr"] = df["y"].round()

matches = pd.merge(red, green, on=["xr", "yr", "frame"], suffixes=["_red", "_green"])

原則上,紅色的多個匹配項可以匹配綠色的特定行,反之亦然。 如果是這樣,您將不得不決定如何處理這些,例如只保留每個組中的第一個,使用matches = matches.groupby(["xr", "yr", "frame"]).agg("first") .

您可以直接使用生成的 dataframe,或將其轉換為 numpy arrays:

intensity = matches[["mass_red", "mass_green"]].to_numpy()
location = matches[["x_red", "y_red"]].to_numpy()
frame = matches["frame_red"].to_numpy()
particle = matches["particle_red"].to_numpy()

暫無
暫無

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

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