我必须按照给定的步长建立一个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必须有更好的方式来编写它。
答案 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元素。