NumPy 入门教程

文章介绍了NumPy的基本用法,包括安装、数组的创建与操作(如zeros,ones,arange)、索引切片、运算、多维数组、形状大小、广播机制、数组复制与视图以及矩阵运算。通过这些内容,读者可以掌握NumPy的基础功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NumPy 入门教程

NumPy 是一个非常流行的 Python 数值计算库,它可以帮助我们处理向量、矩阵等数学对象,还提供了大量的数学函数和工具函数。

安装

在使用 NumPy 之前,需要先安装它。可以使用以下命令来安装:

pip install numpy

数组创建与操作

创建数组是 NumPy 最基本的操作。可以使用 numpy.array() 函数来创建一个数组:

import numpy as np

a = np.array([1, 2, 3])
print(a)

输出:

[1 2 3]

可以使用 numpy.zeros() 函数和 numpy.ones() 函数来创建全零和全一数组:

zeros = np.zeros((2, 3))
print(zeros)

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

输出:

[[0. 0. 0.]
 [0. 0. 0.]]
 
[[1. 1. 1.]
 [1. 1. 1.]]

可以使用 numpy.arange() 函数来创建指定间隔的一维数组:

a = np.arange(0, 10, 2)
print(a)

输出:

[0 2 4 6 8]

可以使用数组的各种方法来操作数组,比如:

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

c = np.concatenate([a, b])
print(c)

d = np.vstack([a, b])
print(d)

输出:

[1 2 3 4 5 6]

[[1 2 3]
 [4 5 6]]

数组索引与切片

NumPy 中也可以使用索引和切片来访问数组中的元素:

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

print(a[0]) # 1

print(a[1:4]) # [2 3 4]

a[2:4] = 0
print(a) # [1 2 0 0 5]

数组运算

NumPy 提供了许多数组运算的函数,例如:

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(a + b) # [5 7 9]

print(a - b) # [-3 -3 -3]

print(a * b) # [4 10 18]

print(a / b) # [0.25 0.4 0.5]

print(np.dot(a, b)) # 点积 32

多维数组的创建与操作

除了一维数组之外,NumPy 还支持多维数组的创建和操作。可以使用 numpy.array() 函数来创建一个多维数组:

import numpy as np

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

输出:

[[1 2 3]
 [4 5 6]]

可以使用 numpy.zeros() 函数和 numpy.ones() 函数来创建全零和全一多维数组:

zeros = np.zeros((2, 3, 4)) # 三维数组
print(zeros)

ones = np.ones((2, 3, 4)) # 三维数组
print(ones)

输出:

[[[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]

 [[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]]
 
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]

可以使用数组的各种方法和操作函数来操作多维数组:

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])

c = np.concatenate([a, b], axis=1)
print(c)

d = np.vstack([a, b])
e = np.sum(d, axis=0)
print(e)

输出:

[[ 1  2  3  7  8  9]
 [ 4  5  6 10 11 12]]
 
[22 26 30]

数组的形状和大小

我们通常需要了解数组的形状和大小,可以使用 numpy.shape() 函数和 numpy.size() 函数来查询这些信息:

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

print(np.size(a)) # 6

数组的广播

广播是一种特殊的数组运算,它可以让不同形状的数组进行运算,比如:

a = np.array([1, 2, 3])
b = np.array([[1], [2], [3]])

print(a + b)

输出:

[[2 3 4]
 [3 4 5]
 [4 5 6]]

数组的复制和视图

在 NumPy 中,数组的赋值默认是引用,即两个变量指向同一个数组,因此修改其中一个变量的值会影响到另一个变量。可以使用 numpy.copy() 函数来创建一个数组的副本,这样就不会影响原数组了:

a = np.array([1, 2, 3])
b = a
b[0] = 0

print(a) # [0 2 3]
print(b) # [0 2 3]

c = np.copy(a)
c[1] = 0

print(a) # [0 2 3]
print(c) # [0 0 3]

还有一种特殊的数组视图,即切片得到的数组。这种数组只是原数组的一个引用,并不是副本,因此也会导致修改原数组的值:

a = np.array([1, 2, 3])
b = a[1:2]
b[0] = 0

print(a) # [1 0 3]
print(b) # [0]

矩阵运算

在 NumPy 中,还有矩阵相关的运算,比如逆矩阵、特征值等等。可以使用 numpy.linalg 模块来进行矩阵运算:

a = np.array([[1, 2], [3, 4]])
b = np.linalg.inv(a)

print(b)

e, v = np.linalg.eig(a)
print(e)
print(v)

输出:

[[-2.   1. ]
 [ 1.5 -0.5]]

[-0.37228132+0.j  5.37228132+0.j]

[[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]

总结

这是一个简短的 NumPy 入门教程,通过学习这些基本的操作和函数,可以进一步学习和掌握更多高级的 NumPy 技能。

希望能帮助大家更好地使用这个强大的数学工具库。

说明:本文档所有内容来源于网络 https://www.numpy.org.cn/user/ 目录 1. NUMPY 介绍 1 1.1 什么是 NUMPY? 1 1.2 为什么 NUMPY 这么快? 3 1.3 还有谁在使用 NUMPY? 3 2. 快速入门教程 4 2.1 先决条件 4 2.2 基础知识 4 2.2.1一个例子 5 2.2.2 数组创建 6 2.2.3 打印数组 8 2.2.4 基本操作 10 2.2.5 通函数 13 2.2.6 索引、切片和迭代 14 2.3 形状操纵 18 2.3.1改变数组的形状 18 2.3.2 将不同数组堆叠在一起 20 2.3.3 将一个数组拆分成几个较小的数组 22 2.4 拷贝和视图 23 2.4.1 完全不复制 23 2.4.2 视图或浅拷贝 24 2.4.3 深拷贝 25 2.4.4 功能和方法概述 26 2.5 LESS 基础 26 广播(Broadcasting)规则 27 2.6 花式索引和索引技巧 27 2.6.1使用索引数组进行索引 27 2.6.2使用布尔数组进行索引 31 2.6.3 ix_()函数 34 2.6.4使用字符串建立索引 37 2.7线性代数 37 简单数组操作 37 2.8技巧和提示 38 2.8.1“自动”整形 39 2.8.2矢量堆叠 39 2.8.3直方图 40 2.9进一步阅读 41 3. NUMPY 基础知识 42 3.1 数据类型 42 3.1.1 数组类型之间的转换 42 3.1.2 数组标量 45 3.1.3 溢出错误 46 3.1.4 扩展精度 47 3.2 创建数组 47 3.2.1 简介 48 3.2.2 将Python array_like对象转换为Numpy数组 48 3.2.3 Numpy原生数组的创建 48 3.2.4 从磁盘读取数组 50 3.3 NUMPY与输入输出 51 3.3.1 定义输入 51 3.3.2 将行拆分为列 52 3.3.3 跳过直线并选择列 54 3.3.4 选择数据的类型 55 3.3.5 设置名称 56 3.3.6 调整转换 59 3.3.7 快捷方式函数 62 3.4 索引 62 3.4.1 赋值与引用 63 3.4.2 单个元素索引 63 3.4.3 其他索引选项 64 3.4.4 索引数组 65 3.4.5 索引多维数组 66 3.4.6 布尔或“掩码”索引数组 67 3.4.7 将索引数组与切片组合 69 3.4.8 结构索引工具 70 3.4.9 为索引数组赋值 71 3.4.10 在程序中处理可变数量的索引 72 3.5 广播 73 3.6 字节交换 78 3.6.1字节排序和ndarrays简介 78 3.6.2 更改字节顺序 80 3.7 结构化数组 82 3.7.1 介绍 82 3.7.2 结构化数据类型 83 3.7.3 索引和分配给结构化数组 88 3.7.4 记录数组 96 3.7.5 Recarray Helper 函数 98 3.8编写自定义数组容器 116 3.9子类化NDARRAY 124 3.9.1 介绍 124 3.9.2 视图投影 125 3.9.3 从模板创建 126 3.9.4 视图投影与从模板创建的关系 126 3.9.5 子类化的含义 126 3.9.6 简单示例 —— 向ndarray添加额外属性 132 3.9.7 稍微更现实的例子 —— 添加到现有数组的属性 134 3.9.8 __array_ufunc__ 对于ufuncs 135 3.9.9 __array_wrap__用于ufuncs和其他函数 139 3.9.10 额外的坑 —— 自定义的 __del__ 方法和 ndarray.base 142 3.9.11 子类和下游兼容性 143 4. 其他杂项 144 4.1 IEEE 754 浮点特殊值 144 4.2 NUMPY 如何处理数字异常的 146 4.3 示例 146 4.4 连接到 C 的方式 147 4.4.1 不借助任何工具, 手动打包你的C语言代码。 147 4.4.2 Cython 148 4.4.3 ctypes 148 4.4.4 SWIG(自动包装发生器) 149 4.4.5 scipy.weave 149 4.4.6 Psyco 149 5. 与MATLAB比较 149 5.1 介绍 150 5.2 一些关键的差异 150 5.3 'ARRAY'或'MATRIX'?我应该使用哪个? 151 5.3.1 简答 151 5.3.2 长答案 151 5.4 MATLAB 和 NUMPY粗略的功能对应表 153 5.4.1 一般功能的对应表 153 5.4.2 线性代数功能对应表 154 5.5 备注 161 5.6 自定义您的环境 163 5.7 链接 164 6. 从源代码构建 164 6.1 先决条件 164 6.2 基本安装 164 6.3 测试 165 并行构建 165 6.4 FORTRAN ABI不匹配 165 6.4.1 选择fortran编译器 166 6.4.2 如何检查BLAS / LAPACK /地图集ABI 166 6.5 加速BLAS / LAPACK库 166 6.5.1 BLAS 166 6.5.2 LAPACK 167 6.5.3 禁用ATLAS和其他加速库 167 6.6 提供额外的编译器标志 168 6.7 使用ATLAS支持构建 168 7. 使用NUMPY的C-API 168 7.1 如何扩展NUMPY 168 7.1.1 编写扩展模板 169 7.1.2 必需的子程序 169 7.1.3 定义函数 171 7.1.4 处理数组对象 175 7.1.5 示例 180 7.2 使用PYTHON作为胶水 182 7.2.1 从Python调用其他编译库 183 7.2.2 手工生成的包装器 183 7.2.3 f2py 184 7.2.4 用Cython 191 7.2.5 ctypes 196 7.2.6 您可能会觉得有用的其他工具 206 7.3 编写自己的UFUNC 208 7.3.1 创建一个新的ufunc 208 7.3.2 示例非ufunc扩展名 209 7.3.3 一种dtype的NumPy ufunc示例 215 7.3.4 示例具有多个dtypes的NumPy ufunc 221 7.3.5 示例具有多个参数/返回值的NumPy ufunc 230 7.3.6 示例带有结构化数组dtype参数的NumPy ufunc 235 7.4 深入的知识 241 7.4.1 迭代数组中的元素 242 7.4.2 用户定义的数据类型 246 7.4.3 在C中对ndarray进行子类型化 249
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百年孤独百年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值