python中numpy科学计算库的基本使用(二)

上接python中numpy科学计算库的基本使用(一)

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基础到此结束!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值