numpy
array对象的背景
- Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组;
- Python的List也可以实现相同的功能,但是array比List的优点在于性能好、包含数组元数据信息、大量的便捷函数;
- Numpy成为事实上的Scipy、Pandas、Scikit-Learn、Tensorflow、PaddlePaddle等框架的“通用底层语言”
- Numpy的array和Python的List的一个区别,是它元素必须都是同一种数据类型,比如都是数字int类型,这也是Numpy高性能的一个原因;
array本身的属性
- shape:返回一个元组,表示array的维度
- ndim:一个数字,表示array的维度的数目
- size:一个数字,表示array中所有数据元素的数目
- dtype:array中元素的数据类型
创建array的方法
- 从Python的列表List和嵌套列表创建array
- 使用预定函数arange、ones/ones_like、zeros/zeros_like、empty/empty_like、full/full_like、eye等函数创建
- 生成随机数的np.random模块构建
array本身支持的大量操作和函数
- 直接逐元素的加减乘除等算数操作
- 更好用的面向多维的数组索引
- 求sum/mean等聚合函数
- 线性代数函数,比如求解逆矩阵、求解方程组
创建array的便捷函数
使用arange创建数字序列np.arange([start,] stop[, step,], dtype=None)
1 | np.arange(10) |
创建一维和二维数组
使用 Python List 和嵌套 List 创建数组
1 | import numpy as np |
创建数组的便捷函数
使用 arange 创建数字序列
1 | np.arange(10) # 创建序列 0 到 9 的数组 |
1 | np.ones(10) # 创建长度为 10 的全 1 数组 |
使用 zeros 和 zeros_like 创建全 0 数组
1 | np.zeros(10) # 创建长度为 10 的全 0 数组 |
使用 empty 和 empty_like 创建未初始化数组
1 | np.empty(10) # 创建长度为 10 的未初始化数组 |
使用 full 和 full_like 创建指定值数组
1 | np.full(10, 666) # 创建长度为 10,填充值为 666 的数组 |
使用 random 模块生成随机数数组
1 | np.random.randn() # 生成一个随机数 |
array 支持的操作和函数
1 | A = np.arange(10).reshape(2, 5) # 创建并重塑数组 A |
Numpy对数组按索引查询
Numpy中有三种索引方法:
- 基础索引
- 神奇索引
- 布尔索引
基础索引
1 | import numpy as np |
二维数组
1 | X = np.arange(20).reshape(4,5) |
神奇索引
一维数组
1 | x = np.arange(10) |
二维数组
1 | X = np.arange(20).reshape(4, 5) |
布尔索引
一维数组
1 | x = np.arange(10) |
二维数组
1 | X = np.arange(20).reshape(4, 5) |
条件的组合
1 | x = np.arange(10) |
Numpy常用Random随机函数汇总
Numpy提供了多种随机数生成函数,以下是常用的随机函数及示例:
1. np.random.rand(d0, d1, ..., dn)
返回数据在 [0, 1) 之间,具有均匀分布。
一维数组:
1
2np.random.rand(5)
# array([0.70043712, 0.84418664, 0.67651434, 0.72785806, 0.95145796])二维数组:
1
2
3
4np.random.rand(3, 4)
# array([[0.0127032 , 0.4135877 , 0.04881279, 0.09992856],
# [0.50806631, 0.20024754, 0.74415417, 0.192892 ],
# [0.70084475, 0.29322811, 0.77447945, 0.00510884]])
2. np.random.randn(d0, d1, ..., dn)
返回数据具有标准正态分布(均值为0,方差为1)。
一维数组:
1
2np.random.randn(5)
# array([-1.20990266, -0.04618272, -0.44118244, 0.46953431, 0.44325817])二维数组:
1
2
3
4np.random.randn(3, 4)
# array([[-1.66738875, -1.81731749, -1.39753916, 0.78392691],
# [-0.29129965, 0.67049043, 0.706931 , 1.42965241],
# [-0.41407013, -1.32672274, -0.14880188, 0.34771289]])
3. np.random.randint(low[, high, size, dtype])
生成随机整数,包含low,不包含high。
示例:
单个整数:
1
np.random.randint(3) # 2
指定范围的整数:
1
2np.random.randint(10, 30, size=(5,))
# array([27, 16, 25, 18, 18])
4. np.random.random([size])
生成 [0.0, 1.0) 之间的随机数。
示例:
一维数组:
1
2np.random.random(5)
# array([0.95858105, 0.66579831, 0.84015904, 0.14691185, 0.14394403])二维数组:
1
2
3
4np.random.random(size=(3,4))
# array([[0.30843116, 0.37016398, 0.31852964, 0.56240025],
# [0.4640979 , 0.80066784, 0.78735522, 0.84323067],
# [0.68824287, 0.31854825, 0.93794112, 0.40711455]])
5. np.random.choice(a[, size, replace, p])
从数组a中生成随机结果。
6. np.random.shuffle(x)
将数组x进行随机排列。
7. np.random.permutation(x)
将数组x进行随机排列或者数字的全排列。
8. np.random.normal([loc, scale, size])
按照给定的平均值loc和方差scale生成高斯分布的数字。
9. np.random.uniform([low, high, size])
在指定范围内生成均匀分布的随机数。
详细使用方法和示例可以参考Numpy官方文档。
Numpy的数学统计函数
1. Numpy有哪些数学统计函数:
| 函数名 | 说明 |
|---|---|
| np.sum | 所有元素的和 |
| np.prod | 所有元素的乘积 |
| np.cumsum | 元素的累积加和 |
| np.cumprod | 元素的累积乘积 |
| np.min | 最小值 |
| np.max | 最大值 |
| np.percentile | 0-100百分位数 |
| np.quantile | 0-1分位数 |
| np.median | 中位数 |
| np.average | 加权平均,参数可以指定weights |
| np.mean | 平均值 |
| np.std | 标准差 |
| np.var | 方差 |
2. 怎样实现按不同的axis计算
以上函数,都有一个参数叫做axis用于指定计算轴为行还是列,如果不指定,那么会计算所有元素的结果
3. 实例:机器学习将数据进行标准化
1 | import numpy as np |
Numpy计算数组中满足条件元素个数
使用numpy的random模块生成1亿个数字
1 | import numpy as np |
使用Python原生语法实现
1 | pyarr = list(arr) |
使用numpy的向量化操作实现
1 | result_np = arr[arr > 5000].size |
Numpy怎样给数组增加一个维度
在处理数据时,有时需要增加数组的维度,以下是三种方法:
- 使用 np.newaxis 关键字
1 | import numpy as np |
- 使用 np.expand_dims 方法
1 | import numpy as np |
- 使用 np.reshape 方法
1 | import numpy as np |
以上三种方法都能在不改变数据的情况下增加数组的维度,便于在多维数据处理中进行维度匹配和操作。
Numpy非常重要有用的数组合并操作
在数据处理中,常常需要合并不同来源的数据。以下是数组合并的几种重要方法:
1. 给数据添加新的多行
1 | import numpy as np |
方法1:使用 np.concatenate()
1 | print(np.concatenate([a, b])) |
方法2:使用 np.vstack() 或 np.row_stack()
1 | print(np.vstack([a, b])) |
- 给数据添加新的多列
1 | a = np.arange(12).reshape(3,4) |
方法1:使用 np.concatenate() 指定 axis=1
1 | print(np.concatenate([a, b], axis=1)) |
方法2:使用 np.hstack()
1 | print(np.hstack([a, b])) |
方法3:使用 np.column_stack()
1 | print(np.column_stack([a, b])) |
Numpy怎样对数组排序
Numpy提供了三种排序方法:
np.sort:返回排序后数组的拷贝。array.sort:原地排序数组而不是返回拷贝。np.argsort:间接排序,返回排序后的数字索引。
这些方法都支持参数kind,可用值包括:
quicksort:快速排序,平均O(nlogn),不稳定情况。mergesort:归并排序,平均O(nlogn),稳定排序。heapsort:堆排序,平均O(nlogn),不稳定排序。stable:稳定排序。
默认kind是quicksort,保持默认即可。
1 | import numpy as np |
Numpy与Pandas数据的相互转换
Numpy数组转换为Pandas数据结构
一维数组转换为Pandas的Series
1 | import numpy as np |
二维数组转换为Pandas的DataFrame
1 | arr = np.random.randint(1, 10, size=(5, 4)) |
Pandas数据结构转换为Numpy数组
将Pandas的Series转换为Numpy数组
1 | series = pd.Series(range(10)) |
将Pandas的DataFrame转换为Numpy数组
1 | df = pd.DataFrame([ |
Numpy的缺失值处理
在NumPy中,处理缺失值通常涉及使用掩码或特殊函数来识别、过滤或填充这些值。
使用np.nan表示缺失值:
1 | import numpy as np |
检测缺失值:
1 | np.isnan():检测数组中的缺失值。 |
1 | np.isnan(arr) # 返回一个布尔掩码,指示数组中的缺失值 |
过滤或填充缺失值:np.nan_to_num():将缺失值替换为特定值。np.nanmean()、np.nanmedian():计算数组中忽略缺失值的均值或中位数。np.where():条件替换。
1 | arr[np.isnan(arr)] = 0 # 将缺失值替换为0 |
处理包含缺失值的数据:
NumPy通常不是用于处理包含不同数据类型或缺失值的复杂数据集的最佳工具。对于更复杂的数据操作和缺失值处理,通常使用Pandas库会更合适。