矩阵&矩阵的维度&矩阵按某一维度进行拼接

时间:2022-10-06 18:54:54

 以Numpy为例介绍,但是不仅仅适用于ndarry;

只要是矩阵按照axis=k这种方式拼接都满足如下方式

1. Numpy的一个很重要的数据类型就是ndarry

 NumPy Ndarray 对象 | 菜鸟教程 (runoob.com)

 Numpy:矩阵拼接_dyhBUPT的博客-CSDN博客_numpy矩阵拼接

2.  矩阵的维度介绍:

矩阵&矩阵的维度&矩阵按某一维度进行拼接

2.1 维度标号:

首先,我们来明确一下,矩阵的维度指的都是啥,怎么标序号的:

这样方便我们知道拼接的时候,怎么按照维度拼接:

维度的编号方式是从外往里依次递增,即:

矩阵&矩阵的维度&矩阵按某一维度进行拼接

 因此,矩阵n的维度就是dim=[3×2×1]

解释一下:矩阵n在第0维的有3个下一维度的内容(即,矩阵n有3个一维的内容)

同理:矩阵n在第1维的有2个下一维度的内容( 即,有两个二维的内容)

          矩阵n在第2维的有1个下一维度的内容( 即,有1个三维的内容)

2.2 一个概念:"矩阵k维的内容"

【注意】这个概念是我自己定义的,非官方,,只是为了方便理解 :

假设矩阵 tmp 内容为:

tmp = [ [ [1],[2],[3],[4] ] ,
        [ [5],[6],[7],[8] ] ,
        [ [9],[8],[3],[2] ]   ]

此时的矩阵tmp有三个维度,tmp为一个[3×4×1]的矩阵

那么,tmp的0维内容有三个,是:

位置为第0的:[ [1], [2], [3], [4] ]

位置为第1的:[ [5], [6], [7], [8] ]

位置为第2的:[ [9], [8], [3], [2] ]

解释一下,为啥说0维内容有三个:因为我自己这个“第k维的内容”的定义就是说:第k维包括几个第k+1维的内容。

至于位置,这个也强调一下,是因为在进行矩阵间的拼接时,要将对应位置的矩阵按序append在同一位置,(但对于axis=0这种就没啥强调位置的必要了,之后会说)

tmp的1维内容有四个:

但是,tmp有三个1维的内容,每个1维的内容包括四个2维的内容,

我们以一个tmp为1维的内容为例(以[1], [2], [3], [4] 为例):

那么其包括的内容有四个,分别是:

位置为第0的:[1]

位置为第1的:[2]

位置为第2的:[3]

位置为第3的:[4]

tmp的2维内容有一个:

但是,tmp有三个1维的内容,每个1维的内容包括四个2维的内容,每个2维内容包括1个内容:

我们以一个tmp为2维的内容为例(以 1 为例):

位置为第0的:1

2.3 两个矩阵按axis=k方式拼接[This]:

总言之:

k维的内容就是,把 矩阵 的第k维及其外侧的[ ]都脱掉 剩下的内容就是 第k维的内容

于是,以axis=k进行两个矩阵相拼接,就是将dim=k的内容,拢在一起:拢在一起时也注意,是对应位置拢在一起

这个“对应位置拢到一起”中对应位置的理解,如下:

矩阵&矩阵的维度&矩阵按某一维度进行拼接

 其实看图也可以理解出来:

以axis=k来拼接,结果output 就只能是第 k 这个维度的数值 发生改变:

output的其他维度数值都不会改变,

且, 第 k 这个维度的数值 = p和q两个矩阵其 第k维 的值相加和 

2.4 矩阵拼接时注意矩阵的维度和axis的对应:

(1)首先,我们要明确一个原则:

对于ndarry来说,不能(不建议)定义各个维度的内容维度不一致的矩阵,

即,不建议(已弃用)定义这个样子的矩阵:

n = np.array( [ [ ['a','fff'],['b','kkk'] ] ,
                [ ['c'],['d'] ] ,
                [ ['e'],['f'] ] ] )

会出现这样的报错:

VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  [ ['e'],['f'] ] ] )

有了这个原则,我们就可以比较好理解为啥拼接的时候会报错。

我们拼接的时候,并不是长成啥样的矩阵都可以去拼接的。

两个矩阵在 axis=k 处可以拼接,得满足:

假如m,n矩阵要在axis=k处进行拼接,那么,除了dim=k这个维度的两个矩阵的内容len不一致以外,其他维度的内容的len得全部一致

例如,下述的两个矩阵m,n就只能在axis=1处进行拼接,在其他维度进行拼接就会报错

m = [ [ [1],[2],[3],[4] ] ,
      [ [5],[6],[7],[8] ] ,
      [ [9],[8],[3],[2] ]   ]

n = [ [ ['a'],['b'] ],
      [ ['c'],['d'] ],
      [ ['e'],['f'] ]  ]

由于在axis=k这个维度进行拼接,需要做的是将dim=k的内容按对应位置拢在一起就可以了

即,如下例所示:以axis=1来拼接m和n矩阵,将dim=1的内容拢在一起就可以了

矩阵&矩阵的维度&矩阵按某一维度进行拼接

 现在,还是这两个矩阵m[3×4×1] 和 n[3×2×1] ,为什么以axis=0来拼接就不对了呢?

回顾我们之前的原则,要求,对于ndarry来说,同一维度的内容其len要保持一致

那么,如果我们坚持要将 m 和 n 矩阵以 axis=0 方式拼接,就会得到如下的output(这个只能自己手写一下,代码执行会报错,因为不符合ndarry的数据规则)

以axis=0方式拼接,就是将m和n两个矩阵的对应位置的dim=0的内容拢在一起,那output就会长这个样子:

矩阵&矩阵的维度&矩阵按某一维度进行拼接

 显然,output的dim=1时的len不同,前三个len=4,后三个len=2。这就是为啥不让以axis=0方式拼接m,n两个矩阵,会报错的原因。

同理,若坚持要以axis=2来拼接两个矩阵m和n,那么,output如下,也会报错

矩阵&矩阵的维度&矩阵按某一维度进行拼接