一、numpy简介
numpy官方文档:https://docs.scipy.org/doc/numpy/reference/?v=20190307135750
numpy是Python的一种开源的数值计算扩展库。这种库可用来存储和处理大型numpy数组,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示numpy数组)。
numpy库有两个作用:
区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型
计算速度快,甚至要由于python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似。
二、为什么用numpy
lis1 = [1 , 2 , 3 ]
lis2 = [4 , 5 , 6 ]
如果我们想让lis1 \\\* lis2
得到一个结果为lis_res = \\\[4, 10, 18\\\]
,非常复杂。
三、创建numpy数组
numpy数组即numpy的ndarray对象,创建numpy数组就是把一个列表传入np.array()方法。
arr = np.array([1 , 2 , 3 ])
print (arr, type (arr))
[1 2 3] <class 'numpy.ndarray'>
print (np.array([[1 , 2 , 3 ], [4 , 5 , 6 ]]))
print (np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [7 , 8 , 9 ]]))
[[1 2 3]
[4 5 6]
[7 8 9]]
四、numpy数组的常用属性
属性
解释
T
数组的转置(对高维数组而言)
dtype
数组元素的数据类型
size
数组元素的个数
ndim
数组的维数
shape
数组的维度大小(以元组形式)
astype
类型转换
dtype种类:bool_, int(8,16,32,64), float(16,32,64)
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ]], dtype=np.float32)
print (arr)
[[1. 4.]
[2. 5.]
[3. 6.]]
arr = arr.astype(np.int32)
print (arr.dtype)
print (arr)
五、获取numpy数组的行列数
由于numpy数组是多维的,对于二维的数组而言,numpy数组就是既有行又有列。
注意:对于numpy我们一般多讨论二维的数组。
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ]])
print (arr)
六、切割numpy数组
切分numpy数组类似于列表的切割,但是与列表的切割不同的是,numpy数组的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。
arr = np.array([[1 , 2 , 3 , 4 ], [5 , 6 , 7 , 8 ], [9 , 10 , 11 , 12 ]])
print (arr)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[False False False False]
[False True True True]
[ True True True True]]
七、numpy数组元素替换
numpy数组元素的替换,类似于列表元素的替换,并且numpy数组也是一个可变类型的数据,即如果对numpy数组进行替换操作,会修改原numpy数组的元素,所以下面我们用.copy()方法举例numpy数组元素的替换。
arr = np.array([[1 , 2 , 3 , 4 ], [5 , 6 , 7 , 8 ], [9 , 10 , 11 , 12 ]])
print (arr)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
arr1 = arr.copy()
arr1[:1 , :] = 0
print (arr1)
[[ 0 0 0 0]
[ 5 6 7 8]
[ 9 10 11 12]]
arr2 = arr.copy()
arr2[arr > 5 ] = 0
print (arr2)
[[1 2 3 4]
[5 0 0 0]
[0 0 0 0]]
arr3 = arr.copy()
arr3[:, :] = 0
print (arr3)
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
八、numpy数组的合并
arr1 = np.array([[1 , 2 ], [3 , 4 ], [5 , 6 ]])
print (arr1)
arr2 = np.array([[7 , 8 ], [9 , 10 ], [11 , 12 ]])
print (arr2)
print (np.hstack((arr1, arr2)))
[[ 1 2 7 8]
[ 3 4 9 10]
[ 5 6 11 12]]
print (np.concatenate((arr1, arr2), axis=1 ))
[[ 1 2 7 8]
[ 3 4 9 10]
[ 5 6 11 12]]
print (np.vstack((arr1, arr2)))
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
九、通过函数创建numpy数组
方法
详解
array()
将列表转换为数组,可选择显式指定dtype
arange()
range的numpy版,支持浮点数
linspace()
类似arange(),第三个参数为数组长度
zeros()
根据指定形状和dtype创建全0数组
ones()
根据指定形状和dtype创建全1数组
eye()
创建单位矩阵
empty()
创建一个元素全随机的数组
reshape()
重塑形状
9.1 array
arr = np.array([1 , 2 , 3 ])
print (arr)
9.2 arange
print (np.arange(1 , 20 , 2 ))
[ 1 3 5 7 9 11 13 15 17 19]
9.3 linspace/logspace
print (np.linspace(0 , 20 , 5 ))
[1.e+00 1.e+05 1.e+10 1.e+15 1.e+20]
9.4 zeros/ones/eye/empty
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
[[ 2.31584178e+077 -1.49457545e-154 3.95252517e-323 0.00000000e+000]
[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000]
[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000]
[ 0.00000000e+000 0.00000000e+000 1.29074055e-231 1.11687366e-308]]
9.5 reshape
arr = np.ones([2 , 2 ], dtype=int )
print (arr.reshape(4 , 1 ))
9.6 fromstring/fromfunction(了解)
s = 'abcdef'
print (np.fromstring(s, dtype=np.int8))
[ 97 98 99 100 101 102]
/Applications/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:4: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
after removing the cwd from sys.path.
def func (i, j ):
"""其中i为numpy数组的行,j为numpy数组的列"""
return i * j
print (np.fromfunction(func, (3 , 4 )))
[[0. 0. 0. 0.]
[0. 1. 2. 3.]
[0. 2. 4. 6.]]
十、numpy数组运算
运算符
说明
+
两个numpy数组对应元素相加
-
两个numpy数组对应元素相减
*
两个numpy数组对应元素相乘
/
两个numpy数组对应元素相除,如果都是整数则取商
%
两个numpy数组对应元素相除后取余数
**n
单个numpy数组每个元素都取n次方,如**2:每个元素都取平方
arrarr1 = np.array([[1 , 2 ], [3 , 4 ], [5 , 6 ]])
print (arr1)
arr2 = np.array([[7 , 8 ], [9 , 10 ], [11 , 12 ]])
print (arr2)
[[ 8 10]
[12 14]
[16 18]]
十一、numpy数组运算函数
numpy数组函数
详解
np.sin(arr)
对numpy数组arr中每个元素取正弦,sin(x)
np.cos(arr)
对numpy数组arr中每个元素取余弦,cos(x)
np.tan(arr)
对numpy数组arr中每个元素取正切,tan(x)
np.arcsin(arr)
对numpy数组arr中每个元素取反正弦,arcsin(x)
np.arccos(arr)
对numpy数组arr中每个元素取反余弦,arccos(x)
np.arctan(arr)
对numpy数组arr中每个元素取反正切,arctan(x)
np.exp(arr)
对numpy数组arr中每个元素取指数函数,ex
np.sqrt(arr)
对numpy数组arr中每个元素开根号√x
一元函数:abs, sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
二元函数:add, substract, multiply, divide, power, mod, maximum, mininum
arr = np.array([[1 , 2 , 3 , 4 ], [5 , 6 , 7 , 8 ], [9 , 10 , 11 , 12 ]])
print (arr)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 0.84147098 0.90929743 0.14112001 -0.7568025 ]
[-0.95892427 -0.2794155 0.6569866 0.98935825]
[ 0.41211849 -0.54402111 -0.99999021 -0.53657292]]
[[1. 1.41421356 1.73205081 2. ]
[2.23606798 2.44948974 2.64575131 2.82842712]
[3. 3.16227766 3.31662479 3.46410162]]
[[0.10016742 0.20135792 0.30469265 0.41151685]
[0.52359878 0.64350111 0.7753975 0.92729522]
[1.11976951 1.57079633 nan nan]]
/Applications/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in arcsin
[[False False False]
[False False False]]
十二、numpy数组矩阵化
12.1 numpy数组的点乘
numpy数组的点乘必须满足第一个numpy数组的列数等于第二个numpy数组的行数,即m∗n⋅n∗m=m∗m
arr1 = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ]]) print (arr1.shape)
arr2 = np.array([[7 , 8 ], [9 , 10 ], [11 , 12 ]])
print (arr2.shape)
assert arr1.shape[0 ] == arr2.shape[1 ]
print (arr2.shape)
12.2 numpy数组的转置
numpy数组的转置,相当于numpy数组的行和列互换。
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ]])
print (arr)
12.3 numpy数组的逆
numpy数组行和列相同时,numpy数组才可逆。
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [9 , 8 , 9 ]])
print (arr)
[[1 2 3]
[4 5 6]
[9 8 9]]
print (np.linalg.inv(arr))
[[ 0.5 -1. 0.5 ]
[-3. 3. -1. ]
[ 2.16666667 -1.66666667 0.5 ]]
arr = np.eye(3 )
print (arr)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
print (np.linalg.inv(arr))
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
十三、numpy数组数学和统计方法
方法
详解
sum
求和
cumsum
累加求和
mean
求平均数
std
求标准差
var
求方差
min
求最小值
max
求最大值
argmin
求最小值索引
argmax
求最大值索引
sort
排序
13.1 最大最小值
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [7 , 8 , 9 ]])
print (arr)
[[1 2 3]
[4 5 6]
[7 8 9]]
print (arr.argmax(axis=1 ))
13.2 平均值
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [7 , 8 , 9 ]])
print (arr)
[[1 2 3]
[4 5 6]
[7 8 9]]
13.3 方差
方差公式为
其中x为numpy数组。
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [7 , 8 , 9 ]])
print (arr)
[[1 2 3]
[4 5 6]
[7 8 9]]
[0.66666667 0.66666667 0.66666667]
13.4 标准差
标准差公式为
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [7 , 8 , 9 ]])
print (arr)
[[1 2 3]
[4 5 6]
[7 8 9]]
[2.44948974 2.44948974 2.44948974]
[0.81649658 0.81649658 0.81649658]
13.5 中位数
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [7 , 8 , 9 ]])
print (arr)
[[1 2 3]
[4 5 6]
[7 8 9]]
print (np.median(arr, axis=0 ))
print (np.median(arr, axis=1 ))
13.6 numpy数组求和
arr = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ], [7 , 8 , 9 ]])
print (arr)
[[1 2 3]
[4 5 6]
[7 8 9]]
13.7 累加和
arr = np.array([1 , 2 , 3 , 4 , 5 ])
print (arr)
十四、numpy.random生成随机数
函数名称
函数功能
参数说明
rand(d0,d1,⋯,dn)
产生均匀分布的随机数
dn为第n维数据的维度
randn(d0,d1,⋯,dn)
产生标准正态分布随机数
dn为第n维数据的维度
randint(low[, high, size, dtype])
产生随机整数
low:最小值;high:最大值;size:数据个数
random_sample([size])
在[0,1)[0,1)内产生随机数
size为随机数的shape,可以为元祖或者列表
choice(a[, size])
从arr中随机选择指定数据
arr为1维数组;size为数组形状
uniform(low,high [,size])
给定形状产生随机数组
low为最小值;high为最大值,size为数组形状
shuffle(a)
与random.shuffle相同
a为指定数组
rs = np.random.RandomState(1 )
print (rs.rand(10 ))
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01
1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01
3.96767474e-01 5.38816734e-01]
np.random.seed(1 )
print (np.random.rand(3 , 4 ))
[[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01]
[1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01]
[3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]]
print (np.random.rand(3 , 4 , 5 ))
[[[0.20445225 0.87811744 0.02738759 0.67046751 0.4173048 ]
[0.55868983 0.14038694 0.19810149 0.80074457 0.96826158]
[0.31342418 0.69232262 0.87638915 0.89460666 0.08504421]
[0.03905478 0.16983042 0.8781425 0.09834683 0.42110763]]
[[0.95788953 0.53316528 0.69187711 0.31551563 0.68650093]
[0.83462567 0.01828828 0.75014431 0.98886109 0.74816565]
[0.28044399 0.78927933 0.10322601 0.44789353 0.9085955 ]
[0.29361415 0.28777534 0.13002857 0.01936696 0.67883553]]
[[0.21162812 0.26554666 0.49157316 0.05336255 0.57411761]
[0.14672857 0.58930554 0.69975836 0.10233443 0.41405599]
[0.69440016 0.41417927 0.04995346 0.53589641 0.66379465]
[0.51488911 0.94459476 0.58655504 0.90340192 0.1374747 ]]]
print (np.random.randn(3 , 4 ))
[[ 0.30017032 -0.35224985 -1.1425182 -0.34934272]
[-0.20889423 0.58662319 0.83898341 0.93110208]
[ 0.28558733 0.88514116 -0.75439794 1.25286816]]
print (np.random.randint(1 , 5 , 10 ))
print (np.random.random_sample((3 , 4 )))
[[0.62169572 0.11474597 0.94948926 0.44991213]
[0.57838961 0.4081368 0.23702698 0.90337952]
[0.57367949 0.00287033 0.61714491 0.3266449 ]]
arr = np.array([1 , 2 , 3 ])
print (np.random.choice(arr, size=2 ))
arr = np.random.uniform(1 , 5 , (2 , 3 ))
print (arr)
[[4.72405173 3.30633687 4.35858086]
[3.49316845 2.29806999 3.91204657]]
np.random.shuffle(arr)
print (arr)
[[3.49316845 2.29806999 3.91204657]
[4.72405173 3.30633687 4.35858086]]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2022-11-15 网络编程:软件开发架构、架构总结、网络编程前戏、OSI七层协议简介、OSI七层协议之物理连接层、数据链路层、网络相关专业名词、OSI七层协议之网络层、OSI七层协议之传输层