假设任意数量的任意长度的数组。我想从数组中的值构造所有组合的n维数组。甚至更好的是所有组合的列表。
但是,我也希望每个组合都使用前面的“对角线”元素,除非该元素不存在,在这种情况下,不存在的值设置为-inf。
前去。以下是简单的二维情况:
v1=[-2,2]
v2=[-3,3]
我将从中得到所有组合
[[-2,-3],
[-2,3],
[2,-3],
[2,3]]
或以2D数组/矩阵形式
-3 3
-2 -2,-3 -2,3
2 2,-3 2,3
现在,我还希望为每个元素添加一个包含先前“对角”元素的新列(在这种情况下,只有1个这种实际情况)。先前的“对角线”元素是指索引i-1,j-1,k-1,...,n-1处的元素。边际上,我们采用所有可能的先前值。
1 2
-2,-3 -inf,-inf
-2, 3 -inf,-3
2,-3 -2,-inf
2, 3 -2,-3
编辑:这是2D情况的代码,对于一般n情况来说用处不大。
import math
v1=[-3,-1,2,4]
v2=[-2,0,2]
tmp=[]
tmp2=[]
for i in range(0,len(v1)):
for j in range(0,len(v2)):
tmp.append([v1[i],v2[j]])
if i==0 and j==0:
tmp2.append([-math.inf,-math.inf])
elif i==0:
tmp2.append([-math.inf,v2[j-1]])
elif j==0:
tmp2.append([v1[i-1],-math.inf])
else:
tmp2.append([v1[i-1],v2[j-1]])
等等
tmp
[[-3, -2],
[-3, 0],
[-3, 2],
[-1, -2],
[-1, 0],
[-1, 2],
[2, -2],
[2, 0],
[2, 2],
[4, -2],
[4, 0],
[4, 2]]
和
tmp2
[[-inf, -inf],
[-inf, -2],
[-inf, 0],
[-3, -inf],
[-3, -2],
[-3, 0],
[-1, -inf],
[-1, -2],
[-1, 0],
[2, -inf],
[2, -2],
[2, 0]]
答案 0 :(得分:1)
要获取“对角线”,可以采用向量索引的乘积而不是向量本身。这样,您可以访问每个组合的值以及组合的先前值。
示例:
import itertools
v1=[-2,2]
v2=[-3,3]
vectors = [v1, v2]
combs = list(itertools.product(*[range(len(v)) for v in vectors]))
print(combs)
[(0,0),(0,1),(1,0),(1,1)]
print([[vectors[vi][ci] for vi, ci in enumerate(comb)] for comb in combs])
[[-2,-3],[-2,3],[2,-3],[2,3]]
print([[(vectors[vi][ci-1] if ci > 0 else np.inf) for vi, ci in enumerate(comb)] for comb in combs])
[[[inf,inf],[inf,-3],[-2,inf],[-2,-3]]