numpy中concatenate、stack、hstack、vstack、dstack区别与联系

总结:

  • concatenate、stack、hstack、vstack、dstack都是将多个序列连接起来的方法,只是连接的方法不同;
  • concatenate是在存在的维度上连接序列,并且除了操作的维度,其他维度的尺寸要相同;
  • stack是在增加的新的维度上连接序列,需要连接的所有序列的所有维度都要相同;
  • vstack、hstack相当于stack在axis=0,axis=1的轴上的操作;
  • stack、vstack、hstack相当于增加新的维度之后的concatenate。

1、numpy.concatenate((a1, a2, …), axis=0, out=None, dtype=None, casting=“same_kind”)

  • Join a sequence of arrays along an existing axis.
    沿某个存在的轴方向连接序列

  • 参数:
    a1、a2:需要连接的序列,两个序列除了axis的方向,其他尺寸要相同
    axis:默认是0

  • 例1:
    a的size是2x2,b的szie是1x2,在axis=0的轴上连接序列(这个时候,axis=1上的尺寸是相同的),变成3x2;b转置之后,变为2x1,在axis=1上连接序列(这个时候,axis=0上的尺寸是相同的),变成2x3

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
     
np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

2、numpy.stack(arrays, axis=0, out=None)

  • Join a sequence of arrays along a new axis.
    在新的axis上连接序列

  • 参数解释:
    arrays,需要连接的序列必须有相同的尺寸
    axis, 结果序列中增加的轴,axis=0是第一个维度,axis=-1是最后一个维度

  • 例1:
    生成了10个3x4的序列,当在axis=0上连接时,10个序列增加一个维度,变成1x3x4的尺寸,同样的,在axis=1时,增加维度变成3x1x4,在axis=2时,增加维度变成3x4x1。

arrays = [np.random.randn(3, 4) for _ in range(10)]
np.stack(arrays, axis=0).shape
(10, 3, 4)
np.stack(arrays, axis=1).shape
(3, 10, 4)
np.stack(arrays, axis=2).shape
(3, 4, 10)
  • 例2:axis=0时,a,b增加一个维度,变成1x3,axis=1时,增加维度变成3x1
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
(3,)
np.stack((a, b))
array([[1, 2, 3],
       [4, 5, 6]])
(2, 3)
np.stack((a, b), axis=-1)
array([[1, 4],
       [2, 5],
       [3, 6]])
(3, 2)

3、numpy.vstack(tup)

  • Stack arrays in sequence vertically (row wise).
    除了大小为(N,) 的一维序列需要reshape为(1,N),其他序列在第二个维度上连接序列,即np.stack(arrays, axis=0)

  • 例1:

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.vstack((a,b)) 
# np.stack((a,b), xis=0)
array([[1, 2, 3],
       [4, 5, 6]])

a = np.array([[1], [2], [3]])
b = np.array([[4], [5], [6]])
np.vstack((a,b))
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

4、numpy.vstack(tup)

  • Stack arrays in sequence horizontally (column wise).
    除了一维数据是在第一个维度,其他序列在第二个轴上连接,即np.stack(arrays, axis=1)

  • 例1:

a = np.array((1,2,3))
b = np.array((4,5,6))
# np.stack((a,b), axis=1)
np.hstack((a,b))
array([1, 2, 3, 4, 5, 6])
a = np.array([[1],[2],[3]])
b = np.array([[4],[5],[6]])
np.hstack((a,b))
array([[1, 4],
       [2, 5],
       [3, 6]])

5、numpy.dstack(tup)

  • Stack arrays in sequence depth wise (along third axis).
    当遇到大小为(M,N)的 2-D序列时,reshape为(M,N,1),或者大小为(N,)的1-D序列时,reshape为(1,N,1),然后在第三维上进行连接,即np.stack(arrays, axis=2)

  • 例1:

a = np.array((1,2,3))
b = np.array((2,3,4))
np.dstack((a,b))
array([[[1, 2],
        [2, 3],
        [3, 4]]])
a = np.array([[1],[2],[3]])
b = np.array([[2],[3],[4]])
np.dstack((a,b))
array([[[1, 2]],
       [[2, 3]],
       [[3, 4]]])
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`numpy.concatenate`和`numpy.stack`都可以用于将多个数组合并成一个更大的数组,但它们有一些区别。 `numpy.concatenate`函数用于在现有的轴上连接数组。它需要指定需要连接的数组以及连接的轴。连接的轴是现有的轴,连接后的数组的维数不会增加。例如,如果你有两个二维数组,你可以在它们的行或列上连接它们。 `numpy.stack`函数用于在新轴上堆叠数组。它需要指定需要堆叠的数组以及新轴的位置。新轴的位置可以是0(最前面),1(间)或-1(最后面)。堆叠后的数组的维数会增加。例如,如果你有两个一维数组,你可以在它们的第0个轴上堆叠它们,得到一个二维数组。 下面是一个简单的示例,演示如何使用`numpy.concatenate`和`numpy.stack`函数: ```python import numpy as np # 创建两个二维数组 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 使用 concatenate 在行上连接两个数组 c = np.concatenate((a, b), axis=0) print(c) # 使用 concatenate 在列上连接两个数组 d = np.concatenate((a, b), axis=1) print(d) # 使用 stack 在新轴上堆叠两个数组 e = np.stack((a, b), axis=0) print(e) ``` 输出结果如下: ``` # 使用 concatenate 在行上连接两个数组 [[1 2] [3 4] [5 6] [7 8]] # 使用 concatenate 在列上连接两个数组 [[1 2 5 6] [3 4 7 8]] # 使用 stack 在新轴上堆叠两个数组 [[[1 2] [3 4]] [[5 6] [7 8]]] ``` 在这个例子,我们创建了两个二维数组a和b。使用`numpy.concatenate`函数,我们将它们沿着行和列连接起来。使用`numpy.stack`函数,我们将它们沿着新轴堆叠起来。注意,使用`numpy.stack`函数,我们得到了一个三维数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值