Python 一维数组和二维数组之间的行笛卡尔积
我想我遗漏了一些明显的东西。我想找到arr1(一维numpy数组)和arr2(二维numpy数组)的行的笛卡尔乘积。因此,如果arr1有4个元素,arr2有形状(5,2),那么输出应该有形状(20,3)。(见下文) 所需输出为:Python 一维数组和二维数组之间的行笛卡尔积,python,arrays,numpy,Python,Arrays,Numpy,我想我遗漏了一些明显的东西。我想找到arr1(一维numpy数组)和arr2(二维numpy数组)的行的笛卡尔乘积。因此,如果arr1有4个元素,arr2有形状(5,2),那么输出应该有形状(20,3)。(见下文) 所需输出为: arr3 = np.array([[1, 0, 1], [1, 2, 3], [1, 4, 5], [1, 4, 0], [1, 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]])
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))之类的代码进行转置和重塑,但还没有成功
我希望这个解决方案可以推广,因为我还需要处理这样的情况:获取2d(10,2)数组行和2d数组行(20,5)的所有组合,以获得输出数组(200,7)。我认为应该这样做:
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)
输出为:
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]])
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]])
您可以使用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]))
以下是一个矢量化解决方案,也适用于您的一般情况:
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)
:
干净利落
根据您显示所需输出的方式。其形状为(4,5,3)。如果是这种情况,则解决方案如下,如果不是,请在问题中编辑输出数组
将numpy导入为np
arr1=np.array([1,4,7,3])
arr2=np.array([[0,1],
[2, 3],
[4, 5],
[4, 0],
[9, 9]])
arr3=np.broadcast\u to(arr1[:,np.newaxis,np.newaxis],(4,5,1))
打印(arr3.形状)
打印(arr3)
arr4=np.broadcast_to(arr2[np.newaxis,:,:],(4,5,2))
打印(arr4.形状)
打印(arr4)
arr5=np.连接([arr3,arr4],轴=-1)
打印(arr5.形状)
打印(arr5)
发布的输出不是形状(4,5,3),而是正确的形状(20,3)。我认为行与行之间的间隔只是为了让读者更容易理解输出是如何构造的。
*len(arr1)
使用非矢量化的元组重复。为什么?
(4, 5, 1)
[[[1]
[1]
[1]
[1]
[1]]
[[4]
[4]
[4]
[4]
[4]]
[[7]
[7]
[7]
[7]
[7]]
[[3]
[3]
[3]
[3]
[3]]]
(4, 5, 2)
[[[0 1]
[2 3]
[4 5]
[4 0]
[9 9]]
[[0 1]
[2 3]
[4 5]
[4 0]
[9 9]]
[[0 1]
[2 3]
[4 5]
[4 0]
[9 9]]
[[0 1]
[2 3]
[4 5]
[4 0]
[9 9]]]
(4, 5, 3)
[[[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]]]