首页 > 解决方案 > 根据特定的布尔条件选择 Numpy 数组中的一些元素

问题描述

我有两个这样的列表

sampled_series = [ 488, 1223, 1958, 2693, 3428]
cum_array = [ 100,  190,  340,  540,  590,  940, 1340, 1410, 1640, 2040, 2940, 3396, 3630, 3675]

我想做以下操作。

  1. 取第一个元素sampled_series并将其与cum_array.

  2. 如果第一次cum_array大于sampled_series中的元素,则返回前一个元素并中断循环cum_array

  3. 再做同样的操作

例如540incum_array大于 的第一个元素sampled_array,即488在这种情况下打印值340,它是前一个元素

我写的代码是这样的:

for i in range(0, len(sampled_series)):
    for j in range(0, len(cum_array)):
        if sampled_series[i]<cum_array[j]:
            print(cum_array[j-1])
        break

当我运行代码时,没有错误,但我也看不到任何打印内容。代码运行顺畅,没有任何错误,也没有任何输出。

我期望看到的是这个

340
940
1640
2040
3396

PS:我试图通过这个程序完成与大小抽样成比例的概率。

这是什么

https://en.wikipedia.org/wiki/Sampling_%28statistics%29#Probability-proportional-to-size_sampling

标签: pythonnumpystatistics

解决方案


有一种快速的方法可以做到这一点numpysearchsorted我将您的列表转换为 numpy 数组,然后通过 searchsorted 查找应插入元素以保持顺序的索引:

ss = np.array([ 488, 1223, 1958, 2693, 3428])
ca = np.array([ 100,  190,  340,  540,  590,  940, 1340, 1410, 1640, 2040, 2940, 3396, 3630, 3675])
idx=np.searchsorted(ca,ss)

由于您想要以前的值,请减去一个:

result=ca[idx-1]
#array([ 340,  940, 1640, 2040, 3396])

推荐阅读