NumPy - 快速指南


NumPy - 简介

NumPy 是一个 Python 包。它代表“数字Python”。它是一个由多维数组对象和数组处理例程集合组成的库。

Numeric是 NumPy 的祖先,由 Jim Hugunin 开发。还开发了另一个软件包 Numarray,具有一些附加功能。2005 年,Travis Oliphant 将 Numarray 的功能合并到 Numeric 包中,创建了 NumPy 包。这个开源项目有很多贡献者。

使用 NumPy 进行运算

使用 NumPy,开发人员可以执行以下操作 -

  • 数组的数学和逻辑运算。

  • 傅里叶变换和形状操作例程。

  • 与线性代数相关的运算。NumPy 具有用于线性代数和随机数生成的内置函数。

NumPy – MatLab 的替代品

NumPy 通常与SciPy(科学 Python)和Mat−plotlib(绘图库)等软件包一起使用。这种组合被广泛用作 MatLab(一种流行的技术计算平台)的替代品。然而,Python 替代 MatLab 现在被视为一种更现代、更完整的编程语言。

它是开源的,这是 NumPy 的另一个优势。

NumPy - 环境

标准 Python 发行版不与 NumPy 模块捆绑在一起。一种轻量级的替代方案是使用流行的 Python 包安装程序pip安装 NumPy 。

pip install numpy

启用 NumPy 的最佳方法是使用特定于您的操作系统的可安装二进制包。这些二进制文件包含完整的SciPy堆栈(包括NumPy、SciPy、matplotlib、IPython、SymPy和nose包以及核心Python)。

Windows

Anaconda(来自https://www.continuum.io)是 SciPy 堆栈的免费 Python 发行版。它还适用于 Linux 和 Mac。

Canopy ( https://www.enthought.com/products/canopy/ ) 既可以免费提供,也可以作为商业发行版提供,具有适用于 Windows、Linux 和 Mac 的完整 SciPy 堆栈。

Python (x,y):它是一个免费的 Python 发行版,带有适用于 Windows 操作系统的 SciPy 堆栈和 Spyder IDE。(可从https://www.python-xy.github.io/下载)

Linux

各个 Linux 发行版的包管理器用于在 SciPy 堆栈中安装一个或多个包。

对于Ubuntu

sudo apt-get install python-numpy 
python-scipy python-matplotlibipythonipythonnotebook python-pandas 
python-sympy python-nose

对于软呢帽

sudo yum install numpyscipy python-matplotlibipython 
python-pandas sympy python-nose atlas-devel

从源头构建

核心 Python(2.6.x、2.7.x 和 3.2.x 及以上)必须使用 distutils 安装,并且应启用 zlib 模块。

GNU gcc(4.2 及更高版本)C 编译器必须可用。

要安装 NumPy,请运行以下命令。

Python setup.py install

要测试 NumPy 模块是否正确安装,请尝试从 Python 提示符导入它。

import numpy

如果未安装,将显示以下错误消息。

Traceback (most recent call last): 
   File "<pyshell#0>", line 1, in <module> 
      import numpy 
ImportError: No module named 'numpy'

或者,使用以下语法导入 NumPy 包 -

import numpy as np

NumPy - Ndarray 对象

NumPy 中定义的最重要的对象是称为ndarray 的N 维数组类型。它描述了相同类型的项目的集合。可以使用从零开始的索引来访问集合中的项目。

ndarray 中的每个项目在内存中占用相同大小的块。ndarray 中的每个元素都是数据类型对象(称为dtype )的对象。

从 ndarray 对象(通过切片)提取的任何项目都由数组标量类型之一的 Python 对象表示。下图显示了 ndarray、数据类型对象 (dtype) 和数组标量类型之间的关系 -

恩达阵列

ndarray 类的实例可以通过本教程后面描述的不同数组创建例程来构造。基本 ndarray 是使用 NumPy 中的数组函数创建的,如下所示 -

numpy.array 

它从任何公开数组接口的对象或任何返回数组的方法创建一个 ndarray。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

上面的构造函数采用以下参数 -

先生。 参数及说明
1

目的

公开数组接口方法的任何对象都会返回数组或任何(嵌套)序列。

2

数据类型

所需的数组数据类型,可选

3

复制

选修的。默认情况下(true),对象被复制

4

命令

C(行专业)或 F(列专业)或 A(任意)(默认)

5

苏博克

默认情况下,返回的数组强制为基类数组。如果为 true,则子类通过

6

最小

指定结果数组的最小尺寸

请看以下示例以更好地理解。

实施例1

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

输出如下 -

[1, 2, 3]

实施例2

# more than one dimensions 
import numpy as np 
a = np.array([[1, 2], [3, 4]]) 
print a

输出如下 -

[[1, 2] 
 [3, 4]]

实施例3

# minimum dimensions 
import numpy as np 
a = np.array([1, 2, 3,4,5], ndmin = 2) 
print a

输出如下 -

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

实施例4

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

输出如下 -

[ 1.+0.j,  2.+0.j,  3.+0.j]

ndarray对象由计算机内存的连续一维段组成,并结合将每个项目映射到内存块中的位置的索引方案。内存块以行优先顺序(C 风格)或列优先顺序(FORTRAN 或 MatLab 风格)保存元素。

NumPy - 数据类型

NumPy 比 Python 支持更多种类的数值类型。下表显示了 NumPy 中定义的不同标量数据类型。

先生。 数据类型和描述
1

布尔_

布尔值(True 或 False)存储为字节

2

整数_

默认整数类型(与 C long 相同;通常为 int64 或 int32)

3

国际委员会

与 C int 相同(通常为 int32 或 int64)

4

INTP

用于索引的整数(与 C ssize_t 相同;通常为 int32 或 int64)

5

整型8

字节(-128 到 127)

6

整型16

整数(-32768 至 32767)

7

整型32

整数(-2147483648 至 2147483647)

8

整型64

整数(-9223372036854775808 至 9223372036854775807)

9

uint8

无符号整数(0 到 255)

10

uint16

无符号整数(0 到 65535)

11

uint32

无符号整数(0 到 4294967295)

12

uint64

无符号整数(0 到 18446744073709551615)

13

漂浮_

float64 的简写

14

浮动16

半精度浮点数:符号位,5位指数,10位尾数

15

浮动32

单精度浮点数:符号位、8位指数、23位尾数

16

浮动64

双精度浮点数:符号位、11 位指数、52 位尾数

17 号

复杂的_

Complex128 的简写

18

复杂64

复数,由两个 32 位浮点数(实部和虚部)表示

19

复杂128

复数,由两个 64 位浮点数(实部和虚部)表示

NumPy 数值类型是 dtype(数据类型)对象的实例,每个对象都具有独特的特征。数据类型可用作 np.bool_、np.float32 等。

数据类型对象(dtype)

数据类型对象描述了与数组对应的固定内存块的解释,具体取决于以下方面 -

  • 数据类型(整数、浮点或 Python 对象)

  • 数据大小

  • 字节顺序(小端或大端)

  • 如果是结构化类型,则为字段名称、每个字段的数据类型以及每个字段占用的内存块的一部分。

  • 如果数据类型是子数组,则其形状和数据类型

字节顺序由数据类型前缀“<”或“>”决定。'<' 表示编码是小尾数法(最低有效位存储在最小地址中)。'>' 表示编码是大端字节序(最高有效字节存储在最小地址中)。

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

numpy.dtype(object, align, copy)

参数是 -

  • 对象- 转换为数据类型对象

  • Align - 如果为 true,则向字段添加填充以使其类似于 C 结构

  • 复制- 制作 dtype 对象的新副本。如果为 false,则结果是对内置数据类型对象的引用

实施例1

# using array-scalar type 
import numpy as np 
dt = np.dtype(np.int32) 
print dt

输出如下 -

int32

实施例2

#int8, int16, int32, int64 can be replaced by equivalent string 'i1', 'i2','i4', etc. 
import numpy as np 

dt = np.dtype('i4')
print dt 

输出如下 -

int32

实施例3

# using endian notation 
import numpy as np 
dt = np.dtype('>i4') 
print dt

输出如下 -

>i4

以下示例展示了结构化数据类型的使用。这里,要声明字段名称和相应的标量数据类型。

实施例4

# first create structured data type 
import numpy as np 
dt = np.dtype([('age',np.int8)]) 
print dt 

输出如下 -

[('age', 'i1')] 

实施例5

# now apply it to ndarray object 
import numpy as np 

dt = np.dtype([('age',np.int8)]) 
a = np.array([(10,),(20,),(30,)], dtype = dt) 
print a

输出如下 -

[(10,) (20,) (30,)]

实施例6

# file name can be used to access content of age column 
import numpy as np 

dt = np.dtype([('age',np.int8)]) 
a = np.array([(10,),(20,),(30,)], dtype = dt) 
print a['age']

输出如下 -

[10 20 30]

实施例7

以下示例定义了一个名为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([('abc', 21, 50),('xyz', 18, 75)], dtype = student) 
print a

输出如下 -

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

每个内置数据类型都有一个唯一标识它的字符代码。

  • 'b' - 布尔值

  • 'i' - (有符号)整数

  • 'u' - 无符号整数

  • 'f' - 浮点数

  • 'c' - 复数浮点

  • 'm' - 时间增量

  • 'M' - 日期时间

  • 'O' - (Python) 对象

  • 'S', 'a' - (字节)字符串

  • 'U' - 统一码

  • 'V' - 原始数据(无效)

NumPy - 数组属性

在本章中,我们将讨论 NumPy 的各种数组属性。

ndarray.shape

此数组属性返回一个由数组维度组成的元组。它还可以用于调整数组的大小。

实施例1

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

输出如下 -

(2, 3)

实施例2

# this resizes the ndarray 
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]]

实施例3

NumPy 还提供了一个 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

此数组属性返回数组维数。

实施例1

# an array of evenly spaced numbers 
import numpy as np 
a = np.arange(24) 
print a

输出如下 -

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

实施例2

# this is one dimensional array 
import numpy as np 
a = np.arange(24) 
a.ndim  

# now reshape it 
b = a.reshape(2,4,3) 
print b 
# b is having three dimensions

输出如下 -

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

numpy.itemsize

此数组属性返回数组每个元素的长度(以字节为单位)。

实施例1

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

输出如下 -

1

实施例2

# dtype of array is now float32 (4 bytes) 
import numpy as np 
x = np.array([1,2,3,4,5], dtype = np.float32) 
print x.itemsize

输出如下 -

4

numpy.flags

ndarray 对象具有以下属性。该函数返回其当前值。

先生。 属性及描述
1

C_连续 (C)

数据位于单个 C 风格的连续段中

2

F_连续 (F)

数据位于单个 Fortran 风格的连续段中

3

自有数据 (O)

数组拥有它使用的内存或从另一个对象借用内存

4

可写(W)

数据区可写入。将其设置为 False 会锁定数据,使其只读

5

对齐 (A)

数据和所有元素都针对硬件进行适当对齐

6

更新复制 (U)

该数组是其他数组的副本。当该数组被释放时,基数组将被更新为该数组的内容

例子

以下示例显示了标志的当前值。

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

输出如下 -

C_CONTIGUOUS : True 
F_CONTIGUOUS : True 
OWNDATA : True 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False

NumPy - 数组创建例程

新的ndarray对象可以通过以下任何数组创建例程或使用低级 ndarray 构造函数来构造。

numpy.empty

它创建指定形状和数据类型的未初始化数组。它使用以下构造函数 -

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

构造函数采用以下参数。

先生。 参数及说明
1

形状

int 或 int 元组中的空数组的形状

2

数据类型

所需的输出数据类型。选修的

3

命令

'C' 表示 C 样式行优先数组,'F' 表示 FORTRAN 样式列优先数组

例子

以下代码显示了空数组的示例。

import numpy as np 
x = np.empty([3,2], dtype = int) 
print x

输出如下 -

[[22649312    1701344351] 
 [1818321759  1885959276] 
 [16779776    156368896]]

注意- 数组中的元素显示随机值,因为它们未初始化。

numpy.zeros

返回指定大小的新数组,并用零填充。

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

构造函数采用以下参数。

先生。 参数及说明
1

形状

int 或 int 序列中的空数组的形状

2

数据类型

所需的输出数据类型。选修的

3

命令

'C' 表示 C 样式行优先数组,'F' 表示 FORTRAN 样式列优先数组

实施例1

# array of five zeros. Default dtype is float 
import numpy as np 
x = np.zeros(5) 
print x

输出如下 -

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

实施例2

import numpy as np 
x = np.zeros((5,), dtype = np.int) 
print x

现在,输出如下 -

[0  0  0  0  0]

实施例3

# custom type 
import numpy as np 
x = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print x

它应该产生以下输出 -

[[(0,0)(0,0)]
 [(0,0)(0,0)]]         

numpy.ones

返回指定大小和类型的新数组,并用 1 填充。

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

构造函数采用以下参数。

先生。 参数及说明
1

形状

int 或 int 元组中的空数组的形状

2

数据类型

所需的输出数据类型。选修的

3

命令

'C' 表示 C 样式行优先数组,'F' 表示 FORTRAN 样式列优先数组

实施例1

# array of five ones. Default dtype is float 
import numpy as np 
x = np.ones(5) 
print x

输出如下 -

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

实施例2

import numpy as np 
x = np.ones([2,2], dtype = int) 
print x

现在,输出如下 -

[[1  1] 
 [1  1]]

NumPy - 来自现有数据的数组

在本章中,我们将讨论如何从现有数据创建数组。

numpy.asarray

该函数与 numpy.array 类似,只是参数较少。此例程对于将 Python 序列转换为 ndarray 很有用。

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

构造函数采用以下参数。

先生。 参数及说明
1

A

以任何形式输入数据,例如列表、元组列表、元组、元组的元组或列表的元组

2

数据类型

默认情况下,输入数据的数据类型应用于结果 ndarray

3

命令

C(行专业)或 F(列专业)。C为默认值

以下示例展示了如何使用asarray函数。

实施例1

# convert list to ndarray 
import numpy as np 

x = [1,2,3] 
a = np.asarray(x) 
print a

其输出如下 -

[1  2  3] 

实施例2

# dtype is set 
import numpy as np 

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

现在,输出如下 -

[ 1.  2.  3.] 

实施例3

# ndarray from tuple 
import numpy as np 

x = (1,2,3) 
a = np.asarray(x) 
print a

它的输出将是 -

[1  2  3]

实施例4

# ndarray from list of tuples 
import numpy as np 

x = [(1,2,3),(4,5)] 
a = np.asarray(x) 
print a

在这里,输出如下 -

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

numpy.frombuffer

该函数将缓冲区解释为一维数组。任何公开缓冲区接口的对象都用作返回ndarray的参数。

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

构造函数采用以下参数。

先生。 参数及说明
1

缓冲

任何公开缓冲区接口的对象

2

数据类型

返回的 ndarray 的数据类型。默认为浮动

3

数数

读取的条数,默认-1表示所有数据

4

抵消

读取的起始位置。默认值为 0

例子

以下示例演示了frombuffer函数的使用。

import numpy as np 
s = 'Hello World' 
a = np.frombuffer(s, dtype = 'S1') 
print a

这是它的输出 -

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

numpy.fromiter

此函数从任何可迭代对象构建ndarray对象。该函数返回一个新的一维数组。

numpy.fromiter(iterable, dtype, count = -1)

这里,构造函数采用以下参数。

先生。 参数及说明
1

可迭代的

任何可迭代对象

2

数据类型

结果数组的数据类型

3

数数

要从迭代器读取的项目数。默认为-1,表示读取所有数据

以下示例演示如何使用内置range()函数返回列表对象。该列表的迭代器用于形成ndarray对象。

实施例1

# create list object using range function 
import numpy as np 
list = range(5) 
print list

其输出如下 -

[0,  1,  2,  3,  4]

实施例2

# obtain iterator object from list 
import numpy as np 
list = range(5) 
it = iter(list)  

# use iterator to create ndarray 
x = np.fromiter(it, dtype = float) 
print x

现在,输出如下 -

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

NumPy - 数值范围的数组

在本章中,我们将了解如何从数值范围创建数组。

numpy.arange

此函数返回一个ndarray对象,其中包含给定范围内均匀间隔的值。函数的格式如下 -

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

构造函数采用以下参数。

先生。 参数及说明
1

开始

间隔的开始。如果省略,则默认为 0

2

停止

间隔结束(不包括该数字)

3

值之间的间距,默认为 1

4

数据类型

生成的 ndarray 的数据类型。如果未给出,则使用输入的数据类型

以下示例展示了如何使用此功能。

实施例1

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

其输出如下 -

[0  1  2  3  4]

实施例2

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

在这里,输出将是 -

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

实施例3

# start and stop parameters set 
import numpy as np 
x = np.arange(10,20,2) 
print x

其输出如下 -

[10  12  14  16  18] 

numpy.linspace

该函数与arange()函数类似。在此函数中,指定了间隔之间均匀分布的值的数量,而不是步长。该函数的用法如下 -

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

构造函数采用以下参数。

先生。 参数及说明
1

开始

序列的起始值

2

停止

序列的结束值,如果端点设置为 true,则包含在序列中

3

编号

要生成的均匀间隔样本的数量。默认值为 50

4

终点

默认情况下为 True,因此停止值包含在序列中。如果为 false,则不包含在内

5

重步

如果为 true,则返回样本并在连续数字之间步进

6

数据类型

输出ndarray的数据类型

以下示例演示了linspace函数的使用。

实施例1

import numpy as np 
x = np.linspace(10,20,5) 
print x

它的输出将是 -

[10.   12.5   15.   17.5  20.]

实施例2

# endpoint set to false 
import numpy as np 
x = np.linspace(10,20, 5, endpoint = False) 
print x

输出将是 -

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

实施例3

# find retstep value 
import numpy as np 

x = np.linspace(1,2,5, retstep = True) 
print x 
# retstep here is 0.25

现在,输出将是 -

(array([ 1.  ,  1.25,  1.5 ,  1.75,  2.  ]), 0.25)

numpy.logspace

此函数返回一个ndarray对象,其中包含在对数刻度上均匀分布的数字。刻度的起始和终止端点是基数的索引,通常为 10。

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

以下参数确定logspace函数的输出。

先生。 参数及说明
1

开始

序列的起点是碱基起始点

2

停止

序列的最终值为base stop

3

编号

范围之间的值的数量。默认值为 50

4

终点

如果为 true,则 stop 是范围中的最后一个值

5

根据

日志空间的基数,默认为10

6

数据类型

输出数组的数据类型。如果没有给出,则取决于其他输入参数

以下示例将帮助您了解logspace功能。

实施例1

import numpy as np 
# default base is 10 
a = np.logspace(1.0, 2.0, num = 10) 
print a

其输出如下 -

[ 10.           12.91549665     16.68100537      21.5443469  27.82559402      
  35.93813664   46.41588834     59.94842503      77.42636827    100.    ]

实施例2

# set base of log space to 2 
import numpy as np 
a = np.logspace(1,10,num = 10, base = 2) 
print a

现在,输出将是 -

[ 2.     4.     8.    16.    32.    64.   128.   256.    512.   1024.] 

NumPy - 索引和切片

ndarray对象的内容可以通过索引或切片来访问和修改,就像Python内置的容器对象一样。

如前所述,ndarray 对象中的项目遵循从零开始的索引。提供三种类型的索引方法:字段访问、基本切片高级索引

基本切片是 Python 的 n 维切片基本概念的扩展。Python 切片对象是通过向内置切片函数提供start、stopstep参数来构造的。该切片对象被传递到数组以提取数组的一部分。

实施例1

import numpy as np 
a = np.arange(10) 
s = slice(2,7,2) 
print a[s]

其输出如下 -

[2  4  6]

在上面的例子中,一个ndarray对象是由arange()函数准备的。然后定义一个切片对象,其开始、停止和步长值分别为 2、7 和 2。当这个切片对象被传递到 ndarray 时,它的一部分从索引 2 开始到 7,步长为 2 被切片。

通过将用冒号 : (start:stop:step) 分隔的切片参数直接赋予ndarray对象也可以获得相同的结果。

实施例2

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

在这里,我们将得到相同的输出 -

[2  4  6]

如果只输入一个参数,则将返回与索引对应的单个项目。如果在其前面插入 :,则将从该索引开始的所有项目都将被提取。如果使用两个参数(它们之间有 : ),则默认步骤一的两个索引之间的项目(不包括停止索引)将被切片。

实施例3

# slice single item 
import numpy as np 

a = np.arange(10) 
b = a[5] 
print b

其输出如下 -

5

实施例4

# slice items starting from index 
import numpy as np 
a = np.arange(10) 
print a[2:]

现在,输出将是 -

[2  3  4  5  6  7  8  9]

实施例5

# slice items between indexes 
import numpy as np 
a = np.arange(10) 
print a[2:5]

在这里,输出将是 -

[2  3  4] 

上述描述也适用于多维ndarray

实施例6

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

# slice items starting from index
print 'Now we will slice the array from the index a[1:]' 
print a[1:]

输出如下 -

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

Now we will slice the array from the index a[1:]
[[3 4 5]
 [4 5 6]]

切片还可以包含省略号 (...) 以生成与数组维度长度相同的选择元组。如果在行位置使用省略号,它将返回一个由行中的项目组成的 ndarray。

实施例7

# array to begin with 
import numpy as np 
a = np.array([[1,2,3],[3,4,5],[4,5,6]]) 

print 'Our array is:' 
print a 
print '\n'  

# this returns array of items in the second column 
print 'The items in the second column are:'  
print a[...,1] 
print '\n'  

# Now we will slice all items from the second row 
print 'The items in the second row are:' 
print a[1,...] 
print '\n'  

# Now we will slice all items from column 1 onwards 
print 'The items column 1 onwards are:' 
print a[...,1:]

该程序的输出如下 -

Our array is:
[[1 2 3]
 [3 4 5]
 [4 5 6]] 
 
The items in the second column are: 
[2 4 5] 

The items in the second row are:
[3 4 5]

The items column 1 onwards are:
[[2 3]
 [4 5]
 [5 6]] 

NumPy - 高级索引

可以从非元组序列、整数或布尔数据类型的 ndarray 对象或至少有一项是序列对象的元组中进行选择。高级索引始终返回数据的副本。与此相反,切片仅呈现一个视图。

有两种类型的高级索引 - IntegerBoolean

整数索引

此机制有助于根据 N 维索引选择数组中的任意项目。每个整数数组表示该维度的索引数。当索引由与目标 ndarray 的维度一样多的整数数组组成时,它就变得简单了。

在以下示例中,从 ndarray 对象的每一行中选择指定列的一个元素。因此,行索引包含所有行号,列索引指定要选择的元素。

实施例1

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]

该选择包括第一个数组中 (0,0)、(1,1) 和 (2,0) 处的元素。

在以下示例中,选择放置在 4X3 阵列角上的元素。选择的行索引为 [0, 0] 和 [3,3],而列索引为 [0,2] 和 [0,2]。

实施例2

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
   
print 'Our array is:' 
print x 
print '\n' 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 
   
print 'The corner elements of this array are:' 
print y

该程序的输出如下 -

Our array is:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]
 
The corner elements of this array are:                                        
[[ 0  2]                                                                      
 [ 9 11]] 

结果选择是一个包含角元素的 ndarray 对象。

高级索引和基本索引可以通过使用一个切片 (:) 或省略号 (…) 与索引数组来组合。以下示例对行使用切片,对列使用高级索引。当切片同时用于两者时,结果是相同的。但高级索引会导致复制,并且可能具有不同的内存布局。

实施例3

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# slicing 
z = x[1:4,1:3] 

print 'After slicing, our array becomes:' 
print z 
print '\n'  

# using advanced index for column 
y = x[1:4,[1,2]] 

print 'Slicing using advanced index for column:' 
print y

该程序的输出如下 -

Our array is:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]
 
After slicing, our array becomes:
[[ 4  5]
 [ 7  8]
 [10 11]]

Slicing using advanced index for column:
[[ 4  5]
 [ 7  8]
 [10 11]] 

布尔数组索引

当生成的对象是布尔运算(例如比较运算符)的结果时,使用这种类型的高级索引。

实施例1

在此示例中,大于 5 的项目将作为布尔索引的结果返回。

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# Now we will print the items greater than 5 
print 'The items greater than 5 are:' 
print x[x > 5]

该程序的输出将是 -

Our array is: 
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 
 
The items greater than 5 are:
[ 6  7  8  9 10 11] 

实施例2

在此示例中,使用 ~(补码运算符)省略 NaN(非数字)元素。

import numpy as np 
a = np.array([np.nan, 1,2,np.nan,3,4,5]) 
print a[~np.isnan(a)]

它的输出将是 -

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

实施例3

以下示例演示如何从数组中过滤掉非复杂元素。

import numpy as np 
a = np.array([1, 2+6j, 5, 3.5+5j]) 
print a[np.iscomplex(a)]

这里,输出如下 -

[2.0+6.j  3.5+5.j] 

NumPy - 广播

术语“广播”是指 NumPy 在算术运算期间处理不同形状的数组的能力。数组的算术运算通常是针对相应的元素进行的。如果两个数组的形状完全相同,那么这些操作就可以顺利执行。

实施例1

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]

如果两个数组的维度不同,则无法进行元素到元素的操作。然而,由于广播功能,在 NumPy 中仍然可以对不相似形状的数组进行操作。较小的数组被广播到较大数组的大小,以便它们具有兼容的形状。

如果满足以下规则,则可以进行广播 -

  • ndim小于另一个的数组在其形状中添加“1”。

  • 输出形状的每个维度的大小是该维度的输入大小的最大值。

  • 如果输入在特定维度上的大小与输出大小匹配或者其值恰好为 1,则输入可以用于计算。

  • 如果输入的维度大小为 1,则该维度中的第一个数据条目将用于沿该维度的所有计算。

如果上述规则产生有效结果并且以下其中一个为真,则一组数组被称为可广播-

  • 数组具有完全相同的形状。

  • 数组具有相同的维数,每个维的长度要么是公共长度,要么是 1。

  • 维度太少的数组可以在其形状前面加上长度为 1 的维度,以便上述属性成立。

以下程序显示了广播的示例。

实施例2

import numpy as np 
a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) 
b = np.array([1.0,2.0,3.0])  
   
print 'First array:' 
print a 
print '\n'  
   
print 'Second array:' 
print b 
print '\n'  
   
print 'First Array + Second Array' 
print a + b

该程序的输出如下 -

First array:
[[ 0. 0. 0.]
 [ 10. 10. 10.]
 [ 20. 20. 20.]
 [ 30. 30. 30.]]

Second array:
[ 1. 2. 3.]

First Array + Second Array
[[ 1. 2. 3.]
 [ 11. 12. 13.]
 [ 21. 22. 23.]
 [ 31. 32. 33.]]

下图演示了如何广播数组b以与a兼容。

大批

NumPy - 迭代数组

NumPy 包包含一个迭代器对象numpy.nditer。它是一个高效的多维迭代器对象,使用它可以迭代数组。使用 Python 的标准 Iterator 接口访问数组的每个元素。

让我们使用 arange() 函数创建一个 3X4 数组,并使用nditer对其进行迭代。

实施例1

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)

print 'Original array is:'
print a
print '\n'

print 'Modified array is:'
for x in np.nditer(a):
   print x,

该程序的输出如下 -

Original array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Modified array is:
0 5 10 15 20 25 30 35 40 45 50 55

实施例2

选择迭代顺序以匹配数组的内存布局,而不考虑特定的顺序。这可以通过迭代上述数组的转置来看出。

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 
   
print 'Original array is:'
print a 
print '\n'  
   
print 'Transpose of the original array is:' 
b = a.T 
print b 
print '\n'  
   
print 'Modified array is:' 
for x in np.nditer(b): 
   print x,

上述程序的输出如下 -

Original array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Transpose of the original array is:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]

Modified array is:
0 5 10 15 20 25 30 35 40 45 50 55

迭代顺序

如果使用 F 样式顺序存储相同的元素,则迭代器会选择更有效的方式来迭代数组。

实施例1

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'

print 'Transpose of the original array is:'
b = a.T
print b
print '\n'

print 'Sorted in C-style order:'
c = b.copy(order='C')
print c
for x in np.nditer(c):
   print x,

print '\n'

print 'Sorted in F-style order:'
c = b.copy(order='F')
print c
for x in np.nditer(c):
   print x,

其输出如下 -

Original array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Transpose of the original array is:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]

Sorted in C-style order:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0 20 40 5 25 45 10 30 50 15 35 55

Sorted in F-style order:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0 5 10 15 20 25 30 35 40 45 50 55

实施例2

通过明确提及,可以强制nditer对象使用特定的顺序。

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 

print 'Original array is:' 
print a 
print '\n'  

print 'Sorted in C-style order:' 
for x in np.nditer(a, order = 'C'): 
   print x,  
print '\n' 

print 'Sorted in F-style order:' 
for x in np.nditer(a, order = 'F'): 
   print x,

它的输出将是 -

Original array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Sorted in C-style order:
0 5 10 15 20 25 30 35 40 45 50 55

Sorted in F-style order:
0 20 40 5 25 45 10 30 50 15 35 55

修改数组值

nditer对象有另一个可选参数,称为op_flags。其默认值为只读,但可以设置为读写或只写模式。这将允许使用此迭代器修改数组元素。

例子

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'

for x in np.nditer(a, op_flags = ['readwrite']):
   x[...] = 2*x
print 'Modified array is:'
print a

其输出如下 -

Original array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Modified array is:
[[ 0 10 20 30]
 [ 40 50 60 70]
 [ 80 90 100 110]]

外环

nditer 类构造函数有一个“flags”参数,它可以采用以下值 -

先生。 参数及说明
1

c_索引

C_order索引可追踪

2

f_index

Fortran_order 索引被跟踪

3

多索引

可以跟踪每次迭代一个索引的类型

4

外部循环

导致给定的值是具有多个值的一维数组而不是零维数组

例子

在下面的例子中,迭代器遍历了每一列对应的一维数组。

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 

print 'Original array is:' 
print a 
print '\n'  

print 'Modified array is:' 
for x in np.nditer(a, flags = ['external_loop'], order = 'F'): 
   print x,

输出如下 -

Original array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Modified array is:
[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]

广播迭代

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

例子

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 

print 'First array is:' 
print a 
print '\n'  

print 'Second array is:' 
b = np.array([1, 2, 3, 4], dtype = int) 
print b  
print '\n' 

print 'Modified array is:' 
for x,y in np.nditer([a,b]): 
   print "%d:%d" % (x,y),

其输出如下 -

First array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Second array is:
[1 2 3 4]

Modified array is:
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4

NumPy - 数组操作

NumPy 包中有几个例程可用于操作 ndarray 对象中的元素。它们可以分为以下类型 -

改变形状

先生。 形状及描述
1 重塑

为数组提供新的形状而不更改其数据

2 平坦的

数组上的一维迭代器

3 压扁

返回折叠成一维的数组的副本

4 拉维尔

返回连续的展平数组

转置操作

先生。