Python 2D numpy阵列的所有可能组合

Python 2D numpy阵列的所有可能组合,python,numpy,numpy-ufunc,Python,Numpy,Numpy Ufunc,我有四个numpy阵列,下面给出了一个示例: a1=np.array([[-24.4925, 295.77 ], [-24.4925, 295.77 ], [-14.3925, 295.77 ], [-16.4125, 295.77 ], [-43.6825, 295.77 ], [-22.4725, 295.77 ]]) a2=np.array([[-

我有四个numpy阵列,下面给出了一个示例:

a1=np.array([[-24.4925, 295.77  ],
             [-24.4925, 295.77  ],
             [-14.3925, 295.77  ],
             [-16.4125, 295.77  ],
             [-43.6825, 295.77  ],
             [-22.4725, 295.77  ]])

a2=np.array([[-26.0075, 309.39  ],
             [-24.9975, 309.39  ],
             [-14.8975, 309.39  ],
             [-17.9275, 309.39  ],
             [-46.2075, 309.39  ],
             [-23.9875, 309.39  ]])

a3=np.array([[-25.5025, 310.265 ],
             [-25.5025, 310.265 ],
             [-15.4025, 310.265 ],
             [-17.4225, 310.265 ],
             [-45.7025, 310.265 ],
             [-24.4925, 310.265 ]])

a4=np.array([[-27.0175, 326.895 ],
             [-27.0175, 326.895 ],
             [-15.9075, 326.895 ],
             [-18.9375, 326.895 ],
             [-48.2275, 326.895 ],
             [-24.9975, 326.895 ]])
我想在数组之间进行所有可能的组合,同时进行连接,例如:

array[-24.4925, 295.77, -26.0075, 309.39, -25.5025, 310.265, -27.0175, 326.895]

[a1[0]、a2[0]、a3[0]、a4[0]]
[a1[0]、a2[0]、a3[0]、a4[1]
等等


除了在四个阵列上循环外,最快的方法是什么

嗯,没有比循环更快的方法了,但是有一种干净的方法,您不必编写循环:

将numpy导入为np
进口itertools
a1=np.数组([-24.4925295.77],
[-24.4925, 295.77  ],
[-14.3925, 295.77  ],
[-16.4125, 295.77  ],
[-43.6825, 295.77  ],
[-22.4725, 295.77  ]])
a2=np.数组([-26.0075309.39],
[-24.9975, 309.39  ],
[-14.8975, 309.39  ],
[-17.9275, 309.39  ],
[-46.2075, 309.39  ],
[-23.9875, 309.39  ]])
a3=np.数组([-25.5025310.265],
[-25.5025, 310.265 ],
[-15.4025, 310.265 ],
[-17.4225, 310.265 ],
[-45.7025, 310.265 ],
[-24.4925, 310.265 ]])
a4=np.数组([-27.0175326.895],
[-27.0175, 326.895 ],
[-15.9075, 326.895 ],
[-18.9375, 326.895 ],
[-48.2275, 326.895 ],
[-24.9975, 326.895 ]])
数组=[a1、a2、a3、a4]
对于itertools.product(*数组)中的片段:
组合=np。连接(件,轴=0)
打印(合并)

标准库
itertools
module()提供了各种工具,用于生成iterables的产品、组合、排列等。由于numpy数组恰好是可迭代的(在第一个索引上迭代),我们可以使用
itertools
从每个数组中获取切片,然后使用numpy将它们组合起来。

下面是一个
numpy
解决方案,它基于来自的笛卡尔积实现

在本例中,
inds
数组如下所示:

print(inds[:10])
# [[0 0 0 0]
#  [0 0 0 1]
#  [0 0 0 2]
#  [0 0 0 3]
#  [0 0 0 4]
#  [0 0 0 5]
#  [0 0 1 0]
#  [0 0 1 1]
#  [0 0 1 2]
#  [0 0 1 3]]
然后,我们可以使用
np。沿着_轴
选择每个组合的适当元素

arr = np.stack([a1, a2, a3, a4])

print(arr.shape) # (4, 6, 2)
n, m, k = arr.shape

# from https://stackoverflow.com/questions/11144513/cartesian-product-of-x-and-y-array-points-into-single-array-of-2d-points
def cartesian_product(*arrays):
    la = len(arrays)
    dtype = np.result_type(*arrays)
    arr = np.empty([len(a) for a in arrays] + [la], dtype=dtype)
    for i, a in enumerate(np.ix_(*arrays)):
        arr[...,i] = a
    return arr.reshape(-1, la)

inds = cartesian_product(*([np.arange(m)] * n))
res = np.take_along_axis(arr, inds.T[...,None], 1).swapaxes(0,1).reshape(-1, n*k)

print(res[0])
# [-24.4925 295.77   -26.0075 309.39   -25.5025 310.265  -27.0175 326.895 ]
print(inds[:10])
# [[0 0 0 0]
#  [0 0 0 1]
#  [0 0 0 2]
#  [0 0 0 3]
#  [0 0 0 4]
#  [0 0 0 5]
#  [0 0 1 0]
#  [0 0 1 1]
#  [0 0 1 2]
#  [0 0 1 3]]