02-Numpy基础详解
Numpy
Numpy介绍: Numpy是高性能科学计算和数据分析的基础包。它是Pandas等其他各种工具的基础。
Numpy主要功能:
- ndarray: 一个多维数组,高效且节省空间
- 无需循环对整组数据进行快速运算的数学函数
- 线性代数、随机数生成和傅里叶变换函数
Numpy引用方式: import numpy as np
Numpy-基础
Numpy提供了ndarray数组对象, 数组和列表的区别是:
- 数组对象内的元素类型必须相同
- 数组大小不可修改
假设我要统计50家市值在100万到200万之间的公司的数据,并且换算其RMB市值,可以使用numpy进行如下处理
- 已知若干家跨国公司的市值(美元),将其换算成RMB
import numpy as np
import random
a = [random.uniform(100.0,200.0) for i in range(50)]
# 第一种方法换算外汇
b = []
for ele in a:
ele = ele * x
b.append(ele)
print(b)
# 第二种方法换算外汇
aofarray = np.array(a)
aofarray * x
# 两种方法得到的结果相同,使用了Numpy后,再也不需要用循环
- 已知购物车中每件商品的价格与商品件数,求其总金额
c = [random.randint(1,10) for i in range(50)]
d = [random.randint(5,20) for i in range(50)]
c = np.array(c)
d = np.array(d)
c*d
Numpy-ndarray
01-ndarray创建
我们可以通过直接传入列表或者随机生成数据来创建数组,代码如下:
# 将列表转化为数组
test1 = np.array([1,2,3,4,5])
# 随机生成数组,元素为10个
test2 = np.array(range(10)]
test3 = np.array([9,8,7,6,5,4,3,2,1,8])
# test1 不可以和 test2相乘 一个有5个元素,另一个有10个元素
# test3 可以和 test2相乘 都只有10个元素
# 创建一个数组,元素值全为0,内有10个元素,元素类型默认是float64
test4 = np.zeros(10)
# 创建一个数组,元素值全为0,内有10个元素,元素类型设定是int 64
test5 = np.zeros(10,dtype='int')
# 创建一个数组,元素值全为1,内有10个元素,元素类型默认是float 64
test6 = np.ones(10)
# 创建一个数组,元素值全为1,内有10个元素,元素类型设定是int 64
test7 = np.ones(10,dtype='int')
# 创建一个数组,元素值为随机,内有10个元素,取的是内存里的值
test8 = np.empty(100)
# 创建一个数组,里面数据为以1为步长的数列(默认),前包后不包
test9 = np.arange(2,10)
# 创建一个数组,里面数据为以2为步长是数列
test10 = np.arange(2,10,3)
# 创建一个数组,里面是线性空间,传入参数(起始值、终止值、数组大小),前后都包
test11 = np.linspace(1,100,99) # 常用于画函数图像
# 创建一个数组,里面是线性代数里的单位矩阵,传入参数为矩阵的行列
test12 = np.eye(10)
02-ndarray函数
# 输出数组中的数据类型
testarray.dtype
# 输出数组中元素的个数
testarray.size
# 输出数组的维数
testarray.ndim
# 输出数组的维度
testarray.shape
# 输出转至后的数组
testarray.T
03-ndarray索引和切片
# 与标量进行运算
testarray = np.arange(10)
# 数组内元素统一加一
testarray +1
# 数组内元素同意乘三
testarray *3
# 比较两个数组内元素的大小
testarray1 = testarray+1
testarray1 > testarray
# 生成二维数组
testarray2 = np.arange(15).reshape(3,5)
# 切片
testarray3 = testarray[0:4]
testarray3[0]=1
# 此时testarray[0]也会被修改,因为这是视图,没有拷贝
# 拷贝
testarray4 = testarray[0:4].copy()
testarray4[1] = 100
# 此时testarray[1]不会被修改,因为这是拷贝
# 二维切片
testarray5 = np.arange(15).reshape(3,5)
testarray6 =testarray5[0:2,0:2]
04-布尔型索引
# 随机生成一个列表,筛选出列表中大于50的数
import random
list1 =[random.randint(0,100) for i in range(10)]
list2 = list(filter(lambda x:x>5,a))
# 随机生成一个数组,筛选出数组中大于50的数
a=np.array([random.randint(0,100) for i in range(10)])
a[a>50]
# 随机生成一个数组,筛选出数组中大于50的偶数
a=np.array([random.randint(0,100) for i in range(10)])
b = a[(a>50) & (a%2 ==0)]
b[b%2==0]
# 生成一个元素个数为4的列表,输出第一项与最后一项
testarray = np.arange(4)
testarray[[True,False,False,True]]
# 运行结果为array([0,3])
05-花式索引
# 生成一个数组, 使用花式索引取其中:1、3、5、7、9的数据
a = np.arange(20)
a[[1,3,5,7,9]]
# 生成一个三行五列数组,选择其中第二行,第二列到第四列
b = np.arange(15).reshape(3,5)
b[1,1:4]
06-通用函数
通用函数: 指的是能够同时对数组中所有元素进行运算的函数
常见通用函数:
- 一元函数: abs、sqrt、exp、log、ceil、floor、rint、trunc、modf、isnan、isinf、cos、sin、tan
- 二元函数: add、substract、multiply、divide、power、mod、maximum、minimum
常见一元函数的使用
a1=np.array([random.randint(-100,100) for i in range(10)])
# 绝对值
abs(a1)
# 开根号
np.sqrt(abs(a1)) # 负数无法开根号,这里需要注意
# 四舍五入,向零取整
a = 1.6
round(a) #输出值为2
# 四舍五入,向下取整
u = 1.6
math.floor(u) #输出值为1
# 四舍五入,向上取整
u = 1.6
math.ceil(u) #输出值为1
# 截断浮点数
t = 2.53454
np.trunc(t) #输出值为2.0
# np所可以使用的一元通用函数
# np.floor()
# np.ceil()
# np.round()
# np.trunc()
# np.rint()
# np.modf() #剥离数组中的小数部分和整数部分,返回一个元组,元组中包含两个数组
特殊值补充:
- nan(Not a number): 不等于任何浮点数,nan!=nan
- inf(infinity):比任何浮点数都大
- Numpy中可以使用np.nan,np.inf创建特殊值,并且nan常用于表示缺失数据值
07-统计方法和随机数生成
统计函数
# 求数组中数据的总和
testarray.sum()
# 求数组中数据的平均值
testarray.mean()
# 求方差,方差为每个数减去均值的结果的平方和再除以数的个数
testarray.var()
# 求标准差,标准差为方差再开根号
testarray.std()
# 求最大值
testarray.max()
# 求最小值
testarray.min()
# 求最大值的下标
testarray.argmax()
# 求最小值的下标
testarray.argmin()
# 求正态分布百分之60数据所在的区间
print("(",testarray.mean()-testarray.std(),",",testarray.mean()+testarray.std(),")")
# 结果为( 10.961648432337965 , 39.54340207271254 )
随机数的生成
import random
# 随机生成一个数
random.random()
# 随机生成一个a-b之间的整数,前后取闭集
random.randint(1,10)
# 随机返回列表中一个数
random.choice([1,2,3,4,5])
random.choice([1,2,3,4,5],10) #出10次
# 随机打乱一个数组
random.shuffle(testarray)
# 随机生成一个x行y列的数组,范围从0-10
np.random.randint(0,10,(x,y))