(以下所有代码都是在jupyter notebook中运行)
一、NumPy - 简介
NumPy是一个python包。它是一个由多维数组对象和用于处理数组的例程集合组成的库。
使用NumPy,可执行以下操作:
1、数组的算数和逻辑运算。
2、傅里叶变换和用于图形操作的流程。
3、线性代数有关的操作。Numpy拥有线性代数和随机数生成的内置函数。
二、NumPy - ndarray对象和其属性
ndarray 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。
ndarray中的每个元素在内存中使用相同大小的块。 ndarray中的每个元素是数据类型对象的对象(称为 dtype)
基本的ndarray是使用 NumPy 中的数组函数创建的(numpy.array())
属性:
- ndarray.ndim 阵列的轴数。
- ndarray.shape 数组的大小,表示每个维度中数组的大小。
- ndarray.size 数组的元素总数,相当于元素的乘积。
- ndarray.dtype 描述数组中元素类型的对象。
- ndarray.itemsize 数组中每个元素的大小。
三、NumPy - 数组的创建
numpy.zeros() 返回特定大小,以0填充的新数组
import numpy as np
np.zeros(shape=(3,3),dtype=np.int)
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
numpy.ones() 返回特定大小,以1填充的新数组
np.ones(shape=(3,3))
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
numpy.full() 指定数放入矩阵
import numpy as np
np.full(shape=(2,3),fill_value=6)
array([[6, 6, 6],
[6, 6, 6]])
numpy.eye() 单位矩阵
import numpy as np
np.eye(N=4,M=4)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
numpy.random.randn() 从“标准正态”分布中返回一个样本
numpy.random.normal() 从正态(高斯)分布中抽取随机样本
import numpy as np
# 可以控制期望值和方差变化
# loc 期望值 默认0
# scale 方差 默认值1
np.random.normal(loc=10,scale=2,size=(2,3))
# loc:float
# 此概率分布的均值(对应着整个分布的中心centre)
# scale:float
# 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
# size:int or tuple of ints
# 输出的shape,默认为None,只输出一个值
array([[ 8.01600174, 7.58884683, 11.24281731],
[ 8.96752779, 10.71715635, 12.57544995]])
四、NumPy - ndarray的基本操作
1.索引(一维与列表完全一致,多维度同理)
import numpy as np
arr1 = np.random.randint(0,100,size=10)
# array([63, 17, 78, 0, 72, 33, 35, 81, 37, 21]) 打印出来的结果(都是随机数)
arr1[0] = 11
# array([11, 17, 78, 0, 72, 33, 35, 81, 37, 21])
arr1[-1]
# 21
arr1[[0,1]]
# array([11, 17])
2.切片(y一维与列表完全一致,多维时同理)
arr2
# array([[38, 85, 35, 51, 31],
[59, 33, 99, 19, 62],
[92, 13, 98, 56, 52]])
arr2[0:1]
# array([[38, 85, 35, 51, 31]])
arr2[:,0:2]
# array([[38, 85],
[59, 33],
[92, 13]])
arr2[::-1,:]
# array([[92, 13, 98, 56, 52],
[59, 33, 99, 19, 62],
[38, 85, 35, 51, 31]])
3.变形(使用reshape函数)
import numpy as np
arr = np.random.random(size=(5,5,3))
# 变成一列
arr.reshape(-1,1)
# 变成一行
arr.reshape(1,-1)
4.级联
- np.concatenate() 级联需要注意的点:
- 级联的参数是列表:一定要加中括号或小括号。
- 维度必须相同。
- 形状相符。
- 【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向。
- 可通过axis参数改变级联的方向。
import numpy as np
n1 = np.ones(shape=(6,3))
n2 = np.zeros(shape=(6,3))
# axis就表示维度的方向
np.concatenate((n1,n2),axis=1)
# array([[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.]])
np.hstack与np.vstack
水平级联与垂直级联,进行维度的变更
np.hstack((n1,n2))
# array([[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.]])
np.vstack((n1,n2))
# array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
5.切分
与级联类似,三个函数完成切分工作:
- np.split
- np.vsplit
- np.hsplit
arr = np.random.randint(0,100,size=(6,6))
# 指定切分的块数来进行切分,axis控制轴向
np.split(arr,indices_or_sections=3,axis=1)
# 自定义切分
# n m 切分范围为 0~n ,n~m, m~last
np.split(arr,indices_or_sections=[3,5],axis=1)
6.副本
所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。
可使用copy()函数创建副本
arr = np.random.randint(0,10,10)
arr[0] = 100
copy_arr = arr.copy()
print(arr)
print(copy_arr)
五、ndarray的聚合操作
1.求和np.sum()
2.取最小值np.min()
在取最大值中还有一个函数np.argmin()
- 如果操作的是一维数组,没有问题,
- 如果是二维数组,要指定axis,不然得到的索引无法使用,需要对原数组做扁平化处理
- axis = 1时,表示行方向寻找。axis=0时,表示列方向寻找。
import numpy as np
n = np.random.randint(0,10,size=(3,3))
# array([[4, 0, 9],
[4, 5, 2],
[0, 0, 9]])
np.max(n,axis=1)
# array([9, 5, 9])
np.argmin(n2,axis=1)
# array([1, 2, 0], dtype=int64) 返回的是相应最小值的下标
3.取最大值np.max() 同np.main()
4.求标准差np.std()
5.求平均值np.mean()
六、ndarray的矩阵操作
1.基本矩阵操作
- 加减乘除
- 矩阵积np.dot()
2.广播机制
【重要】ndarray广播机制的两条规则
- 规则一:为缺失的维度补1
- 规则二:假定缺失元素用已有值填充
import numpy as np
例1: m = np.ones((2, 3)) a = np.arange(3) 求M+a
m = np.ones((2,3))
a = np.array([5])
display(m,a)
# array([[1., 1., 1.],
[1., 1., 1.]])
# array([5])
m + a
# array([[6., 6., 6.],
[6., 6., 6.]])
七、ndarray的排序
import numpy as np
np.sort()与ndarray.sort()都可以,但有区别:
np.sort()不改变输入
ndarray.sort()本地处理,不占用空间,但改变输入