numpy数组的拼接(扩维拼接和非扩维拼接)

numpy数组的数组拼接方式非常多,特写一篇blog来总结一下。
想转载请留言获批准。


hstack, vstack, dstack, concatenate, stack这些函数都可以用来拼接Numpy数组。还可以利用list来拼接数组。
对于拼接的效果其实我们可以划分为2类:

  1. 横向拼接:hstack, vstack, concatenate等。横向拼接的意思是指,拼接不会产生更高的维度。比如两个2x2的二维矩阵拼接以后,它还是一个二维矩阵,只是变胖了,变成4x2或者2x4。
  2. 扩维拼接:dstack, stack等。拼接后会产生更高的维度,两个(2, 2)的二维矩阵拼接会产生(2, 2, 2)的三维矩阵。

1. 水平拼接hstack

np.hstack()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.hstack((a, b))
print(c)
print(c.shape)

输出为:

array([[1, 1, 2, 2],
       [1, 1, 2, 2]])
(2, 4)

2. 垂直拼接数组vstack

np.vstack()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.vstack((a, b))
print(c)
print(c.shape)

输出为:

array([[1, 1],
       [1, 1],
       [2, 2],
       [2, 2]])
(4, 2)

3.深度拼接dstack

np.dstack()
import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.dstack((a, b))
print(c)
print(c.shape)

输出为:

array([[[1, 5],
        [2, 6]],

       [[3, 7],
        [4, 8]]])
(2, 2, 2)

4.concatenate()函数拼接
concatenate()是非常灵活的拼接函数。

np.concatenate()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.concatenate((a, b), axis=0)
print(c)
print(c.shape)

输出为:

array([[1, 1],
       [1, 1],
       [2, 2],
       [2, 2]])
(4, 2)

可见axis=0时,concatenate的功能和vstack一样。axis=0的含义就是,在第0个维度扩展,其他维度保持不变。这里的第0个维度之前是2,现在是4。
axis=1时,输出为:

array([[1, 1, 2, 2],
       [1, 1, 2, 2]])
(2, 4)

可见axis=1时,concatenate的功能和hstack一样。
注意,axis的取值只能小于被拼接数组的维度(2),所以axis在这里只能取0和1。
但对于多维数组的拼接,concatenate就十分方便了。


5.利用list来实现扩维拼接
我们先构建一个空list

import numpy as np
ls = []
a = np.array([[1, 1],[1, 1]])
b = np.array([[2, 2],[2, 2]])
ls.append(a)
ls.append(b)
c = np.array(ls)
print(c)
print(c.shape)

输出为:

array([[[1, 1],
        [1, 1]],

       [[2, 2],
        [2, 2]]])
(2, 2, 2)

注意,这一操作和dstack是有不同之处的。这个操作是将两个数组叠放在一起而已。


6. 用stack来拼接数组
我们知道stack是扩维拼接,和concatenate有本质的区别。对于两个(2, 2)的数组用stack拼接,我们的结果一定是个三维的,而concatenate的结果是二维的。
涉及到数组的扩维,我们就可以从维度上来理解stack的操作了,初始为2个shape为(2,2)的矩阵,扩展之后:
如果axis = 0,得出结果的shape应该是(_, 2, 2)。看清楚 下划线没有,这个位置的维度是虚位以待的,如果有n(n>=2)个矩阵来拼接,这个下划线的数值就应该是n;(在本博文的栗子里,n=2)
如果axis=1,结果应该是(2, _, 2),在第1个维度上虚位以待;
如果axis=2,结果应该是(2, 2, _),在第2个维度上虚位以待;

np.stack()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)

输出为:

array([[[1, 1],
        [1, 1]],

       [[2, 2],
        [2, 2]]])
(2, 2, 2)

当axis=0时,np.stack就可以实现list一样功能的扩维拼接
再来看axis=1:
为了更容易看到效果,把两个数组的值改一下:

import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)
array([[[1, 2],
        [5, 6]],

       [[3, 4],
        [7, 8]]])
(2, 2, 2)

再看当axis=2时,

array([[[1, 5],
        [2, 6]],

       [[3, 7],
        [4, 8]]])
(2, 2, 2)

可见,axis=2时,stack和dstack的效果一样。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木盏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值