Numpy中np.c_、np.r_用法小结

Numpy中np.c_、np.r_用法小结

写在最前面:本文内容为本人在学习Numpy过程中关于np.c_/np.r_时的总结内容,如有错误之处,还望各位大佬多加指正。在学习的过程中,本人主要参阅了王的机器(大佬王圣元的微信公众号)中:Numpy入门下的相关内容。在此再次向大佬致敬!

1.通俗用法:对两个数组进行合并。

1.1、使用np.c_对两个数组的列进行合并,条件:两个数组的行必须相同

(1)当两个数组是一维数组时。

a_c=np.array([1,2,3])
b_c=np.array([4,5,6])
result=np.c_[a_c,b_c]
print(result)

运算结果如下:`

[[1 4]
 [2 5]
 [3 6]]

原因如下:
对于类似a_c=np.array([1,2,3])这种类型的数组,其实质上是一个默认的3行*1列的一维列向量。为了不引起维度上的误解,所以显示为:[1,2,3]。对于a_c,b_c这两个默认的3行1列的一维列向量进行合并时,沿着水平方向,将a_c,b_c两个向量的进行合并,会导致维度增加。合并后的结果会由原来的一维列向量变成三行两列的二维矩阵(数组)。
(2)当两个数组的维度大于1时。

a1=np.random.randint(2,18,size=(2,3))
print(f'a1 is: {a1}')

a1结果:

a1 is: [[ 9 12  5]
 [10  2 13]]
b1=np.random.randint(2,18,size=(4,3))
print(f'b1 is: {b1}')

b1结果:

b1 is: [[ 9  8 17]
 [12 13 11]
 [16  2  4]
 [ 3  2 16]]

使用np.c_对a1,b1在列上进行合并:

result=np.c_[a1,b1]
print(result)

结果报错了:因为a1,b1两个数组的数不同。

ValueError: all the input array dimensions except for the concatenation axis must match exactly

正解:当用np.c_对两个数组在水平方向上将列进行合并且满足行相等的条件时:

a1_c=np.random.randint(2,18,size=(2,3))
print(f'a1_c is: {a1_c}')

输出:

a1_c is: [[16  2 15]
 [14 14  2]]
b1_c=np.random.randint(2,18,size=(2,5))
print(f'b1_c is: {b1_c}')

输出:

b1_c is: [[15 11 14 13 12]
 [ 2 17 13  3  3]]

当两个数组的行相同时,使用np.r_对两个数组沿着水平方向上对两个数组的列进行合并。

result=np.c_[a1_c,b1_c]
print(result)

合并结果如下:

[[16  2 15 15 11 14 13 12]
 [14 14  2  2 17 13  3  3]]

1.2、使用np.r_对两个数组的行进行合并,条件:两个数组的列必须相同

(1)当两个数组是一维数组时。

a_r=np.array([1,2,3])
b_r=np.array([4,5,6])
result=np.r_[a_r,b_r]
print(result)

运算结果如下:

[1 2 3 4 5 6]

原因如下:
对于类似a_r=np.array([1,2,3])这种类型的数组,其实质上是一个默认的3行1列的一维列向量。为了不引起维度上的误解,所以显示为:[1,2,3]。对于a_r,b_r这两个默认的3行1列的一维列向量进行合并时,沿着竖直方向,将a_c,b_c两个向量的行进行合并不会导致维度增加。合并后的结果会由原来的一维列向量变成6行一列的一维列向量。为了不引起维度上的误解,所以显示为:[1,2,3,4,5,6]。
(2)当两个数组的维度大于1时。
当两个数组的列不相同时,使用np.r_对两个数组沿着竖直方向上对两个数组的行进行合并会报错。

a1_r=np.random.randint(2,18,size=(2,3))
print(f'a1_r is: {a1_r}')

输出:

a1_r is: [[16 10 12]
 [ 4 14  6]]
b1_r=np.random.randint(2,18,size=(2,5))
print(f'b1_r is: {b1_r}')

输出:

b1_r is: [[10  6  2 11 17]
 [10  3  9  2  7]]

使用np.r_对a1_r和b1_r在竖直方向上对行进行合并:

result=np.r_[a1_r,b1_r]
print(result)

输出结果报错:

ValueError: all the input array dimensions except for the concatenation axis must match exactly

当两个数组的列相同时,使用np.r_对两个数组沿着竖直方向上对两个数组的行进合并:

a1_r=np.random.randint(2,18,size=(2,3))
print(f'a1_r is: {a1_r}')

a1_r结果:

a1_r is: [[ 2 17 16]
 [ 2  9  2]]
b1_r=np.random.randint(2,18,size=(4,3))
print(f'b1_r is: {b1_r}')

b1_r结果:

b1_r is: [[14 13  2]
 [16  3 10]
 [ 4 14  8]
 [16 16  9]]

使用np.r_对a1_r和b1_r在竖直方向上对行进行合并:

result=np.c_[a1_r,b1_r]
print(result)

合并结果如下:

[[ 2 17 16]
 [ 2  9  2]
 [14 13  2]
 [16  3 10]
 [ 4 14  8]
 [16 16  9]]

2.np.c_、np.r_的自有用法

2.1、将切片转换成数组进行拼接。

(1)np.c_

注意,利用np.c_将对切片进行合并时,仍必须满足行相等的条件,否则会出现错误。

result=np.c_[1:6,-10:-1]
print(result)

结果报错:

ValueError: all the input array dimensions except for the concatenation axis must match exactly

分析:在列用np.c_进行列合并时,要保证两个数组的行相等。np.c_在进行数组合并时,将切片1:6转换成了6行一列的一维列向量,将-10:-1转化成了10行1列的一维列向量,二者行数不同,所以合并时会报错。

当满足相等的条件时(即np.c_将切片转换成数组时满足行相等条件):

result1=np.c_[1:6,3:9]
print(result1)

结果如下:

result1=np.c_[1:6,3:8]
print(result1)

分析
np.c_将切片1:6、3:8转化成了5行一列的一维列向量,然后在水平方向上对列进行了合并。
除了对两个切片进行合并之外,np.c_也可以对其他满足行对准的元素进行合并。

例如:切片与列表混合。

result1=np.c_[1:7,[2,5,6,7,14,6]]
print(result1)

结果:[[ 1 2] [ 2 5] [ 3 6] [ 4 7] [ 5 14] [ 6 6]]

除此之外,还可以使用np.c_/np.r_ 对两个列表进行合并:

result1=np.c_[[i**2 for i in range(6)],[2,5,6,7,14,6]]
print(result1)

结果:[[ 0 2] [ 1 5] [ 4 6] [ 9 7] [16 14] [25 6]]

(2)np.r_

注意,利用np.r_将对切片进行合并时,仍必须满足列相等的条见,否则会出现错误。
将切片与列表混合起来。
满足列相等条件:

result1=np.r_[-2:2:1,[0]*5]
print(result1)

结果:[-2 -1 0 1 0 0 0 0 0]
分析:np.r_将-2:2:1处理为4行1列的一维列向量,将列表[0,0,0,0,0]处理成了5行1列的列向量,二者满足列相等条件,在竖直方向上对列进行合并,形成了9行1列的一维列向量。
将列表和列表混合起来。

ls1=[i**3 for i in range(10) if i<6]

ls2=[j for j in range(10) if j<3]
print(np.r_[ls1,ls2])

结果如下:[ 0 1 8 27 64 125 0 1 2]

注意:以上结果是由于混合叠加的结果仍旧为一维列向量(9行1列),为了显示方便,显示如上。实际混合是在竖直方向上对行进行叠加。

当不满足列相同条件时:

ls1=[[i**3 for i in range(10) if i<6]]

ls2=[[j for j in range(10) if j<3]]
print(np.r_[ls1,ls2])

结果如下:ValueError: all the input array dimensions except for the concatenation axis must match exactly
原因如下:系统将列表ls1以及ls2转化成二维数组时,两个数组的列不同。不满足使用合并条件。
注意!!!
在对任意两个数组进行合并时,必须保证二者的维度相同。否则会报错。
例如:

ls1=[[i**3 for i in range(10) if i<6]]

ls2=[j for j in range(10) if j<6]
print(np.r_[ls1,ls2])

结果如下:ValueError: all the input arrays must have same number of dimensions

2.2、特殊参数的使用

(1)使用’r’/'c’参数生成线性代数中常用的二维矩阵。
普通混合叠加(默认方式):

ls1=[i**3 for i in range(10) if i<6]

ls2=[j for j in range(10) if j<6]
result=np.r_[ls1,ls2]
print(result)
print(type(result))

结果如下:[ 0 1 8 27 64 125 0 1 2 3 4 5] <class 'numpy.ndarray'>

ls1=[[i for i in range(3)],[5,7,9]]

ls2=[[j**2 for j in range(3)],[12,13,14] ]
result=np.r_[ls1,ls2]
print(result)
print(type(result))

结果如下:[[ 0 1 2] [ 5 7 9] [ 0 1 4] [12 13 14]] <class 'numpy.ndarray'>

加入’r’参数:
i、一维列表

使用np.r_对两个一维列表进行合并:

ls1=[i**3 for i in range(10) if i<6]
ls2=[j for j in range(10) if j<6]
result=np.r_['r',ls1,ls2]
print(result)
print(type(result))
print(result.shape)

结果生成了线性代数中常用的矩阵类型:

[[  0   1   8  27  64 125   0   1   2   3   4   5]]
<class 'numpy.matrix'>
(1, 12)

使用np.c_对两个一维列表进行合并:

ls1=[i**3 for i in range(10) if i<6]
ls2=[j for j in range(10) if j<6]
result=np.c_['r',ls1,ls2]
print(result)
print(type(result))
print(result.shape)

结果如下:

[[  0   0]
 [  1   1]
 [  8   2]
 [ 27   3]
 [ 64   4]
 [125   5]]
<class 'numpy.matrix'>
(6, 2)

ii、嵌套列表

使用np.r_对两个嵌套的二维列表进行合并:

ls1=[[i for i in range(3)],[5,7,9]]
ls2=[[j**2 for j in range(3)],[12,13,14] ]
result=np.r_['r',ls1,ls2]
print(result)
print(type(result))

结果如下:

[[ 0  1  2]
 [ 5  7  9]
 [ 0  1  4]
 [12 13 14]]
<class 'numpy.matrix'>

分析:相较于原来的np.r_对二维嵌套列表的合并结果,并没有发生显著改变,仅仅是结果类型发生了变化。

使用np.c_对两个二维嵌套列表进行合并:

ls1=[[i for i in range(3)],[5,7,9]]

ls2=[[j**2 for j in range(3)],[12,13,14] ]
result=np.c_['r',ls1,ls2]
print(result)
print(type(result))

结果如下:[[ 0 1 2 0 1 4] [ 5 7 9 12 13 14]] <class 'numpy.matrix'>

加入’c’参数:
i、一维列表

使用np.r_对两个一维列表进行合并

ls1=[i**3 for i in range(10) if i<6]
ls2=[j for j in range(10) if j<6]
result=np.r_['c',ls1,ls2]
print(result)
print(type(result))
print(result.shape)

结果生成了线性代数中常用的矩阵类型:

[[  0]
 [  1]
 [  8]
 [ 27]
 [ 64]
 [125]
 [  0]
 [  1]
 [  2]
 [  3]
 [  4]
 [  5]]
<class 'numpy.matrix'>
(12, 1)

使用np.c_对两个一维列表进行合并:

ls1=[i**3 for i in range(10) if i<6]
ls2=[j for j in range(10) if j<6]
result=np.c_['c',ls1,ls2]
print(result)
print(type(result))
print(result.shape)

结果如下:

[[  0   0]
 [  1   1]
 [  8   2]
 [ 27   3]
 [ 64   4]
 [125   5]]
<class 'numpy.matrix'>
(6, 2)
print(result.shape)

ii、嵌套列表

使用np.r_对两个二维嵌套列表进行合并:

ls1=[[i for i in range(3)],[5,7,9]]
ls2=[[j**2 for j in range(3)],[12,13,14] ]
result=np.r_['c',ls1,ls2]
print(result)
print(type(result))
print(result.shape)

结果如下:

[[ 0  1  2]
 [ 5  7  9]
 [ 0  1  4]
 [12 13 14]]
<class 'numpy.matrix'>
(4, 3)

使用np.c_对两个二维嵌套列表进行合并:

ls1=[[i for i in range(3)],[5,7,9]]
ls2=[[j**2 for j in range(3)],[12,13,14] ]
result=np.c_['c',ls1,ls2]
print(result)
print(type(result))
print(result.shape)

结果如下:

[[ 0  1  2  0  1  4]
 [ 5  7  9 12 13 14]]
<class 'numpy.matrix'>
(2, 6)

**(2)控制参数的使用,使得数组合并按照某种指定方式进行。
在np.r_/np.c_中,第一个参数可以是控制参数(如上文所述的’r’,‘c’),如果写成’a,b,c’的形式,其中:

[1]、a代表在a轴上进行合并。
[2]、b代表合并后的维度。
[3]、c代表在c轴上做维度提升。

ls1=[i**2 for i in range(5)]
ls2=[j**3 for j in range(5)]
result=np.r_['0,2,0',ls1,ls2]
print(result)
print(tpye(result))

分析:上述代码表示:对于ls1,ls2,设置合并后的结果为2维数组,且在合并前,对ls1、ls2在0轴方向进行升维操作。合并时在0轴方向(竖直方向上)进行合并。

合并结果如下:

[[ 0]
 [ 1]
 [ 4]
 [ 9]
 [16]
 [ 0]
 [ 1]
 [ 8]
 [27]
 [64]]
<class 'numpy.ndarray'>
ls1=[i**2 for i in range(5)]
ls2=[j**3 for j in range(5)]
result=np.r_['0,2,1',ls1,ls2]
print(result)
print(type(result))

分析:上述代码表示:对于ls1,ls2,设置合并后的结果为2维数组,且在合并前,对ls1、ls2在1轴方向进行升维操作。合并时在0轴方向(竖直方向上)进行合并。

合并结果如下:

[[ 0  1  4  9 16]
 [ 0  1  8 27 64]]
<class 'numpy.ndarray'>
ls1=[i**2 for i in range(5)]
ls2=[j**3 for j in range(5)]
result=np.r_['1,2,0',ls1,ls2]
print(result)
print(type(result))

分析:上述代码表示:对于ls1,ls2,设置合并后的结果为2维数组,且在合并前,对ls1、ls2在0轴方向进行升维操作。合并时在1轴方向(水平方向上)进行合并。

结果如下:

[[ 0  1  4  9 16]
 [ 0  1  8 27 64]]
<class 'numpy.ndarray'>
ls1=[i**2 for i in range(5)]
ls2=[j**3 for j in range(5)]
result=np.r_['1,2,1',ls1,ls2]
print(result)
print(type(result))

分析:上述代码表示:对于ls1,ls2,设置合并后的结果为2维数组,且在合并前,对ls1、ls2在1轴方向进行升维操作。合并时在1轴方向(水平方向上)进行合并。

结果如下:

[[ 0  1  4  9 16  0  1  8 27 64]]
<class 'numpy.ndarray'>
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值