将二维数组的每个元素映射到 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.product
与 zip
和列表理解结合使用。您还需要使用 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.product
和 zip
扁平化的产品 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')]
我有两个一维数组,它们给出了 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.product
与 zip
和列表理解结合使用。您还需要使用 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.product
和 zip
扁平化的产品 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')]