对np.random使用循环还是将数组重塑为矩阵



一般来说,我是编程新手,但我非常努力地让一个项目根据我生成的彩票的结果发生的概率随机选择一些结果,我希望每次都使用循环来获得随机数。

这是我的代码:

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


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

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

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

最新更新