目录
前言
为什么要学习numpy
(1)快速
(2)方便
(3)是科学计算的基础库
一、什么是numpy?
NumPy 是一个 Python 科学计算库的基础库。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。也是为后面机器学习打下基础。
二、numpy创建数组(矩阵)
2.1 数组示例
代码:
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array(range(10))
c = np.arange(10)
d = np.array([1.1,2.2,3.3])
print("a:", a)
print("b:", b)
print("c:", c)
print("array类型", type(a))
print("c存放数据类型", c.dtype)
print("d存放数据类型", d.dtype)
结果:
a: [1 2 3 4 5]
b: [0 1 2 3 4 5 6 7 8 9]
c: [0 1 2 3 4 5 6 7 8 9]
array类型 <class 'numpy.ndarray'>
c存放数据类型 int32
d存放数据类型 float64
numpy中常见的更多数据类型:
2.2 定义数据类型
代码:
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4,5], dtype=float)
c = np.array([1,2,3,4,5], dtype="float32")
d = np.array([1,0,0,0,1], dtype=bool)
print("a存放数据类型", a.dtype)
print("b存放数据类型", b.dtype)
print("c存放数据类型", c.dtype)
print("d:", d)
print("d存放数据类型", d.dtype)
#调整数据类型
d = d.astype(int)
print("d存放数据类型", d.dtype)
结果:
a存放数据类型 int32
b存放数据类型 float64
c存放数据类型 float32
d: [ True False False False True]
d存放数据类型 bool
d存放数据类型 int32
2.3 操作浮点数
代码:
import numpy as np
import random
a = np.array([random.random() for i in range(10)]) #生成十个0-1之间随机数
print("a:", a)
print("a.dtype:", a.dtype)
b = np.round(a, 3) #取小数点后几位
print("b:", b)
print("b.dtype:", b.dtype)
结果:
a: [0.53867519 0.53154411 0.17961852 0.09215703 0.21608598 0.77266274 0.55812637 0.55287423 0.3019635 0.68435789]
a.dtype: float64
b: [0.539 0.532 0.18 0.092 0.216 0.773 0.558 0.553 0.302 0.684]
b.dtype: float64
2.4 数组形状
代码:
import numpy as np
a = np.array([[3,4,5,6,7,8], [4,5,6,7,8,9]])
print("a:",a)
print("a.shape:", a.shape)
b = a.reshape(3,4)
print("b:",b)
print("b.shape:", b.shape)
c = b.reshape(1,12)
print("c:",c)
print("c.shape:", c.shape)
d = np.arange(24).reshape((2,3,4)) #2块数据,每一块数据是3*4
print("d.shape:", d.shape)
e = a.flatten() #按照行 列展开成一维
print("e:", e)
结果:
a: [[3 4 5 6 7 8]
[4 5 6 7 8 9]]
a.shape: (2, 6)
b: [[3 4 5 6]
[7 8 4 5]
[6 7 8 9]]
b.shape: (3, 4)
c: [[3 4 5 6 7 8 4 5 6 7 8 9]]
c.shape: (1, 12)
d.shape: (2, 3, 4)
e: [3 4 5 6 7 8 4 5 6 7 8 9]
三、数组计算
3.1 数组和数的计算
3.1.1 加减法
数组a加(或减)数b会在数组a中每一个元素都加上这个数b进行运算,这是numpy中的广播机制。
广播机制:如果两个数组的后缘长度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失或长度为1的维度上进行。
代码如下。
import numpy as np
a = np.array([[3,4,5,6,7,8], [4,5,6,7,8,9]])
b = 2
a = a+b
print(a)
结果:
[[ 5 6 7 8 9 10]
[ 6 7 8 9 10 11]]
3.1.2 乘除法
数组a乘(或者除)数b会在数组a中每一个元素都加上这个数b进行运算,代码如下。
import numpy as np
a = np.array([[3,4,5,6,7,8], [4,5,6,7,8,9]])
b = 2
a = a*b
print(a)
结果:
[[ 6 8 10 12 14 16]
[ 8 10 12 14 16 18]]
3.2 数组和数组计算
3.2.1 加减法
代码:
import numpy as np
a = np.arange(0,24).reshape(4, 6)
b = np.arange(100,124).reshape(4, 6)
c = a+b
print(c)
d = np.arange(0, 6)
e = a - d
print(e)
结果:
[[100 102 104 106 108 110]
[112 114 116 118 120 122]
[124 126 128 130 132 134]
[136 138 140 142 144 146]]
[[ 0 0 0 0 0 0]
[ 6 6 6 6 6 6]
[12 12 12 12 12 12]
[18 18 18 18 18 18]]
3.2.2 乘除法
矩阵a*(/)矩阵b是每个元素对应位置进行乘除法,代码如下。
import numpy as np
a = np.arange(0,24).reshape(4, 6)
b = np.arange(100,124).reshape(4, 6)
c = a*b
print("c:", c)
d = np.arange(0, 6)
e = a * d
print("e:",e)
结果:
c: [[ 0 101 204 309 416 525]
[ 636 749 864 981 1100 1221]
[1344 1469 1596 1725 1856 1989]
[2124 2261 2400 2541 2684 2829]]
e: [[ 0 1 4 9 16 25]
[ 0 7 16 27 40 55]
[ 0 13 28 45 64 85]
[ 0 19 40 63 88 115]]
3.2.3 矩阵点乘
矩阵点乘与矩阵乘法不同,矩阵点乘公式如下图。
代码中实现点乘使用np.dot()进行计算,代码如下:
import numpy as np
a = np.arange(0,9).reshape((3, 3))
b = np.arange(10,19).reshape((3, 3))
c = np.dot(a,b)
print(c)
结果:
[[ 45 48 51]
[162 174 186]
[279 300 321]]
四、轴(axis)
在numpy中轴可以理解为方向,使用0,1,2这些数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴。
有了轴的概念后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值。
五、numpy读取存储数据
采用np.loadtxt()读取外界数据,使用方法如下:
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
存储数据采用np.save("名称.npy", 数组)就可以。
六、numpy中的转置
转置是一种变换,对于numpy中的数组来说,就是在对焦方向交换数据。代码如下:
import numpy as np
a = np.arange(24).reshape(4, 6)
print(a.transpose())
print(a.swapaxes(1,0))
print(a.T)
以上三种方式均可以对矩阵a进行转置。
七、numpy的索引和切片
7.1 索引
代码:
import numpy as np
a = np.arange(24).reshape(4, 6)
print(a)
print("*"*10)
#取行
print(a[2]) #取第三行
print("*"*10)
#取连续多行
print(a[2:])
print("*"*10)
#取不连续多行
print(a[[0,2]])
print("*"*10)
#取列
print(a[:,2]) #取第三列
print("*"*10)
#取连续多列
print(a[:,2:5])
print("*"*10)
#取不连续多列
print(a[:,[0,2]])
print("*"*10)
#取行列,比如取第三行第四列的值
print(a[2,3])
print("*"*10)
#取多行多列,比如取第二行到第三行,第一列到第四列的结果
print(a[1:3, 0:4])
print("*"*10)
#取多个不相邻的点
print(a[[0,1,3], [0,3,1]]) #按照每个[]内数据按位找点
#点的结果是[0,0] [1,3] [3,1]
print("*"*10)
7.2 数值修改
代码:
import numpy as np
a = np.arange(24).reshape(4, 6)
print(a)
print("*"*10)
a[0,0]=5
print(a)
print("*"*10)
a[:,1:4] = 3
print(a)
结果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
**********
[[ 5 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
**********
[[ 5 3 3 3 4 5]
[ 6 3 3 3 10 11]
[12 3 3 3 16 17]
[18 3 3 3 22 23]]
7.3 numpy中三元运算符
numpy中三元运算符如下代码所示,会将a中小于10的数字替换为0,大于10的数字替换为20。代码如下:
import numpy as np
a = np.arange(24).reshape(4, 6)
print(a)
print("*"*20)
print(np.where(a<10,0,20))
结果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
********************
[[ 0 0 0 0 0 0]
[ 0 0 0 0 20 20]
[20 20 20 20 20 20]
[20 20 20 20 20 20]]
假设要将小于9的数字替换为9,大于15的数字替换为15,代码如下:
import numpy as np
a = np.arange(24).reshape(4, 6)
print(a)
print("*"*20)
print(a.clip(9,15))
结果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
********************
[[ 9 9 9 9 9 9]
[ 9 9 9 9 10 11]
[12 13 14 15 15 15]
[15 15 15 15 15 15]]
八、numpy中的nan和inf
nan不是一个数字,当我们读取本地文件为float的时候,如果有确实,会出现nan;当做了一个不合适的计算时候也会出现nan。
inf表示正无穷,-inf表示负无穷。当一个数字除以0时候会出现inf。
九,数组的拼接
9.1 水平、竖直拼接
简单的数组水平、竖直拼接代码:
import numpy as np
a = np.arange(0,12).reshape(2,6)
b = np.arange(12,24).reshape(2,6)
#竖状拼接
c = np.vstack((a,b))
print(c)
print("*"*20)
#水平拼接
c = np.hstack((a,b))
print(c)
结果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
********************
[[ 0 1 2 3 4 5 12 13 14 15 16 17]
[ 6 7 8 9 10 11 18 19 20 21 22 23]]
9.2 数组行列交换
代码:
import numpy as np
a = np.arange(0,12).reshape(3,4)
#行交换
a[[1,2],:]=a[[2,1],:]
print(a)
print("*"*20)
#列交换
a[:,[1,2]]=a[:,[2,1]]
print(a)
print("*"*20)
结果:
[[ 0 1 2 3]
[ 8 9 10 11]
[ 4 5 6 7]]
********************
[[ 0 2 1 3]
[ 8 10 9 11]
[ 4 6 5 7]]
十 其他
10.1 numpy其他函数
代码:
import numpy as np
a = np.arange(0,12).reshape(3,4)
#获取最大值与最小值的位置
print(np.argmax(a,axis = 0))#按列来看最大值的位置
print(np.argmin(a,axis = 0))#按行来看最大值的位置
#创建一个全为0的数组
b=np.zeros((3,4))
#创建一个全为1的数组
c=np.ones((3,4))
#创建一个对角线为1的正方形矩阵
d = np.eye(4)
10.2 numpy生成随机数
表中均匀分布与正态分布如下图: