AI机器学习-NumPy

NumPy 是 Python 中一个开源的科学计算库,专为高效处理任意维度的数组而设计。它提供了丰富的功能,支持常见的数组与矩阵操作,核心数据结构为 ndarray,这是一个快速且灵活的大数据容器。

一、ndarray 对象

(一)ndarray 优势

  1. 内存块风格:

    • 与 Python 列表不同,ndarray 在存储数据时,数据与数据的地址是连续的。这使得对数组元素进行批量操作时速度更快。

    • 而 Python 列表中的元素类型可以是任意的

    • 在存储元素时,ndarray 内存连续,Python 原生 list 只能通过寻址方式找到下一个元素。这虽然导致在通用性能方面 ndarray 不及 Python 原生 list,但在科学计算场景下,ndarray 能省掉许多循环语句,代码编写更为简洁。

  2. 支持并行化运算:NumPy 内置并行运算功能。当系统具备多个核心时,在执行某些计算任务时,NumPy 会自动进行并行计算,即向量化运算,大大提高计算效率。

  3. 效率远高于纯 Python 代码:NumPy 底层使用 C 语言编写,并且内部解除了 GIL(全局解释器锁),因此其对数组的操作速度不受 Python 解释器的限制,相比纯 Python 代码,效率有显著提升。

(二)ndarray 属性

  1. ndarray.shape:返回一个表示数组维度的元组。
    • 例如,对于一个二维数组 arr = np.array([[1, 2], [3, 4]]),arr.shape 的结果为 (2, 2),分别表示行数和列数。
  2. ndarray.ndim:返回数组的维数。
    • 例如,一维数组 arr1 = np.array([1, 2, 3]) 的 ndim 属性值为 1,二维数组 arr 的 ndim 属性值为 2。
  3. ndarray.size:返回数组中的元素数量。
    • 例如,上述二维数组 arr 的 size 属性值为 4,因为它包含 4 个元素。
  4. ndarray.itemsize:返回一个数组元素的长度(以字节为单位)。
    • 例如,对于 np.array([1, 2, 3], dtype=np.int32),itemsize 为 4,因为 np.int32 类型每个元素占用 4 字节。
  5. ndarray.dtype:返回数组元素的类型。
    • 例如,np.array([1, 2, 3]).dtype 为 int64,表示数组元素为 64 位整数类型。

(三)创建数组

  1. 生成 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 的数组。
  2. 从现有数组中生成

    • 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。
    • np.asarray(a, dtype=None, order=None):将输入转换为 ndarray,但如果输入本身就是 ndarray 且 dtype 匹配,不会进行拷贝,而是返回原数组的视图,即浅拷贝。

      • 例如,arr1 = np.array([1, 2, 3]),arr2 = np.asarray(arr1),此时修改 arr2 会影响 arr1。
  3. 生成固定范围数组

    • 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。
  4. 生成随机数组

    • 正态分布:正态分布是一种常见的概率分布,
      • 具有两个参数:均值 μ 和标准差 σ。它是连续型随机变量的分布,记作 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 的正态分布随机数组成的一维数组。
    • 均匀分布
      • 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) 区间内的随机整数组成的一维数组。

(四)数组索引

  1. 可以直接对数组进行索引和切片操作。
  2. 使用 [:, :] 形式,先行后列。
  3. 例如,对于二维数组 arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    • arr[1, :] 表示获取第二行的所有元素,结果为 array([4, 5, 6]);
    • arr[:, 2] 表示获取第三列的所有元素,结果为 array([3, 6, 9])。

(五)数组形状改变

  1. 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 本身不变。
  2. resize(new_shape):直接修改原数组的形状。
    • 例如,arr = np.array([1, 2, 3, 4, 5, 6]),arr.resize((2, 3)) 后,arr 本身变为 2 行 3 列的二维数组。
    • 如果新形状所需的元素数量与原数组不同,会根据情况进行填充或截断。
  3. T 属性:用于获取数组的转置,即将数组的行和列进行互换。
    1. 例如,对于二维数组 arr = np.array([[1, 2], [3, 4]]),arr.T 的结果为 array([[1, 3], [2, 4]])。

(六)数组去重

  1. np.unique(a, return_index=False, return_inverse=False, return_counts=False, axis=None):返回数组 a 中的唯一元素。
    1. return_index 参数若为 True,还会返回唯一元素在原数组中的索引;
    2. return_inverse 参数若为 True,会返回一个数组,其元素表示原数组中每个元素在唯一元素数组中的位置;
    3. return_counts 参数若为 True,会返回每个唯一元素在原数组中出现的次数;
    4. axis 参数用于指定在哪个轴上进行去重操作,默认为 None,即对整个数组进行去重。
    5. 例如,arr = np.array([1, 2, 2, 3, 3, 3]),np.unique(arr) 的结果为 array([1, 2, 3])。

二、运算

(一)逻辑运算

  1. 可以对数组整体进行大于或小于某元素的判断,并返回维度相同的数组结果。
    • 例如,对于数组 arr = np.array([1, 2, 3, 4, 5]),arr > 3 的结果为 array([False, False, False, True, True])。

(二)通用判断函数

  1. 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。
  2. np.any(a, axis=None, out=None, keepdims=, *, where=):判断数组 a 中是否至少有一个元素满足指定条件(默认为至少有一个元素为 True)。axis 参数作用与 np.all 中的相同。

    • 例如,对于上述二维数组 arr,np.any(arr > 3) 返回 True,因为存在大于 3 的元素。
  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。

(三)统计运算

  1. 统计指标:

    • 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 的标准差

要是你喜欢这篇内容,那就别犹豫啦,赶紧点赞👍 收藏🌟 加关注👀 吧!后续仍然会持续分享相关内容

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐