Numpy
1、概述
(一)、简介
- NumPy(Numerical Python)是Python数据分析必不可少的第三方库
- NumPy的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型,使其具备了构造复杂数据类型的能力。
- 本身是由C语言开发,是个很基础的扩展,NumPy被Python其它科学计算包作为基础包,因此理解np的数据类型对python数据分析十分重要。
- NumPy重在数值计算,主要用于多维数组(矩阵)处理的库。用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多
(二)、功能
-
高性能科学计算和数据分析的基础包
-
ndarray,多维数组,具有矢量运算能力,快速、节省空间
-
矩阵运算,无需循环,可完成类似Matlab中的矢量运算
-
用于读写磁盘数据的工具以及用于操作内存映射文件的工具
2、Numpy属性
(一)、常见属性
-
ndarray.ndim # 数组的维度
-
ndarray.shape # 数组的形状
-
ndarray.size # 所有元素的个数
-
ndarray.dtype # 元素的类型
-
ndarray.itemsize # 元素的大小
(二)、例子
# 1. 构建1个3行5列的 ndarray对象(n维数字), 即: 3行5列.
arr = np.arange(15).reshape((3, 5)) # arange(15)类似于Python的range(15), 然后把0~15(包左不包右)的数据放到 3个 长度维5的一维数组中.
print(f'ndarray对象: {arr}') # ndarray对象.
print(f'数组的形状(维度): {arr.shape}') # (3, 5), 简单理解为: 3行5列
print(f'数组的轴: {arr.ndim}') # 2, 几维数组, 维度(轴)就是几.
print(f'数组的长度: {arr.size}') # 15, 即所有元素的个数.
print(f'数组的每个元素的类型: {arr.dtype}') # int64
print(f'数组的每个元素的大小(字节数): {arr.itemsize}') # 8
print(f'数组的类型: {type(arr)}') # <class 'numpy.ndarray'>
# 扩展: 上述的 shape, ndim, size等属性, 可以改写成: np.属性名(对象对)的形式.
print(f'数组的形状(维度): {np.shape(arr)}') # (3, 5), 简单理解为: 3行5列
print(f'数组的轴: {np.ndim(arr)}') # 2, 几维数组, 维度(轴)就是几.
print(f'数组的长度: {np.size(arr)}') # 15, 即所有元素的个数.
# print(f'数组的每个元素的类型: {np.dtype(arr)}') # 报错, 无该函数
# print(f'数组的每个元素的大小(字节数): {np.itemsize(arr)}') # 报错, 无该函数
# print(f'数组的类型: {np.type(arr)}') # 报错, 无该函数
3、ndarray对象
(一)、数组的方式创建
格式
# 细节: 数组的元素类型要统一
array()
例如
# 1. 数组方式创建 ndarray对象(Numpy的核心对象, 即: n维数组)
arr1 = np.array([1, 2, 3])
print(f'arr的内容: {arr1}')
print(f'arr的类型: {type(arr1)}')
print(f'arr的元素类型: {arr1.dtype}') # int32
'''
arr的内容: [1 2 3]
arr的类型: <class 'numpy.ndarray'>
arr的元素类型: int32
'''
# 2. 数组方式创建 ndarray对象(Numpy的核心对象, 即: n维数组)
arr2 = np.array([1.1, 2.3, 3.5])
print(f'arr2的内容: {arr2}')
print(f'arr2的类型: {type(arr2)}')
print(f'arr2的元素类型: {arr2.dtype}') # float64
'''
arr2的内容: [1.1 2.3 3.5]
arr2的类型: <class 'numpy.ndarray'>
arr2的元素类型: float64
'''
(二)、创建空的ndarray对象
格式
# 细节: 3个函数, 获取的元素类型都是: float64
zero() # 创造一个全是0的矩阵
ones() # 创造一个全是1的矩阵
empty() # 创造一个内容随机的矩阵(随机依赖于内存,内存不变随机数不变)
例如
# 1. 演示 zeros()函数, 创建1个全是0的ndarray对象.
arr3 = np.zeros((3, 5)) # 维度: 3行5列, 1个二维数组, 它有3个元素(每个都是1维数组), 且每个一维数组有5个元素.
print(f'arr3的内容: {arr3}')
print(f'arr3的类型: {type(arr3)}')
print(f'arr3的元素类型: {arr3.dtype}') # float64
'''
arr3的内容: [[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
arr3的类型: <class 'numpy.ndarray'>
arr3的元素类型: float64
'''
# 2. 演示 ones()函数, 创建1个 全是1的 ndarray对象.
arr4 = np.ones((2, 3)) # 维度: 2行3列, 1个二维数组, 它有2个元素(每个都是1维数组), 且每个一维数组有3个元素.
print(f'arr4的内容: {arr4}')
print(f'arr4的类型: {type(arr4)}')
print(f'arr4的元素类型: {arr4.dtype}') # float64
'''
arr4的内容: [[1. 1. 1.]
[1. 1. 1.]]
arr4的类型: <class 'numpy.ndarray'>
arr4的元素类型: float64
'''
# 3. 演示 empty()函数, 创建1个 内容随机且依赖内存状态的 ndarray对象.
arr5 = np.empty((2, 3)) # 维度: 2行3列, 1个二维数组, 它有2个元素(每个都是1维数组), 且每个一维数组有3个元素.
print(f'arr5的内容: {arr5}')
print(f'arr5的类型: {type(arr5)}')
print(f'arr5的元素类型: {arr5.dtype}') # float64
'''
arr5的内容: [[1. 1. 1.]
[1. 1. 1.]]
arr5的类型: <class 'numpy.ndarray'>
arr5的元素类型: float64
'''
(三)、创建指定范围和步长的ndarray对象
格式
arange() # 类似于python中的range()函数
例如
# 参1: 起始值(start), 参2: 结束值(不包括) stop, 参3: 步长, step. 参4: 数据类型, dtype
arr6 = np.arange(0, 10, 2, dtype=np.int64)
print(f'arr6的内容: {arr6}')
print(f'arr6的类型: {type(arr6)}')
print(f'arr6的元素类型: {arr6.dtype}') # float64
'''
arr6的内容: [0 2 4 6 8]
arr6的类型: <class 'numpy.ndarray'>
arr6的元素类型: int64
'''
(四)、创建二维数组
格式
matrix() # 创建二维的数组,mat()与该函数效果一致
例如
# 1. 创建2维矩阵.
# arr7 = np.mat('1 2 3;4 5 6')
arr7 = np.matrix('1 2 3;4 5 6')
print(f'arr7的内容: {arr7}')
print(f'arr7的类型: {type(arr7)}') # matrix类型是 ndarray类型的 子类型.
print(f'arr7的元素类型: {arr7.dtype}') # float64
'''
arr7的内容: [[1 2 3]
[4 5 6]]
arr7的类型: <class 'numpy.matrix'>
arr7的元素类型: int32
'''
# 2. 创建2维矩阵.
arr8 = np.mat('1,2,3;4,5,6')
print(f'arr8的内容: {arr8}')
print(f'arr8的类型: {type(arr8)}') # matrix类型是 ndarray类型的 子类型.
print(f'arr8的元素类型: {arr8.dtype}') # float64
'''
arr8的内容: [[1 2 3]
[4 5 6]]
arr8的类型: <class 'numpy.matrix'>
arr8的元素类型: int32
'''
# 3. 创建2维矩阵.
arr9 = np.mat(([1, 2, 3], [4, 5, 6])) # (第1个1维数组, 第2个一维数组...)
print(f'arr9的内容: {arr9}')
print(f'arr9的类型: {type(arr9)}') # matrix类型是 ndarray类型的 子类型.
print(f'arr9的元素类型: {arr9.dtype}') # float64
'''
arr9的内容: [[1 2 3]
[4 5 6]]
arr9的类型: <class 'numpy.matrix'>
arr9的元素类型: int32
'''
(五)、创建随机的ndarray对象
格式
random.rand() # 创建0.0~1.0之间的随机数
random.randint() # 指定范围内生成整数随机数
random.uniform() # 指定范围内生成小数随机数
例如
# 1. random.rand()函数, 创建0.0 ~ 1.0区间的随机数.
arr10 = np.random.rand(3, 5) # 3行5列
print(f'arr10的内容: {arr10}')
print(f'arr10的类型: {type(arr10)}') # <class 'numpy.ndarray'>
print(f'arr10的元素类型: {arr10.dtype}') # float64
'''
arr10的内容: [[0.53813533 0.44168178 0.1511361 0.77878695 0.78863361]
[0.05959302 0.72917081 0.37366742 0.50864748 0.72221538]
[0.81312235 0.80706018 0.34945499 0.21080258 0.64437881]]
arr10的类型: <class 'numpy.ndarray'>
arr10的元素类型: float64
'''
# 2. random.randint()函数, 可以指定范围, 生成: 整数的随机数
arr11 = np.random.randint(1, 10, size=(3, 5)) # 3行5列
print(f'arr11的内容: {arr11}')
print(f'arr11的类型: {type(arr11)}') # <class 'numpy.ndarray'>
print(f'arr11的元素类型: {arr11.dtype}') # float64
'''
arr11的内容: [[8 9 5 2 6]
[1 7 4 4 3]
[4 4 9 5 5]]
arr11的类型: <class 'numpy.ndarray'>
arr11的元素类型: int32
'''
# 3. random.uniform()函数, 可以指定范围, 生成: 小数的随机数
arr12 = np.random.uniform(1, 10, size=(3, 5)) # 3行5列
print(f'arr12的内容: {arr12}')
print(f'arr12的类型: {type(arr12)}') # <class 'numpy.ndarray'>
print(f'arr12的元素类型: {arr12.dtype}') # float64
'''
arr12的内容: [[2.84314753 5.22655245 6.17191338 9.47401406 4.99604169]
[2.56853946 5.87402435 5.00552884 3.89829494 4.66979043]
[2.2194954 5.81720869 1.90185452 7.55161239 7.3594193 ]]
arr12的类型: <class 'numpy.ndarray'>
arr12的元素类型: float64
'''
(六)、ndarray的类型转换
格式
astype() # 可以将ndarray转换成目标类型
例如
# 1. 创建1个 ndarray对象, 元素类型为: float64
arr13 = np.zeros((3, 5), dtype=np.float64)
print(arr13)
print(arr13.dtype) # float64
'''
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
float64
'''
# 2. 把上述的 arr13 从 float64 => int32
arr14 = arr13.astype(np.int32)
print(arr14)
print(arr14.dtype) # int32
'''
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
int32
'''
(七)、等比和等差数列
格式
logspace() # 等比数列
linspace() # 等差数列
例如
# 1. logspace(): 等比数列, 默认是: 10的幂, 且: 包左包右
arr15 = np.logspace(1, 3, 5) # 生成10 ^ 1 ~ 10 ^ 3之间, 5个元素
print(f'arr15的内容: {arr15}')
print(f'arr15的类型: {type(arr15)}') # <class 'numpy.ndarray'>
print(f'arr15的元素类型: {arr15.dtype}') # float64
'''
arr15的内容: [ 10. 31.6227766 100. 316.22776602 1000. ]
arr15的类型: <class 'numpy.ndarray'>
arr15的元素类型: float64
'''
# 2. logspace(): 等比数列, 默认是: 10的幂, 且: 包左包右, 指定底数.
arr15 = np.logspace(1, 3, 5, base=2) # 生成2 ^ 1 ~ 2 ^ 3之间, 5个元素
print(f'arr15的内容: {arr15}')
print(f'arr15的类型: {type(arr15)}') # <class 'numpy.ndarray'>
print(f'arr15的元素类型: {arr15.dtype}') # float64
'''
arr15的内容: [2. 2.82842712 4. 5.65685425 8. ]
arr15的类型: <class 'numpy.ndarray'>
arr15的元素类型: float64
'''
# 3. linspace(): 等差数列, 默认: 包左包右.
arr16 = np.linspace(1, 10, 5) # 1 ~ 10之间的, 5个元素.
print(f'arr16的内容: {arr16}')
print(f'arr16的类型: {type(arr16)}') # <class 'numpy.ndarray'>
print(f'arr16的元素类型: {arr16.dtype}') # float64
'''
arr16的内容: [ 1. 3.25 5.5 7.75 10. ]
arr16的类型: <class 'numpy.ndarray'>
arr16的元素类型: float64
'''
# 4. linspace(): 等差数列, 默认: 包左包右. endpoint: 默认是True(即: 包括结束值)
arr17 = np.linspace(1, 10, 5, endpoint=False) # 1 ~ 10之间的, 5个元素.
print(f'arr17的内容: {arr17}')
print(f'arr17的类型: {type(arr17)}') # <class 'numpy.ndarray'>
print(f'arr17的元素类型: {arr17.dtype}') # float64
'''
arr17的内容: [1. 2.8 4.6 6.4 8.2]
arr17的类型: <class 'numpy.ndarray'>
arr17的元素类型: float64
'''
4、函数
(一)、基本函数
格式
np.ceil() # 向上最接近的整数,参数是 number 或 array
np.floor() # 向下最接近的整数,参数是 number 或 array
np.rint() # 四舍五入,参数是 number 或 array
np.isnan() # 判断元素是否为 NaN(Not a Number),参数是 number 或 array
np.multiply() # 元素相乘,参数是 number 或 array
np.divide() # 元素相除,参数是 number 或 array
np.abs() # 元素的绝对值,参数是 number 或 array
np.where(condition, x, y) # 三元运算符,x if condition else y
# 注意: 需要注意multiply/divide 如果是两个ndarray进行运算 shape必须一致
例如
# 1. 创建1个正太分布的 ndarray对象.
arr = np.random.randn(2, 3)
'''
-0.344227,-0.766068,1.536094
-0.153168,-0.029010,-0.351011
'''
# 2. 演示基本函数.
print(np.ceil(arr)) # 向上取整, 天花板数.
print(np.floor(arr)) # 向下取整, 地板数.
print(np.rint(arr)) # 四舍五入
print(np.isnan(arr)) # 判断是否是: 空值.
print(np.abs(arr)) # 绝对值
print(np.multiply(arr, arr)) # 乘法运算.
print(np.divide(arr, arr)) # 除法运算.
print(np.where(arr > 0, 1, -1)) # 转换, 大于0的 => 1, 否则 => -1
'''
[[-0. -0. 2.]
[-0. -0. -0.]]
[[-1. -1. 1.]
[-1. -1. -1.]]
[[-0. -1. 2.]
[-0. -0. -0.]]
[[False False False]
[False False False]]
[[0.34422725 0.76606825 1.53609391]
[0.15316788 0.0290104 0.35101139]]
[[1.18492401e-01 5.86860558e-01 2.35958451e+00]
[2.34604003e-02 8.41603241e-04 1.23208996e-01]]
[[1. 1. 1.]
[1. 1. 1.]]
[[-1 -1 1]
[-1 -1 -1]]
'''
(二)、统计函数
格式
sum() # 求矩阵和
cumsum() # 前缀和,输出列表
例如
# 1. 创建1个 ndarray对象.
arr = np.arange(12).reshape(3, 4) # 3行4列, 二维数组
'''
0,1,2,3
4,5,6,7
8,9,10,11
'''
# 2. 统计函数
print(np.sum(arr)) # 求和: 66
print(np.cumsum(arr)) # 求和: [ 0 1 3 6 10 15 21 28 36 45 55 66]
'''
66
[ 0 1 3 6 10 15 21 28 36 45 55 66]
'''
# 3. 按行或者列进行求和, axis=0 或者 1 0 => 按列计算, 1 => 按行计算
print(np.sum(arr, axis=0)) # [12 15 18 21]
print(np.sum(arr, axis=1)) # [ 6 22 38]
'''
[12 15 18 21]
[ 6 22 38]
'''
(三)、判断相关
格式
any() # 任意1个值满足条件即可, 类似于Python中的 or
all() # 要求所有的元素都要满足, 类似于Python的and
例如
# 1. 创建1个 ndarray对象.
arr = np.random.randn(2, 3)
'''
1.297382,0.299214,0.995814
0.973208,-1.486949,-0.408149
'''
# 2. 演示 any()函数: 任意1个值满足条件即可, 类似于Python中的 or
print(np.any(arr > 0)) # True
# 3. 演示 all()函数: 要求所有的元素都要满足, 类似于Python的and
print(np.all(arr > 0)) # False
(四)、去重相关
格式
unique() # 去重
去重
# 1. 创建1个 ndarray对象.
arr = np.array([[3, 2, 1, 2], [2, 6, 5, 5]])
# 2. 对上述的 ndarry去重
print(np.unique(arr)) # [1 2 3 5 6]
(五)、排序相关
格式
sort(容器) # 返回1个新的ndarray对象
容器.sort() # 对自身进行排序
去重
# 1. 创建1个 ndarray对象.
arr = np.array([3, 1, 2, 5, 6])
print(f'排序前: {arr}')
# 2. 排序, 方式1: np.sort(arr) => 返回1个新的ndarray对象.
# np.sort(arr)
# print(f'排序后: {arr}')
new_arr = np.sort(arr)
print(f'排序后: {new_arr}')
# 3. 排序, 方式2: arr.sort() => 对自身进行排序.
arr.sort()
print(f'排序后: {arr}')
5、运算
(一)、基本运算
格式
+, -
例如
# 1. 创建两个 ndarray对象.
arr1 = np.array([10, 20, 30, 40])
arr2 = np.arange(4)
# 2. 打印上述的两个对象.
print(f'arr1: {arr1}')
print(f'arr2: {arr2}')
# 3. 基本运算, 并输出结果.
arr3 = arr1 - arr2
print(f'arr3: {arr3}') # [10 19 28 37]
(二)、矩阵运算
格式
multiply() # 哈达玛积(元素积),对应位置上的元素乘
dot() # 乘积,行乘列后的和,为当前元素
例如
# 1. 创建两个 ndarray对象.
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(f'arr1: {arr1}')
print(f'arr2: {arr2}')
# 2. 矩阵运算, 场景1: A的行数 = B的行数 且 A的列数 = B的列数
# arr3 = arr1 * arr2
arr3 = np.multiply(arr1, arr2)
print(f'arr3: {arr3}') # [[ 1 4 9], [16 25 36]]
# 3. 矩阵运算, 场景2: A的列数 = B的行数 且 A的列数 != B的列数
# 假设: A => 2行3列, B => 3行2列
# 3.1 创建两个ndarray对象.
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[1, 2], [4, 5], [-6, 7]])
print(f'arr1: {arr1}')
print(f'arr2: {arr2}')
# 3.3 矩阵运算.
print(np.dot(arr1, arr2))
print(arr1.dot(arr2)) # [[-9, 33], [-12, 75]]