NumPy 入门:pypi 安装与使用指南 – wiki基地

“`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 --versionpip --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 np

    arr = 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() 沿新的轴连接数组。 hstackvstackstack 的便捷版本,分别用于水平和垂直堆叠数组。

“`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!
“`

发表评论

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

滚动至顶部