# Author:Nimo_Ding
# numpy是Python中使用最多的第三方库,而且是scipy、pandas等数据科学的基础库。
# numpy所提供的数据结构是Python数据分析的基础。
# 列表list的元素在系统内存中是分散存储的;而numpy数组存储在一个均匀连续的内存块中,
# 这样数组计算遍历所有的元素,不像列表list还需要对内存地址进行查找,从而节省了计算资源。
# 有两个重要的对象:
# ndarray - N-dimensional array object
# ndarray实际上是多维数组的含义
import numpy as np
print('# 用array函数创建数组:')
a=np.array([1,2,3])
b=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
b[1,1]=10
print(a.shape)
# (3,)
print(b.shape)
# (3, 3)
print(a.dtype)
# int64
print(a)
# [1 2 3]
print(b)
# [[ 1 2 3]
# [ 4 10 6]
# [ 7 8 9]]
print('\n# 用dtype定义结构类型:')
persontype=np.dtype({
'names':['name','age','chinese','math','english'],
'formats':['S32','i','i','i','f']
})
# 定义数组时指定了结构数组的类型dtype=persontype。
peoples=np.array([
("zhangfei",32,78,89,90),
("zhaoyun",23,87,98,69),
("guanyu",27,77,88,99),
("zhaosi",32,79,89,99)],
dtype=persontype)
ages = peoples[:]['age']
chineses = peoples[:]['chinese']
maths = peoples[:]['math']
englishs = peoples[:]['english']
print(peoples)
print(np.mean(ages)) # 28.5
print(np.mean(chineses)) # 80.25
print(np.mean(maths)) # 91.0
print(np.mean(englishs)) # 89.25
print('\n# ufunc - universal function object:')
# 对数组中每个元素进行函数操作
# 使用arange、linspace函数创建连续数组,等差数组
# 这两个结果一样,但是创建方式不一样。
x1=np.arange(1,11,2) # 定义初始值、最终值、步长
x2=np.linspace(1,9,5) # 定义初始值、最终值、元素个数,默认是包括最终值的。
print(x1)
# [1 3 5 7 9]
print(x2)
# [1. 3. 5. 7. 9.]
print('\n算术运算:')
# 进行加减乘除、求n次方、取余数运算
print(np.add(x1,x2))
# [ 2. 6. 10. 14. 18.]
print(np.subtract(x1,x2))
# [0. 0. 0. 0. 0.]
print(np.multiply(x1,x2))
# [ 1. 9. 25. 49. 81.]
print(np.divide(x1,x2))
# [1. 1. 1. 1. 1.]
print(np.power(x1,x2)) # x1的x2次方
# [1.00000000e+00 2.70000000e+01 3.12500000e+03 8.23543000e+05
# 3.87420489e+08]
print(np.remainder(x1,x2)) # remainder和mod是一样的效果,取余
print(np.mod(x1,x2))
# [0. 0. 0. 0. 0.]
print('\n统计函数:')
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)
print(np.amin(a)) # 数组/矩阵中的元素沿指定轴的最小值
# 1
print(np.amin(a,0))
# axis=0,列的概念,把a看成三个元素[1,4,7],[2,5,8],[3,6,9]
# 取出每个元素中最小值
# 即[1 2 3]
print(np.amin(a,1))
# [1 4 7] 行中最小值
print(np.amax(a)) # 数组/矩阵中最大值
# 9
print(np.amax(a,0))
# [7 8 9] 列中最大值
print(np.amax(a,1))
# [3 6 9] 行中最大值
print('\n统计最大值与最小值之差ptp()')
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(np.ptp(a)) # 9-1=8
print(np.ptp(a,0)) # 最大值的列[7,8,9]与最小值的列[1,2,3]之差为[6 6 6]
print(np.ptp(a,1)) # 最大值的行[3,6,9]与最小值的行[1,4,7]之差为[2 2 2]
print('\n统计数组的百分位数percentile()')
# percentile代表
print(a)
print(np.percentile(a,0)) # 0表示最小值
print(np.percentile(a,50)) # 50表示求平均值
print(np.percentile(a,50,axis=0)) # 对列求平均值[4. 5. 6.]
print(np.percentile(a,50,axis=1)) # 对行求平均值[2. 5. 8.]
print('\n统计数组的中位数median()、平均数mean()')
print(a)
print(np.median(a))
print(np.median(a,axis=0)) # 列的中位数[4. 5. 6.]
print(np.median(a,axis=1)) # 行的中位数[2. 5. 8.]
print(np.mean(a))
print(np.mean(a,axis=0)) # 列的平均值[4. 5. 6.]
print(np.mean(a,axis=1)) # 行的平均值[2. 5. 8.]
print('\n统计数组的加权平均值average()')
a=np.array([1,2,3,4])
wts=np.array([1,2,3,4])
print(np.average(a))
# 2.5
print(np.average(a,weights=wts))
# (1*1+2*2+3*3+4*4)/(1+2+3+4)=3
# 3.0
print('\n统计数组的标准差std()、方差var()')
print(a)
# [1 2 3 4]
# 1、标准差:方差的算术平方根,代表的是一组数据离平均值的分散程度
print(np.std(a))
# 1.118033988749895
# 2、方差:每个数值和平均值之差的平方求和的平均值mean((x-x.mean(a))**2)
# mean((1-2.5)^2+(2-2.5)^2+(3-2.5)^2+(4-2.5)^2)
print(np.var(a))
# 1.25
print('\nnumpy排序')
a=np.array([[4,3,2],
[2,4,1]])
print(a)
print('np.sort(a):')
print(np.sort(a))
# [[2 3 4]
# [1 2 4]]
print('np.sort(a,axis=None),不根据轴来排序,变成了一个列表:')
print(np.sort(a,axis=None))
# [1 2 2 3 4 4]
print('\nnp.sort(a,axis=0): 根据列来排序')
print(np.sort(a,axis=0))
# [[2 3 1]
# [4 4 2]]
print('\nnp.sort(a,axis=1): 根据行来排序')
print(np.sort(a,axis=1))
# [[2 3 4]
# [1 2 4]]
print('\nnp.sort(a,axis=-1,kind="quicksort",order=None):')
print(np.sort(a,axis=-1,kind='quicksort',order=None))
# 默认使用的是快速排序。
# [[2 3 4]
# [1 2 4]]
print('''
\n练习题:统计全班成绩
假设一个团队里有5名学员,成绩如下表所示。你可以用NumPy 统计下这些人
在语文、英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。
然后把这些人的总成绩排序,得出名次进行成绩输出
''')
persontype=np.dtype({
'names':['name','chinese','english','math'],
'formats':['S32','i','i','i']
})
students=np.array([
("zhangfei",66,65,30),
("guanyu",95,85,98),
("zhaoyun",93,92,96),
("huangzhong",90,88,77),
("dianwei",80,90,90)
],dtype=persontype)
names =students[:]['name']
chineses=students[:]['chinese']
englishs=students[:]['english']
maths =students[:]['math']
def student(name,subject):
print(name,':',np.average(subject),
np.min(subject),
np.max(subject),
round(np.var(subject),2),
round(np.std(subject),2))
print("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差")
student("语文",chineses)
student("英语",englishs)
student("数学",maths)
print('rank:')
print(sorted(students,
key=lambda x:x[1]+x[2]+x[3],
reverse=True))