使用两个一维数组创建带有 numpy 的坐标元组



如果我有 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)

做到这一点

最新更新