首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用循环的情况下获得大于或小于NumPy数组中每个项的索引?

如何在不使用循环的情况下获得大于或小于NumPy数组中每个项的索引?
EN

Stack Overflow用户
提问于 2021-01-29 08:32:24
回答 1查看 75关注 0票数 0

我正在从头开始编写一个决策树算法,现在我正在尝试将数据分割成组,其中每个组包含的值大于或等于或小于NumPy数组中包含连续DataFrame列值的每个值,并获得这些拆分的目标的平均值。到目前为止我的代码是:

代码语言:javascript
复制
for i in range(len(columns)):
    col = columns[i]
    # cont - list of continous columns in my DataFrame
    if col in cont:
        values  = xs[col].values
        targets = y.values
        for j in range(len(values)):
            value = values[j]
            greater_idx = np.where(values >= value)[0]
            less_idx    = np.where(values <  value)[0]
            targets_greater = targets[greater_idx].sum()
            targets_less    = targets[less_idx]   .sum()
        print(targets_greater/(j+1))
        print(targets_less   /(j+1))

xs DataFrame的长度接近400 K,所以循环非常慢,每次都会杀死我的木星笔记本内核。我知道应该有一个方法完全摆脱这个循环,但我不知道如何做到这一点。

EN

Stack Overflow用户

回答已采纳

发布于 2021-01-29 09:31:58

与其采用矢量化的方法进行比较,不如在算法上有很大的改进空间:

使用(sorted_idxs).

  • Using获得xs[col].values的排序索引,xs[col].values.

  • target_less[0] (0)中的每个值是xs[col].values中最低元素的target_less-value,可以使用unsort_idx = np.argsort(sorted_idxs)target_less[unsort_idx].

现在,对于数组中的所有值都有了所有的target_less-values (当然,target_greater很容易通过targets.sum() - target_less获得)。

编辑:

下面是与建议相一致的代码:

代码语言:javascript
复制
import numpy as np
import pandas as pd

xs = pd.DataFrame(np.random.random(10000))
y = pd.Series(np.random.randint(0, 2, size=10000))

sorted_idxs = np.argsort(xs[0].values)
sorted_values = xs[0].values[sorted_idxs]
sorted_targets = y.values[sorted_idxs]
sorted_targets_less = np.insert(np.cumsum(sorted_targets), 0, 0)[:-1]

unsorted_idxs = np.argsort(sorted_idxs)
targets_less = sorted_targets_less[unsorted_idxs]

for i, target_less_value in enumerate(targets_less):
    assert target_less_value == y.values[np.where(xs.values < xs.values[i])[0]].sum()

一个警告词:上面假设在xs.values中有一组严格不同的值。如果有重复值,则需要调整进行累积和的部分。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65951110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档