用numpy模拟1000种含三组分的混合气体

2024-04-18 11:04:46 发布

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

我想生成1000种气体混合物,其中有三种组分,有一个确定的范围。每种混合物的总和应为100。我不知道如何使用for循环来关联组件。你知道吗

import numpy as np

comp_list = []

c1 = np.arange(80,100, 0.001)

c2 = np.arange(0,14,0.001)

c3 = np.arange(0,4, 0.001)

for i in range(10000):
    comp_sum = c1[i] + c2[i] +c3[i]
    if comp_sum == 100:
        comp_list.append(c1[i], c2[i],c3[i])

print comp_list

Tags: importfornp组件listsumc2气体
2条回答

您可以通过使用列表理解来使用直接方法:

import numpy as np

c1=np.linspace(80,100,100)

carr=np.array([[c1[i],cc2,100-c1[i]-cc2] for i in range(len(c1)) for cc2 in np.arange(0,min(14,100-c1[i]),1)])

你可以用

c1=carr[:,0]
c2=carr[:,1]
c3=carr[:,2]

证明:

In [496]: carr.shape
Out[496]: (944, 3)

In [497]: carr.sum(1)

Out[497]: array([ 100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        ...

您必须稍微考虑一下参数的选择,以获得大约1000个样本,因为对于每个c1,您将有不同数量的c2。然而,这将产生一组大致一致的浓度,您可能只需要在c=100情况下小心(我没有)。你知道吗

正如@AndrasDeak在评论中所建议的,你可以简单地做一个c3 = 100 - c1 - c2来确保一些结果样本能够满足你的约束,然后从结果中提取多达1000个样本,一种方法是:

# I created more than 1000 samples so that I have enough to slice with
In [35]: c1 = np.random.uniform(80, 100, 10000)

In [36]: c2 = np.random.uniform(0, 14, 10000)

In [37]: c3 = 100 - c1 - c2

In [38]: c3
Out[38]: 
array([ 12.68861952,   4.34446942,  -9.74132792, ...,   3.65083356,
        -0.71305583,   9.78624485])

In [39]: masked = np.where((c3 >= 0) & (c3 <= 4))

# only take up to 1000 samples
In [40]: c1 = c1[masked][:1000]

In [41]: c2 = c2[masked][:1000]

In [42]: c3 = c3[masked][:1000]

# sum of the arrays show 100 in all
In [43]: c1 + c2 + c3
Out[43]: 
array([ 100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,
        100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,  100.,

这当然不是最有效的方法,但是对于简单的用例,它可以实现您想要的。你知道吗

相关问题 更多 >