AI机器学习-NumPy
AI机器学习-NumPy
NumPy 是 Python 中一个开源的科学计算库,专为高效处理任意维度的数组而设计。它提供了丰富的功能,支持常见的数组与矩阵操作,核心数据结构为 ndarray,这是一个快速且灵活的大数据容器。
一、ndarray 对象
(一)ndarray 优势
-
内存块风格:
-
与 Python 列表不同,ndarray 在存储数据时,数据与数据的地址是连续的。这使得对数组元素进行批量操作时速度更快。
-
而 Python 列表中的元素类型可以是任意的
-
在存储元素时,ndarray 内存连续,Python 原生 list 只能通过寻址方式找到下一个元素。这虽然导致在通用性能方面 ndarray 不及 Python 原生 list,但在科学计算场景下,ndarray 能省掉许多循环语句,代码编写更为简洁。
-
-
支持并行化运算:NumPy 内置并行运算功能。当系统具备多个核心时,在执行某些计算任务时,NumPy 会自动进行并行计算,即向量化运算,大大提高计算效率。
-
效率远高于纯 Python 代码:NumPy 底层使用 C 语言编写,并且内部解除了 GIL(全局解释器锁),因此其对数组的操作速度不受 Python 解释器的限制,相比纯 Python 代码,效率有显著提升。
(二)ndarray 属性
- ndarray.shape:返回一个表示数组维度的元组。
- 例如,对于一个二维数组 arr = np.array([[1, 2], [3, 4]]),arr.shape 的结果为 (2, 2),分别表示行数和列数。
- ndarray.ndim:返回数组的维数。
- 例如,一维数组 arr1 = np.array([1, 2, 3]) 的 ndim 属性值为 1,二维数组 arr 的 ndim 属性值为 2。
- ndarray.size:返回数组中的元素数量。
- 例如,上述二维数组 arr 的 size 属性值为 4,因为它包含 4 个元素。
- ndarray.itemsize:返回一个数组元素的长度(以字节为单位)。
- 例如,对于 np.array([1, 2, 3], dtype=np.int32),itemsize 为 4,因为 np.int32 类型每个元素占用 4 字节。
- ndarray.dtype:返回数组元素的类型。
- 例如,np.array([1, 2, 3]).dtype 为 int64,表示数组元素为 64 位整数类型。
(三)创建数组
-
生成 0 和 1 的数组
-
np.ones(shape, dtype=None, order=‘C’):创建一个指定形状的数组,数组元素全部为 1。shape 参数指定数组的形状
- dtype 参数可指定数组元素的数据类型,默认为 float64;
- order 参数指定内存中数组元素的存储顺序,‘C’ 表示按行优先存储,‘F’ 表示按列优先存储。
- 例如 np.ones((2, 3)) 创建一个 2 行 3 列的二维数组,所有元素为 1。
-
np.ones_like(a, dtype=None, order=‘K’, subok=True):创建一个与给定数组 a 形状相同且元素全部为 1 的数组。
- dtype、order 和 subok 参数与 np.ones 中的类似。
- 例如,若 a = np.array([[1, 2], [3, 4]]),则 np.ones_like(a) 将创建一个同样是 2 行 2 列,元素全为 1 的数组。
-
-
从现有数组中生成
-
np.array(object, dtype=None, copy=True, order=‘K’, subok=False, ndmin=0):将输入的 object(如列表、元组等)转换为 ndarray。
- copy 参数默认为 True,表示进行深拷贝,即新数组与原对象相互独立,修改新数组不会影响原对象。
- 例如,list1 = [1, 2, 3],arr = np.array(list1),此时修改 arr 不会改变 list1。
- 例如,list1 = [1, 2, 3],arr = np.array(list1),此时修改 arr 不会改变 list1。
- copy 参数默认为 True,表示进行深拷贝,即新数组与原对象相互独立,修改新数组不会影响原对象。
-
np.asarray(a, dtype=None, order=None):将输入转换为 ndarray,但如果输入本身就是 ndarray 且 dtype 匹配,不会进行拷贝,而是返回原数组的视图,即浅拷贝。
- 例如,arr1 = np.array([1, 2, 3]),arr2 = np.asarray(arr1),此时修改 arr2 会影响 arr1。
- 例如,arr1 = np.array([1, 2, 3]),arr2 = np.asarray(arr1),此时修改 arr2 会影响 arr1。
-
-
生成固定范围数组
-
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0):在指定的区间 [start, stop] 内,生成 num 个等间距的数值组成的数组。
-
endpoint 参数默认为 True,表示 stop 是生成数组的最后一个元素;若为 False,则生成的数组不包含 stop。
retstep 参数若为 True,除了返回数组,还会返回相邻两个元素的间距。
-
例如,np.linspace(0, 10, 5) 将在 0 到 10 之间生成 5 个等间距的数,结果为 array([ 0., 2.5, 5., 7.5, 10.])。
-
-
np.arange([start, ]stop, [step, ]dtype=None, *, like=None):生成一个从 start 开始(默认从 0 开始),以 step 为步长(默认步长为 1),到 stop 结束(不包含 stop)的数组。例如,np.arange(0, 10, 2) 将生成 array([0, 2, 4, 6, 8])。
-
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0):在指定的对数空间内生成等间距的数组。
- 它以 base 为底,从 base start 到 base stop 之间生成 num 个等间距的数。
- 例如,np.logspace(0, 2, 3, base=10) 将生成 array([ 1., 10., 100.]),即 100,101,10^2。
- 它以 base 为底,从 base start 到 base stop 之间生成 num 个等间距的数。
-
-
生成随机数组
- 正态分布:正态分布是一种常见的概率分布,
- 具有两个参数:均值 μ 和标准差 σ。它是连续型随机变量的分布,记作 N(μ,σ)。其中,
- 均值 μ 决定了分布的位置,标准差 σ 决定了分布的幅度。当 μ = 0,σ = 1 时,即为标准正态分布。
- np.random.randn(d0, d1,…, dn):生成一个或多个服从标准正态分布(均值为 0,标准差为 1)的随机数数组。
- 参数 d0, d1,…, dn 用于指定数组的形状。
- 例如,np.random.randn(2, 3) 将生成一个 2 行 3 列的数组,数组元素服从标准正态分布。
- np.random.normal(loc=0.0, scale=1.0, size=None):生成服从正态分布的随机数数组。
- loc 参数指定均值 μ,scale 参数指定标准差 σ,size 参数指定数组的形状。
- 例如,np.random.normal(0, 1, 100) 将生成 100 个均值为 0,标准差为 1 的正态分布随机数组成的一维数组。
- 具有两个参数:均值 μ 和标准差 σ。它是连续型随机变量的分布,记作 N(μ,σ)。其中,
- 均匀分布
- np.random.rand(d0, d1,…, dn):生成一个或多个在 [0, 1) 区间内均匀分布的随机数数组。
- 参数 d0, d1,…, dn 用于指定数组的形状。
- 例如,np.random.rand(2, 3) 将生成一个 2 行 3 列的数组,数组元素在 [0, 1) 区间内均匀分布。
- np.random.uniform(low=0.0, high=1.0, size=None):生成在指定区间 [low, high) 内均匀分布的随机数数组。
- size 参数指定数组的形状。
- 例如,np.random.uniform(0, 1, 100) 将生成 100 个在 [0, 1) 区间内均匀分布的随机数组成的一维数组。
- np.random.randint(low, high=None, size=None, dtype=‘l’):生成在半开区间 [low, high) 内的随机整数数组。
- 若只指定 low,则生成在 [0, low) 内的随机整数。size 参数指定数组的形状。
- 例如,np.random.randint(0, 10, 10) 将生成 10 个在 [0, 10) 区间内的随机整数组成的一维数组。
- np.random.rand(d0, d1,…, dn):生成一个或多个在 [0, 1) 区间内均匀分布的随机数数组。
- 正态分布:正态分布是一种常见的概率分布,
(四)数组索引
- 可以直接对数组进行索引和切片操作。
- 使用 [:, :] 形式,先行后列。
- 例如,对于二维数组 arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
- arr[1, :] 表示获取第二行的所有元素,结果为 array([4, 5, 6]);
- arr[:, 2] 表示获取第三列的所有元素,结果为 array([3, 6, 9])。
(五)数组形状改变
- reshape(shape, order=‘C’):返回一个具有新形状的数组,但不改变原数组的数据。shape 参数指定新的形状,
- order 参数与 np.ones 中的类似,指定内存中数组元素的存储顺序。
- 例如,arr = np.array([1, 2, 3, 4, 5, 6]),new_arr = arr.reshape((2, 3)) 将把一维数组 arr 转换为 2 行 3 列的二维数组 new_arr,而 arr 本身不变。
- resize(new_shape):直接修改原数组的形状。
- 例如,arr = np.array([1, 2, 3, 4, 5, 6]),arr.resize((2, 3)) 后,arr 本身变为 2 行 3 列的二维数组。
- 如果新形状所需的元素数量与原数组不同,会根据情况进行填充或截断。
- T 属性:用于获取数组的转置,即将数组的行和列进行互换。
- 例如,对于二维数组 arr = np.array([[1, 2], [3, 4]]),arr.T 的结果为 array([[1, 3], [2, 4]])。
- 例如,对于二维数组 arr = np.array([[1, 2], [3, 4]]),arr.T 的结果为 array([[1, 3], [2, 4]])。
(六)数组去重
- np.unique(a, return_index=False, return_inverse=False, return_counts=False, axis=None):返回数组 a 中的唯一元素。
- return_index 参数若为 True,还会返回唯一元素在原数组中的索引;
- return_inverse 参数若为 True,会返回一个数组,其元素表示原数组中每个元素在唯一元素数组中的位置;
- return_counts 参数若为 True,会返回每个唯一元素在原数组中出现的次数;
- axis 参数用于指定在哪个轴上进行去重操作,默认为 None,即对整个数组进行去重。
- 例如,arr = np.array([1, 2, 2, 3, 3, 3]),np.unique(arr) 的结果为 array([1, 2, 3])。
二、运算
(一)逻辑运算
- 可以对数组整体进行大于或小于某元素的判断,并返回维度相同的数组结果。
- 例如,对于数组 arr = np.array([1, 2, 3, 4, 5]),arr > 3 的结果为 array([False, False, False, True, True])。
(二)通用判断函数
-
np.all(a, axis=None, out=None, keepdims=,*, where=):判断数组 a 中所有元素是否满足指定条件(默认为所有元素都为 True)。
- axis 参数用于指定沿哪个轴进行判断,若为 None,则对整个数组进行判断。
- 例如,对于二维数组 arr = np.array([[1, 2], [3, 4]]),np.all(arr > 0) 返回 True,因为所有元素都大于 0;若 np.all(arr > 2),则返回 False。
-
np.any(a, axis=None, out=None, keepdims=, *, where=):判断数组 a 中是否至少有一个元素满足指定条件(默认为至少有一个元素为 True)。axis 参数作用与 np.all 中的相同。
- 例如,对于上述二维数组 arr,np.any(arr > 3) 返回 True,因为存在大于 3 的元素。
-
**np.where(condition, [x, y]):**根据条件condition进行判断,若condition为True,则返回x对应位置的元素,否则返回y对应位置的元素。
-
例如,score = np.array([[50, 60, 70], [80, 90, 100]]),temp = score[:2, :2]
- np.where(temp > 60, 1, 0)的结果为array([[0, 1], [1, 1]]),表示temp中大于 60 的元素位置置为 1,否则为 0。
-
与条件:np.logical_and(x1, x2, /, out=None, *, where=True, casting=‘same_kind’, order=‘K’, dtype=None, subok=True[, signature, extobj]) 用于对两个数组进行逻辑与操作。
- 例如,np.where(np.logical_and(temp > 60, temp < 90), 1, 0) 表示对 temp 中大于 60 且小于 90 的元素位置置为 1,否则为 0。
-
或条件:np.logical_or(x1, x2, /, out=None, *, where=True, casting=‘same_kind’, order=‘K’, dtype=None, subok=True[, signature, extobj]) 用于对两个数组进行逻辑或操作。
- 例如,np.where(np.logical_or(temp > 90, temp < 60), 1, 0) 表示对 temp 中大于 90 或小于 60 的元素位置置为 1,否则为 0。
-
(三)统计运算
-
统计指标:
-
min(a, axis=None, out=None, keepdims=, initial=, where=):返回数组 a 沿指定轴 axis 的最小值。
-
例如,对于二维数组 arr = np.array([[1, 2], [3, 4]]),
np.min(arr, axis = 0) 返回 array([1, 2]),表示每列的最小值;
np.min(arr, axis = 1) 返回 array([1, 3]),表示每行的最小值。
-
-
max(a, axis=None, out=None, keepdims=, initial=, where=):返回数组 a 沿指定轴 axis 的最大值,用法与 min 类似。
-
median(a, axis=None, out=None, overwrite_input=False, keepdims=False):计算数组 a 沿指定轴 axis 的中位数。
- 例如,arr = np.array([1, 2, 3, 4, 5]),np.median(arr) 返回 3.0。
-
mean(a, axis=None, dtype=None, out=None, keepdims=, *, where=):计算数组 a 沿指定轴 axis 的平均值。
- dtype 参数可指定计算时使用的数据类型。
- 例如,arr = np.array([1, 2, 3]),np.mean(arr) 返回 2.0。
-
std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=, *, where=):计算数组 a 沿指定轴 axis 的标准差
-
要是你喜欢这篇内容,那就别犹豫啦,赶紧点赞👍 收藏🌟 加关注👀 吧!后续仍然会持续分享相关内容
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐








所有评论(0)