文章目录
Numpy 概念
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
安装
pip install numpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
导入包
import numpy as np
数据创建
1. 随机数
在numpy中,随机函数是一个很大的类,我们会经常使用随机函数初始化数据模型。
numpy.random.normal()
numpy.random.normal(loc=0,scale=1e-2,size=shape)
- 参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布,
- 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。
- 参数size(int 或者整数元组):输出的值赋在shape里,默认为None。
>>> np.random.normal(loc = 0, scale = 1, size = (2, 3))
array([[ 1.1253141 , -0.35899555, 1.2206081 ],
[-1.33949555, 0.42837337, -0.12346315]])
numpy.random.rand()
numpy.random.rand(d0,d1,…,dn)
- rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
- dn表格每个维度
- 返回值为指定维度的array
>>> np.random.rand()
0.5741992576511386
>>> np.random.rand(4)
array([0.46293136, 0.67650639, 0.4965211 , 0.41193224])
>>> np.random.rand(3,4)
array([[0.5874274 , 0.74255452, 0.532332 , 0.20922426],
[0.60061671, 0.57630622, 0.5325137 , 0.42761424],
[0.75694314, 0.04299292, 0.86352272, 0.0804793 ]])
>>> np.random.rand(2,3,4)
array([[[0.4610567 , 0.62417219, 0.42756664, 0.96705009],
[0.21420153, 0.78014512, 0.86688418, 0.49624361],
[0.69868323, 0.05157287, 0.75464171, 0.3637569 ]],
[[0.37934486, 0.2571473 , 0.56984629, 0.55191529],
[0.98903933, 0.7968863 , 0.78496612, 0.49052729],
[0.53844221, 0.91275757, 0.89148343, 0.78016788]]])
numpy.random.randn()
numpy.random.randn(d0,d1,…,dn)
- randn函数返回一个或一组样本,具有标准正态分布。
- dn表格每个维度
- 返回值为指定维度的array
>>> numpy.random.randn()
0.8538518153827508
>>> numpy.random.randn(4)
array([ 0.18676025, -0.96798301, -1.55092326, 0.15827384])
>>> numpy.random.randn(3,4)
array([[ 0.46254689, -0.76170678, 0.83751158, -1.09405029],
[ 0.23794122, 0.75556361, -0.98164949, 2.35257227],
[ 0.52405716, 0.49690142, 0.02190174, 0.52204988]])
>>> numpy.random.randn(2,3,4)
array([[[ 1.53811637, 1.03104813, -0.07696404, -0.48572504],
[ 0.15683787, -1.23805156, 2.75345817, 1.14479291],
[ 1.77812274, 1.56753809, 0.6222866 , -0.04480746]],
[[ 0.23821553, -2.22083911, 0.13508668, -1.3745254 ],
[ 0.83610244, 0.08711017, 1.46519802, -0.65621799],
numpy.random.randint()
numpy.random.randint(low, high=None, size=None, dtype=‘I’)
- 返回随机整数,范围区间为[low,high),包含low,不包含high
- 参数:low为最小值,high为最大值,size为数组维度大小,dtype为数据类型,默认的数据类型是np.int
- high没有填写时,默认生成随机数的范围是[0,low)
>>> np.random.randint(1, 5)
2
>>> np.random.randint(1, 5, size=(2))
array([3, 1])
>>> np.random.randint(1, 5, size=(4))
array([4, 4, 4, 2])
>>> np.random.randint(1, 5, size=(3,4))
array([[2, 1, 1, 3],
[4, 3, 3, 2],
[1, 1, 1, 4]])
>>> np.random.randint(1, 5, size=(2,3,4))
array([[[2, 1, 4, 1],
[4, 3, 3, 3],
[1, 3, 2, 2]],
[[2, 2, 1, 2],
[3, 2, 4, 3],
[2, 2, 3, 3]]])
2. 矩阵
使用numpy,可以非常方便的对矩阵进行各种运算。
随机矩阵可以使用随机函数创建,而一些特殊矩阵也可以是用特定的函数
# 0 矩阵
>>> np.zeros([3, 3])
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
# 1 矩阵
>>> np.ones([3, 3])
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
# 单位矩阵
>>> np.identity(6)
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.]])
# 对角矩阵
>>> np.diag(np.random.randint(1, 10, size = 6))
array([[6, 0, 0, 0, 0, 0],
[0, 3, 0, 0, 0, 0],
[0, 0, 5, 0, 0, 0],
[0, 0, 0, 8, 0, 0],
[0, 0, 0, 0, 7, 0],
[0, 0, 0, 0, 0, 9]])
# 重塑
>>> np.arange(1, 10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(1, 10).reshape(3,-1)
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> np.arange(40).reshape(-1,10)
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]])
3. 创建副本
>>> ar = np.random.randint(1,100,size=(10,10))
>>> ar
array([[37, 62, 79, 43, 71, 92, 86, 59, 26, 22],
[73, 97, 35, 70, 48, 82, 57, 42, 89, 79],
[40, 29, 76, 64, 15, 26, 44, 57, 8, 89],
[64, 40, 4, 32, 87, 96, 42, 32, 70, 33],
[17, 56, 37, 55, 9, 50, 63, 6, 79, 97],
[14, 97, 77, 49, 94, 4, 87, 22, 52, 13],
[47, 25, 33, 59, 93, 96, 94, 77, 47, 12],
[ 7, 93, 8, 94, 40, 38, 51, 7, 76, 70],
[19, 69, 44, 87, 60, 18, 17, 26, 91, 53],
[40, 59, 50, 53, 77, 58, 47, 17, 48, 38]])
>>> ab = ar.copy()
>>> ab
array([[37, 62, 79, 43, 71, 92, 86, 59, 26, 22],
[73, 97, 35, 70, 48, 82, 57, 42, 89, 79],
[40, 29, 76, 64, 15, 26, 44, 57, 8, 89],
[64, 40, 4, 32, 87, 96, 42, 32, 70, 33],
[17, 56, 37, 55, 9, 50, 63, 6, 79, 97],
[14, 97, 77, 49, 94, 4, 87, 22, 52, 13],
[47, 25, 33, 59, 93, 96, 94, 77, 47, 12],
[ 7, 93, 8, 94, 40, 38, 51, 7, 76, 70],
[19, 69, 44, 87, 60, 18, 17, 26, 91, 53],
[40, 59, 50, 53, 77, 58, 47, 17, 48, 38]])
数据转换
1. list 转换 numpy
>>> a = [i for i in range(1, 15)]
>>> ar = np.array(a)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> ar
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
2. DataFrame 转换 numpy
>>> df = pd.DataFrame({
'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
>>> df
A B C
0 1 4 7
1 2 5 8
2 3 6 9
>>> df.values
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]], dtype=int64)
数据抽样
1. 随机抽样
numpy.random.choice()
numpy.random.choice(a, size=None, replace=True, p=None)
- 从给定的一维数组中生成随机数
- 参数:
- a为一维数组类似数据或整数;size为数组维度;p为数组中的数据出现的概率
- a为整数时,对应的一维数组为np.arange(a)
# 当replace为False时,生成的随机数不能有重复的数值
>>> np.random.choice(5, size = 5, replace=False)
array([0, 1, 3, 4, 2])
# 从[10,...,19]当中随机选取数字,再组成(3,4)的矩阵。
>>> np.random.choice([i for i in range(10, 20)], size=(3, 4))
array([[14, 13, 10, 14],
[12, 16, 15, 11],
[19, 10, 12, 19]])
# 从[10,...,19]当中随机选取数字,再组成(3,4)的矩阵,然后重塑为(6,2)的矩阵
>>> np.random.choice([i for i in range(10, 20)], size=(3, 4)).reshape(6,-1)
array([[11, 19],
[11, 10],
[17, 18],
[14, 18],
[18, 18],
[17, 15]])
2. 概率抽样
# 按照概率筛选数值
>>> np.random.choice(5, size=3, p=[0.2, 0.3, 0.1, 0.2, 0.2])
array([3, 1, 1])
numpy.random.seed()
numpy.random.seed()
- np.random.seed()的作用:使得随机数据可预测。
- 当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数
# seed = 0
>>> np.random.seed(0)
>>> np.random.rand(5)
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
# seed 随机改变,随机结果改变
>>> np.random.rand(5)
array([0.64589411, 0.43758721, 0.891773 , 0.96366276, 0.38344152])
# seed = 22,结果与 seed = 0 不同
>>> np.random.seed(22)
>>> np.random.rand(5)
array([0.20846054, 0.48168106, 0.42053804, 0.859182 , 0.17116155])
# seed = 0,结果和第一次相同
>>> np.random.seed(0)
>>> np.random.rand(5)
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
数据查找&筛选
1. 去重
np.unique()
>>> ar = np.random.randint(1, 100, size=100)
>>> ar
array([87, 89, 80, 91, 11, 8, 20, 84, 11, 68, 83, 5, 15, 16, 83, 72, 63,
71, 11, 57, 95, 2, 59, 39, 96, 51, 81, 74, 40, 76, 57, 47, 39, 14,
80, 57, 52, 82, 31, 33, 99, 85, 31, 47, 29, 27, 4, 37, 51, 80, 6,
6, 6, 67, 58, 36, 25, 80, 89, 61