Numpy 数组操作

笔记 · 2023-05-24 · 533 人浏览
Numpy 数组操作

  NumPy支持各种索引和切片操作、数组转置和重塑操作、数组拼接和堆叠操作等。这些功能可以使用户方便地对数据进行处理、计算和分析。


基本操作

ndarray 数组与其他数据序列类似,也可以进行索引、切片和迭代。

1. 索引

一维与列表完全一致,多维时同理,这里直接用示例说明。

索引基本操作

  除了一些基本的索引操作,ndarray 也支持一些不一样的索引方式。
索引高级操作

2. 切片

对 ndarray 进行切片操作与一维数组相同,用索引标记切片的起始和终止位置即可。因为 ndarray 可以是多维数组,在进行切片时,通常需要设定每个维度上的切片位置

  • 一维与列表完全一致,多维时同理。
  • 所有的切片方式都是开区间(左闭右开)。
import numpy as np
# 创建一个 4×6 的二维数组
arr = np.random.randint(0, 100, size=(4, 6))
print('arr=\n', arr)
# 截取第 2 行到最后一行,第 2 列到第 4 列构成的 ndarray
arr1 = arr[1:, 1:4]
print('arr1=\n', arr1)

运行结果如下:
运行结果1

操作示例:
切片示例

  如果需要将数据反转进行切片也是可以的,例如:[3, 2, 7, 6, 8] -> [8, 7, 3]

import numpy as np
arr = np.array([3, 2, 7, 6, 8])
arr1 = arr[::-2]

  除此之外,Numpy 还提供了一个 copy() 方法,可以根据现有的 ndarray 数组创建新的 ndarray 数组。使用 copy() 方法与切片,可以用原数组的一部分生成新数组。

import numpy as np
# 创建一个 4×6 的二维数组
arr = np.arange(24).reshape(4, 6)
# 切片复制 arr 的第 2 行到第 4 行、第 1 列到第 3 列
arr1 = np.copy(arr[1:4, 0:3])
# 复制 arr1 到 arr_Copy
arr_Copy = arr1.copy()

3. 迭代

ndarray 可以通过 for 循环实现迭代。当维数多于一维时,迭代操作使用嵌套的循环。

  迭代时,通常按照第一条轴(默认为行)对二维数组进行扫描。如果需要按其他维度迭代,可以使用 apply_along_axis(func, axis, arr) 函数指定当前处理的轴。

  此外,Numpy 还包含一个循环迭代器类 numpy.nditer,所生成的迭代器(Iterator)对象是一个根据位置进行遍历的对象。这是一个有效的多维迭代器对象,与 Python 内置的 iter() 类似,每个数组元素可使用迭代器对象来访问,从而方便地对数组进行遍历。

【例 3.1】 使用嵌套 for 循环对 ndarray 数组进行遍历迭代遍历。
for 遍历

【例 3.2】 使用 nditer 对象对 ndarray 数组进行遍历迭代。
nditer 迭代

4. 变形

使用 reshape 函数,注意参数是一个 元组(tuple)。前面已多次使用,就不再赘述。

请输入图片描述

5. 级联

注意:级联的时候,如果是横向级联,参与级联的数组的行数要一致;纵向级联,参与级联的数组的列数要一致;如果是高维度数组级联,级联的维度的数据个数要一致。

(1)- np.concatenate() 级联需要注意的点:

  • 级联的参数是列表,一定要加中括号或小括号
  • 维度必须相同
  • 形状相符
  • 级联的方向默认是 shape,这个 tuple 的第一个值所代表的维度方向
  • 可通过 axis 参数改变级联的方向

具体示例:
级联1

(2)- np.hstack & np.vstack

水平级联与垂直级联,处理自己,进行维度的变更,按方向(行,列顺序)堆叠数组构成一个新的数组,堆叠的数组需要具有相同的维度。

具体示例(沿用上述中的数组):
请输入图片描述

6. 分割

与级联类似,有以下四个函数完成切分工作:

函数 数组及操作
np.split 将一个数组分割为多个子数组
np.hsplit 将一个数组水平分割为多个子数组(按列)
np.vsplit 将一个数组垂直分割为多个子数组(按行)
np.dsplit 在第三个轴上进行深度切割

  参数上也都大致类似,不同的是进行哪个维度的切分。

  这里以 np.split 为例,格式为: numpy.split(ary, indices_or_sections, axis=0)

参数 描述
ary 要被切分的数组
indices_or_sections 如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置
axis 沿着哪个维度进行切向,默认为0,横向切分

具体示例:
切分1
切分2
切分3

7. 副本

所有赋值运算不会为 ndarray 的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。可使用 copy() 函数创建副本。前面也有介绍过,可点击此处


计算(聚合)操作

ndarray 也可以直接进行基本运算,包括条件运算、统计运算以及基本数组运算等。

1. 条件运算

  Numpy 中的条件表达式 condition 的值返回特定的数组。当条件为真时返回 x 数组,条件为假时返回 y 数组。

【例 3.1】简单条件运算
简单运算1

【例 3.2】用 np.where() 函数实现数据筛选
简单运算2

2. 统计运算

  Numpy 提供了丰富的统计函数,简单来讲就是对一组数据去求它的某项指标,如最值。下表给出一些常见的统计函数:

Function Name NaN-safe Version Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power 幂运算

这里给出一些示例:
统计1.jpg


矩阵操作

1. 基本矩阵操作

算术运算(即加减乘除):在数学矩阵是可以乘以或除以一个常数。

这里以矩阵积 np.dot()为例:
请输入图片描述

2. 广播机制

重要ndarray 广播机制的两条规则

  • 规则一: 为缺失的维度补维度
  • 规则二: 假定缺失元素用已有值填充,目的就是为了保证参与运算的两个数组形状一致。

广播机制1
广播机制2

广播机制的原则:

  • 就是要把缺失的那些行或者列补充完整
  • 我们可以把一个常数向任何一个矩阵或者向量进行广播,用常数来填补整个扩展的矩阵
  • 向量可以向形状类似的举证广播(比如行向量可以向列数与其一致矩阵广播),向量在向矩阵广播的时候,用向量的行(或列)取填补扩展的矩阵

示例:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
data = 3
arr + data

# 运行结果  : array([4, 5, 6, 7, 8])

ndarray 的排序

1. 快速排序

np.sort()ndarray.sort() 都可以,但有区别:

  • np.sort() 不改变输入
  • ndarray.sort() 本地处理,不占用空间,但改变输入

示例:
快排

2. 部分排序

  有的时候我们不是对全部数据感兴趣,可能只对最小或最大的一部分感兴趣。就可以使用 np.partition(a, k) 进行排序。

  • 当 k 为正时,我们想要得到最小的 k 个数
  • 当 k 为负时,我们想要得到最大的 k 个数

部分排序


  除上述一些操作外,NumPy 还有更多的功能和方法,如果您想要深入学习和运用NumPy,建议查看官方文档及相应教程。


往期相关

  1. Numpy 基本概念
  2. Numpy 常用方法
Python
  1. xxcheng 2023-05-24

    点个赞

Theme Jasmine by Kent Liao

本网站由 又拍云 提供CDN加速/云存储服务

鄂ICP备2023005457号    鄂公网安备 42011302000815号

欢迎来自 * · * 的用户