Python NumPy:PyPI包的详细介绍与使用 – wiki大全


Python NumPy:PyPI包的详细介绍与使用

在Python的数据科学和科学计算领域,NumPy(Numerical Python)无疑是一个基石般的存在。它提供了强大的多维数组对象、派生对象(如掩码数组和矩阵),以及用于处理这些数组的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等。本文将详细介绍NumPy的PyPI包,包括其安装、核心功能和使用方法。

1. NumPy 简介:为什么选择 NumPy?

Python原生提供了列表(list)作为序列类型,但其在处理大量数值数据时效率低下,尤其是在进行向量化操作时。NumPy应运而生,解决了这一痛点。它的核心是ndarray(n-dimensional array)对象,这是一个同构的、多维的、固定大小的数组。

NumPy 的主要优势包括:

  • 高性能:NumPy数组中的所有元素都具有相同的数据类型,并且存储在连续的内存块中,这使得操作速度远超Python列表。许多NumPy操作在C或Fortran中实现,进一步提升了性能。
  • 向量化操作:NumPy允许对整个数组执行操作,而无需编写显式的循环,这不仅使代码更简洁、可读,而且效率更高(称为“向量化”)。
  • 功能丰富:NumPy提供了大量的数学函数、线性代数、傅里叶变换、随机数生成等功能,是进行科学计算的强大工具。
  • 生态系统基石:Pandas、SciPy、Matplotlib、Scikit-learn等众多流行的数据科学库都构建在NumPy数组的基础上,使其成为Python数据科学栈的通用数据交换格式。

2. PyPI 包介绍与安装

NumPy作为Python社区中最常用的库之一,通过Python包索引(PyPI, Python Package Index)发布和维护。这意味着你可以使用Python的包管理器pip轻松安装它。

安装步骤:

  1. 确保 pip 已安装:现代Python版本通常自带pip。你可以在命令行输入 pip --version 来检查。
  2. 安装 NumPy:在命令行或终端中运行以下命令:

    bash
    pip install numpy

    如果需要更新已安装的NumPy版本,可以使用:

    bash
    pip install --upgrade numpy

  3. 验证安装:打开Python解释器或创建一个Python脚本,尝试导入NumPy并检查其版本:

    python
    import numpy as np
    print(np.__version__)

    如果能够成功打印出版本号,则说明NumPy已成功安装。

3. NumPy 核心概念与基本使用

3.1 创建 ndarray 数组

NumPy数组的创建方式多种多样:

从Python列表创建:

“`python
import numpy as np

一维数组

arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)

输出: [1 2 3 4 5]

print(arr1.shape) # (5,)
print(arr1.dtype) # int64 (或 int32, 取决于系统)

二维数组

arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)

输出:

[[1 2 3]

[4 5 6]]

print(arr2.shape) # (2, 3) (2行3列)
print(arr2.ndim) # 2 (2维)
print(arr2.size) # 6 (元素总数)
“`

使用内置函数创建特定数组:

“`python

全零数组

zeros_arr = np.zeros((3, 4))
print(zeros_arr)

输出:

[[0. 0. 0. 0.]

[0. 0. 0. 0.]

[0. 0. 0. 0.]]

全一数组

ones_arr = np.ones((2, 2))
print(ones_arr)

输出:

[[1. 1.]

[1. 1.]]

单位矩阵

identity_arr = np.eye(3)
print(identity_arr)

输出:

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

范围数组 (类似range)

range_arr = np.arange(0, 10, 2) # 从0到10(不包含),步长为2
print(range_arr)

输出: [0 2 4 6 8]

等差数列

linspace_arr = np.linspace(0, 1, 5) # 从0到1(包含),等分成5个点
print(linspace_arr)

输出: [0. 0.25 0.5 0.75 1. ]

“`

3.2 数组属性

NumPy数组有一些重要的属性:

  • ndim: 数组的维度(轴的数量)。
  • shape: 一个元组,表示数组每个维度的大小。
  • size: 数组中元素的总数。
  • dtype: 数组中元素的数据类型。
  • itemsize: 数组中每个元素占用的字节数。

python
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(f"维度: {arr.ndim}") # 2
print(f"形状: {arr.shape}") # (2, 3)
print(f"元素总数: {arr.size}") # 6
print(f"数据类型: {arr.dtype}") # int64

3.3 索引与切片

NumPy的索引和切片功能非常强大,与Python列表类似但更灵活,支持多维索引。

一维数组:

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

多维数组:

“`python
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[0, 0]) # 1 (第一行第一列)
print(arr2d[1, :]) # [4 5 6] (第二行所有列)
print(arr2d[:, 2]) # [3 6 9] (所有行的第三列)
print(arr2d[0:2, 1:3]) # 前两行,第二列到第三列

输出:

[[2 3]

[5 6]]

“`

布尔索引:

“`python
arr = np.array([1, 5, 2, 8, 3, 9])

选出所有大于5的元素

greater_than_5 = arr[arr > 5]
print(greater_than_5) # [8 9]
“`

3.4 数组操作

NumPy允许直接对数组进行各种数学运算,这些运算是元素级的。

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

print(arr1 + arr2) # [5 7 9] (加法)
print(arr1 * arr2) # [ 4 10 18] (乘法)
print(arr1 / 2) # [0.5 1. 1.5] (标量运算)

arr3 = np.array([[1, 2], [3, 4]])
arr4 = np.array([[5, 6], [7, 8]])

print(arr3 + arr4)

输出:

[[ 6 8]

[10 12]]

矩阵乘法 (@ 运算符或 np.dot())

print(arr3 @ arr4)

输出:

[[19 22]

[43 50]]

print(np.dot(arr3, arr4)) # 效果同上
“`

广播 (Broadcasting):
NumPy的广播机制允许不同形状的数组进行算术运算,前提是它们在某些维度上兼容。

“`python
a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3)
b = np.array([10, 20, 30]) # 形状 (3,)

print(a + b)

输出:

[[11 22 33]

[14 25 36]]

``
NumPy会自动将
b扩展为[[10, 20, 30], [10, 20, 30]]` 再进行元素相加。

4. 高级功能与应用

4.1 数学函数

NumPy提供了大量通用的数学函数,可以直接作用于整个数组:

python
arr = np.array([0, np.pi/2, np.pi]) # pi 为圆周率
print(np.sin(arr)) # [0.0000000e+00 1.0000000e+00 1.2246468e-16] (sin值)
print(np.sqrt(np.array([1, 4, 9]))) # [1. 2. 3.] (平方根)
print(np.exp(np.array([0, 1]))) # [1. 2.71828183] (e的指数)

4.2 统计函数

用于计算数组的统计量:

python
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr)) # 21 (所有元素之和)
print(np.sum(arr, axis=0)) # [5 7 9] (按列求和)
print(np.sum(arr, axis=1)) # [ 6 15] (按行求和)
print(np.mean(arr)) # 3.5 (平均值)
print(np.max(arr)) # 6 (最大值)
print(np.min(arr)) # 1 (最小值)
print(np.std(arr)) # 标准差

4.3 线性代数

NumPy的np.linalg模块提供了丰富的线性代数功能:

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

矩阵求逆

inv_A = np.linalg.inv(A)
print(inv_A)

输出:

[[-2. 1. ]

[ 1.5 -0.5]]

求解线性方程组 Ax = b

x = np.linalg.solve(A, b)
print(x) # [-4. 4.5]

计算行列式

det_A = np.linalg.det(A)
print(det_A) # -2.0000000000000004
“`

4.4 随机数生成

np.random模块用于生成各种类型的随机数:

“`python

生成一个0到1之间的随机浮点数

print(np.random.rand())

生成一个形状为(2, 3)的0到1之间的随机浮点数数组

print(np.random.rand(2, 3))

生成一个指定范围的随机整数

print(np.random.randint(0, 10, size=(2, 2))) # 0到9的整数

从正态分布中抽取样本

print(np.random.randn(3)) # 标准正态分布 (均值0, 方差1)
“`

4.5 改变数组形状 (Reshaping)

“`python
arr = np.arange(9) # [0 1 2 3 4 5 6 7 8]
reshaped_arr = arr.reshape((3, 3))
print(reshaped_arr)

输出:

[[0 1 2]

[3 4 5]

[6 7 8]]

使用 -1 让NumPy自动计算维度

reshaped_arr_auto = arr.reshape((3, -1)) # 3行,列数自动计算
print(reshaped_arr_auto)

扁平化数组 (展平)

flattened_arr = reshaped_arr.flatten()
print(flattened_arr) # [0 1 2 3 4 5 6 7 8]
“`

5. NumPy 的性能优势

NumPy的性能优势主要来源于以下几点:

  • 底层实现:NumPy的核心是用C语言编写的,这意味着其操作执行速度接近C语言。
  • 内存连续性:NumPy数组元素在内存中是连续存储的,这使得CPU缓存效率更高,也方便了向量化操作。
  • 向量化操作:避免了Python解释器循环的开销。Python循环是逐个解释执行的,而NumPy的向量化操作是将整个操作传递给底层的C实现一次性完成。

“`python
import time

list_data = list(range(1000000))
np_array_data = np.arange(1000000)

使用Python列表进行操作

start_time = time.time()
result_list = [x * 2 for x in list_data]
end_time = time.time()
print(f”Python列表操作时间: {end_time – start_time:.6f} 秒”)

使用NumPy数组进行操作

start_time = time.time()
result_np = np_array_data * 2
end_time = time.time()
print(f”NumPy数组操作时间: {end_time – start_time:.6f} 秒”)
“`

你会发现NumPy数组的操作速度远超Python列表。

6. NumPy 与其他库的集成

NumPy作为Python科学计算的基石,与数据科学生态系统中的其他库无缝集成:

  • Pandas:Pandas的DataFrame和Series对象内部使用NumPy数组来存储数据。
  • Matplotlib:绘图库Matplotlib接收NumPy数组作为输入,进行数据可视化。
  • SciPy:SciPy是一个基于NumPy的科学计算库,提供了更高级的模块,如优化、信号处理、图像处理等。
  • Scikit-learn:机器学习库Scikit-learn接受NumPy数组作为其模型输入和输出。

7. 总结

NumPy是Python进行科学计算不可或缺的库。它通过引入高效的ndarray对象和丰富的函数集,极大地提升了Python处理数值数据的能力。无论是数据分析、机器学习、图像处理还是更复杂的科学模拟,NumPy都是构建这些应用的基础。掌握NumPy的使用,是迈入Python数据科学世界的关键一步。通过PyPI包的便捷安装,你可以轻松地将这个强大的工具集成到你的开发环境中,开启高效数值计算之旅。


滚动至顶部