做到这一点
如果我有 2 个 numpy 数组:
a = [1, 2, 3, 4, 5, 6]
b = [a, b, c, d, e, f]
如何使用 numpy 获取以下 2D 元组数组?
ab = [[(1,a), (2,a), (3,a), (4,a), (5,a), (6,a)],
[(1,b), (2,b), (3,b), (4,b), (5,b), (6,b)],
.
.
[(1,f), (2,f), (3,f), (4,f), (5,f), (6,f)]]
首先:与其创建一个 2 元组的 NxN 数组,不如创建一个 NxNx2 数组。
如果这样做,则可以使用广播分配来实现所需的阵列:
x = np.arange(6) # [0, 1, 2, 3, 4, 5]
y = np.arange(6, 12) # [a, b, c, d, e, f]
out = np.zeros((len(x), len(y), 2))
out[..., 0] = x # values are repeated for each row
out[..., 1] = y[:, None] # values are repeated for each column
Python 提供了很多方法来做到这一点。您可以执行以下操作:
[[a0, b0] for a0 in a for b0 in b]
笛卡尔乘积会给你所有的组合。然后,您可以按第二个键(字母(对该列表进行排序,然后使用列表推导式重新嵌套它
import numpy as np
import itertools
a = np.array([1, 2, 3, 4, 5, 6])
b = np.array(['a', 'b', 'c', 'd', 'e', 'f'])
out = list(itertools.product(a,b))
out.sort(key=lambda x: x[1])
nested = [out[x:x+len(a)] for x in range(0, len(out), len(a))]
这将给出以下嵌套列表:
[[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a'), (6, 'a')],
[(1, 'b'), (2, 'b'), (3, 'b'), (4, 'b'), (5, 'b'), (6, 'b')],
[(1, 'c'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'c'), (6, 'c')],
[(1, 'd'), (2, 'd'), (3, 'd'), (4, 'd'), (5, 'd'), (6, 'd')],
[(1, 'e'), (2, 'e'), (3, 'e'), (4, 'e'), (5, 'e'), (6, 'e')],
[(1, 'f'), (2, 'f'), (3, 'f'), (4, 'f'), (5, 'f'), (6, 'f')]]
如果您宁愿将其存储为 numpy 数组而不是创建嵌套列表,则很可能希望它为 6x6x2 而不是 2D 数组。你可以用np.array(out).reshape(6,6,2)