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'>