python - 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]]
解决方案
要获得“对角线”,您可以采用向量索引的乘积而不是向量本身。这样您就可以访问每个组合的值以及该组合的先前值。
例子:
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]]
推荐阅读
- multidimensional-array - 读取二维表时出错
- javascript - 无法使用 JavaScript 中的 for 循环将堆栈的所有元素推入另一个堆栈
- typescript - React Hotkeys 键盘映射在打字稿中给出类型错误
- r - geom_line() 参数方向不起作用
- android - Android WebView 抱怨证书不受信任,但它在所有其他浏览器中都受信任
- sql-server - 批处理文件不记录 SQL 错误
- sql-server - 哪个 SQL Profiler Trace 模板显示表类型参数值
- javascript - D3.js - 数组的第一个值丢失
- python - 如何将python版本从google colab的默认3.5更改为3.8
- git - 解决冲突 Git LFS