科普
"""
很多编程语言对数字精确度不是很敏感 python亦是如此
1234567890.0987654321
1234567890.01
但是python又可以做人工智能 机器学习 量化交易 数据分析等高精确度的工作
内部其实就是通过相应的模块来实现
"""
简介:
1.Numpy是高性能科学计算和数据分析的基础包
2.也是pandas等其他数据分析的工具的基础
3.NumPy具有多维数组功能,运算更加高效快速
下载模块
在notebook中如果需要执行pip命令下载模块
只需要在命令行的开头加上一个感叹号即可
!pip3 install numpy
"""
在安装完anaconda之后该软件也会给我们提供一个下载模块的工具
conda使用方式与pip一致
conda install numpy
"""
导入模块
import numpy
import numpy as np # 更加倾向于起别名 np
前戏:
"""
notebook单元格左侧如果是星号表示当前单元格正在执行 是数字表示执行完毕
"""
# 身高
height = [170,173,178,180,183]
# 体重
weight = [76,65,70,77,75]
'''求BMI指数:身体质量指数=体重(KG)/身高(m)的平方'''
BMI = weight/(height/100)**2 # 理想完美 现实报错
import random
# 伪造数据
h = [ ]
w = [ ]
for i in range(100000000):
h.append(random.randint(153,180))
w.append(random.uniform(51,88))
'''纯python代码实现'''
import time
# for循环计算
start_time = time.time()
for i in range(100000000):
w[i]/(h[i]/100) ** 2
end_time = time.time() - start_time
end_time
'''numpy解决方案'''
import numpy as np
H = np.array(h)
W = np.array(w)
# 数组运算
start_time = time.time()
BMI = W/(H/100)**2
end_time = time.time() - start_time
end_time
多维数组:
"""
numpy中同一个数组内所有数据数据类型肯定是一致的
np.array([1,2,False]) >>> array([1, 2, 0])
np.array([1,2,3.1]) >>> array([1.,2.,3.1])
numpy中进行数据操作的时候同一个数组内所有的数据都挨个对应参与操作
a1 = np.array([1,2,3,4])
a2 = np.array([7,8,9,1])
a1 + a2 >>> array([ 8, 10, 12, 5])
a1 * 10 >>> array([10, 20, 30, 40])
"""
# 一维数组
np.array([1,2,3,4])
# 二维数组(矩阵)
np.array([[1,2,3,4],[9,8,7,6]])
数据类型:
布尔型 bool_
整型 int_ int8 int16 int32 int64
int32只能表示(-2**31,2**31-1),因为它只有32个位,只能表示2**32个数
无符号整型 uint8 uint16 uint32 uint64
浮点型 float_ float16 float32 float64
复数型 complex_ complex64 complex128
"""
1.为什么numpy数据类型以数字居多
因为numpy主要用于科学计算 只有数字可以参与计算
2.为什么有些数据类型后面加下划线
因为为了跟python数据类型关键字区分开
"""
常用属性:
T 数组的转置(对高维数组而言)
li1 = [
[1,2,3],
[4,5,6]
]
a = np.array(li1)
a.T
执行结果:
array([[1, 4],
[2, 5],
[3, 6]])
就相当于是将行变成列,列变成行,它也是一个比较常用的方法
dtype 数组元素的数据类型
size 数组元素的个数
ndim 数组的维数
shape 数组的维度大小(以元组形式)
常用方法:
"""如何查看某个方法的使用说明"""
方式1:在方法后面跟问号执行即可
方式2:写完方法名后先按shift不松开然后按tab即可(shift+tab)
array() 将列表转换为数组,可选择显式指定dtype
arange() range的numpy版,支持浮点数
np.arange(1,10,2)
np.arange(1.2,10,0.4)
linspace() 类似arange(),第三个参数为数组长度
np.linspace(1,10,20)
# 这个方法与arange有一些区别,arange是顾头不顾尾,而这个方法是顾头又顾尾,在1到10之间生成的二十个数每个数字之间的距离相等的,前后两个数做减法肯定相等
zeros() 根据指定形状和dtype创建全0数组
np.zeros((3,4))
ones() 根据指定形状和dtype创建全1数组
np.ones((3,4))
empty() 根据指定形状和dtype创建空数组(随机值)
np.empty(10)
eye() 根据指定边长和dtype创建单位矩阵
np.eye(5)
索引与切片:
1.针对一维数组 索引与切片操作跟python中的列表完全一致
2.花式索引(间断索引)
age[[0,2,5]]
3.布尔值索引(逻辑索引)
age[age>15]
4.针对二维数组索引与切片有些许复杂
res[行索引(切片),列索引(切片)]
如果需要获取二维数组的所有行或列元素,那么,对应的行索引或列索引需要用英文 状态的冒号表示
array([[ 1, 3, 5, 7],
[ 2, 4, 6, 8],
[ 11, 13, 15, 17],
[ 12, 14, 16, 18],
[100, 101, 102, 103]])
arr1[3,3] # 18
arr1[3,:] # array([12, 14, 16, 18])
arr1[:,1] # array([ 3, 4, 13, 14, 101])
arr1[0:2,1:3] # array([[3,5],[4,6]])
运算符:
# 数学运算符
+ 数组对应元素的加和
- 数组对应元素的差
* 数组对应元素的乘积
/ 数组对应元素的商
% 数组对应元素商的余数
// 数组对应元素商的整除数
** 数组对应元素的幂指数
# 比较运算符
>
等价np.greater(arr1,arr2)
判断arr1的元素是否大于arr2的元素
>=
等价np.greater_equal(arr1,arr2)
判断arr1的元素是否大于等于arr2的元素
<
等价np.less(arr1,arr2)
判断arr1的元素是否小于arr2的元素
<=
等价np.less_equal(arr1,arr2)
判断arr1的元素是否小于等于arr2的元素
==
等价np.equal(arr1,arr2)
判断arr1的元素是否等于arr2的元素
!=
等价np.not_equal(arr1,arr2)
判断arr1的元素是否不等于arr2的元素
函数:
# 常用的数学函数
np.round(arr)
对各元素四舍五入
np.sqrt(arr)
计算各元素的算术平方根
np.square(arr)
计算各元素的平方值
np.exp(arr)
计算以e为底的指数
np.power(arr, α)
计算各元素的指数
np.log2(arr)
计算以2为底各元素的对数
np.log10(arr)
计算以10为底各元素的对数
np.log(arr)
计算以e为底各元素的对数
# 常用的统计函数(必会)
np.min(arr,axis)
按照轴的方向计算最小值
np.max(arr,axis)
按照轴的方向计算最大值
np.mean(arr,axis)
按照轴的方向计算平均值
np.median(arr,axis )
按照轴的方向计算中位数
np.sum(arr,axis)
按照轴的方向计算和
np.std(arr,axis)
按照轴的方向计算标准差
np.var(arr,axis)
按照轴的方向计算方差
'''
注意:
axis=0时,计算数组各列的统计值
axis=1时,计算数组各行的统计值
'''
array([[ 80.5, 60., 40.1, 20., 90.7],
[ 10.5, 30., 50.4, 70.3, 90.],
[ 35.2, 35., 39.8, 39., 31.],
[91.2, 83.4, 85.6, 67.8, 99.]])
'''不使用axis参数'''
# 计算每一行的和
Sum = [ ]
for row in range(4):
Sum.append(np.sum(arr2[row,:]))
# 计算每一列的平均
Avg = [ ]
for col in range(5):
Avg.append(np.mean(arr2[:,col]))
'''使用axis参数'''
arr2.sum(axis = 1) # 等价np.sum(arr2, axis = 1)
np.mean(arr2, axis = 0) # 等价arr2.mean(axis = 0)
随机数:
numpy中的random子模块
np.random
rand 给定形状产生随机数组(0到1之间的数)
randint 给定形状产生随机整数
choice给定形状产生随机选择
shuffle与random.shuffle相同
uniform给定形状产生随机数组(随机均匀分布)
normal 随机正态分布