NumPy入门:快速掌握Python数据分析利器 – wiki基地

NumPy入门:快速掌握Python数据分析利器

在数据科学和机器学习领域,Python已经成为最流行的编程语言之一。这很大程度上归功于其丰富的生态系统,其中NumPy库扮演着至关重要的角色。NumPy,即Numerical Python,是Python中用于科学计算的基础包。它提供了一个强大的N维数组对象、广播功能函数、集成C/C++和Fortran代码的工具以及线性代数、傅里叶变换和随机数生成等实用功能。

本文将深入介绍NumPy,帮助你快速掌握这个强大的数据分析利器。我们将从NumPy的核心概念开始,逐步探索其各种功能,并提供实用的代码示例,让你能够轻松地将NumPy应用到你的数据分析项目中。

一、NumPy的核心概念:ndarray

NumPy的核心是ndarray(N-dimensional array object),即N维数组对象。ndarray是一个存储相同类型数据的多维容器,可以是整数、浮点数、字符串等。与Python的列表相比,ndarray具有以下显著优势:

  • 性能更高: NumPy数组使用连续的内存块存储数据,这使得其能够利用SIMD(Single Instruction, Multiple Data)指令进行并行计算,显著提升运算速度。
  • 内存效率更高: 由于数据类型相同,NumPy数组可以更紧凑地存储数据,减少内存占用。
  • 强大的广播机制: NumPy允许对不同形状的数组进行运算,只要它们满足一定的广播规则。

1.1 创建ndarray

NumPy提供了多种创建ndarray的方式:

  • 从Python列表或元组创建: 使用np.array()函数可以将Python列表或元组转换为NumPy数组。

    “`python
    import numpy as np

    从列表创建

    list1 = [1, 2, 3, 4, 5]
    arr1 = np.array(list1)
    print(arr1) # 输出: [1 2 3 4 5]
    print(type(arr1)) # 输出:

    从元组创建

    tuple1 = (6, 7, 8, 9, 10)
    arr2 = np.array(tuple1)
    print(arr2) # 输出: [ 6 7 8 9 10]
    “`

  • 使用NumPy内置函数创建: NumPy提供了许多内置函数,可以快速创建特定类型的数组。

    • np.zeros(shape):创建指定形状的零数组。

      “`python
      arr3 = np.zeros((2, 3)) # 创建一个2行3列的零数组
      print(arr3)

      输出:

      [[0. 0. 0.]

      [0. 0. 0.]]

      “`

    • np.ones(shape):创建指定形状的全一数组。

      “`python
      arr4 = np.ones((3, 2)) # 创建一个3行2列的全一数组
      print(arr4)

      输出:

      [[1. 1.]

      [1. 1.]

      [1. 1.]]

      “`

    • np.empty(shape):创建指定形状的空数组(未初始化)。注意,空数组中的值是随机的,不应假定其为零。

      “`python
      arr5 = np.empty((2, 2))
      print(arr5)

      输出 (可能会是随机值):

      [[6.93040926e-310 6.93040926e-310]

      [6.93040926e-310 6.93040926e-310]]

      “`

    • np.arange(start, stop, step):创建指定范围内的数组,类似于Python的range()函数。

      python
      arr6 = np.arange(0, 10, 2) # 创建一个从0到10(不包括10),步长为2的数组
      print(arr6) # 输出: [0 2 4 6 8]

    • np.linspace(start, stop, num):创建指定范围内的数组,并指定数组元素的个数。

      python
      arr7 = np.linspace(0, 1, 5) # 创建一个从0到1(包括1),包含5个元素的数组
      print(arr7) # 输出: [0. 0.25 0.5 0.75 1. ]

    • np.eye(N):创建N x N的单位矩阵。

      “`python
      arr8 = np.eye(3) # 创建一个3×3的单位矩阵
      print(arr8)

      输出:

      [[1. 0. 0.]

      [0. 1. 0.]

      [0. 0. 1.]]

      “`

1.2 ndarray的属性

ndarray对象具有许多有用的属性,可以帮助我们了解数组的结构和数据类型。

  • ndarray.ndim:数组的维度数。

    python
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr.ndim) # 输出: 2

  • ndarray.shape:数组的形状,即每个维度的长度。

    python
    print(arr.shape) # 输出: (2, 3)

  • ndarray.size:数组中元素的总个数。

    python
    print(arr.size) # 输出: 6

  • ndarray.dtype:数组中元素的数据类型。

    python
    print(arr.dtype) # 输出: int64 (或int32,取决于你的系统)

  • ndarray.itemsize:数组中每个元素占用的字节数。

    python
    print(arr.itemsize) # 输出: 8 (如果是int64) 或 4 (如果是int32)

1.3 ndarray的数据类型

NumPy支持多种数据类型,包括整数、浮点数、布尔值、字符串等。可以使用dtype参数在创建数组时指定数据类型。

“`python
arr1 = np.array([1, 2, 3], dtype=np.int32)
print(arr1.dtype) # 输出: int32

arr2 = np.array([1.0, 2.0, 3.0], dtype=np.float64)
print(arr2.dtype) # 输出: float64

arr3 = np.array([True, False, True], dtype=np.bool_)
print(arr3.dtype) # 输出: bool

arr4 = np.array([‘apple’, ‘banana’, ‘cherry’], dtype=np.string_) # fixed-length byte strings
print(arr4.dtype) # 输出: |S6 (长度取决于元素中最长字符串的长度)

arr5 = np.array([‘apple’, ‘banana’, ‘cherry’], dtype=np.unicode_) # fixed-length unicode strings
print(arr5.dtype) # 输出: U6 (长度取决于元素中最长字符串的长度)
“`

可以使用astype()方法更改数组的数据类型。

python
arr = np.array([1, 2, 3])
arr_float = arr.astype(np.float64)
print(arr_float.dtype) # 输出: float64

二、NumPy数组的索引和切片

NumPy数组的索引和切片与Python列表类似,但更加强大。

2.1 基本索引和切片

  • 一维数组: 与Python列表相同。

    python
    arr = np.arange(10)
    print(arr[0]) # 输出: 0
    print(arr[2:5]) # 输出: [2 3 4]
    print(arr[:]) # 输出: [0 1 2 3 4 5 6 7 8 9]
    print(arr[5:]) # 输出: [5 6 7 8 9]
    print(arr[:-1]) # 输出: [0 1 2 3 4 5 6 7 8]

  • 多维数组: 可以使用逗号分隔的索引来访问特定元素。

    python
    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(arr[0, 0]) # 输出: 1
    print(arr[1, 2]) # 输出: 6

    可以使用切片来访问数组的子区域。

    python
    print(arr[:2, 1:]) # 输出: [[2 3] [5 6]]
    print(arr[1:, :2]) # 输出: [[4 5] [7 8]]

2.2 布尔索引

布尔索引允许使用布尔数组来选择数组中的元素。

python
arr = np.array([1, 2, 3, 4, 5])
bool_arr = arr > 2
print(bool_arr) # 输出: [False False True True True]
print(arr[bool_arr]) # 输出: [3 4 5]

2.3 花式索引

花式索引允许使用整数数组来选择数组中的元素。

“`python
arr = np.array([1, 2, 3, 4, 5])
index_arr = [0, 2, 4]
print(arr[index_arr]) # 输出: [1 3 5]

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[[0, 2], [1, 2]]) # 输出 [2 9] (选择了(0,1)和(2,2)位置的元素)
“`

三、NumPy的算术运算和通用函数(ufunc)

NumPy提供了丰富的算术运算和通用函数,可以对数组进行各种数学操作。

3.1 数组的算术运算

NumPy允许对数组进行逐元素的算术运算。

“`python
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

print(arr1 + arr2) # 输出: [5 7 9]
print(arr1 – arr2) # 输出: [-3 -3 -3]
print(arr1 * arr2) # 输出: [ 4 10 18]
print(arr1 / arr2) # 输出: [0.25 0.4 0.5 ]
print(arr1 ** arr2) # 输出: [ 1 32 729]
“`

3.2 通用函数(ufunc)

通用函数是对ndarray中的数据执行元素级运算的函数。 NumPy提供了许多内置的ufunc。

  • np.abs():计算绝对值。
  • np.sqrt():计算平方根。
  • np.exp():计算指数。
  • np.log():计算自然对数。
  • np.sin():计算正弦值。
  • np.cos():计算余弦值。
  • np.tan():计算正切值。
  • np.floor(): 向下取整
  • np.ceil(): 向上取整
  • np.round(): 四舍五入

“`python
arr = np.array([1, 4, 9])
print(np.sqrt(arr)) # 输出: [1. 2. 3.]

arr = np.array([-1, -2, -3, 1, 2, 3])
print(np.abs(arr)) # 输出: [1 2 3 1 2 3]

arr = np.array([1, 2, 3])
print(np.exp(arr)) # 输出: [ 2.71828183 7.3890561 20.08553692]
“`

四、NumPy的广播机制

广播是NumPy强大的特性之一,它允许对不同形状的数组进行运算,而无需显式地复制数据。广播的规则如下:

  1. 如果两个数组的维度数不同,则在维度数较小的数组的形状前面补1,直到维度数相同。
  2. 如果两个数组的形状在任何维度上都不匹配,则该维度的长度必须为1,才能进行广播。
  3. 如果两个数组在任何维度上的长度都不为1,且不相等,则无法进行广播。

“`python
arr1 = np.array([1, 2, 3])
arr2 = np.array([[4], [5], [6]])

print(arr1 + arr2)

输出:

[[5 6 7]

[6 7 8]

[7 8 9]]

“`

在这个例子中,arr1的形状是(3,)arr2的形状是(3, 1)arr1被广播为(3, 3)arr2也被广播为(3, 3),然后进行逐元素相加。

五、NumPy的线性代数

NumPy提供了强大的线性代数功能,包括矩阵乘法、矩阵分解、求逆等。

  • np.dot(a, b):计算矩阵乘法。
  • np.linalg.inv(a):计算矩阵的逆。
  • np.linalg.solve(a, b):解线性方程组。
  • np.linalg.eig(a):计算矩阵的特征值和特征向量。
  • np.linalg.det(a):计算矩阵的行列式。

“`python
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

矩阵乘法

print(np.dot(arr1, arr2))

输出:

[[19 22]

[43 50]]

矩阵的逆

arr = np.array([[1, 2], [3, 4]])
inv_arr = np.linalg.inv(arr)
print(inv_arr)

输出:

[[-2. 1. ]

[ 1.5 -0.5]]

“`

六、NumPy的随机数生成

NumPy的np.random模块提供了各种随机数生成函数。

  • np.random.rand(shape):生成服从均匀分布的随机数。
  • np.random.randn(shape):生成服从标准正态分布的随机数。
  • np.random.randint(low, high, size):生成指定范围内的随机整数。
  • np.random.choice(a, size, replace, p):从给定数组中随机选择元素。

“`python

生成一个3×3的服从均匀分布的随机数数组

rand_arr = np.random.rand(3, 3)
print(rand_arr)

生成一个2×2的服从标准正态分布的随机数数组

randn_arr = np.random.randn(2, 2)
print(randn_arr)

生成一个0到10之间的随机整数

rand_int = np.random.randint(0, 10)
print(rand_int)

从数组中随机选择5个元素 (可重复)

arr = np.array([1, 2, 3, 4, 5])
choice_arr = np.random.choice(arr, 5)
print(choice_arr)
“`

七、NumPy的应用实例

NumPy广泛应用于数据分析、机器学习、图像处理等领域。以下是一些简单的应用实例:

  • 数据清洗: 使用布尔索引过滤掉异常值。
  • 数据归一化: 将数据缩放到指定范围内。
  • 图像处理: 使用数组表示图像,并进行各种图像操作。
  • 机器学习: 使用NumPy进行矩阵运算和数据预处理。

八、总结

NumPy是Python中用于科学计算的基础包,提供了强大的N维数组对象和丰富的数学函数。掌握NumPy对于进行数据分析和机器学习至关重要。本文介绍了NumPy的核心概念、数组的创建和操作、算术运算、广播机制、线性代数和随机数生成等功能。通过学习本文,你将能够快速入门NumPy,并将其应用到你的数据分析项目中。 继续深入学习NumPy的高级特性,例如掩码数组、结构化数组、以及与其他科学计算库(如SciPy和Pandas)的集成,将进一步提升你的数据分析能力。 实践是最好的老师。 多练习,多尝试,你将逐渐掌握NumPy,并成为一个熟练的数据分析师。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部