Python NumPy 新手教程:通过实例学习
Python 中的 NumPy 是什么?
NumPy 是 Python 中一个可用的开源库,有助于数学、科学、工程和数据科学编程。它是一个非常有用的库,用于在 Python 中执行数学和统计运算。它完美适用于多维数组和矩阵乘法。它很容易与 C/C++ 和 Fortran 集成。
对于任何科学项目,NumPy 都是必须了解的工具。它被构建用于处理 N 维数组、线性代数、随机数、傅里叶变换等。
NumPy 是一种处理多维数组和矩阵的编程语言。在数组和矩阵的基础上,NumPy 支持大量的数学运算。在这一部分,我们将回顾您需要为“TensorFlow”教程了解的基本函数。
为什么要使用 NumPy?
NumPy 具有内存效率,这意味着它能比任何其他库更轻松地处理大量数据。此外,NumPy 使用起来非常方便,特别是在矩阵乘法和重塑方面。最重要的是,NumPy 速度很快。实际上,TensorFlow 和 Scikit-learn 在后端使用 NumPy 数组来计算矩阵乘法。
如何安装 NumPy
要安装 NumPy 库,请参考我们的教程如何安装 TensorFlow。NumPy 默认随 Anaconda 一起安装。
在极少数情况下,如果 NumPy 未安装-
您可以使用 Anaconda 安装 NumPy
conda install -c anaconda numpy
- 在 Jupyter Notebook 中
import sys !conda install --yes --prefix {sys.prefix} numpy
导入 NumPy 并检查版本
导入 numpy 的命令是
import numpy as np
上面的代码将 Numpy 命名空间重命名为 np。这使我们能够以“np”为前缀来使用 Numpy 的函数、方法和属性,而不用输入“numpy”。这是您将在 numpy 文献中找到的标准快捷方式。
要检查您已安装的 NumPy 版本,请使用以下命令
print (np.__version__)
输出
1.18.0
什么是 Python NumPy 数组?
NumPy 数组有点像 Python 列表,但同时又非常不同。对于那些刚接触这个主题的人,让我们澄清一下它到底是什么以及它有什么用。
正如其名所示,NumPy 数组是 numpy 库的核心数据结构。该库的名称实际上是“Numeric Python”或“Numerical Python”的缩写。
创建一个 NumPy 数组
在 Numpy 中创建数组最简单的方法是使用 Python 列表
myPythonList = [1,9,8,3]
通过使用对象 np.array 将 python 列表转换为 numpy 数组。
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 创建数组。然而,这才是推荐的方法。
您也可以从元组(Tuple)创建一个 numpy 数组。
数组上的数学运算
您可以在数组上执行数学运算,如加法、减法、除法和乘法。语法是数组名后跟操作 (+.-,*,/) 再跟操作数。
示例
numpy_array_from_list + 10
输出
array([11, 19, 18, 13])
此操作将 numpy 数组的每个元素加上 10。
数组的形状
您可以使用对象 shape,前面加上数组的名称来检查数组的形状。同样,您可以使用 dtypes 检查类型。
import numpy as np a = np.array([1,2,3]) print(a.shape) print(a.dtype) (3,) int64
整数是没有小数的值。如果您创建一个带小数的数组,那么类型将变为浮点型(float)。
#### 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)
目标 | 代码 |
---|---|
创建数组 | array([1,2,3]) |
打印形状 | array([.]).shape |
什么是 numpy.zeros()?
numpy.zeros() 或 np.zeros Python 函数用于创建一个全零矩阵。在 TensorFlow 和其他统计任务中初始化第一次迭代的权重时,可以使用 Python 中的 numpy.zeros()。
numpy.zeros() 函数语法
numpy.zeros(shape, dtype=float, order='C')
Python numpy.zeros() 参数
此处,
- Shape:是 numpy 零数组的形状
- Dtype:是 numpy zeros 中的数据类型。它是可选的。默认值为 float64
- Order:默认为 C,这是 Python 中 numpy.zeros() 的基本行主序样式。
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 的矩阵。在 TensorFlow 和其他统计任务中,当您在第一次迭代中初始化权重时,可以使用 Python 中的 numpy.ones()。
Python numpy.ones() 语法
numpy.ones(shape, dtype=float, order='C')
Python numpy.ones() 参数
此处,
- Shape:是 np.ones Python 数组的形状
- Dtype:是 numpy ones 中的数据类型。它是可选的。默认值为 float64
- Order:默认为 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)
Python 中的 numpy.reshape() 函数
Python NumPy Reshape 函数用于在不改变其数据的情况下改变数组的形状。在某些情况下,您可能需要将数据从宽格式重塑为长格式。您可以使用 np.reshape 函数来完成此操作。
np.reshape() 的语法
numpy.reshape(a, newShape, order='C')
此处,
a:您想要重塑的数组
newShape:新的期望形状
Order:默认为 C,这是一种基本的行主序样式。
NumPy Reshape 示例
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]])
Python 中的 numpy.flatten()
Python NumPy Flatten 函数用于返回数组在一维形式下的副本。当您处理像 convnet 这样的神经网络时,需要将数组展平。您可以使用 np.flatten() 函数来完成此操作。
np.flatten() 的语法
numpy.flatten(order='C')
此处,
Order:默认为 C,这是一种基本的行主序样式。
NumPy Flatten 示例
e.flatten()
输出
array([1, 2, 3, 4, 5, 6])
Python 中的 numpy.hstack() 是什么?
Numpy.hstack 是 Python 中的一个函数,用于水平堆叠输入数组序列,以创建一个单一的数组。使用 hstack() 函数,您可以水平地追加数据。这是 NumPy 中一个非常方便的函数。
让我们通过一个例子来学习 Python 中的 hstack
示例
## Horitzontal 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]
Python 中的 numpy.vstack() 是什么?
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 vstack 和 hstack 之后,让我们学习一个在 NumPy 中生成随机数的例子。
使用 NumPy 生成随机数
要生成高斯分布的随机数,请使用
numpy.random.normal(loc, scale, size)
此处,
- Loc:均值。分布的中心
- Scale:标准差。
- Size:返回的数量
示例
## Generate random nmber from 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]
如果绘制出来,分布将类似于下图
NumPy Asarray 函数
当您想将输入转换为数组时,使用 asarray() 函数。输入可以是列表、元组、ndarray 等。
语法
numpy.asarray(data, dtype=None, order=None)[source]
此处,
data:您想要转换为数组的数据
dtype:这是一个可选参数。如果未指定,数据类型将从输入数据中推断出来
Order:默认为 C,这是一种基本的行主序样式。另一个选项是 F(Fortran 风格)
示例
考虑以下由 1 填充的四行四列的二维矩阵
import numpy as np A = np.matrix(np.ones((4,4)))
如果你想改变矩阵的值,你不能。原因在于,改变一个副本是不可能的。
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)
代码解释
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 的值;您可以使用 Python 中的 np.arange() 函数。
语法
numpy.arange(start, stop, step, dtype)
Python NumPy arange 参数
- Start:Python 函数 np.arange 的区间起点。
- Stop:区间终点。
- Step:值之间的间距。默认步长为 1。
- Dtype:是 Python 中 NumPy arange 的数组输出类型。
示例
import numpy np np.arange(1, 11)
输出
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
示例
在这个 Python 示例中,如果你想改变 NumPy arange 函数的步长,你可以在括号中添加第三个数字。它会改变步长。
import numpy np np.arange(1, 14, 4)
输出
array([ 1, 5, 9, 13])
NumPy Linspace 函数
Linspace 提供均匀间隔的样本。
语法
numpy.linspace(start, stop, num, endpoint)
此处,
- Start:序列的起始值
- Stop:序列的结束值
- Num:要生成的样本数。默认为 50
- Endpoint:如果为 True(默认),stop 是最后一个值。如果为 False,则不包含 stop 值。
示例
例如,它可以用来创建从 1 到 5 的 10 个均匀间隔的值。
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. ])
如果你不想在区间中包含最后一个数字,可以将 endpoint 设置为 false
np.linspace(1.0, 5.0, num=5, endpoint=False)
输出
array([1. , 1.8, 2.6, 3.4, 4.2])
Python 中的 LogSpace NumPy 函数
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 column print('First row:', e[0]) ## Second col print('Second row:', e[1])
输出
First row: [1 2 3] Second row: [4 5 6]
在 Python 中,像许多其他语言一样,
- 逗号前的值代表行
- 右侧的值代表列。
- 如果要选择一列,您需要在列索引前添加 :。
- : 表示你想要所选列的所有行。
print('Second column:', e[:,1])
Second column: [2 5]
要返回第二行的前两个值。您使用 : 来选择直到第二个的所有列
## Second Row, two values print(e[1, :2]) [4 5]
Python 中的统计函数
NumPy 有许多有用的统计函数,用于从给定数组的元素中找出最小值、最大值、百分位数、标准差和方差等。这些函数解释如下:
Numpy 配备了如下所列的强大统计函数
函数 | Numpy |
---|---|
Min (最小值) | np.min() |
Max (最大值) | np.max() |
平均值 | np.mean() |
中位数 | np.median() |
标准差 | 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 product 是一个强大的矩阵计算库。例如,您可以使用 np.dot 计算点积。Numpy.dot product 是 a 和 b 的点积。Python 中的 numpy.dot() 处理二维数组并执行矩阵乘法。
语法
numpy.dot(x, y, out=None)
参数
此处,
x,y:输入数组。要使 np.dot() 函数正常工作,x 和 y 都应为一维或二维数组
out:这是要返回的一维数组标量的输出参数。否则应返回 ndarray。
返回
Python 中的 numpy.dot() 函数返回两个数组 x 和 y 的点积。如果 x 和 y 都是一维的,dot() 函数返回一个标量;否则,它返回一个数组。如果给定了 'out',则返回 'out'。
引发
如果 x 的最后一个维度与 y 的倒数第二个维度的大小不同,Python 中的点积会引发 ValueError 异常。
示例
## 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) 一维数组首先被提升为矩阵,然后计算乘积
语法
numpy.matmul(x, y, out=None)
此处,
x,y:输入数组。不允许标量
out:这是一个可选参数。通常输出存储在 ndarray 中
示例
同样,您可以使用 np.matmul 计算矩阵乘法
### Matmul: matruc 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*6np.linalg.det(i)
输出
-2.000000000000005
摘要
- Python 是 Python 中一个可用的开源库,有助于数学、科学、工程和数据科学编程。
- numpy.zeros() 或 np.zeros Python 函数用于创建一个全零矩阵。
- 在 TensorFlow 和其他统计任务中,当您在第一次迭代中初始化权重时,可以使用 Python 中的 numpy.ones()。
- Python NumPy Reshape 函数用于在不改变其数据的情况下调整数组的形状。
- Python NumPy Flatten 函数用于返回数组的一维副本。
- Numpy.hstack 是 Python 中的一个函数,用于水平堆叠输入数组序列以形成单个数组。
- Numpy.vstack 是 Python 中的一个函数,用于垂直堆叠输入数组序列以形成单个数组。
- numpy.arange() 是一个内置的 numpy 函数,它返回一个包含在定义区间内均匀间隔值的 ndarray 对象。
- Numpy.dot product 是一个强大的矩阵计算库。
- Numpy matmul() 函数用于返回两个数组的矩阵乘积。