“`markdown
NumPy 入门:pypi 安装与使用指南
NumPy(Numerical Python)是 Python 中用于科学计算的基础包。它提供了高性能的多维数组对象(ndarray
)以及用于处理这些数组的工具。无论是数据分析、机器学习、深度学习,还是其他任何涉及数值计算的领域,NumPy 都是不可或缺的。本文将详细介绍 NumPy 的安装、基本使用、常用函数、高级特性,并提供一些实践示例,帮助读者快速入门 NumPy。
1. NumPy 的重要性
- 高效的数组运算: NumPy 使用优化的 C 代码实现,因此在数组运算方面比 Python 列表快得多。
- 广播机制: NumPy 允许不同形状的数组进行算术运算,这种机制称为广播,简化了代码编写。
- 丰富的数学函数: NumPy 提供了大量的数学函数,包括线性代数、傅里叶变换、随机数生成等。
- 与其他科学计算库的集成: NumPy 是 SciPy、pandas、scikit-learn 等众多科学计算库的基础。
2. 安装 NumPy
安装 NumPy 最常用的方法是通过 Python 的包管理工具 pip
。
- 确保 Python 和 pip 已安装: 在命令行或终端中输入
python --version
和pip --version
检查 Python 和 pip 是否已正确安装。 如果没有安装,请根据您的操作系统进行安装。 - 使用 pip 安装 NumPy: 在命令行或终端中执行以下命令:
bash
pip install numpy
- 升级 NumPy (可选): 如果你已经安装了 NumPy,并希望升级到最新版本,可以使用以下命令:
bash
pip install --upgrade numpy
- 指定安装版本 (可选): 如果你需要安装特定版本的 NumPy,可以使用以下命令:
bash
pip install numpy==1.23.0 # 例如,安装 1.23.0 版本
- 验证安装: 安装完成后,可以在 Python 解释器中导入 NumPy 并检查其版本:
python
import numpy as np
print(np.__version__)
3. NumPy 的核心:ndarray 对象
ndarray
是 NumPy 中最核心的数据结构,它是一个多维数组,所有元素类型相同。
-
创建 ndarray:
-
从 Python 列表或元组创建:
“`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 内置函数创建:
np.zeros(shape)
:创建指定形状的全零数组。np.ones(shape)
:创建指定形状的全一数组。np.full(shape, value)
:创建指定形状的数组,所有元素都填充为指定值。np.eye(n)
:创建 n x n 的单位矩阵。np.arange(start, stop, step)
:创建指定范围内的等差数组。np.linspace(start, stop, num)
:创建指定范围内的等差数组,包含指定数量的元素。np.random.rand(shape)
:创建指定形状的数组,元素为 0 到 1 之间的随机数。np.random.randint(low, high, size)
:创建指定形状的数组,元素为指定范围内的随机整数。
“`python
import numpy as np# 创建全零数组
zeros_arr = np.zeros((2, 3)) # 创建 2×3 的全零数组
print(zeros_arr)
# 输出:
# [[0. 0. 0.]
# [0. 0. 0.]]# 创建全一数组
ones_arr = np.ones((3, 2)) # 创建 3×2 的全一数组
print(ones_arr)
# 输出:
# [[1. 1.]
# [1. 1.]
# [1. 1.]]# 创建指定值数组
full_arr = np.full((2, 2), 7) # 创建 2×2 的数组,元素都为 7
print(full_arr)
# 输出:
# [[7 7]
# [7 7]]# 创建单位矩阵
eye_arr = np.eye(3) # 创建 3×3 的单位矩阵
print(eye_arr)
# 输出:
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]# 创建等差数组
arange_arr = np.arange(0, 10, 2) # 从 0 开始,到 10 结束(不包含 10),步长为 2
print(arange_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. ]# 创建随机数数组
rand_arr = np.random.rand(2, 2) # 创建 2×2 的随机数数组,元素为 0 到 1 之间的随机数
print(rand_arr)
# 输出: (可能的结果)
# [[0.45807662 0.64206797]
# [0.94788511 0.21198423]]# 创建随机整数数组
randint_arr = np.random.randint(0, 10, (3, 3)) # 创建 3×3 的随机整数数组,元素范围为 0 到 10 (不包含 10)
print(randint_arr)
# 输出: (可能的结果)
# [[8 3 7]
# [1 4 6]
# [3 1 7]]
“` -
ndarray 的属性:
-
ndarray.shape
:数组的形状,返回一个元组,表示每个维度的大小。 ndarray.ndim
:数组的维度。ndarray.size
:数组中元素的总数。ndarray.dtype
:数组中元素的类型。-
ndarray.itemsize
:数组中每个元素占用的字节数。“`python
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 输出: (2, 3)
print(arr.ndim) # 输出: 2
print(arr.size) # 输出: 6
print(arr.dtype) # 输出: int64 (或 int32,取决于系统)
print(arr.itemsize) # 输出: 8 (如果是 int64) 或 4 (如果是 int32)
“` -
ndarray 的数据类型:
NumPy 支持多种数据类型,包括:
int8
,int16
,int32
,int64
:整数类型。uint8
,uint16
,uint32
,uint64
:无符号整数类型。float16
,float32
,float64
:浮点数类型。complex64
,complex128
:复数类型。bool_
:布尔类型。object_
: Python 对象类型.string_
,unicode_
: 字符串类型
可以通过 dtype
参数指定数据类型,或者使用 ndarray.astype()
方法进行类型转换。
“`python
import numpy as np
arr = np.array([1, 2, 3], dtype=np.float32)
print(arr.dtype) # 输出: float32
arr_int = arr.astype(np.int32)
print(arr_int.dtype) # 输出: int32
print(arr_int) # 输出: [1 2 3]
“`
4. 数组的索引和切片
NumPy 的数组索引和切片与 Python 列表类似,但功能更强大。
- 基本索引:
“`python
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[0]) # 输出: 10
print(arr[-1]) # 输出: 50
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[0, 0]) # 输出: 1
print(arr2d[1, 2]) # 输出: 6
“`
- 切片:
“`python
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[1:4]) # 输出: [20 30 40]
print(arr[:3]) # 输出: [10 20 30]
print(arr[3:]) # 输出: [40 50]
print(arr[:]) # 输出: [10 20 30 40 50]
print(arr[::2]) # 输出: [10 30 50]
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[:2, 1:]) # 输出: [[2 3] [5 6]]
print(arr2d[1:, :2]) # 输出: [[4 5] [7 8]]
“`
- 布尔索引: 使用布尔数组选择符合条件的元素。
“`python
import numpy as np
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]
print(arr[arr > 2]) # 更简洁的写法
“`
- 花式索引: 使用整数数组选择特定的行或列。
“`python
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[[0, 2]]) # 选择第 0 行和第 2 行
# 输出:
# [[1 2 3]
# [7 8 9]]
print(arr[[0, 1, 2], [0, 1, 0]]) # 选择 (0,0), (1,1), (2,0) 处的元素
# 输出: [1 5 7]
“`
5. 数组的运算
NumPy 提供了大量的函数进行数组的运算。
- 元素级运算:
“`python
import numpy as np
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 ** 2) # 输出: [1 4 9]
print(np.sqrt(arr1)) # 输出: [1. 1.41421356 1.73205081]
“`
- 矩阵运算:
“`python
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
print(np.dot(arr1, arr2)) # 矩阵乘法
# 输出:
# [[19 22]
# [43 50]]
print(arr1.T) # 转置
# 输出:
# [[1 3]
# [2 4]]
print(np.linalg.inv(arr1)) # 逆矩阵
# 输出:
# [[-2. 1. ]
# [ 1.5 -0.5]]
“`
- 广播机制: NumPy 允许不同形状的数组进行运算,会自动进行广播。
“`python
import numpy as np
arr1 = np.array([1, 2, 3])
scalar = 2
print(arr1 + scalar) # 输出: [3 4 5] 标量 2 被广播到数组的每个元素
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
arr1d = np.array([10, 20, 30])
print(arr2d + arr1d)
# 输出:
# [[11 22 33]
# [14 25 36]] arr1d 被广播到 arr2d 的每一行
“`
- 常用统计函数:
“`python
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(np.sum(arr)) # 求和
print(np.mean(arr)) # 平均值
print(np.std(arr)) # 标准差
print(np.var(arr)) # 方差
print(np.min(arr)) # 最小值
print(np.max(arr)) # 最大值
print(np.argmin(arr)) # 最小值的索引
print(np.argmax(arr)) # 最大值的索引
print(np.cumsum(arr)) # 累积和
print(np.cumprod(arr)) # 累积积
“`
6. 数组的形状操作
NumPy 提供了灵活的函数来改变数组的形状。
reshape()
: 改变数组的形状,但不改变元素的值。
“`python
import numpy as np
arr = np.arange(12) # 创建一个包含 0-11 的数组
print(arr) # 输出: [ 0 1 2 3 4 5 6 7 8 9 10 11]
arr_reshaped = arr.reshape(3, 4) # 改变形状为 3×4
print(arr_reshaped)
# 输出:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
arr_reshaped = arr.reshape(2, 2, 3) # 改变形状为 2x2x3
print(arr_reshaped)
# 输出:
# [[[ 0 1 2]
# [ 3 4 5]]
#
# [[ 6 7 8]
# [ 9 10 11]]]
“`
ravel()
或flatten()
: 将多维数组展平为一维数组。ravel()
返回一个视图(view),而flatten()
返回一个副本(copy)。
“`python
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr_raveled = arr.ravel()
print(arr_raveled) # 输出: [1 2 3 4 5 6]
arr_flattened = arr.flatten()
print(arr_flattened) # 输出: [1 2 3 4 5 6]
“`
transpose()
或ndarray.T
: 转置数组。
“`python
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr_transposed = arr.transpose() # 使用 transpose() 函数
print(arr_transposed)
# 输出:
# [[1 4]
# [2 5]
# [3 6]]
arr_transposed = arr.T # 使用 .T 属性
print(arr_transposed)
# 输出:
# [[1 4]
# [2 5]
# [3 6]]
“`
concatenate()
: 沿指定轴连接数组。
“`python
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr_concatenated_row = np.concatenate((arr1, arr2), axis=0) # 沿行连接 (axis=0)
print(arr_concatenated_row)
# 输出:
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
arr_concatenated_col = np.concatenate((arr1, arr2), axis=1) # 沿列连接 (axis=1)
print(arr_concatenated_col)
# 输出:
# [[1 2 5 6]
# [3 4 7 8]]
“`
stack()
: 沿新的轴连接数组。hstack
和vstack
是stack
的便捷版本,分别用于水平和垂直堆叠数组。
“`python
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr_stacked = np.stack((arr1, arr2), axis=0) #沿着新轴(axis=0)连接
print(arr_stacked)
#输出:
#[[1 2 3]
# [4 5 6]]
arr_stacked = np.stack((arr1, arr2), axis=1) #沿着新轴(axis=1)连接
print(arr_stacked)
#输出:
#[[1 4]
# [2 5]
# [3 6]]
arr_hstack = np.hstack((arr1, arr2)) #水平堆叠
print(arr_hstack)
#输出:
#[1 2 3 4 5 6]
arr_vstack = np.vstack((arr1, arr2)) #垂直堆叠
print(arr_vstack)
#输出:
#[[1 2 3]
# [4 5 6]]
“`
split()
: 将数组分割成多个子数组。
“`python
import numpy as np
arr = np.arange(12)
arr = arr.reshape(3,4)
print(arr)
#输出:
#[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
arr_split = np.split(arr, 3) #平均分成3份
print(arr_split)
#输出:
#[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
arr_split = np.split(arr, [1,3]) #按照index 1 和 3 分割
print(arr_split)
#输出:
#[array([[0, 1, 2, 3]]), array([[ 4, 5, 6, 7],
# [ 8, 9, 10, 11]]), array([], shape=(0, 4), dtype=int64)]
arr_hsplit = np.hsplit(arr,2) #沿着水平方向分割成2份
print(arr_hsplit)
#输出:
#[array([[0, 1],
# [4, 5],
# [8, 9]]), array([[ 2, 3],
# [ 6, 7],
# [10, 11]])]
arr_vsplit = np.vsplit(arr,3) #沿着垂直方向分割成3份
print(arr_vsplit)
#输出:
#[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
“`
7. 文件 I/O
NumPy 允许将数组数据保存到文件中,也可以从文件中加载数据。
np.save()
: 将数组保存到.npy
文件中(二进制格式)。np.load()
: 从.npy
文件中加载数组。np.savetxt()
: 将数组保存到文本文件中。np.loadtxt()
: 从文本文件中加载数组。
“`python
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 保存到 .npy 文件
np.save(‘my_array.npy’, arr)
# 从 .npy 文件加载
loaded_arr = np.load(‘my_array.npy’)
print(loaded_arr)
# 输出:
# [[1 2 3]
# [4 5 6]]
# 保存到文本文件
np.savetxt(‘my_array.txt’, arr, delimiter=’,’)
# 从文本文件加载
loaded_arr_txt = np.loadtxt(‘my_array.txt’, delimiter=’,’)
print(loaded_arr_txt)
# 输出:
# [[1. 2. 3.]
# [4. 5. 6.]]
“`
8. 实践示例
- 计算图像的平均像素值:
“`python
import numpy as np
from PIL import Image # 需安装 Pillow 库: pip install Pillow
# 打开图像
try:
img = Image.open(‘image.jpg’) # 将 ‘image.jpg’ 替换成你的图像文件名
except FileNotFoundError:
print(“Error: Image file not found. Make sure ‘image.jpg’ exists in the current directory or specify the full path.”)
exit()
# 转换为 NumPy 数组
img_array = np.array(img)
# 计算平均像素值
average_pixel = np.mean(img_array)
print(f”Average pixel value: {average_pixel}”)
# 分别计算 RGB 通道的平均值
average_red = np.mean(img_array[:, :, 0])
average_green = np.mean(img_array[:, :, 1])
average_blue = np.mean(img_array[:, :, 2])
print(f”Average Red: {average_red}”)
print(f”Average Green: {average_green}”)
print(f”Average Blue: {average_blue}”)
“`
- 简单线性回归:
“`python
import numpy as np
# 生成一些随机数据
X = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 6, 5])
# 计算斜率和截距
n = len(X)
X_mean = np.mean(X)
y_mean = np.mean(y)
numerator = np.sum((X – X_mean) * (y – y_mean))
denominator = np.sum((X – X_mean)**2)
slope = numerator / denominator
intercept = y_mean – slope * X_mean
print(f”Slope: {slope}”)
print(f”Intercept: {intercept}”)
# 预测新值
new_x = 6
predicted_y = slope * new_x + intercept
print(f”Predicted y for x={new_x}: {predicted_y}”)
“`
9. 总结
NumPy 是 Python 中进行数值计算的强大工具。 掌握 NumPy 的基本概念和常用函数,可以大大提高数据处理和科学计算的效率。 本文介绍了 NumPy 的安装、ndarray 对象、索引和切片、数组运算、形状操作、文件 I/O 等方面的内容。 希望读者通过本文的学习,能够快速入门 NumPy,并将其应用到实际项目中。 实践是最好的学习方法,建议读者多加练习,掌握 NumPy 的各种功能。 NumPy 还有很多高级特性,例如通用函数 (ufunc)、线性代数、傅里叶变换等, 可以在进一步学习中进行探索。 希望这篇详细的指南能帮助你入门 NumPy!
“`