6.array的合并
生存array数组
vstack方法,实现垂直合并(即按行合并)
arr1=np.array([1,2,3])
arr2=np.array([4,5,6])
arr3=np.vstack((arr1,arr2))#垂直合并
print(arr3)
print(arr3.shape)
[[1 2 3]
[4 5 6]]
(2, 3)
hstack方法,实现水平合并(即按列合并)
arr4=np.hstack((arr1,arr2))#水平合并
print(arr4)
print(arr4.shape)
[1 2 3 4 5 6]
(6,)
注:python中,对一维数组使用.shape方法得到的是(数组长度,)这种格式。对矩阵使用.shape方法得到的是(行数,列数)这种格式。
注:python中两个一维数组使用hstack按列合并是合成一个长数组(如上例),
而R中,两个一维向量使用cbind按列合并是合成一个两列的矩阵,使用rbind按行合并是合成一个两行的矩阵
R语言一个例子
> a <- c(1,2,3)
> b <- c(4,5,6)
> a
[1] 1 2 3
> b
[1] 4 5 6
> c <- cbind(a,b)
> c
a b
[1,] 1 4
[2,] 2 5
[3,] 3 6
> c <- rbind(a,b)
> c
[,1] [,2] [,3]
a 1 2 3
b 4 5 6
vstack方法,可以实现多个数组垂直合并(即按行合并)
arrv=np.vstack((arr1,arr2,arr3))#可以实现多个array垂直合并
print(arrv)
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
hstack方法,同样可以实现多个数组水平合并(即按列合并)
arrh=np.hstack((arr1,arr2,arr4))#可以实现多个array水平合并
print(arrh)
[1 2 3 4 5 6 1 2 3 4 5 6]
concatenate方法,实现一维数组合并
ps:这里的axis应该默认是等于0的(因为手动令axis=0,不会出错且结果一致),等于0是按行合并,但是这里是按列合并的结果。且如果令axis=1,即按列合并,应该是这个结果,但会出错,目前水平不足无法解释这个问题。记着concatenate方法合并一维数组时,得到的是一个长数组就可以了。
arr=np.concatenate((arr1,arr2,arr1))#一维数组合并不需要axis属性
print(arr)
[1 2 3 4 5 6 1 2 3]
concatenate方法,实现矩阵按行合并
arr=np.concatenate((arr3,arrv),axis=0)#合并矩阵的列数要相等,axis=0垂直合并(即按行合并)
print(arr)
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
concatenate方法,实现矩阵按列合并
arr=np.concatenate((arr3,arr3),axis=1)#合并矩阵的行数要相等,axis=1水平合并(即按列合并)
print(arr)
[[1 2 3 1 2 3]
[4 5 6 4 5 6]]
一维数组的转置(一维数组转置和没转置一样)
print(arr1)
print(arr1.T)#一维数组转置和原来一样
print(arr1.shape)
print(arr1.T.shape)
[1 2 3]
[1 2 3]
(3,)
(3,)
np.newaxis给数组增加维度(这里是在行方向增加维度)
arr1_1=arr1[np.newaxis,:]#首先一维的数组是没有行和列的,在行位置增加维度,本来没有行,增加以后变成1行3列,
print(arr1_1)
print(arr1_1.shape)
[[1 2 3]]
(1, 3)
np.newaxis给数组增加维度(这里是在列方向增加维度)
arr1_2=arr1[:,np.newaxis]#在列位置增加维度,本来没有列,增加以后变成3行1列,
print(arr1_2)
print(arr1_2.shape)
[[1]
[2]
[3]]
(3, 1)
atleast_2d方法将数据结构转化为2维,2维或更高维数据结构使用此方法不发生变化
arr1_3=np.atleast_2d(arr1)#将数据转化为2维
print(arr1_3)
print(arr1_3.shape)
print(arr1_3.T)
print(arr1_3.T.shape)
[[1 2 3]]
(1, 3)
[[1]
[2]
[3]]
(3, 1)
atleast_3d方法将数据结构转化为3维,3维或更高维数据结构使用此方法不发生变化
三维数组转置和没转置一样
arr1_3=np.atleast_3d(arr1)#将数据转化为3维
print(arr1_3)
print(arr1_3.shape)
print(arr1_3.T)
print(arr1_3.T.shape)
[[[1]
[2]
[3]]]
(1, 3, 1)
[[[1]
[2]
[3]]]
(1, 3, 1)
7.array的分割
生存array数组
arr1=np.arange(12).reshape((3,4))
print(arr1)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
注意:在R中1代表行,2代表列,而在python中0代表行,1代表列。
split方法,实现分割array,axis=1代表按列分割(仅可以实现等份的分割,即分割后的array维度必须一致)
arr2,arr3=np.split(arr1,2,axis=1)#按列分割,分成2份
print(arr2)
print(arr3)
[[0 1]
[4 5]
[8 9]]
[[ 2 3]
[ 6 7]
[10 11]]
split方法,实现分割array,axis=0代表按行分割(仅可以实现等份的分割,即分割后的array维度必须一致)
arr4,arr5,arr6=np.split(arr1,3,axis=0)#按行分割,分成3份
print(arr4)
print(arr5)
print(arr6)
[[0 1 2 3]]
[[4 5 6 7]]
[[ 8 9 10 11]]
array_split方法,可以实现不等分割array,axis=1代表按列分割。实现不等分割时,由于分割后的array维度可能不一致,先分割出来的array维度要大,但分割后的array尽量维度差不多。
arr7,arr8,arr9=np.array_split(arr1,3,axis=1)#按列分割,分成3份,不等分割
print(arr7)
print(arr8)
print(arr9)
[[0 1]
[4 5]
[8 9]]
[[ 2]
[ 6]
[10]]
[[ 3]
[ 7]
[11]]
注意,vsplit和vstack相对应,按行分割或合并array,
hsplit和hstack相对应,按列分割或合并array。
vsplit方法,实现按行分割array,(同split方法,仅可以实现等份的分割)
arrv1,arrv2,arrv3=np.vsplit(arr1,3)#按行分割
print(arrv1)
print(arrv2)
print(arrv3)
[[0 1 2 3]]
[[4 5 6 7]]
[[ 8 9 10 11]]
hsplit方法,实现按列分割array,(同split方法,仅可以实现等份的分割)
arrh1,arrh2=np.hsplit(arr1,2)#按列分割
print(arrh1)
print(arrh2)
[[0 1]
[4 5]
[8 9]]
[[ 2 3]
[ 6 7]
[10 11]]
8.numpy的浅拷贝和深拷贝
生存array数组
arr1=np.array([1,2,3])
直接相等(=),即赋值操作,实现浅拷贝。
arr1,arr2共享一块内存空间(浅拷贝可以理解为给这块内存取了一个别名,还是同一个人只不过取了一个新名字)
arr2=arr1#浅拷贝
arr1和arr2实际上是一块内存(同一个人不同的名字),因此改变arr2,arr1也会发生改变
arr2[0]=5
print(arr1)
print(arr2)
[5 2 3]
[5 2 3]
copy方法,实现深拷贝
arr3又重新申请了一块内存空间,深拷贝(相当于又新生出一个人,对这个人发生改变并不会影响被拷贝的人)
arr3=arr1.copy()#深拷贝
深拷贝出的arr3和arr1没有任何关系(不同的人),arr3有自己的内存空间,因此改变arr3,arr1不会发生变化
arr3[0]=10
print(arr1)
print(arr3)
[5 2 3]
[10 2 3]
numpy基础到此结束!!!