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]

如果绘制出来,分布将类似于下图

Example to Generate Random Numbers using NumPy
使用 NumPy 生成随机数的示例

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() 函数用于返回两个数组的矩阵乘积。