【问题标题】:Use loop for np.random or reshape array to matrix?对 np.random 使用循环或将数组重塑为矩阵?
【发布时间】:2020-12-11 07:18:10
【问题描述】:

我一般是编程新手,但是我非常努力地让一个项目随机选择一些结果,具体取决于我生成的彩票发生该结果的概率,我想使用循环来获得随机每次的数字。

这是我的代码:

 import numpy as np
 p = np.arange(0.01, 1, 0.001, dtype = float) 

 alpha = 0.5
 alpha = float(alpha) 
 alpha = np.zeros((1, len(p))) + alpha 

 def w(alpha, p):
     return np.exp(-(-np.log(p))**alpha) 
 w = w(alpha, p)

 def P(w):
     return np.exp(np.log2(w))
 prob_win = P(w)

 prob_lose = 1 - prob_win

 E = 10
 E = float(E) 
 E = np.zeros((1, len(p))) + E
     
 b = 0
 b = float(b) 
 b = np.zeros((1, len(p))) + b

 def A(E, b, prob_win):
     return (E - b * (1 - prob_win)) / prob_win
 a = A(E, b, prob_win)   
 a = a.squeeze() 

 prob_array = (prob_win, prob_lose)
 prob_matrix = np.vstack(prob_array).T.squeeze() 

 outcomes_array = (a, b)
 outcomes_matrix = np.vstack(outcomes_array).T

 outcome_pairs = np.vsplit(outcomes_matrix, len(p))
 outcome_pairs = np.array(outcome_pairs).astype(np.float)

 prob_pairs = np.vsplit(prob_matrix, len(p))
 prob_pairs = np.array(prob_pairs)

 nominalized_prob_pairs = [outcome_pairs / np.sum(outcome_pairs) for 
 outcome_pairs in np.vsplit(prob_pairs, len(p)) ]

代码工作正常,但我想对下一行代码使用循环或类似的东西,因为我想为每一行/每对概率获得 5 个实现。当我使用size = 5 时,我只是得到一个很长的列表,但我不知道哪些值仍然属于size = 1 时的对

 realisations = np.concatenate([np.random.choice(outcome_pairs[i].ravel(), 
 size=1 , p=nominalized_prob_pairs[i].ravel()) for i in range(len(outcome_pairs))])

或者如果我使用size=5 如下所示,我如何将实现与初始概率相匹配?我是否需要在每第 5 个元素之后切割数组,然后将值存储在一个有 5 列的矩阵中,并且为初始数组的每个第 5 个元素存储一个新行?如果是,我该怎么做?

 realisations = np.concatenate([np.random.choice(outcome_pairs[i].ravel(), 
 size=1 , p=nominalized_prob_pairs[i].ravel()) for i in range(len(outcome_pairs))])


 

【问题讨论】:

    标签: python matrix random probability reshape


    【解决方案1】:

    你到底想生产什么?更简洁。

    这是一个干净的入门代码,您可以在其中生成线性数据。

    import numpy as np
    
    
    def generate_data(n_samples, variance):
        # generate 2D data
        X = np.random.random((n_samples, 1))
    
        # adding a vector of ones to ease calculus
        X = np.concatenate((np.ones((n_samples, 1)), X), axis=1)
    
        # generate two random coefficients
        W = np.random.random((2, 1))
    
        # construct targets with our data and weights
        y = X @ W
    
        # add some noise to our data
        y += np.random.normal(0, variance, (n_samples, 1))
    
        return X, y, W
    
    
    if __name__ == "__main__":
        X, Y, W = generate_data(10, 0.5)
    
        # check random value of x for example
        for x in X:
            print(x, end=' --> ')
            if x[1] <= 0.4:
                print('prob <= 0.4')
            else:
                print('prob > 0.4')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2016-11-08
      • 2011-01-16
      • 2020-10-25
      • 2014-09-22
      相关资源
      最近更新 更多