根据特定的布尔条件在Numpy数组中选择一些元素

时间:2018-07-19 09:33:13

标签: python numpy statistics

我有两个这样的列表

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中的元素第一次大于sample_series ,请返回cum_array中的前一个元素并中断循环

  3. 再次执行相同的操作

例如,540中的cum_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

3 个答案:

答案 0 :(得分:2)

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])

答案 1 :(得分:1)

问题是您无条件break进入内部for循环。另一个问题是,当您的条件为true并且j为零时,您可能会超出cum_array的范围。

请尝试以下更正的代码:

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

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

编辑:我忘了打破循环

答案 2 :(得分:1)

    <form method="post" action="foo" enctype="multipart/form-data" id="document-form">
        <div class="modal-body">
                <input id="files" type="file" name="files" required/>
                <input name="description" required/>
        <div class="modal-footer">
            <button type="submit" class="k-button">Dodaj</button>
        </div>
    </form>

$('#files').kendoUpload(
  {
    multiple: false,
    validation: {
      minFileSize: 1
    }
  }
)