将不同大小的numpy数组合并成一个更大的矩阵

3
我希望能将不同大小的numpy数组组合成一个更大的矩阵。例如:a = np.array([1, 2, 3, 4, 5])b = np.array([6, 7, 8])c = np.array([9, 10, 3, 4, 5]),输出结果应为:
 array([[1., 6., 9.],
       [2., 7., 10.],
       [3., 8., 3.],
       [4., 6., 4.],
       [5., 7., 5.],
       [1., 8., 10.],
       [2., 6., 3.],
       [3., 7., 4.],
       [4., 8., 5.],
       [5., 6., 9.],
       .....
       [5., 8., 5.])

为了涵盖所有可能的组合,请注意数组b中的值正在重复。我尝试过制作一个由1组成的数组,然后使用广播原则。

arr= np.ones((75,3))
arr[:,0]=arr[:,0]*a
arr[:,1]=arr[:,1]*b
arr[:,2]=arr[:,2]*c

但是获取操作数时,形状无法一起广播。

(编辑)需要一个可以具有动态数量的变量长度数组的解决方案。不一定是针对三个数组。


它总是三个数组吗?我认为你的意思是在输出的行中有三个数组元素的每种组合,这与你打印的期望输出不同(为了清楚起见,请考虑大小相同的三个数组)。 - Ehsan
数组的数量将是可变的。我提供了三个作为示例。输出应该是使用数组元素可以制作的所有可能组合,这些元素的总数将被乘以每个数组的元素计数。 - mmcmp
这个回答解决了你的问题吗?使用numpy构建两个数组的所有组合的数组 - 有许多超过2个数组的答案。 - Daniel F
此答案涵盖了一个更一般的情况。 - mmcmp
2个回答

2

我认为您正在寻找meshgrid,现在只需将它们添加到参数中,它可以适用于任何数量的数组:

np.array(np.meshgrid(a,b,c)).T.reshape(-1,3)

如果您有一个数组列表:

l = [a,b,c]
np.array(np.meshgrid(*l)).T.reshape(-1,len(l))

输出:

array([[ 1,  6,  9],
       [ 1,  7,  9],
       [ 1,  8,  9],
       [ 2,  6,  9],
       [ 2,  7,  9],
       [ 2,  8,  9],
       [ 3,  6,  9],
       [ 3,  7,  9],
       [ 3,  8,  9],
       [ 4,  6,  9],
       [ 4,  7,  9],
       [ 4,  8,  9],
       [ 5,  6,  9],
       [ 5,  7,  9],
       [ 5,  8,  9],
       [ 1,  6, 10],
       [ 1,  7, 10],
       [ 1,  8, 10],
       [ 2,  6, 10],
       [ 2,  7, 10],
       [ 2,  8, 10],
       [ 3,  6, 10],
       [ 3,  7, 10],
       [ 3,  8, 10],
       [ 4,  6, 10],
       [ 4,  7, 10],
       [ 4,  8, 10],
       [ 5,  6, 10],
       [ 5,  7, 10],
       [ 5,  8, 10],
       [ 1,  6,  3],
       [ 1,  7,  3],
       [ 1,  8,  3],
       [ 2,  6,  3],
       [ 2,  7,  3],
       [ 2,  8,  3],
       [ 3,  6,  3],
       [ 3,  7,  3],
       [ 3,  8,  3],
       [ 4,  6,  3],
       [ 4,  7,  3],
       [ 4,  8,  3],
       [ 5,  6,  3],
       [ 5,  7,  3],
       [ 5,  8,  3],
       [ 1,  6,  4],
       [ 1,  7,  4],
       [ 1,  8,  4],
       [ 2,  6,  4],
       [ 2,  7,  4],
       [ 2,  8,  4],
       [ 3,  6,  4],
       [ 3,  7,  4],
       [ 3,  8,  4],
       [ 4,  6,  4],
       [ 4,  7,  4],
       [ 4,  8,  4],
       [ 5,  6,  4],
       [ 5,  7,  4],
       [ 5,  8,  4],
       [ 1,  6,  5],
       [ 1,  7,  5],
       [ 1,  8,  5],
       [ 2,  6,  5],
       [ 2,  7,  5],
       [ 2,  8,  5],
       [ 3,  6,  5],
       [ 3,  7,  5],
       [ 3,  8,  5],
       [ 4,  6,  5],
       [ 4,  7,  5],
       [ 4,  8,  5],
       [ 5,  6,  5],
       [ 5,  7,  5],
       [ 5,  8,  5]])

1
谢谢,我该如何扩展它以适用于更多情况,而我事先不知道有多少输入数组? - mmcmp

1
你可以使用列表推导式:

arr = np.array([[x,y,z] for x  in a for y in b for z in c])

1
这是一个很好的解决方案,但我需要处理一般情况,我不知道会有多少个数组。 - mmcmp

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