将随机生成的6个数字与cs的数据重复相乘

2024-03-28 11:32:21 发布

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

我想生成6个总是等于1000000次的随机数(权重),并将其与作为csv文件导入的数据列相乘。将总和存储在另一列(加权平均)中,并在新列(范围)中找到最大值和最小值之间的差值。我想重复这个过程1000000次,得到最小的范围和生成的随机数(权重)集。你知道吗

以下是我迄今为止所做的: 1.生成6个随机数 2.从csv导入数据 三。将数据随机数与csv文件中的数据相乘,得出平均值(加权平均值) 4将加权平均值保存在新的F(x)列中 5查找范围 6重复这个1000000次,得到给我最小范围的随机数。你知道吗

这是文件中的一些数据

     A    B      C    D      E    F    F(x)
 0  4.9  3.9    6.3  3.4    7.3  3.4    0.0
 1  4.1  3.7    7.7  2.8    5.5  3.9    0.0
 2  6.0  6.0    4.0  3.1    3.7  4.3    0.0
 3  5.6  6.3    6.6  4.6    8.3  4.6    0.0

目前所有F(x)的值都是0.0,这是不应该的。你知道吗

arr = np.array(np.random.dirichlet(np.ones(6), size=1))

arr=pd.DataFrame(arr)

ar=(arr.iloc[0])

df = pd.read_csv('weit.csv')

df['F(x)']=df.mul(ar).sum(1)
df

df['F(x)'].max() - df['F(x)'].min()

我所有的加权平均值都是0。我需要得到加权平均数

我不能循环代码运行1000000次,让我的最小范围。你知道吗


Tags: 文件csv数据df过程nprandomarray
1条回答
网友
1楼 · 发布于 2024-03-28 11:32:21

如果正确理解您的需求:

#data from file
print (df)
     A    B    C    D    E    F
0  4.9  3.9  6.3  3.4  7.3  3.4
1  4.1  3.7  7.7  2.8  5.5  3.9
2  6.0  6.0  4.0  3.1  3.7  4.3
3  5.6  6.3  6.6  4.6  8.3  4.6

np.random.seed(3434)

生成二维数组,其中6个“列”和N个“行”由this填充唯一的随机数:

N = 10
#in real data
#N = 1000000 
N = 10
arr = np.array(np.random.dirichlet(np.ones(6), size=N))
print (arr)
[[0.07077773 0.08042978 0.02589592 0.03457833 0.53804634 0.25027191]
 [0.22174594 0.22673581 0.26136526 0.04820957 0.00976747 0.23217594]
 [0.01202493 0.14247592 0.3411326  0.0239181  0.08448841 0.39596005]
 [0.09354759 0.54989312 0.08893737 0.22051801 0.03850101 0.00860291]
 [0.09418778 0.33345217 0.11721214 0.33480462 0.11894247 0.00140081]
 [0.04285476 0.04531546 0.38105815 0.04316535 0.46902838 0.0185779 ]
 [0.00441747 0.08044848 0.33383453 0.09476135 0.37568431 0.11085386]
 [0.14613552 0.11260451 0.10421495 0.27880266 0.28994218 0.06830019]
 [0.50747802 0.15704797 0.04410511 0.07552837 0.18744306 0.02839746]
 [0.00203448 0.13225783 0.43042505 0.33410145 0.08385366 0.01732753]]

然后将数据帧中的值转换为二维numpy数组:

b = df.values
#pandas 0.24+
#b = df.to_numpy()
print (b)
[[4.9 3.9 6.3 3.4 7.3 3.4]
 [4.1 3.7 7.7 2.8 5.5 3.9]
 [6.  6.  4.  3.1 3.7 4.3]
 [5.6 6.3 6.6 4.6 8.3 4.6]]

最后将两个数组合并为三维数组并按轴求和2,最后用于减去最大值和最小值^{}

c = np.ptp((arr * b[:, None]).sum(axis=2), axis=1)
print (c)

[2.19787892 2.08476765 1.2654273  1.45134533]

另一个带有^{}的解决方案:

c = np.ptp(np.einsum('ik,jk->jik', arr, b).sum(axis=2), axis=1)
print (c)
[2.19787892 2.08476765 1.2654273  1.45134533]

用于比较的循环解决方案,但速度慢,N大:

out = []
for row in df.values:
#    print (row)
    a = np.ptp((row * arr).sum(axis=1))
    out.append(a)
print (out)
[2.197878921892329, 2.0847676512823052, 1.2654272959079576, 1.4513453259898297]   

相关问题 更多 >