什么是 numpy? | 新手入门 |《numpy 中文文档》| python 技术论坛-380玩彩网官网入口
什么是 numpy?
numpy 是 python 中科学计算的基本包。它是一个 python 库,它提供了多维数组对象、各种派生对象(如掩蔽数组和矩阵)以及用于数组快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、i/o、离散 fourier 变换、基本线性代数、基本统计操作、随机模拟等。
numpy 包的核心是ndarray对象。这将封装同质数据类型的 n 维数组,在编译的代码中执行许多操作以进行性能操作。numpy 阵列和标准 python 序列之间存在几个重要区别:
numpy 数组在创建时具有固定大小,与 python 列表不同(可以动态增长)。更改ndarray 的大小将创建一个新数组并删除原始数组。
numpy 数组中的元素都需要具有相同的数据类型,因此内存大小相同。例外情况:可以具有 (python,包括 numpy) 对象的数组,从而允许不同大小的元素数组。
numpy 阵列便于对大量数据进行高级数学运算和其他类型的操作。通常,与使用 python 的内置序列时,此类操作的执行效率更高,代码更少。
越来越多的科学和数学 python 包正在使用 numpy 数组;虽然这些通常支持 python 序列输入,但它们在处理之前将此类输入转换为 numpy 数组,并且它们经常输出 numpy 数组。换句话说,为了有效地使用当今许多(甚至可能大多数)基于科学/数学 python 的软件,仅仅知道如何使用 python 的内置序列类型是不够的——人们还需要知道如何使用 numpy 数组。
关于序列大小和速度的点在科学计算中尤为重要。作为一个简单的示例,请考虑将一个 1-d 序列中的每个元素与相同长度的另一个序列中的相应元素相乘的情况。如果数据存储在两个 python 列表中,并且 我们可以遍及每个元素:ab
c = []
for i in range(len(a)):
c.append(a[i]*b[i])
这会产生正确的答案,但如果每个数字都包含数百万个数字,我们将为 python 中循环效率低下付出代价。我们可以通过编写在 c 中更快地完成相同的任务(为了清楚起见,我们忽略了变量声明和初始化、内存分配等)。ab
for (i = 0; i < rows; i): {
c[i] = a[i]*b[i];
}
这样可以节省解释 python 代码和操作 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时,按元素操作是”默认模式”,但按元素操作由预编译的 c 代码快速执行。在 numpy 中
c = a * b
以接近 c 的速度执行前面的示例操作,但代码简单性,我们期望从基于 python 的东西。的确,numpy 成语甚至更简单!最后一个示例演示了 numpy 的两个功能,这些特性是它大部分功能的基础:矢量化和广播。
为什么 numpy 快?
矢量化描述代码中没有任何显式循环、索引等 - 当然,这些事情发生在优化的预编译 c 代码中的”幕后”。矢量化代码有许多优点,其中包括:
- 矢量化代码更简洁,更易于阅读
- 代码行越少通常意味着错误更少
- 代码更类似于标准数学表示法(通常更容易正确编写数学构造代码)
- 矢量化会导致更多的”python”代码。如果没有矢量化,我们的代码将充斥着低效且难以读取的循环
for
。
广播是用于描述操作的隐式元素行为的术语;一般来说,在 numpy 中,所有操作,不仅仅是算术运算,而是逻辑操作、位法运、功能等,以这种隐式元素的方式运行,即它们广播。此外,在上面的示例中,和 可以是相同形状的多维数组,也可以是标量数组和数组,甚至是两个不同形状的数组,前提是较小的数组”可扩展”到较大的形状,从而使生成的广播明确无误。
还有谁使用 numpy?
numpy 完全支持面向对象的方法,再次使用 ndarray 启动。例如,ndarray 是一个类,具有许多方法和属性。它的许多方法都由最外层的 numpy 命名空间中的函数镜像,允许程序员以他们喜欢的范式进行编码。这种灵活性使 numpy 数组方言和 numpy ndarray类成为python 中使用的多维数据交换的实际语言。