更智能的方法来构建所有可能数字的列表

时间:2017-06-20 08:56:28

标签: python list numpy

我必须按照给定的步长建立一个3x2值组合的列表,其中所有可能的值介于0.0和1.0之间(现在它是1/3)。

输出应为[ [[v1, v2], [v3, v4], [v5, v6]], ... ],其中每个v都是介于0.0和1.0之间的值,例如:

[ [[0.0, 0.0], [0.0, 0.0], [0.0, 0.0]],
[[0.0, 0.0], [0.0, 0.0], [0.0, 0.33]],
[[0.0, 0.0], [0.0, 0.0], [0.0, 0.66]],
[[0.0, 0.0], [0.0, 0.0], [0.0, 1.0]],
[[0.0, 0.0], [0.0, 0.0], [0.33, 0.0]],
[[0.0, 0.0], [0.0, 0.0], [0.33, 0.33]],
...,
[[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]] ]

到目前为止,我有:

step = 1.0/3.0
lexica = []
for num1 in numpy.arange(0.0, 1.0, step):
    for num2 in numpy.arange(0.0, 1.0, step):
        for num3 in numpy.arange(0.0, 1.0, step):
            for num4 in numpy.arange(0.0, 1.0, step):
                for num5 in numpy.arange(0.0, 1.0, step):
                    for num6 in numpy.arange(0.0, 1.0, step):
                        lexica.append([[num1, num2],[num3, num4],[num5, num6]])

对于最高值,这不会得到1.0,并且知道Python必须有更好的方式来编写它。

3 个答案:

答案 0 :(得分:3)

您可以使用numpy.mgrid并操纵它来为您提供所需的输出

np.mgrid[0:1:step, 0:1:step, 0:1:step, 0:1:step, 0:1:step, 0:1:step].T.reshape(-1, 3, 2)

修改

用于修复端点的更具可扩展性的方法:

def myMesh(nSteps, shape = (3, 2)):
    c = np.prod(shape)
    x = np.linspace(0, 1, nSteps + 1)
    return np.array(np.meshgrid(*(x,)*c)).T.reshape((-1, ) + shape)

myMesh(3)

array([[[ 0.        ,  0.        ],
        [ 0.        ,  0.        ],
        [ 0.        ,  0.        ]],

       [[ 0.        ,  0.33333333],
        [ 0.        ,  0.        ],
        [ 0.        ,  0.        ]],

       [[ 0.        ,  0.66666667],
        [ 0.        ,  0.        ],
        [ 0.        ,  0.        ]],

       ..., 
       [[ 1.        ,  0.33333333],
        [ 1.        ,  1.        ],
        [ 1.        ,  1.        ]],

       [[ 1.        ,  0.66666667],
        [ 1.        ,  1.        ],
        [ 1.        ,  1.        ]],

       [[ 1.        ,  1.        ],
        [ 1.        ,  1.        ],
        [ 1.        ,  1.        ]]])

答案 1 :(得分:2)

这是你可以做的没有numpy:

from itertools import product

ret = []
for a, b, c, d, e, f in product(range(4), repeat=6):
    ret.append([[a/3, b/3], [c/3, d/3], [e/3, f/3]])

或甚至作为列表理解:

ret = [[[a/3, b/3], [c/3, d/3], [e/3, f/3]] 
       for a, b, c, d, e, f in product(range(4), repeat=6)]

答案 2 :(得分:0)

您可以使用itertools.combinations_with_replacement来完成该任务:

>>> from itertools import combinations_with_replacement as cwr
>>> cwr(cwr(numpy.linspace(0, 1, 4), 2), 3)

cwr(numpy.linspace(0, 1, 4), 2)numpy.linspace(0, 1, 4)的元素(0, 1/3, 2/3, 1)创建长度为2的所有可能组合。外部调用cwr(..., 3)然后从前面的2元组创建所有可能长度为3的元组,从而生成3x2元素。