我正试图从区间[-Kmin^N,Kmin]和[Kmax,Kmax^N]上的均匀分布中生成500个数字。
以下是我使用的代码:
Kmin=min(K1[0],K1[1],K1[2],K1[3],K1[4])
Kmax=max(K1[0],K1[1],K1[2],K1[3],K1[4])
K3=np.zeros(500)
K4=np.zeros(500)
d=0
#the new weights
W_tilde=np.zeros(5)
while d<5:
c=0
total=0
while c<500:
#generating uniform random numbers from the sets [-Kmin^N,Kmin] and [Kmax,Kmax^N]
K3[c]=Kmax+(Kmax**N-Kmax)*random.uniform(0,1)
K4[c]=(-Kmin**N)+(Kmin+Kmin**N)*random.uniform(0,1)
total=total+(K3[c]+K4[c])*W2[d]
c=c+1
W_tilde[d]=total/N
d=d+1
然而,我在输出中得到了以下错误。
<ipython-input-4-257ed5a3bfee>:70: RuntimeWarning: overflow encountered in double_scalars
K3[c]=Kmax +((Kmax**N) -Kmax)*random.uniform(0,1)
<ipython-input-4-257ed5a3bfee>:71: RuntimeWarning: overflow encountered in double_scalars
K4[c]=-(Kmin**N) +(Kmin+(Kmin**N))*random.uniform(0,1)
<ipython-input-4-257ed5a3bfee>:71: RuntimeWarning: invalid value encountered in double_scalars
K4[c]=-(Kmin**N) +(Kmin+(Kmin**N))*random.uniform(0,1)
有人能告诉我哪里出了问题吗?
681^1000等于1.4031752403968567759489378274383e+2833(使用windows计算器(,这太大了,numpy无法将这个数字存储在单个变量中。
所以我认为只有两种解决方案是将其分解为多个变量或使用较小的数字。
还有一些优化你的代码:
- 您可以将数字作为函数内的参数传递,而不是对
random.uniform
的结果进行乘法和加法运算。- 来自numpy文档:
random.uniform(low=0.0, high=1.0, size=None)
- 来自numpy文档:
- 使用numpy矢量化操作,它比在列表上循环要快得多
- 您可以使用for代替while使代码更加紧凑
经过一些重写后的代码(使用上面注释中的较小值(
W_tilde=np.zeros(5)
for d in range(5):
K3 = random.uniform(Kmax,12*Kmax, 500)
K4 = random.uniform(-12*Kmin,Kmin, 500)
total = np.sum((K3+K4)*W2[d]) # vectorized operations
W_tilde[d]=total/N