【发布时间】:2017-03-22 14:29:38
【问题描述】:
这和Numpy: cartesian product of x and y array points into single array of 2D points有点关系
我正在寻找一种简洁的方法来创建具有任意维度的两个数组的笛卡尔积。
例子:
类似的相关线程,我想要
x = numpy.array([1,2,3]) #ndim 1
y = numpy.array([4,5]) #ndim 1
cartesian_product(x,y) == numpy.array([[[1, 4],
[2, 4],
[3, 4]],
[[1, 5],
[2, 5],
[3, 5]]]) #ndim "2" = ndim x + ndim y
结果数组是二维的,因为 [1, 4], [2, 4] 等是坐标,因此不是真实的维度。概括地说,将 x/y 写成 [[1], [2], [3]] 可能会更好。
上面等于
numpy.dstack(numpy.meshgrid(x,y))
但我也想要
x2 = numpy.array([[1,1], [2,2], [3,3]]) #ndim "1", since [1, 1] is a coordinate
cartesian_product(x2,y) == numpy.array([[[1, 1, 4],
[2, 2, 4],
[3, 3, 4]],
[[1, 1, 5],
[2, 2, 5],
[3, 3, 5]]]) #ndim 2 = ndim x2 + ndim y
y2 = numpy.array([[10, 11], [20, 21]]) #ndim 1
(cartesian_product(x2, y2) ==
numpy.array([[[1, 1, 10, 11],
[2, 2, 10, 11],
[3, 3, 10, 11]],
[[1, 1, 20, 21],
[2, 2, 20, 21],
[3, 3, 20, 21]]])) #ndim x2 + ndim y2
x3 = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) #ndim 2
(cartesian_product(x3, y) ==
numpy.array([[[[1, 2, 4], [3, 4, 4]], [[5, 6, 4], [7, 8, 4]]],
[[[1, 2, 5], [3, 4, 5]], [[5, 6, 5], [7, 8, 5]]]]) #ndim 3
可视化我正在尝试做的事情: 正如我所说, [[0, 0], [0, 1], [1, 1], [1, 0]] 应该被解释为一维坐标列表,对应于一条线。如果我然后用 [1, 2, 3, 4] 做一个笛卡尔积,我会在 z 方向上挤压这条线,变成一个表面(即二维)。但现在数组当然是 3 维的了。
我想我可以用循环来解决这个问题,但是有什么方法可以使用 numpy/scipy 工具来解决这个问题?
【问题讨论】:
-
我不明白你所说的“坐标”是什么意思。第一个示例中的结果数组是三维的。如果您将其输入 numpy,它将具有 ndim 3。同样,您的所有示例 x2、y2、x3 的维度都比您想象的要多。
-
当然 [[1, 1], [2, 2]] 是二维数组。但是在我正在寻找的笛卡尔积函数中,它本质上是一维的,因为它只是一个坐标列表,[coord1,coord2]。 [[coord11, coord12], [coord21, coord22]] 将是“2”维的,即使它的数组是 2+1 维的。如果我试图说明我的问题可能会更容易,假设我在 xy 中定义了曲线,它将是一个坐标列表,但一条线本质上是一维的。我想要做的是将它挤压到另一个维度。
标签: python numpy multidimensional-array cartesian-product n-dimensional