Python 使用两个一维数组使用numpy创建坐标元组

Python 使用两个一维数组使用numpy创建坐标元组,python,arrays,numpy,Python,Arrays,Numpy,如果我有2个numpy阵列: a = [1, 2, 3, 4, 5, 6] b = [a, b, c, d, e, f] 如何使用numpy获得以下二维元组数组 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)]] P

如果我有2个numpy阵列:

a = [1, 2, 3, 4, 5, 6]
b = [a, b, c, d, e, f]
如何使用numpy获得以下二维元组数组

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)]]

Python提供了很多方法来实现这一点。您可以执行以下操作:

[[a0, b0] for a0 in a for b0 in b]

Python提供了很多方法来实现这一点。您可以执行以下操作:

[[a0, b0] for a0 in a for b0 in b]

首先:您应该创建一个NX2数组,而不是2元组的NxN数组

如果这样做,您可以使用广播分配来实现所需的阵列:

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

首先:您应该创建一个NX2数组,而不是2元组的NxN数组

如果这样做,您可以使用广播分配来实现所需的阵列:

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

笛卡尔积将给出所有的组合。然后,您可以按第二个键(字母)对列表进行排序,然后使用列表重新嵌套它

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)来实现这一点。重塑(6,6,2)

笛卡尔积将为您提供所有组合。然后,您可以按第二个键(字母)对列表进行排序,然后使用列表重新嵌套它

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).重塑(6,6,2)

itertools.product
itertools.product
如果我们假设
a,b,…
实际上是字符,那么这不起作用。然后你必须将它们放入一个
tuple
中,才能将其存储在
numpy
数组中。只需更改
dtype=object
以进一步澄清-这将用两个元素数组替换tuple。所以你可以说它是由2个元素数组组成的2D数组,而不是元组组成的2D数组。代码的其余部分是关于python数组切片的,如果我们假设
a,b,…
实际上是字符,那么这是行不通的。然后你必须将它们放入一个
tuple
中,才能将其存储在
numpy
数组中。只需更改
dtype=object
以进一步澄清-这将用两个元素数组替换tuple。所以你可以说它是由2个元素数组组成的2D数组,而不是元组组成的2D数组。剩下的代码是关于python数组切片的,这是