python - 一维数组和二维数组之间的逐行笛卡尔积

标签 python arrays numpy

我想我遗漏了一些明显的东西。我想找到 arr1(一维 numpy 数组)的笛卡尔积和 arr2(二维 numpy 数组)的 ROWS。因此,如果 arr1 有 4 个元素并且 arr2 的形状为 (5,2),则输出的形状应为 (20,3)。 (见下文)

import numpy as np

arr1 = np.array([1, 4, 7, 3])

arr2 = np.array([[0, 1],
                 [2, 3], 
                 [4, 5],
                 [4, 0],
                 [9, 9]])

期望的输出是:

arr3 = np.array([[1, 0, 1],
                 [1, 2, 3], 
                 [1, 4, 5],
                 [1, 4, 0],
                 [1, 9, 9],
              
                 [4, 0, 1],
                 [4, 2, 3], 
                 [4, 4, 5],
                 [4, 4, 0],
                 [4, 9, 9],
               
                 [7, 0, 1],
                 [7, 2, 3], 
                 [7, 4, 5],
                 [7, 4, 0],
                 [7, 9, 9],
              
                 [3, 0, 1],
                 [3, 2, 3], 
                 [3, 4, 5],
                 [3, 4, 0],
                 [3, 9, 9]])

我一直在尝试使用 np.array(np.meshgrid(arr1,arr2)) 之类的代码进行转置和 reshape ,但还没有成功。

我希望解决方案可以推广,因为我还需要处理这样的情况:获取二维 (10,2) 数组的行和二维数组 (20) 的行的所有组合, 5) 得到一个输出数组 (200,7)。

最佳答案

这是一个同样适用于您的一般情况的矢量化解决方案:

arr1 = np.array([[1, 4], 
                 [7, 3]])

arr2 = np.array([[0, 1],
                 [2, 3], 
                 [4, 5],
                 [4, 0],
                 [9, 9]])

np.hstack((np.repeat(arr1,len(arr2),0),np.stack((arr2,)*len(arr1)).reshape(-1,arr2.shape[1])))

形状(2,2)*(5,2)->(10,4)的输出:

[[1 4 0 1]
 [1 4 2 3]
 [1 4 4 5]
 [1 4 4 0]
 [1 4 9 9]
 [7 3 0 1]
 [7 3 2 3]
 [7 3 4 5]
 [7 3 4 0]
 [7 3 9 9]]

关于python - 一维数组和二维数组之间的逐行笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64001207/

相关文章:

Python创建列表字典

javascript - 访问对象中数组的值

python - 将不完整的嵌套列表放入矩形 ndarray

python - 更改 numpy 数组中字符串的位置

python - 如何在 Windows 上使用 cython 编译 __init__.py 文件

python - pip 将新的 Python 包安装到所有现有的 virtualenvs

Python装饰器函数调用深度,结构化输出

arrays - 过滤以从数组中排除元素

arrays - 在Matlab中从元胞数组中删除连续和不连续的列

python - Numpy 如何在矢量化中排除数组?