创建三元组网格

时间:2017-10-18 08:02:42

标签: python numpy

我正在尝试创建一个网格,列出所有三元组总和为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 = ???

2 个答案:

答案 0 :(得分:2)

如何获取xy的所有可能值,然后计算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来获取xy的笛卡尔积,但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