NumPy用户指南(1)——NumPy简介

NumPy是Python科学计算的基础包,提供多维数组对象和高效的数学操作。它的ndarray对象支持固定大小的数组,允许快速操作。与Python列表相比,NumPy数组在处理大量数据时更高效,且代码简洁。NumPy的核心特性包括向量化和广播,使得计算过程既快速又易于理解。许多Python科学计算库依赖NumPy数组作为基础数据结构。了解并掌握NumPy的使用对于提升科学计算效率至关重要。
摘要由CSDN通过智能技术生成

此系列文章参照NumPy官方用户指南1.2.1版本进行翻译、解读(直译说不清楚的可能会加入自己的一些理解)。

NumPy简介

NumPy概述

NumPy是Python科学计算的基础包。它提供了多维数组对象及其各种派生对象(如掩码数组和矩阵),它还提供了用于数组快速操作的各种API,包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换(DFT)、基本线性代数,基本统计运算和随机模拟等。

ndarray对象是NumPy包的核心。ndarray对象封装了相同数据类型n 维数组,出于性能方面的考虑,ndarray许多操作都是编译之后执行的。

NumPy数组和标准Python序列之间有几个重要的区别:

  • NumPy数组在创建时具有固定的大小,而Python列表可以动态增长。更改ndarray对象的大小创建一个新数组并删除原来的数组
  • NumPy数组的元素都需要具有相同的数据类型,因此在内存中的大小相同。 例外情况:数组元素为Python对象时(包含NumPy对象),允许作为元素的数组大小不同。
  • NumPy数组更便于对大量数据进行高级数学和其他类型的操作。NumPy数组与Python内置序列相比执行效率更高,且使用的代码更少。
  • 越来越多Python科学计算和数学软件包使用NumPy数组, 虽然这些工具通常都支持Python内置序列作为参数,但它们在处理之前会还是会将输入的数组转换为NumPy数组,而且输出也通常为NumPy数组。换言之,为了高效地使用当今Python科学/数学工具(大部分的科学计算工具),只知道如何使用Python内置序列是不够的,还需要知道如何使用 NumPy 数组。

序列的大小和速度在科学计算中尤为重要。例如,我们需要将1维序列中的每个元素与相同长度的另一个序列中的相应元素相乘。假设数据存储在Python 列表 ab 中,通过迭代每个元素实现的概要代码如下:

c = []
for i in range(len(a)):
    c.append(a[i]*b[i])

上述代码确实符合要求,但是如果ab都包含数百万个数字,使用Python循环的效率将非常低。我们可以通过C语言更快地完成相同任务,概要代码如下:

for (i = 0; i < rows; i++): {
  c[i] = a[i]*b[i];
}

基于C语言的示例代码的确比Python代码效率更高,但牺牲了用Python编写代码所带来的好处。

更进一步,如果数据增加了维度,假设数组为二维数组,上面的C语言代码会扩展为:

for (i = 0; i < rows; i++): {
  for (j = 0; j < columns; j++): {
    c[i][j] = a[i][j]*b[i][j];
  }
}

NumPy 提供了两全其美的解决方案:当涉及 ndarray操作时,默认进行逐元素操作,但是逐元素操作由NumPy 预编译的C代码执行。使用NumPy实现的概要代码如下:

c = a * b

既具有C代码的运行效率,又具有Python代码的简洁性!NumPy的用法更为简单。
上述代码展示了NumPy的两个特性:向量化和广播,它们也是NumPy的大部分功能的基础。

为什么 NumPy 这么快?

向量化说明代码中没有任何显式的循环、索引等,这当然是预编译的C代码隐式优化的结果。向量化代码有许多优点,其中包括:

  • 向量化代码更简洁,更易于阅读
  • 更少的代码行通常意味着更少的错误
  • 代码更接近于标准的数学符号(通常更容易正确编码数学结构)
  • 向量化代码更 Pythonic。如果没有向量化,代码就会充斥着低效且难以阅读的for循环。

广播是用于描述隐式逐元素操作行为的术语。通常,NumPy中的所有操作,不止算术运算,还包括逻辑运算、位运算、函数式编程等都可以通过这种隐式的逐元素方式实现。此外,在上面的示例中,a并且b可以是相同形状的多维数组,或者一个标量、一个数组,甚至两者是具有不同形状的两个数组,条件是较小的数组可以“扩展”到更大的形状,由此产生的广播是明确的。

还有谁在使用 NumPy

NumPy完全支持面向对象的方法,再夸奖一次 ndarray
ndarray是一个类,拥有许多方法和属性。
最顶级的NumPy命名空间中的某些函数镜像了ndarray的许多方法。
PS:因此,对于同一数组操作,既可以使用ndarray对象调用某些方法,也可以使用NumPy模块调用某些函数。
程序员在编码时可选用自己喜欢的范式。这种灵活性使NumPy数组方言NumPy ndarray 类成为Python多维数据交换的事实标准语言。

源文档

https://numpy.org/doc/stable/user/whatisnumpy.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
说明:本文档所有内容来源于网络 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值