Numpy模块 简易使用教程
- 1.数组创建
- 2.数组基本属性-维度、尺寸、数据类型
- 3.数组访问-索引、切片、迭代
- 4.数组的算术运算-加减乘除、转置求逆、极大极小
- 5.通用函数-sin,cos,exp,sqrt
- np.dot与np.matmul的区别
- 6.数组的合并和分割
- 6.1 np.vstack(),np.hstack()
- 6.2 np.stack()
- 7.list与数组相互转换
- 7.1 list() vs tolist()
- 8.np.random
- 8.1 randn()和rand()
- 8.2np.random.choice()
- 8.3 np.random.uniform()
- 9.常用方法
- x.astype(int)
- np.squeeze()
- np.std()
- np.prob()
- array.copy()
- np.linspace()
- np.vstack()
- np.c_ ()
- arr.ravel()
Numpy 是pythond科学计算的基础模块,常被用作多维数据容器,能够完成基本的科学计算操作
1.数组创建
import numpy as np# 1.创建数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([(1.3, 9, 2.0), (7, 6, 1)])
arr3 = np.zeros((2, 3))
arr4 = np.identity(3) # 三维度单位阵
arr5 = np.random.random(size=(2, 3))
2.数组基本属性-维度、尺寸、数据类型
# 2.数组属性
print(arr2.shape) # 矩阵的形状 (2, 3)
print(arr2.ndim) # 矩阵的秩 2
print(arr2.size) # 矩阵所有元素个数 6
print(arr2.dtype.name) # 矩阵中元素的类型 float64
3.数组访问-索引、切片、迭代
# 3.数组访问
print(arr2[:1,:1]) # [[1.3]]
for row in arr2:print(row)
for element in arr2.flat:print(element)
4.数组的算术运算-加减乘除、转置求逆、极大极小
# 4.数组运算
arr9 = np.array([[2, 1], [1, 2]])
arr10 = np.array([[1, 2], [3, 4]])
# 逐元素的+,-,*,/,%,操作
print(arr9 - arr10)
print(arr9**2)
print(arr9 * 3)
print(arr9 * arr10) # 等价于 np.multiply(arr9, arr10)
print(np.dot(arr9, arr10)) # 矩阵叉积, 在二维度的情况下和矩阵乘积的结果一致
print(np.matmul(arr9, arr10)) # 矩阵乘积
# 矩阵转置,求逆,求和,求极大,求极小
print(arr9.T)
print(np.linalg.inv(arr9))
print(arr9.sum(), arr9.max(), arr9.min()) # 6 2 1
5.通用函数-sin,cos,exp,sqrt
# 5.通用函数sin,cos,都是针对整个数组逐元素操作
print(np.exp(arr9))
print(np.sin(arr9))
print(np.sqrt(arr9))
np.dot与np.matmul的区别
在二维度的情况下和矩阵乘积的结果一致
print(np.dot(arr9, arr10)) # 矩阵叉积,
print(np.matmul(arr9, arr10)) # 矩阵乘积
参考博文:https://blog.csdn.net/acterminate/article/details/96151132
6.数组的合并和分割
# 6.数组的合并和分割
arr11 = np.vstack((arr9, arr10)) # 纵向合并,沿着第0维度合并
arr12 = np.hstack((arr9, arr10)) # 横向合并,沿着第1维度合并
print(np.vsplit(arr12, 2)) # 纵向切割
print(np.hsplit(arr12, 2)) # 横向切割
6.1 np.vstack(),np.hstack()
np.vstack()沿着第0维度堆叠
np.hstack()沿着第1维度堆叠
只有两个维度:
np.vstack(tuple)垂直方向堆叠成numpy.array
np.hstack(tuple)水平方向堆叠成numpy.array
注意:
tuple=(a1,a2,a3,…an)
a1,a2,a3,…an除了堆叠的那个维度,剩余的维度尺寸要求完全一致.
>>> a1=numpy.random.randn(2,2)
>>> a2=numpy.random.randn(3,2)
>>> a=numpy.vstack((a1,a2))
>>> a
array([[ 0.67667278, -0.3318424 ],[-0.2550355 , -0.74132559],[ 0.43534239, 1.46399303],[-0.86049107, 2.03871322],[-0.01824614, 0.46310639]])>>> b1=numpy.random.randn(2,3)
>>> b2=numpy.random.randn(2,1)
>>> b=numpy.hstack((b1,b2))
>>> b
array([[-0.69216195, 0.43455353, -0.5628851 , 1.98854944],[ 1.73648473, 1.11249471, -0.8067703 , -0.53433626]])
>>> import numpy
>>> a1=numpy.random.randn(2,2,2)
>>> a2=numpy.random.randn(2,2,2)
>>> a=numpy.vstack((a1,a2))
>>> a[0]
array([[ 0.06585097, -0.80433501],[ 1.77412345, -0.5875084 ]])
>>> b=numpy.hstack((a1,a2))
>>> b.shape
(2, 4, 2)
>>> a.shape
(4, 2, 2)
参考博文:https://blog.csdn.net/nanhuaibeian/article/details/100597342
6.2 np.stack()
stack() 函数是vstack(),与hstack()结合升级.
Parameters:
arrays : sequence of array_like
Each array must have the same shape.
axis : int, optional
The axis in the result array along which the input arrays are stacked.
out : ndarray, optional
If provided, the destination to place the result. The shape must be correct, matching that of what stack would have returned if no out argument were specified.
Returns:
stacked : ndarray
The stacked array has one more dimension than the input arrays.
np.stack(tuple, axis=0) 等价于 np.vstack(tuple)
np.stack(tuple, axis=1) 等价于 np.hstack(tuple)
参考博文:https://blog.csdn.net/u013019431/article/details/79768219
7.list与数组相互转换
list–>np.array
a=[1,2,3]
b=np.array(a)
np.array->list
c=b.tolist()
7.1 list() vs tolist()
- 直接用list()函数 # 转换成 第0维的每一个元素(Numpy.array) 组成的list
- 用array.tolist()函数 # 与原来的array的数据形式是一样的,只不过每一维度都是一个list
结论–tolist() 方法转换的更彻底,list()方法只转换了源数据的第一个维度。
如果np.array是一维,两者没有区别。但如果是二维结果是不同的。
>>> import numpy >>> a1=numpy.random.rand(3)
>>>>> a1
array([0.26546725, 0.27424911, 0.18618962])
>>> list(a1)
[0.26546725247934855, 0.27424910895802035, 0.18618962270208705]
>>> a1.tolist()
[0.26546725247934855, 0.27424910895802035, 0.18618962270208705]>>> a2
array([[0.25176667, 0.78656379, 0.17814966],[0.38749959, 0.195838 , 0.91929009]])
>>> list(a2)
[array([0.25176667, 0.78656379, 0.17814966]), array([0.38749959, 0.195838 , 0.91929009])]
>>> a2.tolist()
[[0.25176666870818276, 0.7865637882478266, 0.17814966253473885], [0.3874995863899837, 0.19583799515418743, 0.9192900894591074]]>>>
参考博文:https://www.cnblogs.com/wxiaoli/p/9550382.html
8.np.random
于随机/随机数相关的一个模块。
8.1 randn()和rand()
rand()-从标准正态分布中随机抽样
randn()-从标准正态分布中随机抽样,值处于[0,1]之间
>import numpy
>a=numpy.random.randn(2)
>a
array([2.14862612, 2.64967285])
>b=numpy.random.randn(2,4)
>b
array([[ 1.12026781, -0.35804222, 0.40199839, 0.8530957 ],[ 0.17434359, 0.77714432, -1.050777 , -1.4872941 ]])
>c=numpy.random.randn(2,4,3)
>c
array([[[-0.63199863, 0.3026388 , 1.52031827],[-0.02198394, 1.21513216, -0.0347614 ],[ 0.05571264, 0.38651474, -1.24363781],[-1.93182679, 1.1883758 , -1.90170175]],[[-0.65822958, 0.52109845, -0.49748048],[ 0.66535972, -0.118965 , 1.55862421],[ 0.58604542, 0.44303396, -1.27043267],[-0.26475081, 0.91481557, -0.7255539 ]]])
>a1=numpy.random.rand(2)
>a1
array([0.29220946, 0.56908742])
8.2np.random.choice()
从xxx中随机抽取元素
numpy.random.choice(a, size=None, replace=True, p=None)
a : 一维数组或整数
size : 生成样本的大小
replace : bool类型 False表示样本中不允许有重复值 True…
p : 给定数组中元素出现的概率
np.random.choice(5,3,p=[0,0,0,0,1])
array([4, 4, 4], dtype=int64)
参考文档:https://www.cnblogs.com/cavaliers20160620/p/8964784.html
8.3 np.random.uniform()
从[1,2]的均匀分布中随机采样64个数据,并且将尺寸由 (64,)转换成(64,1)
np.random.uniform(1, 2, size=64)[:, np.newaxis]
9.常用方法
x.astype(int)
改变数组中的数据类型
x=np.array([1,2,2.5])
x.astype(int)
np.squeeze()
去除中维度为1 的维
In [20]: d=np.array([[[1],[1]],[[1],[1]]])
In [22]: d.shape
Out[22]: (2, 2, 1)
In [23]: e=np.squeeze(d)
In [25]: e.shape
Out[25]: (2, 2)
np.std()
计算所有元素的标准差
numpy.std(data)
计算每一列的标准差
numpy.std(data, 0)
计算每一行的标准差
numpy.std(data, 1)
np.prob()
返回给定维度上各个元素的乘积
>>> import numpy as np
>>> a=np.array([[2,3],[4,5]])
>>> a
array([[2, 3],[4, 5]])>>> np.prod(a)
120
>>> np.prod(a,axis=0)
array([ 8, 15])>>> np.prod(a,axis=1)
array([ 6, 20])
array.copy()
直接名字赋值,两个变量指向同一块地址,其中任何一个数据操作都会影响另一个数组。用数组的.copy()方法,则会建立一个与原来完全独立但是数字完全相同的一个数组。
import numpy as np
ar1 = np.arange(10)
print(ar1)ar2 = ar1
print(ar2 is ar1)ar1[2] = 9
print(ar1,ar2)
#ar1和ar2 指向同一个值,所以ar1改变,ar2一起改变print('-------------------------------')ar3 = ar1.copy()
print(ar3 is ar1)
ar1[0] = 9
print(ar1,ar3)
#coyp方法生成数组及其数据的完整拷贝j
输出结果:
[0 1 2 3 4 5 6 7 8 9]True[0 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]-------------------------------False[9 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]
参考博文:https://blog.csdn.net/weixin_30935137/article/details/80822005
np.linspace()
输出(-1,1)之间的等间距15个数
np.linspace(-1, 1, 15)
np.vstack()
写在一行的for循环,每次将15个数作为一行堆叠64次,生成一个64*15的矩阵
np.vstack([np.linspace(-1, 1, 15) for _ in range(64)])
np.c_ ()
np.c_ 用于连接两个矩阵
np.c 中的c 是 column(列)的缩写,就是按列叠加两个矩阵,就是把两个矩阵左右组合,要求行数相等。
参考博文:https://blog.csdn.net/qq_33728095/article/details/102512600
arr.ravel()
将多维数组转换成一维数组
>>> a = numpy.array([[1,2],[3,4]])
>>> a.ravel()
array([1, 2, 3, 4])
>>>