NumPy(Numerical Python)是 Python 科学计算的核心库,它提供了高性能的多维数组对象(ndarray)以及一系列用于数组操作的函数,相比 Python 原生列表,NumPy 数组在数值计算、数据处理上效率提升显著。本文将从 NumPy 的核心属性、数组创建、基础运算、索引、合并与分割六个核心维度,带你快速掌握 NumPy 的基础用法,适合刚接触 NumPy 的新手入门。

1. NumPy 核心属性

在使用 NumPy 前,首先需要导入库(约定俗成使用np作为别名):

import numpy as np

创建一个基础数组后,我们可以通过 NumPy 的核心属性快速了解数组的关键信息:

# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])

# 1. ndim:数组的维度(秩)
print("数组维度:", arr.ndim)  # 输出:2(二维数组)

# 2. shape:数组的形状(行×列),返回元组
print("数组形状:", arr.shape)  # 输出:(2, 3)(2行3列)

# 3. size:数组中元素的总个数
print("元素总数:", arr.size)  # 输出:6

# 4. dtype:数组中元素的数据类型
print("元素类型:", arr.dtype)  # 输出:int64(默认整数类型,根据系统可能为int32)

关键说明

  • shape是最常用的属性之一,修改shape可以改变数组维度(如arr.shape = (3,2)会将 2 行 3 列数组转为 3 行 2 列);
  • dtype支持指定创建数组的类型,如np.array([1,2], dtype=np.float32)

2. NumPy 数组的创建

NumPy 提供了丰富的数组创建方式,不同方式适用于不同场景,以下是新手必须掌握的核心方法:

2.1 基础创建:np.array ()

这是最基础的创建方式,直接将 Python 列表 / 元组转换为 NumPy 数组,支持指定数据类型。

# 1. 创建一维数组
arr1 = np.array([1, 2, 3, 4])
print("一维数组:", arr1)  # 输出:[1 2 3 4]
print("数组类型:", arr1.dtype)  # 输出:int64

# 2. 创建二维数组(嵌套列表)
arr2 = np.array([[1, 2], [3, 4], [5, 6]])
print("二维数组:\n", arr2)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]]

# 3. 指定数据类型
arr3 = np.array([1, 2, 3], dtype=np.float32)
print("指定float32类型:", arr3, "类型:", arr3.dtype)
# 输出:[1. 2. 3.] 类型:float32

2.2 特殊值数组:zeros/ones/empty/eye

这类方法用于创建固定值的特殊数组,是数值计算中最常用的初始化方式。

2.2.1 np.zeros ():全 0 数组

创建指定形状的全 0 数组,默认float64类型,可通过dtype指定类型。

# 1. 创建一维全0数组
zeros_1d = np.zeros(5)
print("一维全0数组:", zeros_1d)  # 输出:[0. 0. 0. 0. 0.]

# 2. 创建二维全0数组(传入形状元组)
zeros_2d = np.zeros((3, 4))
print("3行4列全0数组:\n", zeros_2d)
# 输出:
# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]


2.2.2 np.ones ():全 1 数组

用法与zeros()完全一致,只是数组元素全为 1。

# 创建2行3列的int类型全1数组
ones_arr = np.ones((2, 3), dtype=np.int64)
print("全1数组:\n", ones_arr)
# 输出:
# [[1 1 1]
#  [1 1 1]]
2.2.3 np.empty ():空数组

创建指定形状的 “空” 数组,数组元素为内存中随机值(非真正空),速度比 zeros/ones 快,适合后续要赋值的场景。

empty_arr = np.empty((2, 2))
print("空数组(随机值):\n", empty_arr)
# 输出示例(值不固定):
# [[4.67296746e-307 1.69121096e-306]
#  [1.37961641e-306 9.79054228e-307]]

2.3 数值序列:arange/linspace

用于创建有序的数值序列数组,替代 Python 原生range,支持浮点数。

2.3.1 np.arange ():固定步长序列

语法:np.arange(start, stop, step, dtype=None)

  • start:起始值(默认 0)
  • stop:终止值(不包含)
  • step:步长(默认 1)
    # 1. 基础用法:0到9(不包含10)
    arr1 = np.arange(10)
    print("0-9序列:", arr1)  # 输出:[0 1 2 3 4 5 6 7 8 9]
    
    # 2. 指定起始和终止:5到14
    arr2 = np.arange(5, 15)
    print("5-14序列:", arr2)  # 输出:[ 5  6  7  8  9 10 11 12 13 14]
    
    # 3. 指定步长:0到10,步长2
    arr3 = np.arange(0, 11, 2)
    print("0-10步长2:", arr3)  # 输出:[ 0  2  4  6  8 10]
    
    # 4. 浮点数步长:0到1,步长0.2
    arr4 = np.arange(0, 1, 0.2)
    print("浮点数步长:", arr4)  # 输出:[0.  0.2 0.4 0.6 0.8]
    
    # 5. 重塑为二维数组
    arr5 = np.arange(12).reshape(3, 4)
    print("重塑为3行4列:\n", arr5)
    # 输出:
    # [[ 0  1  2  3]
    #  [ 4  5  6  7]
    #  [ 8  9 10 11]]
    2.3.2 np.linspace ():固定个数序列

    语法:np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

  • start:起始值
  • stop:终止值(默认包含,endpoint=False则不包含)
  • num:生成的元素个数(默认 50)
  • retstep:是否返回步长(默认 False)
    # 1. 基础用法:0到10,生成5个均匀数(包含10)
    lin1 = np.linspace(0, 10, num=5)
    print("0-10生成5个数:", lin1)  # 输出:[ 0.   2.5  5.   7.5 10. ]
    
    # 2. 不包含终止值:0到10,生成5个数
    lin2 = np.linspace(0, 10, num=5, endpoint=False)
    print("不包含10:", lin2)  # 输出:[0. 2. 4. 6. 8.]
    
    # 3. 返回步长:获取生成的数和步长
    lin3, step = np.linspace(0, 10, num=5, retstep=True)
    print("数值序列:", lin3, "步长:", step)  # 输出:[ 0.   2.5  5.   7.5 10. ] 步长:2.5
    
    # 4. 生成后重塑为二维数组
    lin4 = np.linspace(1, 10, num=9).reshape(3, 3)
    print("3行3列等差数列:\n", lin4)
    # 输出:
    # [[ 1.   2.125  3.25 ]
    #  [ 4.375  5.5    6.625]
    #  [ 7.75   8.875 10.   ]]

    2.4 随机数数组:np.random(基础)

    生成随机数数组是数据分析、模拟实验的常用操作,这里介绍最基础的两种:

    # 1. np.random.random():0到1之间的随机浮点数
    random_arr = np.random.random((2, 3))
    print("0-1随机浮点数数组:\n", random_arr)
    # 输出示例:
    # [[0.456 0.789 0.123]
    #  [0.876 0.345 0.678]]
    
    # 2. np.random.randint():指定范围的随机整数
    # 语法:randint(low, high=None, size=None)
    int_arr = np.random.randint(0, 10, size=(3, 3))  # 0到9的随机整数,3×3
    print("0-9随机整数数组:\n", int_arr)
    # 输出示例:
    # [[5 8 2]
    #  [7 1 9]
    #  [3 4 6]]

    3. NumPy 基础运算

    NumPy 支持数组与标量、数组与数组之间的快速运算,无需循环,效率极高。

    3.1 数组与标量运算

    数组加减乘除标量时,会对每个元素执行相同操作:

    arr = np.array([[1, 2, 3], [4, 5, 6]])
    
    # 加法
    print("数组+2:\n", arr + 2)
    # 输出:
    # [[3 4 5]
    #  [6 7 8]]
    
    # 乘法
    print("数组×3:\n", arr * 3)
    # 输出:
    # [[ 3  6  9]
    #  [12 15 18]]
    
    # 平方
    print("数组平方:\n", arr **2)
    # 输出:
    # [[ 1  4  9]
    #  [16 25 36]]
    
    # 三角函数(以sin为例)
    print("数组sin值:\n", np.sin(arr))
    # 输出:
    # [[ 0.84147098  0.90929743  0.14112001]
    #  [-0.7568025  -0.95892427 -0.2794155 ]]

    3.2 数组与数组运算

    同形状数组

    arr1 = np.array([[1, 2], [3, 4]])
    arr2 = np.array([[5, 6], [7, 8]])
    
    # 加法
    print("数组相加:\n", arr1 + arr2)
    # 输出:
    # [[ 6  8]
    #  [10 12]]
    
    # 乘法(对应元素相乘,非矩阵乘法)
    print("对应元素相乘:\n", arr1 * arr2)
    # 输出:
    # [[ 5 12]
    #  [21 32]]
    
    # 矩阵乘法(需用dot函数)
    print("矩阵乘法:\n", arr1.dot(arr2))
    # 输出:
    # [[19 22]
    #  [43 50]]

    运算时,对应位置元素两两计算:

    3.3 聚合运算

    对数组整体或按轴计算最大值、最小值、求和等:

    arr = np.array([[1, 2, 3], [4, 5, 6]])
    
    print("数组最大值:", arr.max())  # 6
    print("数组最小值:", arr.min())  # 1
    print("数组求和:", arr.sum())    # 21
    
    # 按轴运算(axis=0:列,axis=1:行)
    print("按列求最大值:", arr.max(axis=0))  # [4 5 6]
    print("按行求和:", arr.sum(axis=1))      # [ 6 15]

    4. NumPy 索引

    NumPy 支持类似 Python 列表的索引方式,同时支持多维数组的精准索引。

    4.1 一维数组索引

    与 Python 列表完全一致:

    arr = np.linspace(0, 10, num=6)  # [ 0.  2.  4.  6.  8. 10.]
    
    print("索引第3个元素:", arr[2])    # 4.0
    print("切片(1到4,步长2):", arr[1:4:2])  # [2. 6.]
    print("反向索引:", arr[-1])       # 10.0

    4.2 二维数组索引

    格式为arr[行索引, 列索引],支持单独索引行 / 列、切片:

    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    
    # 索引第2行第3列元素
    print("单个元素:", arr[1, 2])  # 6
    
    # 索引第1行所有元素
    print("第1行:", arr[0, :])    # [1 2 3]
    
    # 索引第2列所有元素
    print("第2列:", arr[:, 1])    # [2 5 8]
    
    # 切片:前2行,后2列
    print("切片结果:\n", arr[:2, 1:])
    # 输出:
    # [[2 3]
    #  [5 6]]
    
    # 布尔索引(筛选大于5的元素)
    print("大于5的元素:", arr[arr > 5])  # [6 7 8 9]

    5. NumPy 数组合并

    NumPy 提供concatenatevstackhstack等函数实现数组合并,核心是保证合并维度的一致性。

    5.1 垂直合并(vstack)

    按行合并(上下拼接),要求列数相同:

    arr1 = np.array([[1, 2], [3, 4]])
    arr2 = np.array([[5, 6], [7, 8]])
    
    # 垂直合并
    v_arr = np.vstack((arr1, arr2))
    print("垂直合并:\n", v_arr)
    # 输出:
    # [[1 2]
    #  [3 4]
    #  [5 6]
    #  [7 8]]

    5.2 水平合并(hstack)

    按列合并(左右拼接),要求行数相同:

    # 水平合并
    h_arr = np.hstack((arr1, arr2))
    print("水平合并:\n", h_arr)
    # 输出:
    # [[1 2 5 6]
    #  [3 4 7 8]]

    5.3 通用合并(concatenate)

    np.concatenate是 NumPy 中最通用的数组合并函数,通过axis参数指定合并轴,可适配一维、二维等多维度合并场景,是vstack/hstack的底层实现。

  • 5.3.1 核心语法
    np.concatenate((arr1, arr2, ...), axis=0)
  • 关键参数:

  • (arr1, arr2, ...):待合并的数组序列(需放入元组 / 列表);
  • axis:合并轴,默认axis=0(垂直 / 行方向),axis=1(水平 / 列方向);
  • 核心要求:除合并轴外,其他轴的形状必须一致。
  • 5.3.2 核心场景示例
    场景 1:二维数组垂直合并(axis=0)

    要求待合并数组列数相同,沿行方向拼接:

  • arr1 = np.array([[1, 2], [3, 4]])  # shape=(2,2)
    arr2 = np.array([[5, 6], [7, 8]])  # shape=(2,2)
    concat_v = np.concatenate((arr1, arr2), axis=0)
    print("垂直合并结果:\n", concat_v)
    # 输出:
    # [[1 2]
    #  [3 4]
    #  [5 6]
    #  [7 8]]
    场景 2:二维数组水平合并(axis=1)

    要求待合并数组行数相同,沿列方向拼接:

  • concat_h = np.concatenate((arr1, arr2), axis=1)
    print("水平合并结果:\n", concat_h)
    # 输出:
    # [[1 2 5 6]
    #  [3 4 7 8]]

    5.4 合并函数对比(vstack/hstack/concatenate)

    函数 适用维度 合并方向 等价 concatenate 写法 核心要求
    np.vstack 一维 / 二维 垂直(行) np.concatenate(..., axis=0) 列数相同
    np.hstack 一维 / 二维 水平(列) np.concatenate(..., axis=1) 行数相同
    np.concatenate 任意维度 任意轴(axis) - 除合并轴外,其他轴形状一致
  • 6. NumPy 数组分割

    数组分割是合并的逆操作,常用splitvsplithsplit函数,需指定分割份数或分割点。

    6.1 垂直分割(vsplit)

    按行分割,要求行数能被分割份数整除:

    arr = np.arange(12).reshape(6, 2)  # 6行2列数组
    print("原始数组:\n", arr)
    
    # 垂直分割为3份
    v_split_arr = np.vsplit(arr, 3)
    print("垂直分割结果:")
    for i in v_split_arr:
        print(i)
    # 输出:
    # [[0 1]]
    # [[2 3]]
    # [[4 5]
    #  [6 7]
    #  [8 9]
    #  [10 11]] → 注:6行分割为3份,每份2行

    6.2 水平分割(hsplit)

    按列分割,要求列数能被分割份数整除:

    arr = np.arange(12).reshape(3, 4)  # 3行4列数组
    print("原始数组:\n", arr)
    
    # 水平分割为2份
    h_split_arr = np.hsplit(arr, 2)
    print("水平分割结果:")
    for i in h_split_arr:
        print(i)
    # 输出:
    # [[0 1]
    #  [4 5]
    #  [8 9]]
    # [[ 2  3]
    #  [ 6  7]
    #  [10 11]]

    6.3 自定义分割(split)

    通过axis指定分割轴,同时支持指定分割点:

    arr = np.arange(10)
    # 按分割点[3,7]分割为3部分(0-2, 3-6,7-9)
    split_arr = np.split(arr, [3,7])
    print("自定义分割:", split_arr)
    # 输出:[array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]

    总结

  • NumPy 数组创建方式丰富:np.array()是基础,zeros/ones用于初始化,arange/linspace生成有序序列,random生成随机数;
  • arange步长生成序列(不包含终止值),linspace个数生成序列(默认包含终止值),可根据需求选择;
  • 数组核心属性(ndim/shape/size/dtype)是操作数组的基础,reshape可灵活调整数组维度;
  • 基础运算支持标量 / 数组运算,聚合运算可按轴计算,矩阵乘法需用dot函数;
  • 索引支持单元素、切片、布尔索引,二维数组索引格式为[行,列]
  • 数组合并 / 分割需保证维度匹配,垂直操作(vstack/vsplit)按行,水平操作(hstack/hsplit)按列。
Logo

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

更多推荐