Nupmy
numpy的核心是名为ndarray
的数据类型,它代表多维数组,封装了操作数据的运算和方法
1. 创建数组对象
1.1 方法1:array
- 通过array将list转换成数据对象
# 通过array将list转换成数据对象
array1=np.array([1,2,3,4,5])
array1 # array([1, 2, 3, 4, 5])
array2=np.array([[1,2,3],[4,5,6]])
array2 # array([[1, 2, 3],[4, 5, 6]])
type(array1) # numpy.ndarray
1.2 方法2:arrage
# 方法2:通过arrage函数指定范围和跨度创建数据对象
# 左闭右开
array3=np.arange(1,100,2)
array3
1.3 方法3、4:linespace和logspace
- linespace: 生成等差数列的数组
- logspace: 生成等比数列的数组
# 方法3:通过linspace函数生成等差数列的数组
array4=np.linspace(-5,5,11)
array4 # array([-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.])
# 方法4:通过logspace函数生成等比数列的数组
# 从2^1 到 2^10,取20个
array5=np.logspace(1,10,base=2,num=20)
array5
array6=np.logspace(1,10,num=20)
array6
1.4 方法5:fromstring
- 从字符串中获取数据创建数组
# 方法5:通过fromstring函数从字符串中获取数据创建数组
array6 = np.fromstring('1,2,3',sep=',',dtype='i8')
array6 # array([1, 2, 3], dtype=int64)
1.5 方法6:fromfile
- 文件中读取数组创建数组对象
# 方法6:从文件中读取数组创建数组对象
array8=np.fromfile('priem.text',sep='\n',dtype='i8')
print(array8)
1.6 方法7:迭代器fromiter
# 迭代器 - 实现了迭代器新协议的对象,携带其协议是两个魔术方法:__iter__、__next__
# 生成器是迭代器的语法简化版本
def fib(n):
a,b=0,1
for _ in range(n):
a,b=b,a+b
yield a
gen = fib(50)
gen
gen1 = fib(150)
gen1
# 方法7:通过fromiter函数从迭代器中获取数据创建数组对象
array9 = np.fromiter(gen,dtype='i8')
array9
1.7 方法8:随机数
- 生成随机元素创建数组对象
1)一维数组
# 方法8:生成随机元素创建数组对象
array10 = np.random.randint(1,100,size=20)
array10 # array([83, 92, 75, 62, 48, 88, 48, 90, 38, 32, 23, 76, 20, 91, 41, 8, 75,36, 88, 36])
2)二维数组
# 二维数组
array11 = np.random.randint(1,100,size=(5,3))
array11 # array([[14, 82, 94],[21, 17, 32],[60, 59, 22],[91, 8, 8],[ 1, 72, 99]])
3)三维数组
# 三维数组
array12 = np.random.randint(1,100,size=(3,5,4))
array12
4)小数数组
# 小数的数组
array13 = np.random.random(size=(2,3))
array13 # array([[0.14019347, 0.44462814, 0.83160303],[0.72572949, 0.78566251, 0.72816835]])
array13 = np.random.random(size=(3))
array13 # array([0.60514807, 0.76696852, 0.50408056])
5)正太分布
# 正态分布
array14 = np.random.normal(0,1,5000)
array14
6)二项分布
# 二项分布
array15=np.random.binomial(10,0.5,size=1000)
array15
1.8 方法9:ones
- 创建全1的数组
# 方法9:通过ones函数创建全1的数组
# 浮点型
array15=np.ones((5,3))
array15
1.9 方法10:zeros
- 创建全0的数组
# 方法10:通过zeros函数创建全0的数组
array16=np.zeros(10)
array16 # array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
1.10 方法11:full
- 创建指定值的数组
# 方法11:通过full函数创建指定值的数组
array17=np.full((2,3),100)
array17 # array([[100, 100, 100],[100, 100, 100]])
1.11 方法12:eye
- 单位矩阵
array18=np.eye(5)
array18 # 五行五列单位矩阵
1.12 方法13:加载图片创建
# 加载图片创建 - image
array19 = plt.imread('res/4.jpeg')
array19
# 数组形状
array19.shape # (400, 400, 3)
# 数组元素个数
array19.size # 480000
# 数组维度
array19.ndim # 3
# 数组数据类型
array19.dtype # dtype('uint8')
# 数组元素占用内存空间大小
array19.itemsize # 1
# 整个数组占用内存空间大小
array19.nbytes # 480000
2.数组对象的索引运算
2.1 普通索引
array20 = np.random.randint(1,100,10)
array20 # array([51, 25, 21, 52, 15, 80, 41, 75, 22, 45])
array20[0] # 51
array20[0]=99
array20[0] # 99
array20[-10] # 99
array21 = np.random.randint(60,101,(5,3))
array21
'''
array([[69, 99, 83],
[69, 84, 61],
[61, 62, 66],
[72, 75, 95],
[88, 74, 93]])
'''
array21[0] # array([69, 99, 83])
array21[0][0] # 69
array21[0,0] # 69
array21[-2,-1] # 95
2.2 花式索引
- 用整数列表或数组充当数组索引
1)一维
array20 # array([99, 25, 21, 52, 15, 80, 41, 75, 22, 45])
array20[[2,4,5,-1]] # array([21, 15, 80, 45])
array20[np.arange(5)] # array([99, 25, 21, 52, 15])
2)二维
array21
'''
array([[69, 99, 83],
[69, 84, 61],
[61, 62, 66],
[72, 75, 95],
[88, 74, 93]])
'''
array21[[1,2]] # array([[69, 84, 61],[61, 62, 66]])
array21[[1,2],[0,1]] # array([69, 62])
array21[[1,2,-1],[0,1,-1]] # array([69, 62, 93])
2.3 布尔索引
- 用保存布尔值的数组或列表充当数组索引
array20 # array([99, 25, 87, 19, 94, 25, 8, 72, 32, 41])
# 跳过False,保留True
array20[[False,True,True,True,True,True,False,True,False,False]] # array([25, 87, 19, 94, 25, 72])
array20>=60 # array([ True, False, True, False, True, False, False, True, False,False])
array20[array20>=60] # array([99, 87, 94, 72])
array20[array20 % 2 == 0] # array([94, 8, 72, 32])
1)& 取两个数组对应布尔值做and运算
2)| 取两个数组对应布尔值做or运算
3)~ 对数组做not运算
array20[(array20>=40) & (array20 % 2 == 0)] # array([94, 72])
array20[(array20>=40) | (array20 % 2 == 0)] # array([99, 87, 94, 8, 72, 32, 41])
array20[~(array20>=40) | (array20 % 2 == 0)] # array([25, 19, 94, 25, 8, 72, 32])
2.4 切片索引
1)一维
array20 # array([99, 25, 87, 19, 94, 25, 8, 72, 32, 41])
array20[2:6] # array([87, 19, 94, 25])
2)二维
array21
'''
array([[ 73, 90, 100],
[ 72, 68, 70],
[ 61, 79, 70],
[ 84, 82, 74],
[ 81, 64, 98]])
'''
array21[::2,::2]
'''
array([[ 73, 100],
[ 61, 70],
[ 81, 98]])
'''
array21[:2,1:]
'''
array([[ 90, 100],
[ 68, 70]])
'''
array21[2] # array([61, 79, 70])
array21[2:,:]
'''
array([[61, 79, 70],
[84, 82, 74],
[81, 64, 98]])
'''
3. 数组对象方法
- 获取描述性统计信息
array20 # array([99, 25, 87, 19, 94, 25, 8, 72, 32, 41])
# 算术平均
array20.mean() # 50.2
np.mean(array20)
# 中位数
np.median(array20)
# 排序
np.sort(array20) # array([ 8, 19, 25, 25, 32, 41, 72, 87, 94, 99])
# 百分位数
# 50%分位数
np.quantile(array20,0.5)
# [0.25,0.5,0.75] - [Q1下四分位数,Q2中位数,Q3上四分位数]
np.quantile(array20[0.25,0.5,0.75])
# 最大值
array20.max()
# 最小值
array20.min()
# 极差 - peak to peak
array20.ptp()
np.ptp(array20)
# 四分位距离
q1,q3 = np.quantile(array20,[0.25,0.75])
# 总体方差
# ddof = 0
array20.var()
# 样本方差
np.var(array20,ddof=1)
# 标准差
array20.std()
# 样本标准差
np.std(array20,ddof=1)
array21
'''
array([[ 73, 90, 100],
[ 72, 68, 70],
[ 61, 79, 70],
[ 84, 82, 74],
[ 81, 64, 98]])
'''
# 对每列求均值
array21.mean(axis=0) # array([74.2, 76.6, 82.4])
# 对每行求均值
array21.mean(axis=1).round(1) # array([87.7, 70. , 70. , 80. , 81. ])
# 总体最值
array21.max()
4. 其他方法
array20 # array([ 8, 19, 25, 25, 32, 41, 72, 87, 94, 99])
array20.dtype # dtype('int32')
array22 = array20.astype('f8') # array([99., 25., 87., 19., 94., 25., 8., 72., 32., 41.])
array20.dtype # dtype('float64')
array22 = array22.astype('i8')
array22.dtype ## dtype('int64')
# 数组元素转换类型
array22 = np.arange(1,61)
array22
array22.reshape(3,20) # 从一维变成二维(3行20列)
array22.reshape(3,4,5) # 变成三维(4行5列)
array22.reshape(-1,3) # 变成二维(有三列)
array22.reshape(3,-1) # 变成二维(有三行)
# 将数组写进二进制文件中
# pickle序列化-python私有协议
array22.reshape(-1,4).dump('../res/my_array')
# 从二进制文件中加载数组对象
# allow_pickle=True - 允许反序列化(有风险操作)
array23 = np.load('../res/my_array',allow_pickle=True)
# 二维数组用tofile读入,维度会坍塌
array23.tofile('../res/my_array',sep=',')
array23
# 数组扁平化
array23.flatten()
- nonzero
array24=np.array([0,0,0,0,0,0,25,0,0,0,0,0,98,0,0,0])
array24 # array([ 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 98, 0, 0, 0])
array24.nonzero() ## (array([ 6, 12], dtype=int64),)
array24[array24.nonzero()] # array([25, 98])
- 排序
# 排序 - 返回新对象
np.sort(array20)
# 排序 - 就地排序,直接改变原顺序
array20.sort()
array20
- tolist:转化成列表
# 将数组转化成列表
my_list = array20.tolist()
my_list # [8, 19, 25, 25, 32, 41, 72, 87, 94, 99]