2141 字
11 分钟
Numpy学习笔记(2)
2025-10-25
NOTE

本笔记基于 Jupyter Lab

TIP

均从第0个元素开始表述(第0行 / 第0列)

数组访问#

一维数组#

整数与切片索引#

import numpy as np
arr = np.arange(10)
print('整数索引结果为:', arr[5]) # 索引从 0 开始;也支持负数,`-1` 表示数组最后一个元素
print('切片结果为:', arr[2:7]) # 左闭右开,获取从 `start` 到 `end` 的子数组
print('省略起始索引结果为:', arr[:5]) # 默认从数组开头开始,获取到索引为 `end-1` 的元素
print('省略结束索引结果为:', arr[5:]) # 默认获取到数组末尾,包含索引为 `start` 的元素

带步长的切片索引#

arr[2:4] = 100, 101
print('索引结果为:', arr) # 左闭右开,切片修改数组元素
print('正步长索引结果为:', arr[::2]) # 左闭右开,每隔 2 个元素取一个,组成子数组
print('负步长索引结果为:', arr[5:1:-1]) # 反向切片,步长为 -1,数组倒序(开始索引必须大于结束索引)

多维数组#

import numpy as np
arr = np.array([[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])
print('创建的二维数组为:\n', arr)

单维度切片索引#

  • arr[行索引, 列起始索引:列结束索引] 或 arr[行起始索引:行结束索引, 列索引]
print('单维度切片索引结果为:', arr[0, 3:5]) # 左闭右开,索引第0行中第3、4列的元素
print('索引结果为:', arr[:, 2]) # 索引第2列的元素

多维度切片索引#

  • arr[行起始索引:行结束索引, 列起始索引:列结束索引]
print('多维度切片索引结果为:', arr[1:, 2:]) # 索引第1行及之后行中第2列到最后列的元素
print('索引结果为:', arr[:, 1:4]) # 左闭右开,选取所有行中,列索引从 1 到 3 的元素

整数序列切片索引#

  • arr[(行索引序列), (列索引序列)]
print('整数序列索引结果为:', arr[(0, 1, 2), (1, 2, 3)]) # 左闭右开,索引第0、1、2行中,第1、2、3列的元素
print('索引结果为:', arr[1:, (0, 2, 3)]) # 左闭右开,索引第1行及之后行中,第0、2、3列的元素

布尔数组切片索引#

  • arr[布尔数组, 列索引]
mask = np.array([1, 0, 1], dtype=np.bool_) # [True, False, True]
print('布尔数组索引结果为:', arr[mask, 2]) # 索引第0、2行中第2列的元素

形状操作与展平规则#

import numpy as np
arr = np.arange(12) # 创建一维数组
print('创建的一维数组为:', arr) # [0 1 2 3 4 5 6 7 8 9 10 11]

改变数组形状#

  • 数组.reshape(shape)
print('新的数组形状为:\n', arr.reshape(3, 4)) # 设置数组的形状为 3x4

查看数组维数#

  • 数组.ndim / 数组.reshape(shape).ndim
print('数组维数为:', arr.ndim) # 查看数组的维数(轴数)

数组展平#

  • 将多维数组展平为一维数组
import numpy as np
arr = np.arange(12).reshape(3, 4)
print('创建的二维数组为:\n', arr) # [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]

数组.ravel()#

# 返回原数组的视图(修改展平后的数组可能会影响原数组)
print('数组展平为:', arr.ravel()) # [ 0 1 2 3 4 5 6 7 8 9 10 11]

数组.flatten()#

# 返回原数组的副本(修改展平后的数组不会影响原数组)
# 支持指定展平顺序(默认按行序展平)
print('横向展平为:', arr.flatten()) # [ 0 1 2 3 4 5 6 7 8 9 10 11]
print('纵向展平为:', arr.flatten('F')) # [ 0 4 8 1 5 9 2 6 10 3 7 11]

数组组合#

数组元素运算#

  • 格式示例新数组 = 原数组 * 数值(或 原数组 + 数值 等)
运算类型格式示例运算逻辑arr1 = np.array([1, 2, 3, 4])运算结果(新数组)
加法新数组 = 原数组 + 数值每个元素加指定数值arr1 + 2[3, 4, 5, 6]
减法新数组 = 原数组 - 数值每个元素减指定数值arr1 - 1[0, 1, 2, 3]
乘法新数组 = 原数组 * 数值每个元素乘指定数值arr1 * 3[3, 6, 9, 12]
除法新数组 = 原数组 / 数值每个元素除以指定数值(结果为浮点)arr1 / 2[0.5, 1.0, 1.5, 2.0]
整除新数组 = 原数组 // 数值每个元素整除指定数值(丢弃小数)arr1 // 2[0, 1, 1, 2]
取余新数组 = 原数组 % 数值每个元素对指定数值取余arr1 % 2[1, 0, 1, 0]
幂运算新数组 = 原数组 ** 数值每个元素的指定次幂arr1 ** 2[1, 4, 9, 16]
大于比较(布尔)新数组 = 原数组 > 数值每个元素与数值比较,返回布尔值arr1 > 2[False, False, True, True]
小于比较(布尔)新数组 = 原数组 < 数值每个元素与数值比较,返回布尔值arr1 < 3[True, True, False, False]
等于比较(布尔)新数组 = 原数组 == 数值每个元素与数值比较,返回布尔值arr1 == 4[False, False, False, True]
不等于比较(布尔)新数组 = 原数组 != 数值每个元素与数值比较,返回布尔值arr1 != 2[True, False, True, True]

数组与数组的逐元素运算(形状需相同)#

运算类型格式示例运算逻辑arr1 = np.array([1,2,3]), arr2 = np.array([4,5,6])运算结果(新数组)
数组加法新数组 = 数组A + 数组B对应位置元素相加arr1 + arr2[5, 7, 9]
数组减法新数组 = 数组A - 数组B对应位置元素相减arr1 - arr2[-3, -3, -3]
数组乘法新数组 = 数组A * 数组B对应位置元素相乘(非矩阵乘法)arr1 * arr2[4, 10, 18]
数组除法新数组 = 数组A / 数组B对应位置元素相除(结果为浮点)arr1 / arr2[0.25, 0.4, 0.5]

np.hstack 横向组合数组#

  • 要求待组合的数组在除水平方向外的其他维度上形状一致
  • np.hstack((数组1, 数组2, ...))
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
print('横向组合后的数组为:\n', np.hstack((arr1, arr2)))
#横向组合后的数组为:
#[[ 1 2 3 7 8 9]
#[ 4 5 6 10 11 12]]

np.vstack 纵向组合数组#

  • 要求待组合的数组在除垂直方向外的其他维度上形状一致
  • np.vstack((数组1, 数组2, ...))
print('纵向组合后的数组为:\n', np.vstack((arr1, arr2)))
#纵向组合后的数组为:
#[[ 1 2 3]
#[ 4 5 6]
#[ 7 8 9]
#[10 11 12]]

np.concatenate 组合数组#

  • np.concatenate((数组1, 数组2, ...), axis=轴编号)
  • 待组合的数组,在除 axis 指定的维度外的其他所有维度上,形状必须完全一致
    • axis 用于指定数组组合的方向维度
      • axis=1横向组合(水平方向,列维度方向),与 np.hstack 类似
      • axis=0纵向组合(垂直方向,行维度方向),与 np.vstack 类似
print('横向组合后的数组为:\n', np.concatenate((arr1, arr2), axis=1))
#横向组合后的数组为:
#[[ 1 2 3 7 8 9]
#[ 4 5 6 10 11 12]]
print('纵向组合后的数组为:\n', np.concatenate((arr1, arr2), axis=0))
#纵向组合后的数组为:
#[[ 1 2 3]
#[ 4 5 6]
#[ 7 8 9]
#[10 11 12]]

数组分割#

arr = np.arange(16).reshape(4, 4)
print('创建的二维数组为:\n', arr)
#创建的二维数组为:
#[[ 0 1 2 3]
#[ 4 5 6 7]
#[ 8 9 10 11]
#[12 13 14 15]]

np.hsplit 横向分割数组#

  • 按照列的维度,将数组平均分割成指定的份数
  • np.hsplit(数组, 分割份数)
print('横向分割后的数组为:\n', np.hsplit(arr, 2))
#横向分割后的数组为:
# [array([[ 0, 1],
# [ 4, 5],
# [ 8, 9],
# [12, 13]]), array([[ 2, 3],
# [ 6, 7],
# [10, 11],
# [14, 15]])]

np.vsplit 纵向分割数组#

  • 按照行的维度,将数组平均分割成指定的份数
  • np.vsplit(数组, 分割份数)
print('纵向分割后的数组为:\n', np.vsplit(arr, 2))
#纵向分割后的数组为:
# [array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
# [12, 13, 14, 15]])]

np.split 分割数组#

  • np.split(数组, 分割份数, axis=轴编号)
    • axis 用于指定数组分割的方向维度
      • axis=1横向分割(水平方向,列维度方向),与 np.hsplit 类似
      • axis=0纵向分割(垂直方向,行维度方向),与 np.vsplit 类似
print('横向分割后的数组为:\n', np.split(arr, 2, axis=1))
#横向分割后的数组为:
# [array([[ 0, 1],
# [ 4, 5],
# [ 8, 9],
# [12, 13]]), array([[ 2, 3],
# [ 6, 7],
# [10, 11],
# [14, 15]])]
print('纵向分割后的数组为:\n', np.split(arr, 2, axis=0))
#纵向分割后的数组为:
# [array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
# [12, 13, 14, 15]])]

参考

Numpy学习笔记(2)
https://blog.chuwu.top/posts/numpy/numpy2/
作者
ChuwuYo
发布于
2025-10-25
许可协议
CC BY-NC-SA 4.0