簡體   English   中英

在列表上迭代時刪除值的最有效方法

[英]Most efficient way to remove values whilst iterating over a list

我有一個數據集,其中包含來自幾個不同主題的X,Y坐標。 因此,主題1至n分別具有獨立的XY。 我將所有X和Y坐標附加到稱為plot的列表的單獨列表中。 因此,每個主題的一個列表用於X,一個列表用於Y。

輸入示例(3個科目):

Subject 1_X Subject 1_Y Subject 2_X Subject 2_Y Subject 3_X Subject 3_Y
11          45          34          67          8           26
12          46          33          65          7           25

示例輸出:

plot[0] = [[11,34,8],[12,33,7]] #X's
plot[1] = [[45,67,26],[46,65,25]] #Y's

在此之前,當X值低於某個閾值(在這種情況下為10)時,我想同時刪除X和對應的Y。 輸出示例如下:(刪除了主題3)

plot[0] = [[11,34],[12,33]] #X's
plot[1] = [[45,67],[46,65]] #Y's

此過程在此處復制:

data = [random.sample(range(80), 40) for _ in range(75000)] #Similar size and format

plot = [[],[]]

n = 0
for row in data :
    if n == 0 :
        n+=1
        continue
    x_data = []
    y_data = []
    for (x,y) in [(0,1),(2,3), (4,5), (6,7), (8,9), (10,11), (12,13), (14,15), (16,17), (18,19), (20,21), (22,23), (24,25), (26,27), (28,29), (30,31), (32,33), (34,35), (36,37), (38,39)] : 
        xcoord = float(row[x])
        ycoord = float(row[y])
        if xcoord >= 10 :
            x_data.append(xcoord)
            y_data.append(ycoord)
            plot[0].append(x_data)
            plot[1].append(y_data)

這項工作可以完成,但是我使用這些列表來創建動畫散點圖。 這非常慢。

如果刪除刪除< 10的值並優化重復項的函數,則它的執行速度會更快。

n=0
for row in data :
    if n == 0 :
        n+=1
        continue 
plot[0].append(list(map(float, row[1:41][::2])))
plot[1].append(list(map(float, row[0:40][::2]))) 

有沒有更快,更有效的方法來更快速地迭代和刪除特定值?

我試圖分別從每個源中刪除值,然后在末尾追加,但這比我目前的效率低。

可以使用以下方式調用散點圖:

scatter = ax.scatter(plot[0][0], plot[1][0], c=['blue'])

動畫的調用如下:

def animate(i) :
    scatter.set_offsets.([[plot[0][0+i][0], plot[1][0+i][0]]])

在這種情況下,最好使用numpy ,因為如果我理解正確的話,您的代碼可以簡化為以下內容:

import numpy as np

data = np.random.randint(0, 80, size=(2, 75000))  # Get a 2x75000 array of values in range [0, 79]

valid = data[0] >= 10  # Mask based on X-value
xdata, ydata = data[:, valid]  # Cut the parts you want

暫無
暫無

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

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