将numpy矩阵插入另一个的优雅方式

时间:2017-06-15 22:33:14

标签: python arrays numpy

我有一个要求,我有2个2D numpy数组,我想以特定方式组合它们:

x = [[0, 1, 2],
     [3, 4, 5],
     [6, 7, 8]]
      |  |  |
      0  1  2

y = [[10, 11, 12],
     [13, 14, 15],
     [16, 17, 18]]
      |   |    |
      3   4    5

 x op y = [ 0 3 1 4 2 5 ] (in terms of the columns)

换句话说,

xy的组合应如下所示:

      [[  0.,  10.,   1.,  11.,   2.,  12.],
       [  3.,  13.,   4.,  14.,   5.,  15.],
       [  6.,  16.,   7.,  17.,   8.,  18.]]

我交替组合每个单独数组的列以形成最终的2D数组。我想出了一种这样做的方法,但它相当丑陋。这是我的代码:

x = np.arange(9).reshape(3, 3)
y = np.arange(start=10, stop=19).reshape(3, 3)
>>> a = np.zeros((6, 3)) # create a 2D array where num_rows(a) = num_cols(x) + num_cols(y)
>>> a[: : 2] = x.T
>>> a[1: : 2] = y.T
>>> a.T
array([[  0.,  10.,   1.,  11.,   2.,  12.],
       [  3.,  13.,   4.,  14.,   5.,  15.],
       [  6.,  16.,   7.,  17.,   8.,  18.]])

正如您所看到的,这是一个非常难看的操作序列。此外,在更高的维度上,事情变得更加麻烦。例如,如果xy[3 x 3 x 3],则必须在每个维度中重复此操作。所以我可能不得不用循环解决这个问题。

有更简单的方法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

In [524]: x=np.arange(9).reshape(3,3)
In [525]: y=np.arange(10,19).reshape(3,3)

这对我来说并不难看(一个衬里被评为过高):

In [526]: a = np.zeros((3,6),int)
....
In [528]: a[:,::2]=x
In [529]: a[:,1::2]=y
In [530]: a
Out[530]: 
array([[ 0, 10,  1, 11,  2, 12],
       [ 3, 13,  4, 14,  5, 15],
       [ 6, 16,  7, 17,  8, 18]])

如果你想要一个班轮,这可能会:

In [535]: np.stack((x.T,y.T),axis=1).reshape(6,3).T
Out[535]: 
array([[ 0, 10,  1, 11,  2, 12],
       [ 3, 13,  4, 14,  5, 15],
       [ 6, 16,  7, 17,  8, 18]])

最后一个想法是将数组合并到一个新维度上,并且重塑其他方式。我通过反复试验找到了它。

并进行了另一次试验:

In [539]: np.stack((x,y),2).reshape(3,6)
Out[539]: 
array([[ 0, 10,  1, 11,  2, 12],
       [ 3, 13,  4, 14,  5, 15],
       [ 6, 16,  7, 17,  8, 18]])

答案 1 :(得分:0)

这是一个用循环编写它的简洁方法,它可以推广到更高维度的数组,只需要一点工作:

    x = np.array([[0,1,2], [3,4,5], [6,7,8]])
    y = np.array([[10,11,12], [13,14,15], [16,17,18]])
    z = np.zeros((3,6))
    for i in xrange(3):
        z[i] = np.vstack((x.T[i],y.T[i])).reshape((-1,),order='F')