一维数组和二维数组的逐行笛卡尔积

3

我觉得我漏掉了一些显而易见的东西。我想要找到arr1(一个1维numpy数组)和arr2(一个2维numpy数组)的的笛卡尔积。因此,如果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]])

我一直在尝试使用transpose和reshape的代码,例如np.array(np.meshgrid(arr1,arr2)),但目前还没有成功。

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

3个回答

1
你可以使用hstack将列添加到arr2中,使用vstack获取最终数组。
np.vstack(np.apply_along_axis(lambda x: np.hstack([np.repeat(x[0], arr2.shape[0]).reshape(-1, 1), 
                                                   arr2]), 
                              1, 
                              arr1[:, None]))

1

这里有一个向量化的解决方案,适用于您的一般情况:

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

为什么*len(arr1)使用了非向量化的元组重复? - Reinderien

0

我认为这应该可以解决:

import numpy as np

arr0 = np.array([1, 4, 7, 3])
arr1 = np.reshape(arr0, (len(arr0),1))
arr2 = np.array([[0, 1],
                 [2, 3], 
                 [4, 5],
                 [4, 0],
                 [9, 9]])

r1,c1 = arr1.shape
r2,c2 = arr2.shape
arrOut = np.zeros((r1,r2,c1+c2), dtype=arr1.dtype)
arrOut[:,:,:c1] = arr1[:,None,:]
arrOut[:,:,c1:] = arr2
arrOut.reshape(-1,c1+c2)

输出结果为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接