19.1 链接和拆分

29 篇文章 1 订阅
29 篇文章 0 订阅

19.1 链接和拆分

  1. np.concatenate 对多个数组按指定轴的方向进行连接
  2. np.stack/np.vstack/np.hstack/np.dstack组合
  3. np.split/np.hsplit/np.vsplit/np.dsplit拆分
import numpy as np
a = np.array([[1, 2, 3], [1, 2, 3]], dtype=np.int32)
b = np.array([[11, 22, 33], [11, 22, 33]], dtype=np.int32)
c = np.array([[44, 55, 55], [44, 55, 55]], dtype=np.int32)
print(a, b, c)

通过axis作为关键字参数指定组合的方向,取值如下:
若待组合的数组都是二维数组:

  1. 0:垂直方向组合
  2. 1:水平方向组合
    若待组合的数组都是三维数组:
  3. 0:垂直方向组合
  4. 1:水平方向组合
  5. 2:深度方向组合

注意:vstack和hstack关注长和宽,dstack关注高,其实变成三维了

print('=' * 50)
dd = np.concatenate((a, b, c), axis=0)
print(dd)

左右排序

dd = np.concatenate((a, b, c), axis=1)
print(dd)

print('=' * 50)

np.stack()

a = np.floor(10 * np.random.random((2, 3)))
b = np.floor(10 * np.random.random((2, 3)))
print(a, b)
c1 = np.vstack((a, b))
print(c1)
[[0. 1. 7.]
 [3. 4. 0.]
 [7. 9. 7.]
 [5. 4. 2.]]
c2 = np.hstack((a, b))
print(c2)
[[0. 1. 7. 7. 9. 7.]
 [3. 4. 0. 5. 4. 2.]]
c3 = np.dstack((a, b))
print(c3)
[[[2. 8.]
  [3. 8.]
  [0. 2.]]

 [[7. 4.]
  [3. 8.]
  [6. 8.]]]

对那些维度比二维更高的数组,hstack沿着第二个轴组合,vstack沿着第一个轴组合,concatenate允许可选参数给出组合时沿着的轴。

a = np.floor(10 * np.random.random((2, 3)))
b = np.floor(10 * np.random.random((2, 3)))
print(a, b)

列拼接

c3 = np.column_stack((a, b))
print(c3)

行拼接

c4 = np.row_stack((a, b))
print(c4)
np.split()

通过给出的数组与要拆分的份数,按照某个方向进行拆分。
使用hsplit你能将数组沿着它的水平轴分割,或者指定返回相同形状数组的个数,或者指定在哪些列后发生分割。

print('=' * 50)

构建一个方便进行拆分的二维数组

a = np.floor(10 * np.random.random((6, 3)))
print(a)
[[9. 0. 3.]
 [5. 3. 1.]
 [6. 5. 3.]
 [7. 5. 6.]
 [2. 3. 0.]
 [2. 8. 3.]]

行均匀拆分

b = np.vsplit(a, 3)
print(b)
[array([[9., 0., 3.],
       [5., 3., 1.]]), 
array([[6., 5., 3.],
       [7., 5., 6.]]), 
array([[2., 3., 0.],
       [2., 8., 3.]])]
b = np.vsplit(a, (1, 4))
print(b)
[array([[9., 0., 3.]]), 
array([[5., 3., 1.],
       [6., 5., 3.],
       [7., 5., 6.]]), 
array([[2., 3., 0.],
       [2., 8., 3.]])]
for r in b:
    print(r)
[[9., 0., 3.]]
[[5., 3., 1.],
 [6., 5., 3.],
 [7., 5., 6.]]
[[2., 3., 0.],
 [2., 8., 3.]]

构建一个方便进行列差分的二维数组

a = np.floor(10 * np.random.random((2, 12)))
print(a)
[[4. 7. 6. 1. 6. 9. 2. 7. 8. 0. 8. 9.]
 [9. 4. 3. 8. 9. 6. 0. 9. 8. 3. 0. 5.]]

列均匀拆分,必须能够整除

b = np.hsplit(a, 4)
print(b)

[array([[4., 7., 6.],
[9., 4., 3.]]),
array([[1., 6., 9.],
[8., 9., 6.]]),
array([[2., 7., 8.],
[0., 9., 8.]]),
array([[0., 8., 9.],
[3., 0., 5.]])]

如果参数为元组,则是指定对应的拆分位置

c = np.hsplit(a, (3, 4, 7))
print(c)
[array([[4., 7., 6.],
       [9., 4., 3.]]), 
array([[1.],
       [8.]]), 
array([[6., 9., 2.],
       [9., 6., 0.]]),
array([[7., 8., 0., 8., 9.],
       [9., 8., 3., 0., 5.]])]
print('=' * 50)
a = np.floor(10 * np.random.random((3, 2)))
b = np.floor(10 * np.random.random((3, 2)))
c = np.dstack((a, b))
print(c)
a1, a2 = np.dsplit(c, 2)
print(a1, a2)
[[[4. 3.]
  [8. 8.]]

 [[8. 6.]
  [0. 3.]]

 [[1. 4.]
  [3. 0.]]]
[[[4.]
  [8.]]

 [[8.]
  [0.]]

 [[1.]
  [3.]]] [[[3.]
  [8.]]

 [[6.]
  [3.]]

 [[4.]
  [0.]]]

如果两个数组的维度不一样,则可以使用np.pad()函数来搞定维度匹配的问题

print('=' * 50)
array = np.array([1, 1, 1])

(1, 2)表示在一维数组array前面填充1位,在最后面填充2位

constant_values=(0, 2)表示前面填充0,后面填充2

ndarray = np.pad(array, (1, 2), 'constant', constant_values=(0, 2))
print(ndarray) # [0 1 1 1 2 2]

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

填充b数组使其长度与a相同,头部补0个元素,尾部补1个元素

b = np.pad(b, pad_width=(0, 1), mode="constant", constant_values=-1)
print(b) # [ 1  2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

soyisou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值