numpy学习笔记
1.安装
Windows和Mac推荐使用pip安装。
pip3 install numpy
pip3 install pandas
注:使用pip freeze命令查看已安装的各个模块及其版本号。
2.numpy的属性
- ndim:维度
- shape:行数和列数
- size:元素个数
import numpy as np array=np.array([[1,2,3],[4,5,6]]) # 将列表转化为矩阵 print(array) # [[1 2 3] # [4 5 6]] print('number of dim:',array.ndim) # 维度 # number of dim: 2 print('shape :',array.shape) # 行数和列数 # shape : (2, 3) print('size:',array.size) # 元素个数 # size : 6
3.创建array
关键字:
- array:创建数组
- dtype:指定数据类型
- zeros:创建数据全为0
- ones:创建数据全为1
- empty:创建数据接近0
- arrange:按指定范围创建数据
- linspace:创建线段
a1 = np.array([2,2,3]) print(a1) # [2 2 3] a2 = np.array([2,2,4],dtype=np.int) print(a2.dtype) # int32 a3 = np.array([2,2,4],dtype=np.float) print(a3.dtype) # float64 b = np.array([[1,2,3],[4,5,6]]) # 2d矩阵,2行3列 print(b) # [[1 2 3] # [4 5 6]] b1 = np.zeros((3,4)) # 数据全为0,3行4列 3和4用括号包起来,视作一个元组 print(b1) # [[0. 0. 0. 0.] # [0. 0. 0. 0.] # [0. 0. 0. 0.]] b2 = np.ones((3,2),dtype=int) # 数据全为1,3行2列 同时指定数据类型 print(b2) # [[1. 1.] # [1. 1.] # [1. 1.]] b3 = np.empty((2,4)) # 数据全为接近0的数,2行4列 print(b3) # [[0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000] # [0.00000000e+000 1.60077269e-321 1.20529361e-311 1.20529361e-311]]
# 使用arange创建连续array # 同python列表切片,顾头不顾尾 c = np.arange(10,20,2) # 10~19,步长为2 print(c) # [10 12 14 16 18] # 可以用reshape方法改变形状 c1 = np.arange(12).reshape((3,4)) # 3行4列,0~11 print(c1) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] # 用linspace创建线段型数据 d = np.linspace(1,10,20)# 开始端1,结束端10,分割成20个数据,生成线段 print(d) # [ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105 # 3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632 # 6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158 # 9.52631579 10. ] # 同样有reshape方法 d1 = d.reshape((4,5)) print(d1) # [[ 1. 1.47368421 1.94736842 2.42105263 2.89473684] # [ 3.36842105 3.84210526 4.31578947 4.78947368 5.26315789] # [ 5.73684211 6.21052632 6.68421053 7.15789474 7.63157895] # [ 8.10526316 8.57894737 9.05263158 9.52631579 10. ]]
4. Numpy基础运算
4.1 一维矩阵的运算
a = np.array([1,2,3])
b = np.array([4,5,6])
(1)加、减、乘、幂
基础运算。注意幂运算的符号为“**”
print(a+b) print(a-b) print(a*b) print(a**2) # [5 7 9] # [-3 -3 -3] # [ 4 10 18] # [1 4 9]
(2)numpy中有许多数学函数工具,如三角函数等。我们可以调用它们对矩阵中的每一项元素进行函数运算。
# 以sin为例 c = 10*np.sin(a) print(c) # [8.41470985 9.09297427 1.41120008]
(3)进行逻辑判断
print(a>2) # [False False True]
返回一个bool类型的矩阵。对原矩阵中的每一个元素进行判断,如果符合判断条件返回true,否则返回false。
需要注意的是,如果想要执行是否相等的判断,需要输入“==”而不是“=”。
4.2 二维及以上
a = np.array([[1,1],[2,2]]) # [[1 1] # [2 2]] b = np .arange(0,4).reshape((2,2)) # [[0 1] # [2 3]]
(1)同线性代数中乘法的定义:np.dot() a.dot(b)
c_dot_1 = np.dot(a,b) c_dot_2 = a.dot(b) print(c_dot_1) # [[2 4] # [4 8]] print(c_dot_2) # [[2 4] # [4 8]]
(2)对应元素相乘 element-wise product: np.multiply(), 或 *
c_multiply_1 = np.multiply(a,b) c_multiply_2 = a*b print(c_multiply_1) # [[0 1] # [4 6]] print(c_multiply_2) # [[0 1] # [4 6]]
4.3 sum() max() min()
# 生成一个随机矩阵,矩阵中的每一个元素都是随机生成的(0,1)的数 random_1 = np.random.random((2,4)) print(random_1) # [[0.91907058 0.19150167 0.14909355 0.90484182] # [0.5016519 0.93417134 0.49772096 0.30443445]]
(1)从整个矩阵
print(np.sum(random_1)) # 3.6753639361080297 print(np.max(random_1)) # 0.9143019403822323 print(np.min(random_1)) # 0.0243471971208451
(2)对行或列进行查找是,需要在上述代码中为axis赋值。
axis为0时,将以列作为查找单元;axis为1时,将以行作为查找单元。
print(np.sum(random_1,axis=1)) # [3.05407585 2.35058479] print(np.max(random_1,axis=0)) # [0.55629772 0.97044846 0.9094335 0.90169083] print(np.min(random_1,axis=1)) # [0.55629772 0.32445655]
4.4 常用函数
(1)索引函数 argmin() argmax()
argmin()
和 argmax()
两个函数分别对应着求矩阵中最小元素和最大元素的索引。
相应的,在矩阵的12个元素中,最小值即1,对应索引0,最大值为12,对应索引为11。
print(np.argmin(a)) # 0 print(np.argmax(a)) # 11
(2)均值函数 mean() average() 中位数函数 median()
print(np.mean(a)) # 6.5 print(np.average(a)) # 6.5 # 第二种写法不太正规,少用 print(a.mean()) # 6.5 print(np.median(a)) # 6.5
(3)累加函数 cumsum() 累差函数diff()
在cumsum()
函数中:生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和。
比如元素6,在cumsum()
生成的矩阵中序号为3,即原矩阵中1,2,3三个元素的和。
print(np.cumsum(a)) # [ 1 3 6 10 15 21 28 36 45 55 66 78]
diff()函数计算的便是每一行中后一项与前一项之差。
故一个3行4列矩阵通过函数计算得到的矩阵便是3行3列的矩阵。
print(np.diff(a)) # [[1 1 1] # [1 1 1] # [1 1 1]]
(4)nonzero()函数
这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。
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))
(5)排序函数sort()
针对每一行从小到大排序
b = np.arange(14,2,-1).reshape((3,4)) print(b) # [[14 13 12 11] # [10 9 8 7] # [ 6 5 4 3]] print(np.sort(b)) # [[11 12 13 14] # [ 7 8 9 10] # [ 3 4 5 6]]
(6)转置函数 transpose()或a.T
print(b.T) # [[14 10 6] # [13 9 5] # [12 8 4] # [11 7 3]] print(np.transpose(b)) # [[14 10 6] # [13 9 5] # [12 8 4] # [11 7 3]]
个人更倾向于使用第二种
(7)clip()函数
这个函数的格式是clip(Array,Array_min,Array_max)
,顾名思义,Array
指的是将要被执行用的矩阵,
而后面的最小值最大值则用于让函数判断矩阵中元素是否有比最小值小的或者比最大值大的元素,并将这些指定的元素转换为最小值或者最大值。
print(np.clip(b,4,8)) # [[8 8 8 8] # [8 8 8 7] # [6 5 4 4]]
更多详细教程参考https://docs.scipy.org/doc/numpy/reference/
5. 索引
5.1 一维矩阵的索引
同python中的列表
5.2 二维矩阵的索引
a = np.arange(2,14).reshape((3,4)) print(a) # [[ 2 3 4 5] # [ 6 7 8 9] # [10 11 12 13]]
二维矩阵中,a[1]表示第二行,a[1][1]表示第二行的第二个元素。
# 第二行 print(a[1]) # [6 7 8 9] # 第二行第二个元素 print(a[1][1]) # 7
也可以使用a[1,1],含义同a[1][1]。
此外在numpy中我们可以像在列表中一样对数据进行切片。
print(a[1,0:-1:2]) # [6 8] print(a[1,1:-1:2]) # [7]
在切片操作后得到的是一个array。
a本身也是一个可迭代对象,使用for可以按照顺序输出它的每一行。
想要输出a的每一列,可以先对a转置,然后输出每一行。
for item in a: print(item) # [2 3 4 5] # [6 7 8 9] # [10 11 12 13] for item in a.T: print(item) # [ 2 6 10] # [ 3 7 11] # [ 4 8 12] # [ 5 9 13]
6. 矩阵的合并
import numpy as np a = np.array([1,1,1]) b = np.array([2,2,2])
6.1 vstack() hstack()
上下合并使用vstack(),左右合并使用hstack()
c = np.vstack((a,b)) # vertical stack print(c) # [[1 1 1] # [2 2 2]] print(c.shape) # (2, 3) d = np.hstack((a,b)) # horizontal stack print(d) # [1 1 1 2 2 2] print(d.shape) # (6,)
a和b原本是两个长度为3的序列,vertical stack后变成了一个2行3列的矩阵,horizontal stack后变成了一个长度为6的序列。
6.2 newaxis
对a进行转置操作时,由于a是一个序列,并不是一个矩阵,转置操作可能无法进行,需要使用newaxis将其转化为矩阵。
newaxis的效果是增加一个维度。
A = a[:,np.newaxis] print(A) # [[1] # [1] # [1]] print(A.shape) # (3, 1)
newaxis的具体用法参照https://blog.csdn.net/lanchunhui/article/details/49725065
6.3 concatenate()
合并操作针对多个矩阵或序列时,可以使用concatenate()函数。
a = a[:,np.newaxis] b = b[:,np.newaxis] c = np.concatenate((a,b,b,a),axis=1) print(c) # [[1 2 2 1] # [1 2 2 1] # [1 2 2 1]] d = np.concatenate((a,b,b,a),axis=0) print(d) # [[1] # [1] # [1] # [2] # [2] # [2] # [2] # [2] # [2] # [1] # [1] # [1]]
axis=0时上下合并,axis=1时左右合并。
7. 分割
import numpy as np a = np.arange(12).reshape((3,4)) print(a) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]]
7.1 split()
axis=0时按行分割,axis=1时按列分割。
split()只支持等分,如果不能等分的时候,会返回如下错误:
ValueError: array split does not result in an equal division
print(np.split(a,2,axis=1)) # [array([[0, 1], # [4, 5], # [8, 9]]), array([[ 2, 3], # [ 6, 7], # [10, 11]])] print(np.split(a,3,axis=0)) # [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
7.2 array_split()
在机器学习时常需要将数据做不等量的分割,解决方法是np.arrat_split()
print(np.array_split(a,3,axis=1)) # [array([[0, 1], # [4, 5], # [8, 9]]), array([[ 2], # [ 6], # [10]]), array([[ 3], # [ 7], # [11]])]
7.3 vsplit() hsplit()
print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0)) # [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])] print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1)) """ [array([[0, 1], [4, 5], [8, 9]]), array([[ 2, 3], [ 6, 7], [10, 11]])] """
8. 深浅拷贝
= 浅拷贝
copy() 深拷贝