Numpy(Numeriacal Python) 是一个开源的Python科学计算库,用于快速处理任意维度数据。
Numpy支持常见的数据和矩阵操作。对于同样的数值计算任务,使用Numpy比Python简洁的多。
Numpy使用ndarray对象来处理多维数据,该对象是一个快速而灵活的大数据容器。
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的"items"的集合
使用ndarray进行存储:
import numpy as np
# 创建ndarray
score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
注:使用numpy计算速度会比python原生计算的时间快很多很多。
机器学习的最大特点就是大量是数据运算。
Numpy专门针对ndarray的操作和运算进行了设计,所以数据的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。
可是ndarray为什么可以这么快呢?
3.1内存块风格
3.2支持并行化运算
3.3.底层实现C
4.1ndarray的属性
数组属性反映了数组本身固有的信息。
属性名字 | 属性解释 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
5.1生成数组的方法
# 生成等间隔的数组
np.linspace(0,100,11)
# 结果
array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.])
# 生成等步长的数组
np.arange(10,50,2)
# 结果
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48])
# 生成10^x
np.logspace(0,2,3)
# 结果
array([ 1., 10., 100.])
# 使用模块
np.random模块
正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ,σ )。
生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。
μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
标准差如何来?
是在概率论和统计方差衡量一组数据时离散程度的度量
其中M为平均值,n为数据总个数,σ 为标准差,σ ^2可以理解一个整体为方差
可以理解成数据的一个离散程度的衡量
正态分布的创建方式
np.random.randn(d0,d1,…dn)
功能:从标准正太分布中返回一个或多个样本值
np.random.normal(loc=0.0,scale=1.0,size=None)
loc : float
此概率分布的均值(对应着整个分布中心center)
scale:float
此概率分布的的标准差(对应的分布的宽度,scale越大越矮胖,scale越小越瘦高)
size:int or tuple of inst
输出的shape,默认为None,只输出一个值
np.random.standard_normal(size=None)
返回指定形状的标准正太分布的数组
x = np.random.normal(loc=1.75,scale=1,100000000)
plt.figure(figsize=(20,8),dpi=100)
plt.hist(x,1000)
plt.show()
4支股票,**一周(5天)**的涨跌幅数据,如何获取?
# 创建符合正态分布的4只股票5天的涨跌幅数据
stock_change = np.random.normal(0, 1, (4, 5))
stock_change
np.random.rand(d0,d1…dn)
np.random.uniform(low=0.0,high=1.0,size=None)
功能:从一个均匀分布[low,high)中随机采样,定义域是左闭右开
参数介绍
返回值:ndarray类型,形状和参数size中描述一致
np.rrandom.randint(low,high=None,size=None,dtype=‘I’)
从一个均匀分布中随机采样,生成一个整数或N维整数数组
取数范围:若high不为None时,取[low,high之间随机整数,否则取[0,low)之间的随机整数
画图查看分布状况
import matplot.pyplot as plt
import random
plt.figure(figsize=(20,8),dpi=100)
x1 = np.random.unifore(-1,1,1000000)
plt.hist(x=x1,bins=1000)
plt.show()
一二三维数组,都可以直接进行索引,切片。或者对象[:,:] 先行后列的切。
二维数组索引方式:
# 二维的数组,两个维度
stock_change[0, 0:3]
# 三维
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
# 返回结果
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[12, 3, 34],
[ 5, 6, 7]]])
# 索引、切片
>>> a1[0, 0, 1]
ndarray.reshape(shape,order)
返回一个具有相同数据域,但shape不一样的视图
行列不进行互换
# 在转换形状的时候,一定要注意数组的元素匹配
a.reshape([5,4])
a.reshape([-1,10]) # 数组的形状被修改为: (2, 10), -1: 表示通过待计算
ndarray.resize(new_shape)
修改数组本身的形状(需要保持元素个数前后相同)
行列不进行互换
a.resize([5,4])
a.shape
ndarray.T
数组的转置
将数组的行、列互换
a.T
ndarray.astype(type)
返回修改了类型之后的数组
a.astype(np.int32)
ndarray.tostring([order])或者ndarray.tobytes([order])
构造包含数组中原始数据字节的python字节
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[12, 3, 34], [5, 6, 7]]])
arr.tostring
np.unique()
temp = np.array([[1,2,3,4],[3,4,5,6]])
ret = np.unique(temp)
ret
#结果
array([1,2,3,4,5,6])
1.逻辑运算
# 生成10名同学,5门功课的数据
score = np.random.randint(40,100.(10,5))
# 取出最后4名同学的成绩
test_score = score[6:,0:5]
# 逻辑判断,如果成绩大于60标记为True,否则为False
test_score > 60
# BOOL赋值,将满族条件的设置为指定的值--布尔索引
test_score[test_score > 60] =1
# 判断前两名同学的成绩,是否全及格
np.all(score[:2,:] > 60)
# 判断前两名同学的成绩,是否有大于90
np.any(score[:2,:] > 90)
# 判断前四名学生,前四门课程中,成绩中大于60的置为1,否则为0
np.where(score[:4,:4] > 60, 1, 0)
# 判断前四名学生,前四门课程中,成绩中大于60且小于90的换为1,否则为0
np.where(np.logical_and(temp > 60, temp < 90), 1, 0)
# 判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp < 60), 1, 0)
在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:
1.数组与数的运算
arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr + 1
arr / 2
# 可以对比python列表的运算,看出区别
a = [1, 2, 3, 4, 5]
a * 3
2.数组与数组的运算
arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
# 这两个是不能够进行运算的
2.1广播机制
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。下面通过一个例子进行说明:
arr1 = np.array([0],[1],[2],[3])
arr.shape
# (4,1)
arr2 = np.array([1,2,3])
arr.shape
# (3,)
arr1 + arr2
# 结果是:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
上述代码中,数组arr1是4行1列,arr2是1行3列。这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2都变成4行3列。
广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
矩阵和向量的乘法: m×n 的矩阵乘以 n×1 的向量,得到的是 m×1 的向量
矩阵乘法遵循准则:
(M行, N列)*(N行, L列) = (M行, L列)
矩阵的乘法不满足交换律:A×B≠B×A
矩阵的乘法满足结合律。即:A×(B×C)=(A×B)×C
单位矩阵:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的 1,我们称 这种矩阵为单位矩阵.它是个方阵,一般用 I 或者 E 表示,从 左上角到右下角的对角线(称为主对角线)上的元素均为 1 以外全都为 0。如:
矩阵的逆:如矩阵 A 是一个 m×m 矩阵(方阵),如果有逆矩阵,则:
AA-1 = A-1A = I
低阶矩阵求逆的方法:
1.待定系数法
2.初等变换
矩阵的转置:设 A 为 m×n 阶矩阵(即 m 行 n 列),第 i 行 j 列的元素是 a(i,j),即:
A=a(i,j)
定义 A 的转置为这样一个 n×m 阶矩阵 B,满足 B=a(j,i),即 b (i,j)=a (j,i)(B 的第 i 行第 j 列元素是 A 的第 j 行第 i 列元素),记 AT =B。
直观来看,将 A 的所有元素绕着一条从第 1 行第 1 列元素出发的右下方 45 度的射线作 镜面反转,即得到 A 的转置。
简单来说矩阵的转置就是行变成列,列变成行。
a = np.array([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]])
b = np.array([[0.7], [0.3]])
np.matmul(a,b)
array([[81.8],
[81.4],
[82.9],
[90. ],
[84.8],
[84.4],
[78.6],
[92.6]])
np.dot(a,b)
array([[81.8],
[81.4],
[82.9],
[90. ],
[84.8],
[84.4],
[78.6],
[92.6]])
np.matmul和np.dot的区别:
二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。