【问题标题】:interweave 3 numpy matrices?交织 3 个 numpy 矩阵?
【发布时间】:2017-03-15 00:10:35
【问题描述】:

我如何按列交织 numpy 矩阵。

举个例子:

>>> import numpy as np
>>> a = np.zeros((3,3))
>>> b = np.ones((3,3))
>>> c = b*2

交织输出应该是

[[ a[0,0].  b[0,0].  c[0,0].  a[0,1]  b[0,1]  c[0,1] .. ]
 [ a[1,0].  b[1,0].  c[1,0].  a[1,1]  b[1,1]  c[1,1] .. ]
 [ a[2,0].  b[2,0].  c[2,0].  a[2,1]  b[2,1]  c[2,1] .. ]]

结束形状应该是(3,9)

【问题讨论】:

  • 所有矩阵都具有相同的维度?
  • 是的..矩阵的维度应该是一样的。

标签: python numpy matrix


【解决方案1】:

另一种选择,您可以使用np.dstack + reshape,根据docsdstack 按顺序深度(沿第三轴)堆叠数组,这样可以方便本例:

np.dstack([a, b, c]).reshape(3,-1)
#array([[ 0.,  1.,  2.,  0.,  1.,  2.,  0.,  1.,  2.],
#       [ 0.,  1.,  2.,  0.,  1.,  2.,  0.,  1.,  2.],
#       [ 0.,  1.,  2.,  0.,  1.,  2.,  0.,  1.,  2.]])

使用一些不那么模棱两可的样本数据:

import numpy as np
a = np.arange(9).reshape(3,3)
b = (np.arange(9) + 9).reshape(3,3)
c = b*2

#array([[ 0,  9, 18,  1, 10, 20,  2, 11, 22],
#       [ 3, 12, 24,  4, 13, 26,  5, 14, 28],
#       [ 6, 15, 30,  7, 16, 32,  8, 17, 34]])

【讨论】:

  • 一个较新的等价物是np.stack([a,b,c], axis=-1)
【解决方案2】:

如果所有矩阵都具有相同的维度,您可以使用:

np.array([a,b,c]).transpose(1,2,0).reshape(3,-1)

或者一个通用函数来合并n个矩阵:

def merge(*args):
    (m,_) = args[0].shape
    return np.array(args).transpose(1,2,0).reshape(m,-1)

(并使用merge(a,b,c) 调用它)

您甚至可以让它适用于任意维度,其中:

def merge_arbitrary(*args):
    (*m,_) = args[0].shape
    return np.array(args).transpose(tuple(range(1,len(m)+2))+(0,)). \
                          reshape(m+[-1])

代码的工作原理如下。我们首先构造一个 3×3×3 的矩阵,其形状如下:

array([[[ a00,  a01,  a02],
        [ a10,  a11,  a12],
        [ a20,  a21,  a22]],

       [[ b00,  b01,  b02],
        [ b10,  b11,  b12],
        [ b20,  b21,  b22]],

       [[ c00,  c01,  c02],
        [ c10,  c11,  c12],
        [ c20,  c21,  c22]]])

接下来我们创建一个transpose(1,2,0),这样现在[aij,bij,cij] 是最低维度。所以从现在开始矩阵有形状:

array([[[a00, b00, c00],
        [a01, b01, c01],
        [a02, b02, c02]],

       [[a10, b10, c10],
        [a11, b11, c11],
        [a12, b12, c12]],

       [[a20, b20, c20],
        [a21, b21, c21],
        [a22, b22, c22]]])

最后通过调用reshape(3,-1),我们“删除”最低维度并连接:

array([[a00, b00, c00, a01, b01, c01, a02, b02, c02],
       [a10, b10, c10, a11, b11, c11, a12, b12, c12],
       [a20, b20, c20, a21, b21, c21, a22, b22, c22]])

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 2021-12-12
    • 2012-12-06
    • 2018-07-18
    • 2017-08-09
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多