numpy
是一种基于矩阵的运算,提高了运算效率
numpy的一些基本属性
In[3]: import numpy as np
In[4]: array=np.array([[1,2,3],[2,3,4]])
In[5]: print('number of dim:',array.ndim) #打印array矩阵的维度
number of dim: 2
In[6]: print('shape:',array.shape) #打印array矩阵的形状
shape: (2, 3)
In[7]: print('size:',array.size) #打印array矩阵的形状
size: 6
numpy中创建array
一般方法
In[8]: a=np.array([[1,2],[3,4]]) #一般方法创建
In[9]: print(a) #和列表打印唯一的区别是,元素之间没逗号隔开
[[1 2]
[3 4]]
规定类型:定义时在构造函数括号里面加一个dtype参数,如dtype=np.int,还可以是np.float,np.int32,np.float64…,np.int默认情况下等于np.int64
In[11]: a=np.array([[1,2],[3,4]],dtype=np.float64)
In[12]: print(a)
[[1. 2.]
[3. 4.]]
In[13]: print(a.dtype)
float64
一些特殊的方式创建
np.zeros(形状):创建所有元素都是0的矩阵
np.ones(形状):创建所有元素都是1的矩阵
np.empty(形状):创建所有元素都是接近0或等于0的小数的矩阵
(可能是显示的原因,在控制台输出的全是0,如果单独写一个脚本文件运行则是许多接近0的小数)
In[14]: a=np.zeros((3,4))
In[15]: print(a)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
In[16]: a=np.ones((3,4),dtype=np.int)
In[17]: print(a)
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
In[18]: a=np.empty((3,4))
In[19]: print(a)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
np.arange(m,n,i):生成从m到n(包括m不包括n)的步长是i的矩阵
矩阵.reshape(形状):重新更改矩阵的形状,前提是元素个数相同
np.linespace(m,n,i):从m到n(包括m包括n)生成i段(即元素个数是i)的矩阵
In[22]: print(np.arange(1,10,2))
[1 3 5 7 9]
In[23]: print(np.arange(1,10,2).reshape((5,1)))
[[1]
[3]
[5]
[7]
[9]]
In[25]: print(np.linspace(1,10,4))
[ 1. 4. 7. 10.]
In[26]: print(np.linspace(1,10,4).reshape(2,2))
[[ 1. 4.]
[ 7. 10.]]
numpy的运算
加减乘除:矩阵之间基于+ - * / 甚至**(次方运算),都是两个矩阵每个位置的对应元素做相关运算再得出结果
In[4]: a=np.array([10,20,30,40])
In[5]: b=np.arange(1,5)
In[6]: print(a+b)
[11 22 33 44]
In[7]: print(a-b)
[ 9 18 27 36]
In[8]: print(a*b)
[ 10 40 90 160]
In[9]: print(a/b)
[10. 10. 10. 10.]
In[10]: print(a**2)
[ 100 400 900 1600]
一些数学中特殊的运算在numpy中有对应函数,如np.sin(),np.cos,np.tan()等等
In[15]: print(np.sin(np.pi/6))
0.49999999999999994
numpy可以通过一些特殊快速看出矩阵中符合某些条件的元素
In[16]: print(a)
[10 20 30 40]
In[17]: print(a<25) #筛选出矩阵中小于25的元素
[ True True False False]
a,b矩阵相乘:np.dot(a,b)或者a.dot(b)
In[19]: a=np.array([[1,1],[0,1]])
In[20]: b=np.arange(4).reshape((2,2))
In[21]: print(a,b,sep='\n')
[[1 1]
[0 1]]
[[0 1]
[2 3]]
In[22]: print(np.dot(a,b))
[[2 4]
[2 3]]
In[23]: print(a.dot(b))
[[2 4]
[2 3]]
np.random.random():生成0到1的随机数
np.sum(…):求和,想对某一行或者某一列求和加上axis=1或axis=0
np.min(…):求最小值,同上
np.max(…):求最大值,同上
In[26]: print(np.random.random((2,4)))
[[0.36933939 0.78979226 0.07014476 0.63035032]
[0.9447366 0.58810221 0.31002611 0.2570716 ]]
In[27]: a=np.array([[1,1,3,4],[2,5,7,8]])
In[28]: print(np.sum(a))
31
In[29]: print(np.sum(a,axis=0))
[ 3 6 10 12]
In[30]: print(np.sum(a,axis=1))
[ 9 22]
In[31]: print(np.max(a))
8
In[32]: print(np.max(a,axis=0))
[2 5 7 8]
In[33]: print(np.max(a,axis=1))
[4 8]
np.argmin(…):矩阵中最小值的下标
np.argmax(…)是最大值的下标
np.mean(…)是求矩阵中的平均值,等同于 矩阵.mean()
np.median(…)是求矩阵的中位数
In[35]: a=np.arange(1,13).reshape((3,4))
In[36]: print(a)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
In[37]: print(np.argmax(a))
11
In[38]: print(np.mean(a))
6.5
In[39]: print(np.median(a))
6.5
np.cumsum(…):返回一个矩阵,返回的矩阵第一个数是该函数参数的矩阵中的第一个数,第二个数是参数矩阵的前两个数字的和,第三个数是参数矩阵前三给数字的和…以此类推
np.diff(…):返回矩阵中每两个相邻元素的差组成的矩阵
np.nonzero(…):返回两个矩阵,第一个是非零元素的行,第二个是非零元素的列,两个矩阵的对应同一个位置组合起来就是每一个非零元素的位置
np.sort(…):对矩阵进行排序
#接上面的,a还是和上一个程序片段相等
In[40]: print(np.cumsum(a))
[ 1 3 6 10 15 21 28 36 45 55 66 78]
In[41]: print(np.diff(a))
[[1 1 1]
[1 1 1]
[1 1 1]]
In[42]: print(np.nonzero(a))
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
In[45]: a=np.array([[4,3,2,1],[8,7,6,5],[12,11,10,9]])
In[46]: print(np.sort(a))
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
np.transpose(a):返回矩阵a的转置矩阵,等同于a.T
np.clip(a,a_min,a_max):把矩阵a中小于a_min的让其等于a_min,大于a_max的让他等于a_max,得到一个新的矩阵
In[48]: a=np.sort(a)
In[49]: print(a)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
In[50]: np.transpose(a)
Out[50]:
array([[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11],
[ 4, 8, 12]])
In[51]: np.clip(a,6,12)
Out[51]:
array([[ 6, 6, 6, 6],
[ 6, 6, 7, 8],
[ 9, 10, 11, 12]])
注意:很多函数,都可以在参数中加上axis=0或1这样的参数,对所有行或列而不是所有元素进行相应操作,不再一 一列举
numpy的索引
numpy在很多方面和python语法中的列表用法相同,如:
In[55]: a=np.arange(10)
In[56]: print(a[2])
2
In[57]: a=np.arange(12).reshape((3,4))
In[58]: print(a)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
In[59]: print(a[1])
[4 5 6 7]
In[60]: print(a[1][1])
5
In[61]: print(a[1,1:3]) #打印第1行的1到2个元素
[5 6]
In[62]: print(a[1,:]) #打印第1行所有
[4 5 6 7]
遍历:
如果是二维的,遍历一次得到一行,如果想对列进行遍历,一次想得到一列,那么可以对A进行转置即A.T,如果想得到每个元素,则需要调用for … in a.flat:…
a.flat:一个可迭代对象,迭代下来可以得到每一个元素
a.flatten():对上面的a.flat迭代得到的结果组成的矩阵
#接上面
In[63]: for i in a:
...: print(i)
...:
[0 1 2 3]
[4 5 6 7]
[ 8 9 10 11]
In[64]: for i in a.T:
...: print(i)
...:
[0 4 8]
[1 5 9]
[ 2 6 10]
[ 3 7 11]
In[65]: for i in a.flat:
...: print(i)
...:
0
1
2
3
4
5
6
7
8
9
10
11
In[66]: print(a.flatten())
[ 0 1 2 3 4 5 6 7 8 9 10 11]
numpy的array合并
np.vstack():纵向合并
np.hstack():横向合并
In[2]: import numpy as np
In[3]: a=np.array([1,1,1])
In[4]: b=np.array([2,2,2])
In[6]: print(np.vstack((a,b)))
[[1 1 1]
[2 2 2]]
In[7]: print(np.hstack((a,b)))
[1 1 1 2 2 2]
矩阵a[,newaxis:]:在行上增加一个维度
矩阵a[:,newaxis]:在列上增加一个维度
In[15]: print(a[:,np.newaxis])
[[1]
[1]
[1]]
In[17]: print(a[np.newaxis,:])
[[1 1 1]]
np.concatenate():更简单直接的合并方式,可以指定按行或者按列
In[22]: a=a[np.newaxis,:]
In[23]: b=b[np.newaxis,:]
In[24]: print(a,b,sep='\n')
[[1 1 1]]
[[2 2 2]]
In[25]: np.concatenate((a,a,b,b),axis=1)
Out[25]: array([[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]])
In[26]: np.concatenate((a,a,b,b),axis=0)
Out[26]:
array([[1, 1, 1],
[1, 1, 1],
[2, 2, 2],
[2, 2, 2]])
In[27]: np.concatenate((a,a,b,b))
Out[27]:
array([[1, 1, 1],
[1, 1, 1],
[2, 2, 2],
[2, 2, 2]])
numpy的分割
np.split():将矩阵分割成相等的几部分,可以指定按行还是按列分割
np.array_split():和前者差不多,只不过它可以进行不等量的分割,前者只能进行等量分割
In[29]: a=np.arange(16).reshape((4,4))
In[30]: print(a)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
In[31]: print(np.split(a,2))
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
In[34]: print(np.split(a,2,axis=0))
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
In[35]: print(np.split(a,2,axis=1))
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
In[36]: print(np.array_split(a,3)) #将矩阵进行不等量分割
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
numpy的copy和deep copy
这和python中的类似
In[37]: a=np.array([1,2,3,4])
In[38]: b=a
In[39]: a[0]=11
In[40]: b
Out[40]: array([11, 2, 3, 4])
In[41]: b=a.copy()
In[42]: a[1]=12
In[43]: a
Out[43]: array([11, 12, 3, 4])
In[44]: b
Out[44]: array([11, 2, 3, 4])