Numpy基础语法(汇总)

01NumPy是什么——

NumPy 的全称是“ Numeric [Python]”,它是 Python 的第三方扩展包,主要用来计算、处理一维或多维数组。

在数组算术计算方面, NumPy 提供了大量的数学函数。NumPy 的底层主要用 C语言编写,因此它能够高速地执行数值计算。NumPy 还提供了多种[数据结构],这些数据结构能够非常契合的应用在数组和矩阵的运算上。

NumPy 的前身是 Numeric 程序包,该包由 Jim Hugunin 开发,在这之后,他还开发了另一个类似的的程序包 Numarray,相比前者而言 Numarray 具有更加全面的功能 。在 2005 年,Travis Oliphant 通过整合 Numarray 与 Numeric 软件包的功能,从而集成了 NumPy。NumPy 的最新版本 1.19.2 已于 2020 年 9 月10 日发布。

NumPy 作为一个开源项目,它由许多协作者共同开发维护,这也是 NumPy 的优势之一。

NumPy使用需求

随着数据科学(Data Science,简称 DS,包括大数据分析与处理、大数据存储、数据抓取等分支)的蓬勃发展,像 NumPy、SciPy(Python科学计算库)、Pandas(基于NumPy的数据处理库) 等数据分析库都有了大量的增长,它们都具有较简单的语法格式。

在矩阵乘法与数组形状处理上,NumPy 有着非常不错的性能,再加上 NumPy 的计算速度很快,这些都是 NumPy 成为一款数据分析工具的重要原因。

数组形状可以理解为数组的维度,比如一维数组、二维数组、三维数组等;以二维数组为例,改变数组形状就是交换数组的行和列,也即将数组旋转 90 度。

NumPy 可以很便捷高效地处理大量数据,那么使用 NumPy 做数据处理有哪些优点呢?总结如下:

  • NumPy 是 Python 科学计算基础库;
  • NumPy 可以对数组进行高效的数学运算;
  • NumPy 的 ndarray 对象可以用来构建多维数组;
  • NumPy 能够执行傅立叶变换与重塑多维数组形状;
  • NumPy 提供了线性代数,以及随机数生成的内置函数。

NumPy应用场景

NumPy 通常与 SciPy(Python科学计算库)和 Matplotlib(Python绘图库)等软件包组合使用,这种组合方式被用来广泛地代替 MatLab 的使用。

MatLab 是一款强大的数学计算软件,广泛应用在数据分析、电子通信、深度学习、图像处理、机器视觉、量化金融等领域,但近些年随着 Python 语言的迅猛发展,Python 被看作是一种更适合代替 MatLab 的编程语言。您可以使用 NumPy、SciPy 与 Matplotlib 等 Python 工具包搭建科学计算环境,比如 Anaconda 就是是一个开源的 Python 发行版本,它包含了 Python 、NumPy 等 180 多个科学包及其依赖项。

因为 NumPy 是 Python 的扩展程序包,所以您在学习 NumPy 之前应该具备一些 Python 基础知识,这对本教程的学习将大有裨益。如果您想了解关于 NumPy 更多的知识可浏览 NumPy 官网:NumPy -

NumPy下载与安装

NumPy 是 [Python] 的第三方扩展包,但它并没有包含在 Python 标准库中,因此您需要单独安装它。本节介绍如何在不同的操作系统上安装 NumPy。

Windows系统安装

在 Windows 系统下安装 NumPy 有两种常用方式,下面分别对其进行介绍。

使用 Python 包管理器pip来安装 NumPy,是一种最简单、最轻量级的方法。只需执行以下命令即可:

!pip install numpy

在实际项目中, NumPy 通常与 SciPy 程序包一起使用,SciPy 可以看做对 NumPy 库的扩展,它在 NumPy 的基础上又增加了许多工程计算函数。因此将它们同时安装是一个不错的选择。但如果你只想针对 NumPy 进行学习,可以不用考虑这种安装方法。

注意:在 Windows 下直接使用 pip 安装 SciPy 会发生报错,需要我们解决 SciPy 的依赖项问题,所以不推荐使用pip安装 SciPy 程序包。下面介绍如何使用 SciPy 栈安装。

首先我们要知道什么是 SciPy 栈?其实它是一个科学计算软件包的集成平台,这类平台囊括了常用的数值计算与机器学习库,比如 NumPy、Matplotlib、SciPy 库、IPython 等,并且它可以自动解决包之间的依赖问题。通过安装一个集成平台就可以实现上述所有软件包的安装,何乐而不为呢

下面介绍几种常用的 SciPy 栈,主要有以下几种:

Anaconda(官网下载:https://www.anaconda.com/)是一个开源的 Python 发行版,它包含了 NumPy、SciPy 等180多个科学包及其依赖项。除了支持 Windows 外,也支持 Linux 和 Mac 系统。Anaconda 就目前应用较为广泛,因此建议安装。

Anaconda 的下载文件约 500 MB 左右,你可以选择安装 Miniconda,它是 Anaconda 的轻巧版,只需 40 余兆。

Python(x,y)(下载地址:https://python-xy.github.io/)是一款基于 Python、Qt (图形用户界面)和 Spyder (交互式开发环境)开发的软件,主要用于数值计算、数据分析和数据可视化等工程项目,目前只支持 Python 2 版本。

Pyzo(下载地址:https://pyzo.org/)是一个跨平台 Python IDE,基于 Python 3 编写,非常适合科学计算,它设计的宗旨就是为了简化和提供效率。

WinPython(下载地址:https://sourceforge.net/projects/winpython/files/)免费的 Python 发行版,包含了常用的科学计算包与 Spyder IDE 开发环境,但仅支持 Windows 系统。

MacOSX系统安装

Mac 系统虽然自带包管理器Homebrew,但是它不能下载 NumPy 等科学计算包,所以需要使用下列方式安装:

$ pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

注意:-i 参数后指的是国内下载源,加快下载的速度。

Linux系统安装

在 Linux 系统中,您可以选择只单独安装 NumPy 一个软件包,也可以同时安装多个软件包。下面介绍了不同的 Linux 发行版具体的安装命令,如下所示:

1) Ubuntu/Debian

对于 Ubuntu/Debian 系统,可以在终端上执行以下命令:

$ sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose 

2) Redhat/CentOS

在 Redhat/CentOS 系统上执行以下命令来安装 NumPy 与其它科学计算包:

$ sudo yum install numpy scipy python-matplotlib ipython python-pandas sympy python-nose

注意:不同的软件包之间必须使用“一个空格”隔开。

最后验证是否安装成功,如下所示:

打开 Python 交互解释器 ,并导入 NumPy 模块,如下图 2 所示如果未出现错误提示,则表示已安装成功。

注意:这里是以 Windows 系统为例进行验证的,Linux 验证方式与其相同。

NumPy ndarray对象

NumPy 定义了一个 n 维数组对象,简称 ndarray 对象,它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块,您可以使用索引或切片的方式获取数组中的每个元素。

ndarray 对象有一个 dtype 属性,该属性用来描述元素的数据类型,

ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按照一定的布局对内存块进行排列,常用的布局方式有两种,即按行或者按列。

创建 ndarray 对象

通过 NumPy 的内置函数 array() 可以创建 ndarray 对象,其语法格式如下:

numpy.array(object,ndmin = 0)

下面表格对其参数做了说明:

序号 参数 描述说明
1 object 表示一个数组序列。
2 dtype 可选参数,通过它可以更改数组的数据类型。
3 ndim 用于指定数组的维度。
4 reshape 用于改变行数和列数

创建一维数组:

a=numpy.array([1,2,3])

示例代码:

import numpy
a=numpy.array([1,2,3])#使用列表构建一维数组
print(a)
[1 2 3]
print(type(a))
#ndarray数组类型
<class 'numpy.ndarray'>

创建多维数组:

b=numpy.array([[1,2,3],[4,5,6]])

示例代码:

b=numpy.array([[1,2,3],[4,5,6]])
print(b)
[[1 2 3]
[4 5 6]]

如果要改变数组元素的数据类型,可以使用通过设置 dtype,如下所示:

c=numpy.array([2,4,6,8],dtype="数据类型名称")

array() 是创建 ndarray 对象的基本方法,在后续内容中还会介绍其他方法。

ndim查看数组维数

通过 ndim 可以查看数组的维度:

import numpy as np 
arr = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [9, 10, 11, 23]]) 
print(arr.ndim) 
2

您也可以使用 ndim 参数创建不同维度的数组:

#输出一个二维数组
import numpy as np
a = np.array([1, 2, 3,4,5], ndimn = 2)
print(a)

输出结果如下:

[[1 2 3 4 5]]

reshape数组变维

数组的形状指的是多维数组的行数和列数。Numpy 模块提供 reshape() 函数可以改变多维数组行数和列数,从而达到数组变维的目的。因此数组变维即对数组形状的重塑:

reshape() 函数可以接受一个元组作为参数,用于指定了新数组的行数和列数,示例如下:

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

输出如下:

原数组 [[1 2]
[3 4]
[5 6]]
新数组 [[1 2 3]
[4 5 6]]

02类型——

1. NumPy 数据类型

numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。下表列举了常用 NumPy 基本类型。

名称 描述
bool_ 布尔型数据类型(True 或者 False)
int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc 与 C 的 int 类型一样,一般是 int32 或 int 64
intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8 字节(范围-128 to 127)(代表与1字节相同的8位整数)
int16 整数(范围-32768 to 32767)(代表 2 字节(16位)的整数)
int32 整数(-范围2147483648 to 2147483647)(代表 4 字节(32位)整数)
int64 整数(范围-9223372036854775808 to 9223372036854775807)(表示 8 字节(64位)整数)
uint8 无符号整数(0 to 255)
uint16 无符号整数(0 to 65535)
uint32 无符号整数(0 to 4294967295)
uint64 无符号整数(0 to 18446744073709551615)
float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float_ float64 类型的简写
float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_ complex128 类型的简写,即 128 位复数
complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)
str_ 表示字符串类型
string_ 表示字节串类型

numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。

数据类型标识码

NumPy 中每种数据类型都有一个唯一标识的字符码,如下所示:

数据类型标识码:

字符 对应类型
b 代表布尔型
i 带符号整型
u 无符号整型
f 浮点型
c 复数浮点型
m 时间间隔(timedelta)
M datatime(日期时间)
O Python对象
S,a 字节串(S)与字符串(a)
U Unicode
V 原始数据(void)

数据类型对象 (dtype)

数据类型对象(numpy.dtype 类的实例)用来描述与数组对应的内存区域是如何使用,它描述了数据的以下几个方面::

  • 数据的类型(整数,浮点数或者 Python 对象)
  • 数据的大小(例如, 整数使用多少个字节存储)
  • 数据的字节顺序(小端法或大端法)
  • 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
  • 如果数据类型是子数组,那么它的形状和数据类型是什么。

字节顺序是通过对数据类型预先设定 <> 来决定的。 < 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。> 意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。

dtype 对象是使用以下语法构造的:

numpy.dtype(object, align, copy)
  • object - 要转换为的数据类型对象
  • align - 如果为 true,填充字段使其类似 C 的结构体。
  • copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用

实例

通过实例来理解

实例 1

import numpy as np
# 使用标量类型
dt = np.dtype(np.int32)
print(dt)

输出:

int32

实例 2

import numpy as np
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
dt = np.dtype('i4')
print(dt)

输出:

int32

实例 3

import numpy as np
# 字节顺序标注
dt = np.dtype('<i4')
print(dt)

输出:

int32

实例 4

下面实例展示结构化数据类型的使用,类型字段和对应的实际类型将被创建

# 首先创建结构化数据类型
import numpy as np
dt = np.dtype([('age',np.int8)]) 
print(dt)

输出:

[('age', 'i1')]
​``````

实例 5

下面的示例定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象。

import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
print(student)

输出:

[('name', 'S20'), ('age', 'i1'), ('marks', 'f4')]

实例 8

import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
a = np.array([('name1', 21, 50),('xyz', 18, 75)], dtype = student) 
print(a)

输出:

[('name1', 21, 50.0), ('xyz', 18, 75.0)]

2. NumPy 数组属性

NumPy 的数组中比较重要 ndarray 对象属性有:

属性 说明
ndarray.ndim 数组的秩(rank),即数组的维度数量或轴的数量。
ndarray.shape 数组的维度,表示数组在每个轴上的大小。对于二维数组(矩阵),表示其行数和列数。
ndarray.size 数组中元素的总个数,等于 ndarray.shape 中各个轴上大小的乘积。
ndarray.dtype 数组中元素的数据类型。
ndarray.itemsize 数组中每个元素的大小,以字节为单位。

ndarray.shape

shape 属性的返回值一个由数组维度构成的元组,比如 2 行 3 列的二维数组可以表示为(2,3),该属性可以用来调整数组维度的大小。

import numpy as np
a = np.array([[2,4,6],[3,5,7]])
print(a.shape)

输出:

(2,3)

通过 shape 属性修改数组的形状大小:

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

输出:

[[1, 2][3, 4][5, 6]]

ndarray.reshape()

作用:调整数组形状

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

输出:

[[1, 2][3, 4]
[5, 6]]

ndarray.ndim

该属性返回的是数组的维数:

import numpy as np   #随机生成一个一维数组
c = np.arange(24)
print(c)
print(c.ndim)    #对数组进行变维操作
e = c.reshape(2,4,3)   *
print(e) 
print(e.ndim)

输出:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
1
[[[ 0  1  2][ 3 4 5]
  [ 6  7  8][ 9 10 11]]

[[12 13 14][15 16 17]
  [18 19 20][21 22 23]]]
3


ndarray.itemsize

返回数组中每个元素的大小(以字节为单位):

数据类型为int8,代表1字节=8 bit

import numpy as np
x = np.array([1,2,3,4,5], dtype = np.int8)
print (x.itemsize)

输出:

1

数据类型为int64,代表8字节

import numpy as np
x = np.array([1,2,3,4,5], dtype = np.int64)
print (x.itemsize)

输出:

8

03数组——

NumPy 数组属性

NumPy 的数组中比较重要 ndarray 对象属性有:

属性 说明
ndarray.ndim 数组的秩(rank),即数组的维度数量或轴的数量。
ndarray.shape 数组的维度,表示数组在每个轴上的大小。对于二维数组(矩阵),表示其行数和列数。
ndarray.size 数组中元素的总个数,等于 ndarray.shape 中各个轴上大小的乘积。
ndarray.dtype 数组中元素的数据类型。
ndarray.itemsize 数组中每个元素的大小,以字节为单位。

NumPy 创建数组

ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建

numpy.empty

numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:

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

参数:

参数 描述
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

实例

#创建数组
#empty表示:方法用来创建一个指定形状数组
a = np.empty([3,2],dtype = np.int64)
print(a)

输出:

[[25895968444448860 23925768161198147]
 [32370111954616435 31525648370892892]
 [18296268630786147 27303364806049904]]

注: 数组元素为随机值,因为它们未初始化

numpy.zeros

创建指定大小的数组,数组元素以 0 来填充:

numpy.zeros(shape, dtype = float)

参数:

参数 描述
shape 数组形状
dtype 数据类型,可选

实例

#创建指定大小的数组,数组元素以 0 来填充:
# 默认为浮点类型
a = np.zeros(5)
print(a)

#设置数据类型
y = np.zeros(5,dtype = int)
print(y)

输出:

[0. 0. 0. 0. 0.]
[0 0 0 0 0]

numpy.ones

创建指定形状的数组,数组元素以 1 来填充:

numpy.ones(shape, dtype = None)

参数:

参数 描述
shape 数组形状
dtype 数据类型,可选

实例

#创建指定形状的数组,数组元素以 1 来填充
# 默认为浮点类型
a = np.ones(5)
print(a)

#设置数据类型
y = np.ones(5,dtype=np.int32)
print(y)

输出:

[1. 1. 1. 1. 1.]
[1 1 1 1 1]

numpy.zeros_like

numpy.zeros_like 用于创建一个与给定数组具有相同形状的数组,数组元素以 0 来填充

numpy.zeros 和 numpy.zeros_like 都是用于创建一个指定形状的数组,其中所有元素都是 0

它们之间的区别在于:numpy.zeros 可以直接指定要创建的数组的形状,而 numpy.zeros_like 则是创建一个与给定数组具有相同形状的数组

numpy.zeros_like(a, dtype=None, order='K')

参数:

参数 描述
a 给定要创建相同形状的数组
dtype 创建的数组的数据类型
order 数组在内存中的存储顺序,可选值为 'C'(按行优先)或 'F'(按列优先),默认为 'K'(保留输入数组的存储顺序)
shape 创建的数组的形状,如果不指定,则默认为 a 数组的形状。

实例

创建一个与 arr 形状相同的,所有元素都为 0 的数组:

#用于创建一个与给定数组具有相同形状的数组,数组元素以 0 来填充。
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)

#调用zeros_like函数来进行操作
x = np.zeros_like(a)
print(x)

输出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[0 0 0]
 [0 0 0]
 [0 0 0]]

numpy.ones_like

numpy.ones_like 用于创建一个与给定数组具有相同形状的数组,数组元素以 1 来填充

numpy.ones 和 numpy.ones_like 都是用于创建一个指定形状的数组,其中所有元素都是 1

它们之间的区别在于:numpy.ones 可以直接指定要创建的数组的形状,而 numpy.ones_like 则是创建一个与给定数组具有相同形状的数组

numpy.ones_like(a, dtype=None, order='K')

参数:

参数 描述
a 给定要创建相同形状的数组
dtype 创建的数组的数据类型
order 数组在内存中的存储顺序,可选值为 'C'(按行优先)或 'F'(按列优先),默认为 'K'(保留输入数组的存储顺序)

实例

创建一个与 arr 形状相同的,所有元素都为 1 的数组:

#用于创建一个与给定数组具有相同形状的数组,数组元素以 1 来填充。
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)

#调用ones_like函数来进行操作
x = np.ones_like(a)
print(x)

输出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[1 1 1]
 [1 1 1]
 [1 1 1]]

NumPy 从已有的数组创建数组

numpy.asarray

numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个

# array和asarray的区别

import numpy as np
x = np.arange(3)
y = np.asarray(x)
z = np.array(x)
print(y is x)  # True,通常不拷贝
print(z is x)  # False,默认会拷贝

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

参数:

参数 描述
a 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
dtype 数据类型,可选
order 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

实例

将列表转换为 ndarray:

#从已有的数组创建数组
x = [1,2,3,4,5,6]
#将列表转换为 ndarray对象
a = np.asarray(x)
print(a)

输出:

[1 2 3 4 5 6]

**将元组转换为 ndarray: **

#将元组转换为 ndarray对象
x = (1,2,3,4,5,6)
a = np.asarray(x)
print(a)

输出:

[1 2 3 4 5 6]

**将元组列表转换为 ndarray: **

#将元组列表转换为 ndarray对象
x = [(1,2,3),(4,5,6)]
a = np.asarray(x,dtype = float)
print(a)

输出:

[[1. 2. 3.]
 [4. 5. 6.]]

设置 dtype 参数:

import numpy as np 
 
x =  [1,2,3] 
a = np.asarray(x, dtype =  float)  
print (a)

输出:

[ 1.  2.  3.]

numpy.frombuffer

numpy.frombuffer 用于实现动态数组

numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

注意:buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b

参数:

参数 描述
buffer 可以是任意对象,会以流的形式读入。
dtype 返回数组的数据类型,可选
import numpy as np 
 
s =  b'Hello World' 
a = np.frombuffer(s, dtype =  'S1')  
print (a)

输出:

[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']

numpy.fromiter

numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组

numpy.fromiter(iterable, dtype)

参数 描述
iterable 可迭代对象
dtype 返回数组的数据类型

实例

# 9 np.fromiter()函数
import numpy as np
lis = range(0,10)
arr = np.fromiter(i,dtype = np.float64)
print(arr)

输出:

[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]


NumPy 从数值范围创建数组

numpy.arange

numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:

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


根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray

参数:

参数 描述
start 起始值,默认为0
stop 终止值(不包含)
step 步长,默认为1
dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

实例

**生成 0 到 4 长度为 5 的数组: **

import numpy as np
 
x = np.arange(5)  
print (x)


输出:

[0  1  2  3  4]


设置返回类型位 float:

import numpy as np
 
# 设置 dtype
x = np.arange(5, dtype =  float)  
print (x)


输出结果如下:

[0.  1.  2.  3.  4.]


设置起始值、终止值及步长:

import numpy as np
x = np.arange(10,20,2)  
print (x)


输出:

[10  12  14  16  18]


numpy.linspace

numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)


参数:

参数 描述
start 序列的起始值
stop 序列的终止值,如果endpointtrue,该值包含于数列中
num 要生成的等步长的样本数量,默认为50
endpoint 该值为 true 时,数列中包含stop值,反之不包含,默认是True。
retstep 如果为 True 时,生成的数组中会显示间距,反之不显示。
dtype ndarray 的数据类型

实例

以下实例用到三个参数,设置起始点为 1 ,终止点为 10,数列个数为 10

import numpy as np
a = np.linspace(1,10,10)
print(a)


输出:

[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]


设置元素全部是1的等差数列:

import numpy as np
a = np.linspace(1,1,10)
print(a)


输出:

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]


将 endpoint 设为 false,不包含终止:

import numpy as np
 
a = np.linspace(10, 20,  5, endpoint =  False)  
print(a)


输出:

[10. 12. 14. 16. 18.]


如果将 endpoint 设为 true,则会包含 20

设置间距

import numpy as np
a =np.linspace(1,10,10,retstep= True)
 
print(a)
# 拓展例子
b =np.linspace(0,10,10).reshape(2,5)  # 重塑为2行5列的数组
print(b)


输出:

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


04切片和索引——

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。

1.实例

ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

import numpy as np
 
a = np.arange(10)
s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])

输出:

[2  4  6]

2.实例

通过 arange() 函数创建 ndarray 对象。 然后,分别设置起始,终止和步长的参数为 2,7 和 2。也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作:

import numpy as np
 
a = np.arange(10)  
b = a[2:7:2]   # 从索引 2 开始到索引 7 停止,间隔为 2
print(b)

输出:

[2  4  6]

3.实例

冒号 :的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。

import numpy as np
 
a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
b = a[5] 
print(b)

输出:

5

import numpy as np
 
a = np.arange(10)
print(a[2:])

输出:

[2  3  4  5  6  7  8  9]

import numpy as np
 
a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
print(a[2:5])

输出:

[2  3  4]

4.实例

**多维数组同样适用上述索引提取方法: **

import numpy as np
 
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a)
# 从某个索引处开始切割
print('从数组索引 a[1:] 处开始切割')
print(a[1:])

输出:

[[1 2 3]
 [3 4 5]
 [4 5 6]]
从数组索引 a[1:] 处开始切割
[[3 4 5]
 [4 5 6]]

5.实例

切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。

import numpy as np
 
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素
print (a[...,1:])  # 第2列及剩下的所有元素

输出:

[2 4 5]
[3 4 5]
[[2 3]
 [4 5]
 [5 6]]

NumPy 高级索引

NumPy 比一般的 Python 序列提供更多的索引方式。

除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。

NumPy 中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素。相比于基本索引,高级索引可以访问到数组中的任意元素,并且可以用来对数组进行复杂的操作和修改。

1. 整数数组索引

整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。

以下实例

实例

获取数组中 (0,0),(1,1) 和 (2,0)位置处的元素。

import numpy as np 
 
x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
y = x[[0,1,2],  [0,1,0]]  
print (y)

输出:

[1  4  5]

以下实例获取了 4X3 数组中的四个角的元素。 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。

import numpy as np 
 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:' )
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  ('这个数组的四个角元素是:')
print (y)

输出:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


这个数组的四个角元素是:
[[ 0  2]
 [ 9 11]]

返回的结果是包含每个角元素的 ndarray 对象。

2. 布尔索引

可以通过一个布尔数组来索引目标数组。

布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

实例

**获取大于 5 的元素: **

import numpy as np 
 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素  
print  ('大于 5 的元素是:')
print (x[x >  5])

输出:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


大于 5 的元素是:
[ 6  7  8  9 10 11]

3. 花式索引

花式索引指的是利用整数数组进行索引。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。

对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素,如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

一维数组

实例

一维数组只有一个轴 axis = 0,所以一维数组就在 axis = 0 这个轴上取值:

import numpy as np

x = np.arange(9)
print(x)
# 一维数组读取指定下标对应的元素
print("-------读取下标对应的元素-------")
x2 = x[[0, 6]] # 使用花式索引
print(x2) 

print(x2[0])
print(x2[1])

输出:

[0 1 2 3 4 5 6 7 8]
-------读取下标对应的元素-------
[0 6]
0
6

二维数组

传入顺序索引数组

实例
import numpy as np 
 
x = np.arange(32).reshape(8, 4)
print(x)
# 二维数组读取指定下标对应的行
print("-------读取下标对应的行-------")
print (x[[4,2,1,7]])

输出:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
-------读取下标对应的行-------
[[16 17 18 19]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [28 29 30 31]]

05广播及迭代——

广播(Broadcast)

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

实例

1. 如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

import numpy as np 
 
a = np.array([1,2,3,4]) 
b = np.array([10,20,30,40]) 
c = a * b 
print (c)

输出:

[ 10  40  90 160]

2. 当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。

import numpy as np 
 
a = np.array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = np.array([0,1,2])
print(a + b)

输出:

[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

**4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算: **

import numpy as np 
 
a = np.array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = np.array([1,2,3])
bb = np.tile(b, (4, 1))  # 重复 b 的各个维度
print(a + bb)

输出:

[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]

NumPy 迭代数组

NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。

迭代器最基本的任务的可以完成对数组元素的访问。

实例

import numpy as np
 
a = np.arange(6).reshape(2,3)
print ('原始数组是:')
print (a)
print ('\n')
print ('迭代输出元素:')
for x in np.nditer(a):
    print (x, end=", " )
print('\b')      # \b  \t  \n   

输出:

原始数组是:
[[0 1 2]
 [3 4 5]]


迭代输出元素:
0, 1, 2, 3, 4, 5, 

控制遍历顺序

for x in np.nditer(a, order='F'):Fortran order,即是列序优先;

**for x in np.nditer(a.T, order='C'): **Corder,即是行序优先;

import numpy as np 
 
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print ('原始数组是:')
print (a)
print ('\n')
print ('以 C 风格顺序排序:')
for x in np.nditer(a, order =  'C'):  
    print (x, end=", " )
print ('\n')
print ('以 F 风格顺序排序:')
for x in np.nditer(a, order =  'F'):  
    print (x, end=", " )

输出:

原始数组是:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


以 C 风格顺序排序:
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 

以 F 风格顺序排序:
0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55,

广播迭代

如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 a 的维度为 3X4,数组 b 的维度为 1X4 ,则使用以下迭代器(数组 b 被广播到 a 的大小)。

实例

import numpy as np

a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print("第一个数组为:")
print(a)
print('\n')
print("第二个数组为:")
b = np.array([1, 2, 3, 4],dtype=int)
print(b)
print('\n')
print("修改后的数组为:")
for x,y in np.nditer([a, b]):
    print(x,y)

输出:

第一个数组为:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


第二个数组为:
[1 2 3 4]


修改后的数组为:
0 1
5 2
10 3
15 4
20 1
25 2
30 3
35 4
40 1
45 2
50 3
55 4

posted @ 2026-02-23 12:19  瑜淞蜀  阅读(0)  评论(0)    收藏  举报