Python NumPy入门教程

⚡ 智能摘要

NumPy 是基础性的 Python NumPy 是一个用于数值计算的库,支持数组、矩阵、线性代数和随机采样。本 NumPy 教程将引导您完成安装、数组创建和随机采样等步骤。ping使用可运行程序进行切片、统计和矩阵数学运算 Python 例子。

  • 核心用途: 快速 N 维数组和向量化数学 Python.
  • ⚙️ 主要功能: zeros、ones、reshape、hstack、dot、linspace。
  • 📚 Foundations: 线性代数、广播、统计学、切片。
  • 🚀 当前版本: NumPy 2.x(2024 年 6 月发布)现已稳定。
  • 🤖 人工智能应用: Py 的骨干Torch、TensorFlow、JAX 和 CuPy 张量。

Python NumPy 教程

NumPy 是什么 Python?

NumPy的 是一个开源的 Python 这是一个用于数学、科学、工程和数据科学编程的库。它是一个非常实用的数学和统计运算库。 Python它能完美地处理多维数组和矩阵乘法,并且可以轻松地与 C/ 集成。C++ 和 Fortran.

对于任何科学项目而言,NumPy 都是必备工具。它专为 N 维数组、线性代数、随机数生成、傅里叶变换等而构建。

NumPy 提供 Python 它对多维数组和矩阵提供了一流的支持,以及大量作用于它们的数学运算。在本指南中,我们将回顾您在学习“……”教程之前需要了解的基本函数。TensorFlow“。

为什么使用 NumPy?

NumPy 内存效率高,因此比纯整数运算更容易处理大量数值数据。 Python 列表。它也非常方便矩阵乘法和重新排序。ping而且速度很快,因为繁重的工作都委托给了编译后的 C 例程。事实上,像 TensorFlow、Py 这样的库也是如此。Torch 和 Scikit-learn 的后端都依赖于 NumPy 数组进行矩阵运算,这使得 NumPy 成为大多数现代数据科学和 AI 工作流程底层默默无闻的主力军。

如何安装 NumPy

要安装 NumPy 库,请参阅我们的教程。 如何安装 TensorFlow。NumPy 是随 Anaconda 默认安装的。

如果 NumPy 没有安装(这种情况很少见),请使用以下任一选项。

您可以使用 Anaconda 安装 NumPy:

conda install -c anaconda numpy
  • In Jupyter 笔记本电脑:
import sys
!conda install --yes --prefix {sys.prefix} numpy

Pip 用户只需一条命令即可安装或升级:

pip install --upgrade numpy

导入 NumPy 并检查版本

导入numpy的命令是:

import numpy as np

上面的代码行将 NumPy 命名空间重命名为 np这个快捷方式允许你以前缀“.”开头来定义 NumPy 函数、方法和属性。 np. 而不是 typing numpy.这是整个 NumPy 生态系统中都会发现的标准约定。

要检查已安装的 NumPy 版本,请使用以下命令:

print(np.__version__)

输出:

2.1.3

NumPy 2.0 于 2024 年 6 月发布,是目前最稳定的主版本系列。如果您的项目仍然依赖于 1.x API,请锁定到最新版本。 numpy<2 在您的需求文件中,因为某些遗留别名,例如 np.float 已在 2.0 版本中移除。

什么是 Python NumPy 数组?

NumPy 数组看起来有点像 Python 乍一看像是列表,但它们的行为却截然不同。对于初次接触这个主题的读者,我们先来解释一下什么是 ndarray 以及它为何如此重要。

顾名思义,NumPy 数组是 NumPy 库的核心数据结构。NumPy 这个名称本身是“Numeric”(数值)的缩写。 Python”或“数值 Python”,而 ndarray 是一个同质的、固定大小的内存块,具有已知的形状和数据类型。

创建 NumPy 数组

在 NumPy 中创建数组的最简单方法是从……开始。 Python 列表.

myPythonList = [1,9,8,3]

转换 Python 将列表转换为 NumPy 数组 np.array.

numpy_array_from_list = np.array(myPythonList)

显示数组的内容。

numpy_array_from_list

输出:

array([1, 9, 8, 3])

在实践中,没有必要声明 Python 先列出清单。这两个步骤可以合并。

a = np.array([1,9,8,3])

注意: NumPy 文档中也提到了这一点。 np.ndarray,但 np.array 这是建议日常使用的出厂设置。

你也可以用同样的方法从元组创建 NumPy 数组。

数学的 Opera数组上的系统蒸发散

您可以执行诸如加法、减法等数学运算。trac对数组进行除法和乘法运算。语法是数组名,后跟运算符(+, -, *, /),后面跟着操作数。这些操作是向量化的,这意味着 NumPy 会将它们应用于每个元素,而无需显式指定。 Python 环。

计费示例:

numpy_array_from_list + 10

输出:

array([11, 19, 18, 13])

此操作将 NumPy 数组的每个元素加 10。

数组形状

你可以用以下方法检查数组的形状: shape 属性可以通过将其附加到数组名称来访问。同样,您可以使用以下方式检查类型 dtype.

import numpy as np
a = np.array([1,2,3])
print(a.shape)
print(a.dtype)

(3,)
int64

整数是不带小数点的值。如果创建一个包含小数的数组,其数据类型将变为浮点数。

#### Different type
b = np.array([1.1,2.0,3.2])
print(b.dtype)

float64

二维数组

您可以在括号内用逗号添加尺寸。

请注意,内部元组必须位于外部括号内。 [].

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

二维数组

更高维度的结构也可以用同样的方法构建。

### 3 dimension
d = np.array([
    [[1, 2,3],
        [4, 5, 6]],
    [[7, 8,9],
        [10, 11, 12]]
])
print(d.shape)
(2, 2, 3)
目的 Code
创建数组 数组([1,2,3])
打印形状 数组([.]).形状

什么是 numpy.zeros()?

numpy.zeros() or np.zeros 是一个意念波· Python 用于创建全零矩阵的函数。 numpy.zeros() 在 TensorFlow 中,当需要在第一次迭代期间初始化权重或为其他统计任务设置占位符缓冲区时,此功能非常有用。

numpy.zeros() 函数语法

numpy.zeros(shape, dtype=float, order='C')

Python numpy.zeros() 参数

在这里,

  • 形状:NumPy 零数组的形状。
  • 类型元素的数据类型。它是可选的,默认值为 float64.
  • 下单默认值为 C这是由以下方式使用的行优先布局: numpy.zeros() in Python.

Python numpy.zeros() 示例

import numpy as np
np.zeros((2,2))

输出:

array([[0., 0.],
          [0., 0.]])

numpy zero 及其数据类型的示例

import numpy as np
np.zeros((2,2), dtype=np.int16)

输出:

array([[0, 0],
         [0, 0]], dtype=int16)

什么是 numpy.ones()?

np.ones() 函数 创建一个全部填充1的矩阵。 numpy.ones() in Python 在 TensorFlow 中第一次迭代时初始化权重以及其他统计任务中非常有用。

Python numpy.ones() 语法

numpy.ones(shape, dtype=float, order='C')

Python numpy.ones() 参数

在这里,

  • 形状np.one 的形状 Python 排列.
  • 类型元素的数据类型。它是可选的,默认值为 float64.
  • 下单默认值为 C这就是行优先布局。

Python numpy.ones() 二维数组及其数据类型示例

import numpy as np
np.ones((1,2,3), dtype=np.int16)

输出:

array([[[1, 1, 1],
       [1, 1, 1]]], dtype=int16)

numpy.reshape() 函数 Python

Python NumPy 重塑 改变数组的形状而不改变其数据。您可能需要将数据从宽格式重塑为长格式,或者在将其输入模型之前将其从一维向量转换为二维矩阵。 np.reshape 该函数只需一次调用即可处理此问题。

np.reshape() 的语法

numpy.reshape(a, newShape, order='C')

在这里,

a:要重塑的数组。

新形状:新的理想形状。

下单默认值为 C行优先布局。

NumPy 重塑示例

import numpy as np
e = np.array([(1,2,3), (4,5,6)])
print(e)
e.reshape(3,2)

输出:

 // Before reshape
[[1 2 3]
 [4 5 6]]
//After Reshape
array([[1, 2],
	[3, 4],
	[5, 6]])

numpy.flatten() 在 Python

Python NumPy 扁平化 返回一个被折叠成一维的数组副本。在使用卷积神经网络等神经网络时,通常需要在将图像张量传递给全连接层之前将其展平。 np.flatten() 该函数只需一次调用即可处理此问题。

np.flatten() 的语法

numpy.flatten(order='C')

在这里,
下单默认值为 C行优先布局。

NumPy Flatten 示例

e.flatten()

输出:

array([1, 2, 3, 4, 5, 6])

numpy.hstack() 是什么 Python?

numpy.hstack 是一个意念波· Python 该函数用于将多个输入数组水平堆叠成一个数组。 hstack()您可以将数据沿列轴方向追加。当需要并排合并特征向量时,它是 NumPy 中一个非常方便的辅助函数。

让我们学习 hstack in Python 举个例子。

计费示例:

## Horizontal Stack
import numpy as np
f = np.array([1,2,3])
g = np.array([4,5,6])
print('Horizontal Append:', np.hstack((f, g)))

输出:

Horizontal Append: [1 2 3 4 5 6]

numpy.vstack() 是什么 Python?

numpy.vstack 是一个意念波· Python 该函数用于将一系列输入数组垂直堆叠成一个数组。 vstack()您可以沿着行轴追加数据,这在您想要合并一批样本时非常方便。

让我们通过一个例子来学习它。

计费示例:

## Vertical Stack
import numpy as np
f = np.array([1,2,3])
g = np.array([4,5,6])
print('Vertical Append:', np.vstack((f, g)))

输出:

Vertical Append: [[1 2 3]
 [4 5 6]]

在学习了 NumPy 之后 vstackhstack让我们来看一个在 NumPy 中生成随机数的例子。

生成随机 Numbers 使用 NumPy

要生成服从高斯分布的随机数,请使用:

numpy.random.normal(loc, scale, size)

在这里,

  • 地方均值。分布的中心。
  • 等级标准差。
  • 尺寸:退回的样本数量。

计费示例:

## Generate random numbers from a normal distribution
normal_array = np.random.normal(5, 0.5, 10)
print(normal_array)
[5.56171852 4.84233558 4.65392767 4.946659   4.85165567 5.61211317 4.46704244 5.22675736 4.49888936 4.68731125]

如果绘制成图,其分布类似于下图。

生成随机数的示例 Numbers 使用 NumPy
生成随机数的示例 Numbers 使用 NumPy

请注意,较新的代码越来越多地使用现代生成器 API。 np.random.default_rng()这是对旧版软件的推荐替代方案。 np.random.normal 在 NumPy 2.x 中调用。

NumPy Asarray 函数

asarray() 该函数将输入转换为数组。输入可以是列表、元组、ndarray 或类似序列。

语法:

numpy.asarray(data, dtype=None, order=None)

在这里,

data:要转换为数组的数据。

数据类型:可选。如果未指定,则根据输入数据推断数据类型。

下单默认值为 C行优先布局。另一种选择是 F (Fortran 样式列优先)。

计费示例:

考虑以下四行四列的二维矩阵,矩阵中的元素均为 1。

import numpy as np
A = np.matrix(np.ones((4,4)))

如果您尝试通过以下方式更改矩阵中的值: np.array原文未作修改。原因是: np.array 创建矩阵的副本。

np.array(A)[2]=2
print(A)
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

矩阵保持不变。使用 asarray 当你想就地修改原始数组时,我们来看看将第三行的值设置为 2 会发生什么。

np.asarray(A)[2]=2
print(A)

Code 说明:

np.asarray(A) 转换矩阵 A 转换为数组视图。

[2] 选择第三行。

输出:

[[1. 1. 1. 1.]
      [1. 1. 1. 1.]
      [2. 2. 2. 2.] # new value
      [1. 1. 1. 1.]]

什么是 numpy.arange()?

numpy.arange() 是 NumPy 的一个内置函数,它返回一个包含指定区间内均匀分布值的 ndarray。例如,要创建 1 到 10 之间的值,可以调用 `ndarray(1, 10)`。 np.arange() in Python.

语法:

numpy.arange(start, stop, step, dtype)

Python NumPy arange 参数:

  • 开始:时间间隔的开始 np.arange in Python.
  • Stop 停止:时间间隔结束。
  • 步骤:数值之间的间距。默认步长为 1。
  • 类型:NumPy 输出数组的类型 arange.

计费示例:

import numpy as np
np.arange(1, 11)

输出:

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

计费示例:

要更改此 NumPy 中的步长 arange 例如,在括号中添加第三个数字。这将改变步长。

import numpy as np
np.arange(1, 14, 4)

输出:

array([ 1,  5,  9, 13])

NumPy Linspace 函数

linspace 返回两个端点之间均匀分布的样本。

语法:

numpy.linspace(start, stop, num, endpoint)

在这里,

  • 开始序列的起始值。
  • Stop 停止序列的结束值。
  • 序号要生成的样本数量。默认值为 50。
  • 端点:如果 True (默认), stop 是最后一个值。如果 False, stop 不包括在内。

计费示例:

例如,它可以用来创建 10 个从 1 到 5 的均匀分布的值。

import numpy as np
np.linspace(1.0, 5.0, num=10)

输出:

array([1.        , 1.44444444, 1.88888889, 2.33333333, 2.77777778,       3.22222222, 3.66666667, 4.11111111, 4.55555556, 5.        ])

如果您不想将最后一位数字包含在区间内,请设置 endpointFalse.

np.linspace(1.0, 5.0, num=5, endpoint=False)

输出:

array([1. , 1.8, 2.6, 3.4, 4.2])

LogSpace NumPy 函数 Python

logspace 返回对数尺度上均匀分布的数字。 logspace 与……具有相同的参数 np.linspace.

语法:

numpy.logspace(start, stop, num, endpoint)

计费示例:

np.logspace(3.0, 4.0, num=4)

输出:

array([ 1000. ,  2154.43469003,  4641.58883361, 10000.        ])

最后,如果您想检查数组中单个元素的内存大小,可以使用以下方法: itemsize.

x = np.array([1,2,3], dtype=np.complex128)
x.itemsize

输出:

16

每个元素占用 16 个字节。

索引和切片 Python

使用 NumPy 对数据进行切片非常简单。我们将对矩阵进行切片。 e。在 Python使用方括号可以返回行或列。
计费示例:

## Slice
import numpy as np
e = np.array([(1,2,3), (4,5,6)])
print(e)
[[1 2 3]
 [4 5 6]]

请记住,在 NumPy 中,数组的第一个索引从 0 开始。

## First row
print('First row:', e[0])

## Second row
print('Second row:', e[1])

输出:

First row: [1 2 3]
Second row: [4 5 6]

In Python就像在许多其他语言中一样,

  • 逗号前的值代表行数。
  • 逗号后面的值代表列数。
  • 如果要选择某一列,请添加 : 在列索引之前。
  • : 这意味着您想要获取所选列中的所有行。
print('Second column:', e[:,1])
Second column: [2 5]

要返回第二行的前两个值,请使用 : 选择索引为 2 的所有列。

## Second Row, two values
print(e[1, :2])
[4 5]

统计函数 Python

NumPy 提供了一系列实用的统计函数,用于从给定数组中查找最小值、最大值、百分位数、标准差、方差等等。下面列出了最常用的函数。

NumPy 附带强大的统计辅助函数,汇总如下表所示。

功能 脾气暴躁的
分钟 np.min()
max. np.max()
平均值 np.mean()
中位数 np.中值()
标准偏差 np.std()

考虑以下数组:

计费示例:

import numpy as np
normal_array = np.random.normal(5, 0.5, 10)
print(normal_array)

输出:

[5.56171852 4.84233558 4.65392767 4.946659   4.85165567 5.61211317 4.46704244 5.22675736 4.49888936 4.68731125]

NumPy统计函数示例

### Min
print(np.min(normal_array))

### Max
print(np.max(normal_array))

### Mean
print(np.mean(normal_array))

### Median
print(np.median(normal_array))

### Sd
print(np.std(normal_array))

输出:

4.467042435266913
5.612113171990201
4.934841002270593
4.846995625786663
0.3875019367395316

什么是 numpy 点积?

numpy.dot 是一个功能强大的矩阵运算函数。例如,你可以用它计算点积。 np.dot. numpy.dot 返回点积 ab并且可以处理一维和二维数组。对于二维输入,它执行矩阵乘法。

语法:

numpy.dot(x, y, out=None)

参数

在这里,

x,y输入数组。 xy 两者都应该是 1D 或 2D 的。 np.dot() 可以作为点积或矩阵乘法使用。

:可选的输出参数,用于捕获结果。否则,将返回一个 ndarray 对象。

Returns & Exchanges

该功能 numpy.dot() 返回两个数组的点积 xy当两个变量均为一维时,返回标量;否则,返回数组。 out 如果给定一个数组,则返回该数组。

引发

点积 Python 提出一个 ValueError 如果最后一个维度 x 与倒数第二个维度不匹配 y.

计费示例:

## Linear algebra
### Dot product: product of two arrays
f = np.array([1,2])
g = np.array([4,5])
### 1*4+2*5
np.dot(f, g)

输出:

14

矩阵乘法 Python

NumPy matmul() 该函数返回两个数组的矩阵乘积。以下是它的工作原理。

1) 对于二维数组,它返回普通的矩阵乘积。

2) 对于大于 2 的维度,该乘积被视为矩阵的堆叠。

3) 首先将一维数组提升为矩阵,然后计算乘积。

中缀 @ 运营商,自 Python 3.5 是以下情况的简写: matmul 并广泛应用于现代代码中。

语法:

numpy.matmul(x, y, out=None)

在这里,

x,y输入数组。不允许输入标量。

:可选参数。通常输出结果存储在 ndarray 中。

计费示例:

同样地,你可以用以下方式计算矩阵乘法: np.matmul.

### Matmul: matrix product of two arrays
h = [[1,2],[3,4]]
i = [[5,6],[7,8]]
### 1*5+2*7 = 19
np.matmul(h, i)

输出:

array([[19, 22],
            [43, 50]])

行列式

如果需要计算矩阵的行列式,请使用 np.linalg.det()NumPy 会自动处理维度问题。

计费示例:

## Determinant 2*2 matrix
### 5*8-7*6
np.linalg.det(i)

输出:

-2.000000000000005

NumPy广播机制详解

广播机制允许 NumPy 对不同形状的数组执行算术运算而无需复制数据。当您将标量加到一维向量,或将一维向量加到二维矩阵时,NumPy 会沿着缺失的轴拉伸较小的操作数,使形状对齐。这避免了显式复制操作。 Python 循环是 NumPy 代码感觉快速简洁的主要原因之一。

当从右到左比较两个形状时,如果每对维度都相等或其中一个维度等于 1,则这两个形状可以兼容广播。例如,形状为 的矩阵。 (3, 4) 广播针对一排形状 (4,) 或一根柱状物 (3, 1)同样的逻辑也应用于机器学习中的归一化,即你进行子集归一化。tracta 表示一批样本中每个特征的均值向量,并将其放在一行中。广播也是 Py 等张量库使用的概念模型。Torch、TensorFlow 和 JAX,因此你在这里学到的规则可以直接应用于 GPU 代码。

NumPy 如何助力人工智能和机器学习

NumPy 几乎是所有现代编程语言的基础。 Python AI 技术栈。PyTorch 张量、TensorFlow eager 张量和 JAX 数组都提供了相同的广播、切片和重新格式化功能。ping 你在 NumPy ndarray 中学到的 API。许多教程仍然将预处理后的 NumPy 数组直接输入到模型训练循环中,而框架也无需任何转换即可接受它们。

三个具体的模式展示了 NumPy 如何与当今的 AI 工作相连接。首先,数据工程师将原始特征转换为 NumPy 数组,然后再将其交给 scikit-learn 流水线或 Hugging Face 数据集。其次,研究人员使用 NumPy 作为 CPU 基准,然后切换到 CuPy,后者提供几乎相同的 API,但通过 CUDA 在 NVIDIA GPU 上运行。第三,JAX 基于 NumPy API 构建,添加了自动微分和即时编译功能,因此在笔记本电脑上运行的代码也可以在云端的 TPU 上运行。由此可见,使用 NumPy 构建的数组技能可以应用于所有主流的深度学习工具包,这使得本教程成为 AI 开发道路上的重要一步。

常见问题

NumPy 提供快速的 N 维数组、向量化数学、线性代数、随机采样和傅里叶变换。工程师和数据科学家使用它进行数值计算、图像和信号处理、统计分析,并作为 pandas、scikit-learn 和 SciPy 等高级库的数组基础。

NumPy 数组将一种固定数据类型的元素存储在连续的内存块中,这使得向量化数学运算速度很快。 Python 列表可以保存任意对象,支持混合类型,并且依赖于速度较慢的逐元素循环,因此它们很灵活,但对于大型数值工作负载来说效率要低得多。

NumPy 2.0 于 2024 年 6 月发布,它保持了核心数组 API 的稳定性,但移除了早已弃用的别名,例如: np.floatnp.int并收紧类型提升规则。大多数生产代码只需要少量修改。固定 numpy<2 如果依赖项尚未更新。

PyTorch 和 TensorFlow 都基于 NumPy ndarray 来建模张量对象。它们具有相同的形状、广播和切片语义,并且都接受 NumPy 数组作为输入。使用 NumPy 学习到的技能可以直接迁移到构建神经网络、训练循环和张量预处理流程中。

标准的 NumPy 运行在 CPU 上。如果需要 GPU 加速,可以使用 CuPy(它在 NVIDIA CUDA 设备上镜像了 NumPy API),或者使用 JAX(它为 GPU 和 TPU 添加了自动差异比较和即时编译功能)。两者都允许您以最小的重写量复用大部分现有的 NumPy 代码来处理 AI 工作负载。

Anaconda 默认自带 NumPy。否则,请运行 pip install numpy or conda install -c anaconda numpy要将现有安装升级到 NumPy 2.x,请运行 pip install --upgrade numpy. 使用以下命令检查当前版本 print(np.__version__) 内 Python.

广播机制使 NumPy 能够处理不同形状的数组而无需复制数据。当维度兼容时,较小的数组会被虚拟拉伸以匹配较大的数组。它为机器学习流程中的归一化、缩放和特征工程提供了简洁的表达式。

总结一下这篇文章: