由于cu上的点数随机选取

2024-10-03 09:17:36 发布

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

I have found this curve on a paper

由于应用程序“automeris,我已经获得了曲线上的一些点,但是,现在我有了几个点的坐标,如何用它们创建分布并在创建的分布中随机选取(如果可能的话,用Python)呢?你知道吗

干杯, 埃迪

数据

45.0, 0.263

47.3, 0.470

51.5, 1.34

53.0, 1.86

54.3, 2.35

55.1, 2.84

55.8, 3.39

56.1, 3.88

56.6, 4.36

57.4, 5.41

57.1, 4.89

57.9, 6.41

57.6, 5.90

58.4, 7.46

58.1, 6.97

58.6, 8.49

58.6, 7.98

59.1, 10.1

59.1, 9.52

59.1, 8.99

59.9, 11.6

59.6, 11.1

59.6, 10.6

60.1, 13.1

60.1, 12.6

60.1, 12.1

60.9, 14.7

60.6, 14.2

60.7, 13.7

61.4, 15.7

61.2, 15.2

61.7, 16.7

61.7, 16.2

62.4, 17.8

62.2, 17.2

62.9, 18.7

62.7, 18.3

63.7, 19.3

64.7, 19.8

67.3, 19.8

68.3, 19.3

69.4, 18.8

70.4, 18.3

71.5, 17.8

72.8, 17.3

74.0, 16.8

75.6, 16.4

77.2, 15.9

78.2, 15.4

79.7, 14.9

81.3, 14.4

82.9, 13.9

84.7, 13.4

86.0, 13.0

87.3, 12.5

89.1, 12.0

90.1, 11.5

91.7, 11.0

92.9, 10.5

94.2, 9.99

95.8, 9.52

96.8, 9.04

98.4, 8.54

99.9, 8.03 

101, 7.59 

103, 7.08 

105, 6.61 

107, 6.13 

109, 5.66 

111, 5.24 

112, 4.74 

117, 3.92 

122, 3.32 

124, 3.12 

128, 2.63 

130, 2.46 

135, 2.10

138, 1.94 

142, 1.73 

146, 1.52 

150, 1.34 

154, 1.18 

163, 0.910 

172, 0.712 

180, 0.592 

Tags: 数据应用程序onhavethis曲线papercurve
2条回答

我将用这些数据创建一个数据帧。并使用一个函数随机选取一行。 见下面的模型:

import pandas as pd 
import matplotlib.pyplot as plt
df = pd.DataFrame([
[45.0, 0.263],
[47.3, 0.470],
[51.5, 1.34],
[53.0, 1.86],
[54.3, 2.35],
[55.1, 2.84],
[55.8, 3.39],
[56.1, 3.88],
[56.6, 4.36],
[57.4, 5.41],
[57.1, 4.89],
[57.9, 6.41],
[57.6, 5.90],
[58.4, 7.46],
[58.1, 6.97],
[58.6, 8.49],
[58.6, 7.98],
[59.1, 10.1],
[59.1, 9.52],
[59.1, 8.99],
[59.9, 11.6],
[59.6, 11.1],
[59.6, 10.6],
[60.1, 13.1],
[60.1, 12.6],
[60.1, 12.1],
[60.9, 14.7],
[60.6, 14.2],
[60.7, 13.7],
[61.4, 15.7],
[61.2, 15.2],
[61.7, 16.7],
[61.7, 16.2],
[62.4, 17.8],
[62.2, 17.2],
[62.9, 18.7],
[62.7, 18.3],
[63.7, 19.3],
[64.7, 19.8],
[67.3, 19.8],
[68.3, 19.3],
[69.4, 18.8],
[70.4, 18.3],
[71.5, 17.8],
[72.8, 17.3],
[74.0, 16.8],
[75.6, 16.4],
[77.2, 15.9],
[78.2, 15.4],
[79.7, 14.9],
[81.3, 14.4],
[82.9, 13.9],
[84.7, 13.4],
[86.0, 13.0],
[87.3, 12.5],
[89.1, 12.0],
[90.1, 11.5],
[91.7, 11.0],
[92.9, 10.5],
[94.2, 9.99],
[95.8, 9.52],
[96.8, 9.04],
[98.4, 8.54],
[99.9, 8.03], 
[101, 7.59], 
[103, 7.08], 
[105, 6.61],
[107, 6.13], 
[109, 5.66], 
[111, 5.24], 
[112, 4.74],
[117, 3.92], 
[122, 3.32], 
[124, 3.12], 
[128, 2.63],
[130, 2.46], 
[135, 2.10],
[138, 1.94],
[142, 1.73],
[146, 1.52], 
[150, 1.34], 
[154, 1.18], 
[163, 0.910],
[172, 0.712],
[180, 0.592] 
], columns=["Col_A", "Col_B"])

plt.plot(df['Col_A'],df['Col_B']);

在图上绘制点,我们得到:

enter image description here

为了得到一个随机值,我创建了以下函数:

import random

def RandomSample(data, samplecount):
    return data.iloc[random.sample(data.index, samplecount)]

RandomSample(df,1)

结果如下:这是一个随机行。你知道吗

Col_A   Col_B
38  64.7    19.8

另一种获取样本的简单方法是使用df.sample(n=1),其中n是所需的样本数。你知道吗

下面的代码对所提供的样本之间的分布进行桶处理,然后根据所述分布随机选择一个桶。然后,它在样本到任意一侧之间进行线性插值,以确定要在它们之间选择的点。您可以将其视为积分的梯形近似值(表示累积概率分布)。你知道吗

from bisect import bisect_left
from random import uniform

def make_lookup(data):
    keys = sorted(data.keys())
    lookup = dict()
    total = 0
    for lkey, hkey in zip(keys, keys[1:]):
        lval, hval = data[lkey], data[hkey]
        total += (lval + hval) * (hkey - lkey) // 2
        lookup[total] = lkey
    return lookup

def draw_number(cprobs, lookup):
    rand = uniform(0, cprobs[-1])
    index = bisect_left(cprobs, rand) - 1
    lo, hi = cprobs[index], cprobs[index+1]
    lkey, hkey = lookup[lo], lookup[hi]
    return lkey + (rand - lo) * (hkey - lkey) / (hi - lo)

def main():
    data = {128.0: 2.63, 130.0: 2.46, 107.0: 6.13, 98.4: 8.54, 135.0: 2.1, 138.0: 1.94, 87.3: 12.5, 142.0: 1.73, 60.7: 13.7, 61.4: 15.7, 150.0: 1.34, 117.0: 3.92, 154.0: 1.18, 111.0: 5.24, 60.1: 12.1, 90.1: 11.5, 99.9: 8.03, 163.0: 0.91, 146.0: 1.52, 62.9: 18.7, 172.0: 0.712, 45.0: 0.263, 47.3: 0.47, 51.5: 1.34, 180.0: 0.592, 57.1: 4.89, 54.3: 2.35, 55.1: 2.84, 56.6: 4.36, 57.9: 6.41, 58.4: 7.46, 59.6: 10.6, 60.6: 14.2, 61.2: 15.2, 62.7: 18.3, 53.0: 1.86, 64.7: 19.8, 67.3: 19.8, 68.3: 19.3, 69.4: 18.8, 70.4: 18.3, 71.5: 17.8, 72.8: 17.3, 74.0: 16.8, 75.6: 16.4, 77.2: 15.9, 78.2: 15.4, 79.7: 14.9, 56.1: 3.88, 82.9: 13.9, 58.6: 7.98, 84.7: 13.4, 86.0: 13.0, 57.4: 5.41, 89.1: 12.0, 57.6: 5.9, 91.7: 11.0, 92.9: 10.5, 58.1: 6.97, 94.2: 9.99, 95.8: 9.52, 96.8: 9.04, 62.4: 17.8, 59.1: 8.99, 101.0: 7.59, 81.3: 14.4, 60.9: 14.7, 103.0: 7.08, 109.0: 5.66, 61.7: 16.2, 112.0: 4.74, 59.9: 11.6, 62.2: 17.2, 105.0: 6.61, 55.8: 3.39, 122.0: 3.32, 63.7: 19.3, 124.0: 3.12}

    lookup = make_lookup(data)
    cprobs = sorted(lookup.keys())

    num = draw_number(cprobs, lookup)
    print(num)

if __name__ == "__main__":
    main()

它也相当快-所以如果你需要大量的样品,它不应该提出任何问题。你知道吗

相关问题 更多 >