1d阵列和2d阵列之间的逐行笛卡尔乘积



我想我遗漏了一些显而易见的东西。我想找到arr1(一个1d的numpy数组(和arr2(一个2d的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((这样的代码来使用转置和整形,但还没有成功。

我希望这个解决方案可以推广,因为我还需要处理这样的情况:获取2d(10,2(数组的ROWS和2d数组(20,5(的ROWS的所有组合,以获得输出数组(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]]

您可以使用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]))

我认为应该这样做:

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

相关内容

  • 没有找到相关文章

最新更新