24.10.22人工智能Numpy库学习笔记 迭代数组~统计函数

本篇文章中所有代码只给出 def 方法,实际运行需要导包 import numpy as np ,代码中的np实际上指的是numpy

迭代数组

python 复制代码
def arr_nditer():
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr)
    for i in np.nditer(arr, order="C"):
        print(i, end=" ")
    print()
    for y in np.nditer(arr, order="F"):
        print(y, end=" ")
    print()

    # 创建一个三维数组
    # flags 的 multi_index 的使用
    arr02 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    # 使用 nditer 遍历数组并获取多维索引
    it = np.nditer(arr02, flags=['multi_index'])
    for x in it:
        print(f"Element: {x}, Index: {it.multi_index}")

    # 创建一个三维数组
    # flags 的 external_loop的使用
    arr03 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    # 使用 nditer 遍历数组并获取多维索引
    it = np.nditer(arr03, flags=['external_loop'], order="F")
    for y in it:
        print(y)

1数组操作

1.1数组变维

函数名称 函数介绍
reshape 在不改变数组元素的条件下,修改数组的形状
flat 返回是一个迭代器,可以用 for 循环遍历其中的每一个元素
flatten 以一维数组的形式返回一份数组的副本,对副本的操作不会影响到原数组
ravel 返回一个连续的扁平数组(即展开的一维数组),与 flatten不同,它返回的是数组视图(修改视图会影响原数组)

1.1.1 flat

python 复制代码
def flat_test():
    array_one = np.arange(4).reshape(2,2)
    print("原数组元素:")
    for i in array_one:
        print(i,end=" ")
    print()
    print("使用flat属性,遍历数组:")
    for i in array_one.flat:
        print(i,end=" ")

1.1.2 flatten()

用于将多维数组转换为一维数组。flatten() 返回的是原数组的一个拷贝,因此对返回的数组进行修改不会影响原数组

语法:

复制代码
ndarray.flatten(order='C')

参数

order: 指定数组的展开顺序。

  • 'C':按行优先顺序展开(默认)。

  • 'F':按列优先顺序展开。

  • 'A':如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。

  • 'K':按元素在内存中的顺序展开。

python 复制代码
def arr_flatten():
    arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    print(arr)
    print("--------")
    # flatten 转为一维数组(原数组的拷贝,修改数据不会对原数据有影响)
    arr2 = arr.flatten(order="C")
    print(arr2)
    # 修改 ravel 返回的数组的元素
    arr2[-1] = 20
    print(arr)  # 发现 flatten 返回的数组修改数据,原数组的数据没被修改
    print(arr2)
    print("---------")

1.1.3 ravel()

用于将多维数组转换为一维数组。与 flatten() 不同,ravel() 返回的是原数组的一个视图(view),而不是拷贝。因此,对返回的数组进行修改会影响原数组

python 复制代码
def arr_ravel():
    arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    print(arr)
    print("---------")
    # 降维成为一维数组
    arr1 = arr.ravel(order="C")
    print(arr1)
    # 修改 ravel 返回的数组的元素
    arr1[-1] = 20
    print(arr)  # 发现 ravel 返回的数组修改数据,原数组的数据也被修改
    print(arr1)

1.2 数组转置

函数名称 说明
transpose 将数组的维度值进行对换,比如二维数组维度(2,4)使用该方法后为(4,2)
ndarray.T 与 transpose 方法相同
python 复制代码
def arr_transpose():
    arr = np.arange(1,7).reshape(2,3)
    print(arr)
    arr2 = np.transpose(arr)
    print(arr2)

1.3 修改数组维度

多维数组(也称为 ndarray)的维度(或轴)是从外向内编号的。这意味着最外层的维度是轴0,然后是轴1,依此类推。

函数名称 参数 说明
expand_dims(arr, axis) arr:输入数组 axis:新轴插入的位置 在指定位置插入新的轴(相对于结果数组而言),从而扩展数组的维度
squeeze(arr, axis) arr:输入数的组 axis:取值为整数或整数元组,用于指定需要删除的维度所在轴,指定的维度值必须为 1 ,否则将会报错,若为 None,则删除数组维度中所有为 1 的项 删除数组中维度为 1 的项
python 复制代码
def arr_dims():
    arr = np.arange(1, 7).reshape(2, 3)
    print(arr)
    arr1 = np.expand_dims(arr, axis=2)
    print(arr1)

1.4 连接数组

函数名称 参数 说明
hstack(tup) tup:可以是元组,列表,或者numpy数组,返回结果为numpy的数组 按水平顺序堆叠序列中数组(列方向)
vstack(tup) tup:可以是元组,列表,或者numpy数组,返回结果为numpy的数组 按垂直方向堆叠序列中数组(行方向)

hstack函数要求堆叠的数组在垂直方向(行)上具有相同的形状。如果行数不一致,hstack() 将无法执行,并会抛出 ValueError 异常。

hstack() 要求堆叠的数组在垂直方向(行)上具有相同的形状。如果列数不一致,将无法执行堆叠操作。

vstack() 和 hstack() 要求堆叠的数组在某些维度上具有相同的形状。如果维度不一致,将无法执行堆叠操作。

python 复制代码
def arr_stack():
    arr11 = np.array([[1, 2, 3], [4, 5, 6]])  # 2*3
    arr12 = np.array([[7, 9], [8, 10]])  # 2 * n
    arr1 = np.hstack((arr11, arr12))  # 垂直方向上连接,行数要匹配
    print(arr1)

    arr21 = np.array([[1, 2, 3], [4, 5, 6]])  # 2 * 3
    arr22 = np.array([[7, 9, 6], [8, 10, 6], [8, 10, 6]])  # n * 3
    arr2 = np.vstack((arr21, arr22))  # 水平方向上连接,列数要匹配
    print(arr2)

1.5 分割数组

函数名称 参数 说明
hsplit(ary, indices_or_sections) ary:原数组 indices_or_sections:按列分割的索引位置 将一个数组水平分割为多个子数组(按列)
vsplit(ary, indices_or_sections) ary:原数组 indices_or_sections:按列分割的索引位置 将一个数组垂直分割为多个子数组(按行)
python 复制代码
def arr_split():
    arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
    print(arr)
    result = np.hsplit(arr, [1])  # 垂直方向切割
    print(result[0])
    print(result[1])
    result = np.vsplit(arr, [1])  # 水平切割
    print(result[0])
    print(result[1])

2.数组元素的增删改查

2.1 resize

函数名称 参数 说明
resize(a, new_shape) a:操作的数组 new_shape:返回的数组的形状,如果元素数量不够,重复数组元素来填充新的形状 返回指定形状的新数组
python 复制代码
def arr_resize():
    arr = np.arange(6).reshape(2, 3)
    print(arr)
    print('resize 后数组:\n', np.resize(arr, (3, 4)))

    # 输出:
    # [[0 1 2 3]
    #  [4 5 0 1]
    #  [2 3 4 5]]

2.2 append

函数名称 参数 说明
append(arr, values, axis=None) arr:输入的数组 values:向 arr 数组中添加的值,需要和 arr 数组的形状保持一致 axis:默认为 None,返回的是一维数组;当 axis =0 时,追加的值会被添加到行,而列数保持不变,若 axis=1 则与其恰好相反 在数组的末尾添加值,返回一个一维数组
python 复制代码
# np.append(array, values, axis)
def arr_append1():
    arr = np.arange(6).reshape(2, 3)
    print(arr)
    arr1 = np.append(arr, [[1, 2, 3], [1, 2, 4]], axis=0)
    print(arr1)


def arr_append2():
    arr = np.arange(6).reshape(2, 3)
    print(arr)
    arr1 = np.append(arr, [[1, 2, 3], [1, 2, 4]], axis=1)
    print(arr1)

2.3 insert

函数名称 参数 说明
insert(arr, obj, values, axis) arr:输入的数组 obj:表示索引值,在该索引值之前插入 values 值 values:要插入的值 axis:默认为 None,返回的是一维数组;当 axis =0 时,追加的值会被添加到行,而列数保持不变,若 axis=1 则与其恰好相反 沿规定的轴将元素值插入到指定的元素前
python 复制代码
def arr_insert():
    arr1 = np.arange(1, 7).reshape(2, 3)
    arr2 = np.arange(7, 13).reshape(2, 3)
    arr12 = np.insert(arr1, 2, [4, 5], axis=1)
    arr21 = np.insert(arr2, 2, [4, 5, 9], axis=0)
    print(arr12)
    print(arr21)

2.4 delete

函数名称 参数 说明
delete(arr, obj, axis) arr:输入的数组 obj:表示索引值,在该索引值之前插入 values 值 axis:默认为 None,返回的是一维数组;当 axis =0 时,删除指定的行,若 axis=1 则与其恰好相反 删掉某个轴上的子数组,并返回删除后的新数组
python 复制代码
def arr_delete():
    arr = np.arange(6).reshape(2, 3)
    print(arr)
    arr1 = np.delete(arr, [1, 2], axis=1)
    print(arr1)

2.5 argwhere

返回数组中非 0 元素的索引,若是多维数组则返回行、列索引组成的索引坐标

2.6 unique

函数名称 参数 说明
unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None) ar:输入的数组 return_index:如果为 True,则返回新数组元素在原数组中的位置(索引) return_inverse:如果为 True,则返回原数组元素在新数组中的位置(逆索引) return_counts:如果为 True,则返回去重后的数组元素在原数组中出现的次数 删掉某个轴上的子数组,并返回删除后的新数组

1:返回唯一元素的索引

2:返回唯一元素及其逆索引

3:返回唯一元素的计数

3.统计函数

3.1 amin() 和 amax()

  • 计算数组沿指定轴的最小值与最大值,并以数组形式返回

  • 对于二维数组来说,axis=1 表示沿着水平方向,axis=0 表示沿着垂直方向

  • 按1轴求最小值,表示在最内层轴中(每列中)分别找最小值;按0轴求最小值表示在最外层轴中(所有行中按列)找最小值。求最大值类似

3.2 ptp()

  • 计算数组元素中最值之差值,即最大值 - 最小值

  • 对于二维数组来说,axis=1 表示沿着水平方向,axis=0 表示沿着垂直方向

3.3 median()

用于计算中位数,中位数是指将数组中的数据按从小到大的顺序排列后,位于中间位置的值。如果数组的长度是偶数,则中位数是中间两个数的平均值。

3.4 mean()

沿指定的轴,计算数组中元素的算术平均值(即元素之总和除以元素数量)

3.5 average()

加权平均值是将数组中各数值乘以相应的权数,然后再对权重值求总和,最后以权重的总和除以总的单位数(即因子个数);根据在数组中给出的权重,计算数组元素的加权平均值。该函数可以接受一个轴参数 axis,如果未指定,则数组被展开为一维数组。

其中 xi是数组中的元素,wi是对应的权重。

如果所有元素的权重之和等于1,则表示为数学中的期望值。

3.6 var()

在 NumPy 中,计算方差时使用的是统计学中的方差公式,而不是概率论中的方差公式,主要是因为 NumPy 的设计目标是处理实际数据集,而不是概率分布。

np.var 函数默认计算的是总体方差(Population Variance),而不是样本方差(Sample Variance)。

总体方差:

对于一个总体数据集 X={x1,x2,...,xN},总体方差的计算公式为:

其中:

  • N是总体数据点的总数。

  • μ是总体的均值

样本方差:

对于一个样本数据集 X={x1,x2,...,xn},样本方差 的计算公式为:

其中:

  • n是样本数据点的总数。

  • xˉ是样本的均值。

在样本数据中,样本均值的估计会引入一定的偏差。通过使用 n−1n−1 作为分母,可以校正这种偏差,得到更准确的总体方差估计

3.7 std()

标准差是方差的算术平方根,用来描述一组数据平均值的分散程度。若一组数据的标准差较大,说明大部分的数值和其平均值之间差异较大;若标准差较小,则代表这组数值比较接近平均值

python 复制代码
import numpy as np


def arr_min():
    arr = np.array([[9, 2, 3], [2, 5, 8], [6, 7, 8]])
    print(arr)
    print(np.min(arr, axis=0))  # 按垂直方向取最小的
    print(np.min(arr, axis=1))  # 按水平方向取最小的


def arr_ptp():
    arr = np.array([[9, 2, 3], [2, 5, 8], [6, 7, 8]])
    print(arr)
    print(np.ptp(arr, axis=0))  # 按垂直方向取最大值和最小值的差
    print(np.ptp(arr, axis=1))  # 按水平方向取最大值和最小值的差


def arr_median():
    arr = np.array([[9, 2, 3, 6], [2, 5, 8, 9], [6, 7, 8, 9]])
    print(arr)
    print(np.median(arr, axis=0))  # 按垂直方向取中位数
    print(np.median(arr, axis=1))  # 按水平方向取中位数


def arr_mean():
    arr = np.array([[9, 2, 3], [2, 5, 8], [6, 7, 8]])
    print(arr)
    print(np.mean(arr, axis=0))  # 按垂直方向取算术平均值(即元素之总和除以元素数量)
    print(np.mean(arr, axis=1))  # 按水平方向取算术平均值(即元素之总和除以元素数量)


def arr_average():
    # 创建一个一维数组
    arr = np.array([1, 2, 3, 4, 5])
    # 创建权重数组
    weights01 = np.array([0.1, 0.2, 0.3, 0.2, 0.2])
    # 使用 np.average 计算加权平均值
    average_value = np.average(arr, weights=weights01)
    print(average_value)


if __name__ == '__main__':
    arr_min()
    arr_ptp
    arr_median()
    arr_mean()
    arr_average()
相关推荐
biter00881 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
吃个糖糖8 分钟前
35 Opencv 亚像素角点检测
人工智能·opencv·计算机视觉
IT古董1 小时前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
凯哥是个大帅比1 小时前
人工智能ACA(五)--深度学习基础
人工智能·深度学习
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
m0_748232921 小时前
DALL-M:基于大语言模型的上下文感知临床数据增强方法 ,补充
人工智能·语言模型·自然语言处理
szxinmai主板定制专家1 小时前
【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
大数据·人工智能·fpga开发
海棠AI实验室1 小时前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
机器懒得学习2 小时前
基于YOLOv5的智能水域监测系统:从目标检测到自动报告生成
人工智能·yolo·目标检测
QQ同步助手2 小时前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度