【问题标题】:Combine numpy arrays of different sizes into a bigger matrix将不同大小的numpy数组组合成一个更大的矩阵
【发布时间】:2021-06-08 06:25:25
【问题描述】:

我想将所有可能的不同大小的 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 值正在重复。我尝试过制作数组,然后使用广播原理。

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

但是获取操作数不能和形状一起广播。

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

【问题讨论】:

  • 总是三个数组吗?我还认为您的意思是在输出行中包含三个数组的元素的每种组合,这与您打印的所需输出不同(为了清楚起见,请考虑三个相同大小的数组)
  • 数组的数量是可变的。我提供了三个作为示例。输出应该是可以使用数组元素进行的所有可能组合,即每个数组元素的总数相乘。
  • 这能回答你的问题吗? Using numpy to build an array of all combinations of two arrays - 对于 >2 个数组有很多答案。
  • 这个答案涵盖了更一般的情况。

标签: python arrays numpy array-broadcasting


【解决方案1】:

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

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

【讨论】:

  • 谢谢,如果我不知道我事先有多少输入数组,我该如何将其用于更多情况?
  • @mmcmp 请查看我的帖子中关于您的评论的编辑。另外,请随时查看stackoverflow.com/help/someone-answers 了解如何接受答案并欢迎来到 SO。
【解决方案2】:

您可以使用列表推导:

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

【讨论】:

  • 这是一个很好的示例解决方案,但我需要在一般情况下工作,我不知道我将拥有多少个数组。
猜你喜欢
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多