如何提高在循环中索引numpy数组的速度?

2024-04-27 00:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

h5id_unique = np.unique(df_[:,0])
cnt_nan = 0
cnt_pos = 0
cnt_neg = 0
cnt = 0
for h5id in h5id_unique:
    dfq_ = df_[df_[:,0]==h5id]
    if dfq_.shape[0] <=2 or dfq_[:,1].sum() != 1:
        cnt_nan += 1
        continue
    cnt += 1
    pos_score = dfq_[dfq_[:,1]==1, 2]
    neg_score = dfq_[dfq_[:,1]==0, 2]
    for i in neg_score:
        if i <= pos_score:
            cnt_pos += 1
        else:
            cnt_neg +=1
    if cnt % 500 == 0:
        print cnt_pos / float(cnt_neg), cnt_nan, cnt

我有一个名为df\的numpy数组,它有三列

h5id, label, pred

h5id是字符串格式的id,label是0/1 int,pred是浮点。这是我的密码。df有1100万行,而数组中有300万个不同的h5id。 我发现我的代码很慢。我怎样才能改进它?我认为索引操作花费了太多时间。它将索引300万次。 谢谢。你知道吗


Tags: inposdfforif数组nanlabel
1条回答
网友
1楼 · 发布于 2024-04-27 00:27:00

在不完全理解代码或其运行的数据的情况下给出一些建议。 您可以尝试根据第一列对df_进行排序,然后根据相同的键彼此相邻的事实进行更智能的索引。你知道吗

根据数据的不同,下面使用的代码建议了一种更简单的方法

if dfq_.shape[0] <=2 or dfq_[:,1].sum() != 1:
    cnt_nan += 1
    continue

这是过滤掉标识符出现两次或更少的任何行,以及列1和列2之和不等于1的任何行。如果大多数数据不满足这些条件,则根据这些条件过滤数据,然后处理其余的数据会快得多。下面的伪代码给出了一种粗略的过滤方法

vals, idx, count = unique(0.5+randint(2, size=10), return_counts=True, return_inverse=True)
cond1 = (count[idx] > 2)
cond2 = (abs(sum(df_[:, 1:], axis=1) - 1) < 1e-9)

newdf = df_[cond1 & cond2]

然后以与df_相同的方式处理newdf

相关问题 更多 >