将二维数组的每个元素映射到 python 中相应的 (x,y) 坐标

Mapping every element of a 2D array to its corresponding (x,y) coordinate in python

我有两个一维数组,它们给出了 x 和 y 值的范围——例如:

x = np.array([0,1,2])
y = np.array([8,9])

我还有一个相应的二维数组,它给出了与每个可能的 (x,y) 组合关联的 z 值——例如:

z = np.array([['A','B'],
              ['C','D'],
              ['E','F']])

注意在这个例子中 z 是一个 3x2 数组,每一行对应给定的 x 值,每一列对应给定的 y 值(顺序对于这个映射很重要)。

我想要的是将这 3 个数组组合成一维坐标值对列表——例如:

result = [(0,8,'A'),
          (0,9,'B'),
          (1,8,'C'),
          (1,9,'D'),
          (2,8,'E'),
          (2,9,'F')]

肯定有一种使用 for 循环的蛮力方法,但是是否有一种使用预先存在的 numpy 或 python 例程的 easier/faster 方法?我猜它可能涉及 np.meshgrid()、zip() 或 itertools,但我想不出来。任何帮助将不胜感激!

尝试将 itertools.productzip 和列表理解结合使用。您还需要使用 numpy

拆开您的二维列表
from itertools import product
import numpy as np

x = np.array([0,1,2])
y = np.array([8,9])
z = np.array([['A','B'],
              ['C','D'],
              ['E','F']])

result = [(x,y,z) for (x,y),z in zip(product(x, y), np.hstack(z))]
# [(0, 8, 'A'), (0, 9, 'B'), (1, 8, 'C'), (1, 9, 'D'), (2, 8, 'E'), (2, 9, 'F')]

您可以使用 itertools.productzip 扁平化的产品 z:

from itertools import product
out = [tuple(list(i)+[j]) for i,j in zip(product(x,y),z.flatten())]

输出:

[(0, 8, 'A'), (0, 9, 'B'), (1, 8, 'C'), (1, 9, 'D'), (2, 8, 'E'), (2, 9, 'F')]

你也可以用np.meshgrid,比itertools.product快:

combs = np.stack(np.meshgrid(x, y), axis=-1).reshape(-1, 2)
print(combs)
[[0 8]
 [1 8]
 [2 8]
 [0 9]
 [1 9]
 [2 9]]

将不同类型的数据保存在同一个数组中不是一个好主意。因此,如果您确实需要它,请以迭代成本将其替换为动态类型:

[(*c, id) for c, id in zip(combs, z.ravel())]
>>> [(0, 8, 'A'), (1, 8, 'B'), (2, 8, 'C'), (0, 9, 'D'), (1, 9, 'E'), (2, 9, 'F')]