我正在尝试创建一个网格,列出所有三元组总和为1,离散化为0.01。这是我尝试过的,没有太多运气。
import numpy as np
w1 = np.arange(0.0, 1.0, 0.01)
w2 = np.arange(0.0, 1.0, 0.01)
w3 = np.arange(0.0, 1.0, 0.01)
x, y,z = np.meshgrid(w1, w2, w3)
a = np.meshgrid[0:1:100j, 0:1:100j, 0:1:100j]
grid = []
for i in range(100):
grid.append([]) # Question: now that I have a list of lists, how to fill this with values?
for entry in grid:
entry = ???
答案 0 :(得分:2)
如何获取x
和y
的所有可能值,然后计算z
的适当值:
import itertools
import numpy as np
grid = np.array([(x, y, 1.0 - x - y) for (x, y) in
itertools.product(np.arange(0, 1.01, 0.01), repeat=2)
if x + y <= 1.])
这会使用itertools.product
来获取x
和y
的笛卡尔积,但np.meshgrid
也可以正常工作。
我们可以证明得到的三元组总和为1(以某些舍入误差为模):
>>> set(grid.sum(axis=1))
{0.99999999999999989, 1.0}
这是同一方法的纯numpy
版本;我正在使用np.mgrid
而不是meshgrid
因为它返回了一个数组而不是两个数组的元组:
xy = np.mgrid[0:1.01:0.01, 0:1.01:0.01]
z = 1. - xy.sum(axis=0)
grid2 = np.concatenate([xy[:, z >= 0.],
np.atleast_2d(z[z >= 0.])])
以下是相同的完整性检查(grid2
相对于grid
转置;也就是说,它们的形状分别为(3, 5151)
和(5151, 3)
:
>>> set(grid2.sum(axis=0))
{1.0}
答案 1 :(得分:0)
您不需要迭代100 ** 3次。这是一个没有任何if
的简单Python解决方案:
[(x, y, 100 - x - y) for x in range(101) for y in range(101 - x)]
输出:
[(0, 0, 100), (0, 1, 99), (0, 2, 98), (0, 3, 97), (0, 4, 96), (0, 5, 95), (0, 6, 94), (0, 7, 93), (0, 8, 92), (0, 9, 91), ..., (95, 1, 4), (95, 2, 3), (95, 3, 2), (95, 4, 1), (95, 5, 0), (96, 0, 4), (96, 1, 3), (96, 2, 2), (96, 3, 1), (96, 4, 0), (97, 0, 3), (97, 1, 2), (97, 2, 1), (97, 3, 0), (98, 0, 2), (98, 1, 1), (98, 2, 0), (99, 0, 1), (99, 1, 0), (100, 0, 0)]
您只需要除以100.0
并将三元组放入np.array
。