Python数据分析基石:深入理解NumPy数组

一、为什么是NumPy?

在开始之前,我们先要明白为什么不用Python原生的列表(List)。Python列表非常灵活,可以存储不同类型的数据,但正是这种灵活性导致了它在进行数值计算时效率低下。

NumPy数组(ndarray)则不同:

  • 同质性强:数组中的所有元素必须是相同类型。

  • 效率极高:底层由C语言实现,连续存储,支持向量化操作。

  • 功能丰富:提供了大量优化的数学函数。

简单来说,当你需要进行大量的数值计算时,NumPy数组比Python列表快几个数量级。

二、创建NumPy数组

首先,我们需要导入NumPy库。社区惯例是将其导入为 np

import numpy as np

创建数组有多种方式:

  1. 从Python列表/元组创建

    python

    # 创建一维数组
    arr1d = np.array([1, 2, 3, 4, 5])
    print("一维数组:", arr1d)
    
    # 创建二维数组
    arr2d = np.array([[1, 2, 3], [4, 5, 6]])
    print("二维数组:\n", arr2d)
  2. 使用内置函数创建

    python

    # 创建全0数组
    zeros_arr = np.zeros((3, 4)) # 3行4列
    print("全0数组:\n", zeros_arr)
    
    # 创建全1数组
    ones_arr = np.ones((2, 3))
    print("全1数组:\n", ones_arr)
    
    # 创建单位矩阵(对角线为1)
    eye_arr = np.eye(3)
    print("单位矩阵:\n", eye_arr)
    
    # 创建指定范围的数组
    range_arr = np.arange(0, 10, 2) # 从0开始,到10结束(不含),步长为2
    print("arange数组:", range_arr)
    
    # 创建等间隔数组
    linspace_arr = np.linspace(0, 1, 5) # 从0到1,生成5个等间隔的数
    print("linspace数组:", linspace_arr)
    三、数组的索引与切片

    这是操作数组最常用的技能,与Python列表类似,但功能更强大。

  3. 一维数组索引切片

    python

    arr = np.array([10, 20, 30, 40, 50])
    print(arr[0])    # 输出:10
    print(arr[1:4])  # 输出:[20 30 40] (切片,含头不含尾)
    print(arr[::2])  # 输出:[10 30 50] (步长为2)

    多维数组索引切片

    python

    arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print("原始数组:\n", arr2d)
    print(arr2d[0, 1])   # 输出:2 (第0行,第1列)
    print(arr2d[1])      # 输出:[4 5 6] (第1行)
    print(arr2d[:, 1])   # 输出:[2 5 8] (所有行的第1列,这是NumPy的特色!)
    print(arr2d[0:2, 1:3]) # 输出第0、1行和第1、2列的交集
    # [[2 3]
    #  [5 6]]
  4. 重要提示: NumPy的切片是原始数组的视图,这意味着修改切片会修改原始数组!如果需要副本,请使用 .copy() 方法。

    python

    slice_of_arr = arr2d[0:2].copy() #
  5. 四、数组的形状操作

    了解并改变数组的形状是数据处理中的常见操作。

    python

    arr = np.arange(12) # [0, 1, 2, ..., 11]
    print("原始形状:", arr.shape) # 输出:(12,)
    
    # 改变形状
    arr_reshaped = arr.reshape(3, 4) # 变为3行4列的二维数组
    print("重塑后:\n", arr_reshaped)
    
    # 展平数组
    arr_flattened = arr_reshaped.flatten() # 或使用 .ravel()
    print("展平后:", arr_flattened)
    
    # 转置
    arr_transposed = arr_reshaped.T
    print("转置后:\n", arr_transposed)
    五、数组的广播(Broadcasting)

    广播是NumPy最强大也最容易让人困惑的特性之一。它描述的是NumPy如何在算术运算中处理不同形状的数组。

    核心规则:从尾部维度开始,逐维度比较,维度相等或其中一方为1时,可以广播。

    看几个例子就明白了:

    python

    # 示例1:数组与标量运算(标量会被广播到所有元素)
    arr = np.array([1, 2, 3])
    result = arr + 5
    print(result) # 输出:[6 7 8]
    
    # 示例2:不同形状的数组相加
    a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3)
    b = np.array([10, 20, 30])           # 形状 (3,)
    # b会被广播成 [[10, 20, 30], [10, 20, 30]],然后与a相加
    result = a + b
    print(result)
    # 输出:
    # [[11 22 33]
    #  [14 25 36]]
    六、总结

    NumPy数组是Python数据科学生态的基石。掌握其创建、索引、切片、形状操作和广播机制,是后续学习Pandas、Scikit-learn、Matplotlib等更高级库的必备前提。建议大家在理解理论后,多动手敲代码,亲自体验NumPy带来的高效与便捷。

    希望这篇博客能帮助你打下坚实的基础!如果你有任何问题,欢迎在评论区留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值