Python基础入门 (三Numpy应用)

1. Numpy简介

2.数组创建和操作

3.赋值Copy和=

4.广播机制

5.常用函数

 

1. Numpy简介

开源的Python科学计算库,主要功能之一是用来操作数组和矩阵(开源,高效,稳定,可扩展)

 

2.数组创建和操作

2.1 创建数组

#一维数组的创建
a=np.array([2,3,4],dtype=np.int32)
print(a)
print(a.dtype)

#多维数组的创建
a=np.array([[1,2,3],[2,3,4]])
print(a)

#创建全零数组
a=np.zeros((2,4))
print(a)

#创建全一数组,同时指定数据类型
a=np.ones((3,4),dtype=np.int)
print(a)

#创建全空数组,每个数接近于0
a=np.empty((3,4))
print(a)

#创建连续数组
a=np.arange(1,10,2)  #1-10的数据,步长为2
print(a)

#reshape操作---改变数组的形状
a=np.arange(0,12,2)
print(a)
b=a.reshape((2,3))
print(b)

#创建连续型数据
a=np.linspace(1,10,5)  #首1,尾10,分成5个数据
print(a)
[2 3 4]
int32
[[1 2 3]
 [2 3 4]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
[[1.186e-321 0.000e+000 0.000e+000 0.000e+000]
 [0.000e+000 0.000e+000 0.000e+000 0.000e+000]
 [0.000e+000 0.000e+000 0.000e+000 0.000e+000]]
[1 3 5 7 9]
[ 0  2  4  6  8 10]
[[ 0  2  4]
 [ 6  8 10]]
[ 1.    3.25  5.5   7.75 10.  ]

2.2 基本操作和运算

一维矩阵运算

# 一维矩阵运算
a=np.array([1,2,3,4])
b=np.arange(4)
print(a,b)
c1=a-b   #对应相减
print(c1)
c2=a*b  #对应相乘
print(c2)
c3=a.dot(b)
print(c3)  #对应相乘再求和
c4=b**2
print(c4)  #相应位置平方
c5=np.sin(a)  #数学函数工具求sin
print(c5)
print(a<2)

[1 2 3 4] [0 1 2 3]
[1 1 1 1]
[ 0  2  6 12]
20
[0 1 4 9]
[ 0.84147098  0.90929743  0.14112001 -0.7568025 ]
[ True False False False]

多维矩阵运算

#多维矩阵运算
a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
print(a)
print(b)

c1=a.dot(b) #矩阵乘a*b
print(c1)

a=np.random.random((2,4))
print(a)
print(np.sum(a))
print(np.min(a))
print(np.mean(a))

c2=np.sum(a,axis=0) #按列进行求和
print(c2)

c3=np.sum(a,axis=1) #按行进行求和
print(c3)
[[1 1]
 [0 1]]
[[0 1]
 [2 3]]
[[2 4]
 [2 3]]
[[0.06649722 0.05433084 0.02834851 0.65647141]
 [0.6025922  0.77713191 0.56970899 0.65963372]]
3.414714800668307
0.02834851107015879
0.42683935008353835
[0.66908942 0.83146275 0.5980575  1.31610513]
[0.80564798 2.60906682]

矩阵基本计算

#矩阵基本计算
A=np.arange(2,14).reshape((3,4))
print(A)

print('最小值元素索引%d'% np.argmin(A))
print('最大值元素索引%d'% np.argmax(A))
print('整个矩阵的均值%f'% np.mean(A))
print(np.average(A))
print(A.mean())

print(np.median(A)) #中位数

print(np.cumsum(A))  #累加,每个位置的数是前边位置的和

print(np.diff(A)) #累差运算

B=np.array([[3,5,9],[4,8,10]])
print(np.nonzero(B))  #将非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵

A=np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.sort(A))#只是对每行进行递增排序

print(np.transpose(A)) #矩阵转置
print(A.T)

print(A)
print(np.clip(A,5,9))   
#clip(Array,Array_min,Array_max) 
#若Array中的元素在[Array_min,Array_max],则该对应位置为原数
#若Array中的元素在<Array_min,则该对应位置为Array_min
#若Array中的元素在>Array_max,则该对应位置为Array_max
[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
最小值元素索引0
最大值元素索引11
整个矩阵的均值7.500000
7.5
7.5
7.5
[ 2  5  9 14 20 27 35 44 54 65 77 90]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
[[11 12 13 14]
 [ 7  8  9 10]
 [ 3  4  5  6]]
[[14 10  6]
 [13  9  5]
 [12  8  4]
 [11  7  3]]
[[14 10  6]
 [13  9  5]
 [12  8  4]
 [11  7  3]]
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
[[9 9 9 9]
 [9 9 8 7]
 [6 5 5 5]]
#列表转为矩阵
array=np.array([[1,3,5],[4,6,9]])
print(array)

#维度
print('number of dim:',array.ndim)


#行数和列数
print('shape:',array.shape)

#元素个数
print('size:',array.size)
[[1 3 5]
 [4 6 9]]
number of dim: 2
shape: (2, 3)
size: 6

2.3 索引和切片

A=np.arange(3,15)
print(A)
B=A.reshape(3,4)
print(B)
print(B[2])
print(B[0,2])
print(B[0][2])

print(B[1,1:3])

#打印行
for row in B:
    print(row)
    
#打印列
for columns in B.T:
    print(columns) 
    
#多维转一维
A=np.arange(3,15).reshape((3,4))
print(A)
print(A.flatten())
#flat是一个迭代器,本身是一个object属性
for item  in A.flat:
    print(item)
[ 3  4  5  6  7  8  9 10 11 12 13 14]
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
[11 12 13 14]
5
5
[8 9]
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
[ 3  4  5  6  7  8  9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14

 

2.4 数组合并

#数组合并
A=np.array([1,1,1])
print(A)
B=np.array([2,2,2])
print(np.vstack((A,B)))  #vertical stack上下合并

C=np.vstack((A,B))
print(C)

print(A.shape,B.shape,C.shape)

D=np.hstack((A,B))
print(D)

print(A.shape,B.shape,D.shape)
#
[1 1 1]
[[1 1 1]
 [2 2 2]]
[[1 1 1]
 [2 2 2]]
(3,) (3,) (2, 3)
[1 1 1 2 2 2]
(3,) (3,) (6,)
#深度合并
b=np.array([[0,1,20,3,4,5],[6,7,8,9,10,11]])
c=b*2
arr_dstack=np.dstack((b,c))
print(arr_dstack.shape)
arr_dstack
(2, 6, 2)
array([[[ 0,  0],
        [ 1,  2],
        [20, 40],
        [ 3,  6],
        [ 4,  8],
        [ 5, 10]],

       [[ 6, 12],
        [ 7, 14],
        [ 8, 16],
        [ 9, 18],
        [10, 20],
        [11, 22]]])
#数组转置为矩阵
print(A[np.newaxis,:])
print(A[np.newaxis,:].shape)
print(A[:,np.newaxis])
[[1 1 1]]
(1, 3)
[[1]
 [1]
 [1]]
#多个矩阵合并p
print(A)
print(B)
A=A[:,np.newaxis]  #数组转置
B=B[:,np.newaxis]  #数组转置
print(A)
print(B)
[1 1 1]
[2 2 2]
[[1]
 [1]
 [1]]
[[2]
 [2]
 [2]]
#纵向合并
C1=np.concatenate((A,B),axis=0)
print(C1)
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]]
#横向合并
C2=np.concatenate((A,B),axis=1)
print(C2)
[[1 2]
 [1 2]
 [1 2]]

2.5 数组拆分

#构造矩阵
A=np.arange(12).reshape((3,4))
print(A)

#沿横向轴拆分(axis=1)
np.hsplit(A,2)

np.split(A,2,axis=1)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
print(A)
#沿纵向轴拆分(axis=0)
np.vsplit(A,3)

np.split(A,3,axis=0)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
#深度拆分
arr_dstack

np.dsplit(arr_dstack,2)
array([[[ 0,  0],
        [ 1,  2],
        [20, 40],
        [ 3,  6],
        [ 4,  8],
        [ 5, 10]],

       [[ 6, 12],
        [ 7, 14],
        [ 8, 16],
        [ 9, 18],
        [10, 20],
        [11, 22]]])
[array([[[ 0],
         [ 1],
         [20],
         [ 3],
         [ 4],
         [ 5]],
 
        [[ 6],
         [ 7],
         [ 8],
         [ 9],
         [10],
         [11]]]), array([[[ 0],
         [ 2],
         [40],
         [ 6],
         [ 8],
         [10]],
 
        [[12],
         [14],
         [16],
         [18],
         [20],
         [22]]])]

3.赋值Copy和=

#=号赋值的关联性
a=np.arange(4)
print(a)

b=a
c=a
d=b
print(b)
print(c)
print(d)
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
a[0]=11  #a中元素发生改变,b,c,d中的元素同样变化
print(a)
print(b)
print(c)
print(d)

d[1:3]=[12,13] #d中元素发生变化,a,b,c中的元素同样变化
print(a)
print(b)
print(c)
print(d)
[11  1  2  3]
[11  1  2  3]
[11  1  2  3]
[11  1  2  3]
[11  1  2  3]
[11  1  2  3]
[11  1  2  3]
[11  1  2  3]
#copy()赋值没有关联性
a=np.arange(4)
print(a)
b=a.copy()
print(b)

a[3]=44
print(a)
print(b)
[0 1 2 3]
[0 1 2 3]
[ 0  1  2 44]
[0 1 2 3]

 

4.广播机制

当数组跟一个标量进行计算时,标量需要根据数组的形状进行扩展,然后执行运算。该扩展过程称为“广播”

a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
b=np.array([0,1,2])
print(a+b) #a,b的维度不一样,在进行计算的时候会将b广播后计算
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]
#相当于将b重复多次
b=np.tile([0,1,2],(4,1)) #b行重复4次,列重复1次
print(a)
print(b)
print(a+b)
[[ 0  0  0]
 [10 10 10]
 [20 20 20]
 [30 30 30]]
[[0 1 2]
 [0 1 2]
 [0 1 2]
 [0 1 2]]
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

类型转换

#数组转换成list,使用tolist()
a=np.array([[0,1,20,3,4,5],[6,7,8,9,10,11]])
print(a.tolist())

#转换成指定类型
print(a.astype(float))
[[0, 1, 20, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
[[ 0.  1. 20.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]]

5.常用函数

#bincount()计算索引出现次数
x=np.array([1,2,3,3,0,1,4,0])
print(np.bincount(x))
#索引0出现2次,索引1出现2次,索引2出现1次,索引3出现2次,索引4出现1次,所以输出[2,2,1,2,1]
#x中最大数为4,那么bin中统计的索引只能为0-4的5个数字,统计它们在x中出现的次数
[2 2 1 2 1]
w=np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1,0.2])
print(np.bincount(x,weights=w))

print(np.bincount(x,weights=w,minlength=7))  #bincount中元素为5个,当设置长度为7时,后边两位设为0
 0.3 -0.6  0.5  1.3  1. ]
[ 0.3 -0.6  0.5  1.3  1.   0.   0. ]
#argmax
x=[[1,3,3],[7,5,2]]
print(np.argmax(x)) #返回最大元素中的位置
print(np.argmax(x,axis=0))  #按列操作返回最大元素的索引位置
print(np.argmax(x,axis=1))  #按行操作返回最大元素的索引位置,对于同为最大值,返回第一个的位置索引即可
3
[1 1 0]
[1 0]
#求取精度
print(np.around([-0.6,1.2798,2.357,9.67,13],decimals=0))
print(np.around([1.2798,2.357,9.67,13],decimals=1))
print(np.around([1.2798,2.357,9.67,13],decimals=2))  #decimals指定保留有效数的位数
print(np.around([1,2,5,6,56],decimals=-1)) #-1表示看最后一位数决定是否进位,大于5进位,小于5省去
print(np.around([1,2,5,6,56],decimals=-2)) #-2表示看最后两位数决定是否进位,大于50进位,小于50省去
[-1.  1.  2. 10. 13.]
[ 1.3  2.4  9.7 13. ]
[ 1.28  2.36  9.67 13.  ]
[ 0  0  0 10 60]
[  0   0   0   0 100]

 

#取整
#向下取整
np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])
#向上取整
np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])
array([-1., -2., -1., -2.,  0.,  1.,  1.])
array([ 2.,  2.,  2.,  3.,  2., -0., -0., -0.])
#查找
x=np.array([[1,0],[2,-2],[-2,1]])
x
np.where(x>0,x,0)  #大于0的数不变,小于0的值用0填充
array([[ 1,  0],
       [ 2, -2],
       [-2,  1]])
array([[1, 0],
       [2, 0],
       [0, 1]])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值