首页 > 解决方案 > Python n 维数组组合

问题描述

假设任意数量的任意长度的数组。我想从数组中的值构造所有组合的 n 维数组。或者更好的是,所有组合的列表。

但是,我还想要每个组合中的前一个“对角线”元素,除非这样的元素不存在,在这种情况下,不存在的值被设置为 -inf。

举个例子。以下简单的二维案例:

v1=[-2,2]
v2=[-3,3]

从中我会得到所有的组合

[[-2,-3],  
 [-2,3],  
 [2,-3],  
 [2,3]]

或以二维数组/矩阵形式

      -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]]

标签: pythonpandasnumpyitertoolsn-dimensional

解决方案


看看itertools.product()

要获得“对角线”,您可以采用向量索引的乘积而不是向量本身。这样您就可以访问每个组合的值以及该组合的先前值。

例子:

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]]


推荐阅读