[转载]Python:Numpy教程

取numpy数组的某几行某几列方法

原文链接https://www.jb51.net/article/137635.htm
这个操作在numpy数组上的操作感觉有点麻烦,但是也没办法。

例如

a = [[1,2,3],
[4,5,6],
[7,8,9]]

取 a 的 2 3 行, 1 2 列

c=[1,2]
d =[0,1]

若写为

b = a[c,d]
output:
[4 8]

取的是 第二行第一列 和第三行第二列的数据

这并不是我们想要的结果。

正确做法是:

b = a[c]先取想要的行数据
b = b[:,d]
print(b)
output:
[[4 5]
[7 8]]

这才是我们想要的结果。必须要经过这两步才能完成。

Numpy 教程

原文链接https://blog.csdn.net/a373595475/article/details/79580734

NumPy - 简介

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

Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。

NumPy 操作

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

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

  • 傅立叶变换和用于图形操作的例程。

  • 与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。

NumPy – MatLab 的替代之一

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用。 这种组合广泛用于替代 MatLab,是一个流行的技术计算平台。 但是,Python 作为 MatLab 的替代方案,现在被视为一种更加现代和完整的编程语言。

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

 

NumPy - Ndarray 对象

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

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

ndarray对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了ndarray,数据类型对象(dtype)和数组标量类型之间的关系。

Ndarray

Ndarray

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


 
 
  1. numpy.array

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


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

上面的构造器接受以下参数:

序号参数及描述
1.object 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。
2.dtype 数组的所需数据类型,可选。
3.copy 可选,默认为true,对象是否被复制。
4.order C(按行)、F(按列)或A(任意,默认)。
5.subok 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。
6.ndmin 指定返回数组的最小维数。

看看下面的例子来更好地理解。

示例 1


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

输出如下:


 
 
  1. [1, 2, 3]

示例 2


 
 
  1. # 多于一个维度
  2. import numpy as np
  3. a = np.array([[1, 2], [3, 4]])
  4. print a

输出如下:


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

示例 3


 
 
  1. # 最小维度
  2. import numpy as np
  3. a = np.array([1, 2, 3,4,5], ndmin = 2)
  4. print a

输出如下:


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

示例 4


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

输出如下:


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

**ndarray ** 对象由计算机内存中的一维连续区域组成,带有将每个元素映射到内存块中某个位置的索引方案。 内存块以按行(C 风格)或按列(FORTRAN 或 MatLab 风格)的方式保存元素。

NumPy - 数据类型

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

序号数据类型及描述
1.bool_ 存储为一个字节的布尔值(真或假)
2.int_ 默认整数,相当于 C 的long,通常为int32int64
3.intc 相当于 C 的int,通常为int32int64
4.intp 用于索引的整数,相当于 C 的size_t,通常为int32int64
5.int8 字节(-128 ~ 127)
6.int16 16 位整数(-32768 ~ 32767)
7.int32 32 位整数(-2147483648 ~ 2147483647)
8.int64 64 位整数(-9223372036854775808 ~ 9223372036854775807)
9.uint8 8 位无符号整数(0 ~ 255)
10.uint16 16 位无符号整数(0 ~ 65535)
11.uint32 32 位无符号整数(0 ~ 4294967295)
12.uint64 64 位无符号整数(0 ~ 18446744073709551615)
13.float_ float64的简写
14.float16 半精度浮点:符号位,5 位指数,10 位尾数
15.float32 单精度浮点:符号位,8 位指数,23 位尾数
16.float64 双精度浮点:符号位,11 位指数,52 位尾数
17.complex_ complex128的简写
18.complex64 复数,由两个 32 位浮点表示(实部和虚部)
19.complex128 复数,由两个 64 位浮点表示(实部和虚部)

NumPy 数字类型是dtype(数据类型)对象的实例,每个对象具有唯一的特征。 这些类型可以是np.bool_np.float32等。

数据类型对象 (dtype)

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

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

  • 数据大小

  • 字节序(小端或大端)

  • 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。

  • 如果数据类型是子序列,它的形状和数据类型。

字节顺序取决于数据类型的前缀<><意味着编码是小端(最小有效字节存储在最小地址中)。 >意味着编码是大端(最大有效字节存储在最小地址中)。

dtype可由一下语法构造:


 
 
  1. numpy.dtype(object, align, copy)

参数为:

  • Object:被转换为数据类型的对象。

  • Align:如果为true,则向字段添加间隔,使其类似 C 的结构体。

  • Copy ? 生成dtype对象的新副本,如果为flase,结果是内建数据类型对象的引用。

示例 1


 
 
  1. # 使用数组标量类型
  2. import numpy as np
  3. dt = np.dtype(np.int32)
  4. print dt

输出如下:


 
 
  1. int32

示例 2


 
 
  1. #int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',以及其他。
  2. import numpy as np
  3. dt = np.dtype('i4')
  4. print dt

输出如下:


 
 
  1. int32

示例 3


 
 
  1. # 使用端记号
  2. import numpy as np
  3. dt = np.dtype('>i4')
  4. print dt

输出如下:


 
 
  1. >i4

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

示例 4


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

输出如下:


 
 
  1. [( 'age', 'i1')]

示例 5


 
 
  1. # 现在将其应用于 ndarray 对象
  2. import numpy as np
  3. dt = np.dtype([('age',np.int8)])
  4. a = np.array([(10,),(20,),(30,)], dtype = dt)
  5. print a

输出如下:


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

示例 6


 
 
  1. # 文件名称可用于访问 age 列的内容
  2. import numpy as np
  3. dt = np.dtype([('age',np.int8)])
  4. a = np.array([(10,),(20,),(30,)], dtype = dt)
  5. print a['age']

输出如下:


 
 
  1. [10 20 30]

示例 7

以下示例定义名为 student 的结构化数据类型,其中包含字符串字段name整数字段age浮点字段marks。 此dtype应用于ndarray对象。


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

输出如下:


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

示例 8


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

输出如下:


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

每个内建类型都有一个唯一定义它的字符代码:

  • 'b':布尔值

  • 'i':符号整数

  • 'u':无符号整数

  • 'f':浮点

  • 'c':复数浮点

  • 'm':时间间隔

  • 'M':日期时间

  • 'O':Python 对象

  • 'S', 'a':字节串

  • 'U':Unicode

  • 'V':原始数据(void

NumPy - 数组属性

这一章中,我们会讨论 NumPy 的多种数组属性。

ndarray.shape

这一数组属性返回一个包含数组维度的元组,它也可以用于调整数组大小。

示例 1


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

输出如下:


 
 
  1. (2, 3)

示例 2


 
 
  1. # 这会调整数组大小
  2. import numpy as np
  3. a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2)
  4. print a

输出如下:


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

示例 3

NumPy 也提供了reshape函数来调整数组大小。


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

输出如下:


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

ndarray.ndim

这一数组属性返回数组的维数。

示例 1


 
 
  1. # 等间隔数字的数组
  2. import numpy as np
  3. a = np.arange(24) print a

输出如下:


 
 
  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]

示例 2


 
 
  1. # 一维数组
  2. import numpy as np
  3. a = np.arange(24) a.ndim
  4. # 现在调整其大小
  5. b = a.reshape(2,4,3)
  6. print b
  7. # b 现在拥有三个维度

输出如下:


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

numpy.itemsize

这一数组属性返回数组中每个元素的字节单位长度。

示例 1


 
 
  1. # 数组的 dtype 为 int8(一个字节)
  2. import numpy as np
  3. x = np.array([1,2,3,4,5], dtype = np.int8)
  4. print x.itemsize

输出如下:


 
 
  1. 1

示例 2


 
 
  1. # 数组的 dtype 现在为 float32(四个字节)
  2. import numpy as np
  3. x = np.array([1,2,3,4,5], dtype = np.float32)
  4. print x.itemsize

输出如下:


 
 
  1. 4

numpy.flags

ndarray对象拥有以下属性。这个函数返回了它们的当前值。

序号属性及描述
1.C_CONTIGUOUS (C) 数组位于单一的、C 风格的连续区段内
2.F_CONTIGUOUS (F) 数组位于单一的、Fortran 风格的连续区段内
3.OWNDATA (O) 数组的内存从其它对象处借用
4.WRITEABLE (W) 数据区域可写入。 将它设置为flase会锁定数据,使其只读
5.ALIGNED (A) 数据和任何元素会为硬件适当对齐
6.UPDATEIFCOPY (U) 这个数组是另一数组的副本。当这个数组释放时,源数组会由这个数组中的元素更新

示例

下面的例子展示当前的标志。


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

输出如下:


 
 
  1. C_CONTIGUOUS : True
  2. F_CONTIGUOUS : True
  3. OWNDATA : True
  4. WRITEABLE : True
  5. ALIGNED : True
  6. UPDATEIFCOPY : False

NumPy - 数组创建例程

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

numpy.empty

它创建指定形状和dtype的未初始化数组。 它使用以下构造函数:


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

构造器接受下列参数:

序号参数及描述
1.Shape 空数组的形状,整数或整数元组
2.Dtype 所需的输出数组类型,可选
3.Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组

示例

下面的代码展示空数组的例子:


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

输出如下:


 
 
  1. [[22649312 1701344351]
  2. [1818321759 1885959276]
  3. [16779776 156368896]]

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

numpy.zeros

返回特定大小,以 0 填充的新数组。


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

构造器接受下列参数:

序号参数及描述
1.Shape 空数组的形状,整数或整数元组
2.Dtype 所需的输出数组类型,可选
3.Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组

示例 1


 
 
  1. # 含有 5 个 0 的数组,默认类型为 float
  2. import numpy as np
  3. x = np.zeros(5)
  4. print x

输出如下:


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

示例 2


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

输出如下:


 
 
  1. [0 0 0 0 0]

示例 3


 
 
  1. # 自定义类型
  2. import numpy as np
  3. x = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
  4. print x

输出如下:


 
 
  1. [[(0,0)(0,0)]
  2. [(0,0)(0,0)]]

numpy.ones

返回特定大小,以 1 填充的新数组。


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

构造器接受下列参数:

序号参数及描述
1.Shape 空数组的形状,整数或整数元组
2.Dtype 所需的输出数组类型,可选
3.Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组

示例 1


 
 
  1. # 含有 5 个 1 的数组,默认类型为 float
  2. import numpy as np
  3. x = np.ones(5) print x

输出如下:


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

示例 2


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

输出如下:


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

NumPy - 来自现有数据的数组

这一章中,我们会讨论如何从现有数据创建数组。

numpy.asarray

此函数类似于numpy.array,除了它有较少的参数。 这个例程对于将 Python 序列转换为ndarray非常有用。


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

构造器接受下列参数:

序号参数及描述
1.a 任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表
2.dtype 通常,输入数据的类型会应用到返回的ndarray
3.order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组

下面的例子展示了如何使用asarray函数:

示例 1


 
 
  1. # 将列表转换为 ndarray
  2. import numpy as np
  3. x = [1,2,3]
  4. a = np.asarray(x)
  5. print a

输出如下:


 
 
  1. [1 2 3]

示例 2


 
 
  1. # 设置了 dtype
  2. import numpy as np
  3. x = [1,2,3]
  4. a = np.asarray(x, dtype = float)
  5. print a

输出如下:


 
 
  1. [ 1. 2. 3.]

示例 3


 
 
  1. # 来自元组的 ndarray
  2. import numpy as np
  3. x = (1,2,3)
  4. a = np.asarray(x)
  5. print a

输出如下:


 
 
  1. [1 2 3]

示例 4


 
 
  1. # 来自元组列表的 ndarray
  2. import numpy as np
  3. x = [(1,2,3),(4,5)]
  4. a = np.asarray(x)
  5. print a

输出如下:


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

numpy.frombuffer

此函数将缓冲区解释为一维数组。 暴露缓冲区接口的任何对象都用作参数来返回ndarray


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

构造器接受下列参数:

序号参数及描述
1.buffer 任何暴露缓冲区借口的对象
2.dtype 返回数组的数据类型,默认为float
3.count 需要读取的数据数量,默认为-1,读取所有数据
4.offset 需要读取的起始位置,默认为0

示例

下面的例子展示了frombuffer函数的用法。


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

输出如下:


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

numpy.fromiter

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


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

构造器接受下列参数:

序号参数及描述
1.iterable 任何可迭代对象
2.dtype 返回数组的数据类型
3.count 需要读取的数据数量,默认为-1,读取所有数据

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

示例 1


 
 
  1. # 使用 range 函数创建列表对象
  2. import numpy as np
  3. list = range(5)
  4. print list

输出如下:


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

示例 2


 
 
  1. # 从列表中获得迭代器
  2. import numpy as np
  3. list = range(5)
  4. it = iter(list)
  5. # 使用迭代器创建 ndarray
  6. x = np.fromiter(it, dtype = float)
  7. print x

输出如下:


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

NumPy - 来自数值范围的数组

这一章中,我们会学到如何从数值范围创建数组。

numpy.arange

这个函数返回ndarray对象,包含给定范围内的等间隔值。


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

构造器接受下列参数:

序号参数及描述
1.start 范围的起始值,默认为0
2.stop 范围的终止值(不包含)
3.step 两个值的间隔,默认为1
4.dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

下面的例子展示了如何使用该函数:

示例 1


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

输出如下:


 
 
  1. [0 1 2 3 4]

示例 2


 
 
  1. import numpy as np
  2. # 设置了 dtype
  3. x = np.arange(5, dtype = float)
  4. print x

输出如下:


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

示例 3


 
 
  1. # 设置了起始值和终止值参数
  2. import numpy as np
  3. x = np.arange(10,20,2)
  4. print x

输出如下:


 
 
  1. [10 12 14 16 18]

numpy.linspace

此函数类似于arange()函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长。 此函数的用法如下。


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

构造器接受下列参数:

序号参数及描述
1.start 序列的起始值
2.stop 序列的终止值,如果endpointtrue,该值包含于序列中
3.num 要生成的等间隔样例数量,默认为50
4.endpoint 序列中是否包含stop值,默认为ture
5.retstep 如果为true,返回样例,以及连续数字之间的步长
6.dtype 输出ndarray的数据类型

下面的例子展示了linspace函数的用法。

示例 1


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

输出如下:


 
 
  1. [10. 12.5 15. 17.5 20.]

示例 2


 
 
  1. # 将 endpoint 设为 false
  2. import numpy as np
  3. x = np.linspace(10,20, 5, endpoint = False)
  4. print x

输出如下:


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

示例 3


 
 
  1. # 输出 retstep 值
  2. import numpy as np
  3. x = np.linspace(1,2,5, retstep = True)
  4. print x
  5. # 这里的 retstep 为 0.25

输出如下:


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

numpy.logspace

此函数返回一个ndarray对象,其中包含在对数刻度上均匀分布的数字。 刻度的开始和结束端点是某个底数的幂,通常为 10。


 
 
  1. numpy.logscale(start, stop, num, endpoint, base, dtype)

logspace函数的输出由以下参数决定:

序号参数及描述
1.start 起始值是base ** start
2.stop 终止值是base ** stop
3.num 范围内的数值数量,默认为50
4.endpoint 如果为true,终止值包含在输出数组当中
5.base 对数空间的底数,默认为10
6.dtype 输出数组的数据类型,如果没有提供,则取决于其它参数

下面的例子展示了logspace函数的用法。

示例 1


 
 
  1. import numpy as np
  2. # 默认底数是 10
  3. a = np.logspace(1.0, 2.0, num = 10)
  4. print a

输出如下:


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

示例 2


 
 
  1. # 将对数空间的底数设置为 2
  2. import numpy as np
  3. a = np.logspace(1,10,num = 10, base = 2)
  4. print a

输出如下:


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

NumPy - 切片和索引

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

如前所述,ndarray对象中的元素遵循基于零的索引。 有三种可用的索引方法类型: 字段访问,基本切片高级索引

基本切片是 Python 中基本切片概念到 n 维的扩展。 通过将startstopstep参数提供给内置的slice函数来构造一个 Python slice对象。 此slice对象被传递给数组来提取数组的一部分。

示例 1


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

输出如下:


 
 
  1. [2 4 6]

在上面的例子中,ndarray对象由arange()函数创建。 然后,分别用起始,终止和步长值272定义切片对象。 当这个切片对象传递给ndarray时,会对它的一部分进行切片,从索引27,步长为2

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

示例 2


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

输出如下:


 
 
  1. [2 4 6]

如果只输入一个参数,则将返回与索引对应的单个项目。 如果使用a:,则从该索引向后的所有项目将被提取。 如果使用两个参数(以:分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。

示例 3


 
 
  1. # 对单个元素进行切片
  2. import numpy as np
  3. a = np.arange(10)
  4. b = a[5]
  5. print b

输出如下:


 
 
  1. 5

示例 4


 
 
  1. # 对始于索引的元素进行切片
  2. import numpy as np
  3. a = np.arange(10)
  4. print a[2:]

输出如下:


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

示例 5


 
 
  1. # 对索引之间的元素进行切片
  2. import numpy as np
  3. a = np.arange(10)
  4. print a[2:5]

输出如下:


 
 
  1. [2 3 4]

上面的描述也可用于多维ndarray

示例 6


 
 
  1. import numpy as np
  2. a = np.array([[1,2,3],[3,4,5],[4,5,6]])
  3. print a
  4. # 对始于索引的元素进行切片
  5. print '现在我们从索引 a[1:] 开始对数组切片'
  6. print a[1:]

输出如下:


 
 
  1. [[1 2 3]
  2. [3 4 5]
  3. [4 5 6]]
  4. 现在我们从索引 a[1:] 开始对数组切片
  5. [[3 4 5]
  6. [4 5 6]]

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

示例 7


 
 
  1. # 最开始的数组
  2. import numpy as np
  3. a = np.array([[1,2,3],[3,4,5],[4,5,6]])
  4. print '我们的数组是:'
  5. print a
  6. print '\n'
  7. # 这会返回第二列元素的数组:
  8. print '第二列的元素是:'
  9. print a[...,1]
  10. print '\n'
  11. # 现在我们从第二行切片所有元素:
  12. print '第二行的元素是:'
  13. print a[1,...]
  14. print '\n'
  15. # 现在我们从第二列向后切片所有元素:
  16. print '第二列及其剩余元素是:'
  17. print a[...,1:]

输出如下:


 
 
  1. 我们的数组是:
  2. [[1 2 3]
  3. [3 4 5]
  4. [4 5 6]]
  5. 第二列的元素是:
  6. [2 4 5]
  7. 第二行的元素是:
  8. [3 4 5]
  9. 第二列及其剩余元素是:
  10. [[2 3]
  11. [4 5]
  12. [5 6]]

NumPy - 高级索引

如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引ndarray。高级索引始终返回数据的副本。 与此相反,切片只提供了一个视图。

有两种类型的高级索引:整数和布尔值。

整数索引

这种机制有助于基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值。 当索引的元素个数就是目标ndarray的维度时,会变得相当直接。

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

示例 1


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

输出如下:


 
 
  1. [1 4 5]

该结果包括数组中(0,0)(1,1)(2,0)位置处的元素。

下面的示例获取了 4X3 数组中的每个角处的元素。 行索引是[0,0][3,3],而列索引是[0,2][0,2]

示例 2


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

输出如下:


 
 
  1. 我们的数组是:
  2. [[ 0 1 2]
  3. [ 3 4 5]
  4. [ 6 7 8]
  5. [ 9 10 11]]
  6. 这个数组的每个角处的元素是:
  7. [[ 0 2]
  8. [ 9 11]]

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

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

示例 3


 
 
  1. import numpy as np
  2. x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
  3. print '我们的数组是:'
  4. print x
  5. print '\n'
  6. # 切片
  7. z = x[1:4,1:3]
  8. print '切片之后,我们的数组变为:'
  9. print z
  10. print '\n'
  11. # 对列使用高级索引
  12. y = x[1:4,[1,2]]
  13. print '对列使用高级索引来切片:'
  14. print y

输出如下:


 
 
  1. 我们的数组是:
  2. [[ 0 1 2]
  3. [ 3 4 5]
  4. [ 6 7 8]
  5. [ 9 10 11]]
  6. 切片之后,我们的数组变为:
  7. [[ 4 5]
  8. [ 7 8]
  9. [10 11]]
  10. 对列使用高级索引来切片:
  11. [[ 4 5]
  12. [ 7 8]
  13. [10 11]]

布尔索引

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

示例 1

这个例子中,大于 5 的元素会作为布尔索引的结果返回。


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

输出如下:


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

示例 2

这个例子使用了~(取补运算符)来过滤NaN


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

输出如下:


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

示例 3

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


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

输出如下:


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

NumPy - 广播

术语广播是指 NumPy 在算术运算期间处理不同形状的数组的能力。 对数组的算术运算通常在相应的元素上进行。 如果两个阵列具有完全相同的形状,则这些操作被无缝执行。

示例 1


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

输出如下:


 
 
  1. [10 40 90 160]

如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。

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

  • ndim较小的数组会在前面追加一个长度为 1 的维度。

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

  • 如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则在计算中可它。

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

如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的

  • 数组拥有相同形状。

  • 数组拥有相同的维数,每个维度拥有相同长度,或者长度为 1。

  • 数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立。

下面的例称展示了广播的示例。

示例 2


 
 
  1. import numpy as np
  2. 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]])
  3. b = np.array([1.0,2.0,3.0])
  4. print '第一个数组:'
  5. print a
  6. print '\n'
  7. print '第二个数组:'
  8. print b
  9. print '\n'
  10. print '第一个数组加第二个数组:'
  11. print a + b

输出如下:


 
 
  1. 第一个数组:
  2. [[ 0. 0. 0.]
  3. [ 10. 10. 10.]
  4. [ 20. 20. 20.]
  5. [ 30. 30. 30.]]
  6. 第二个数组:
  7. [ 1. 2. 3.]
  8. 第一个数组加第二个数组:
  9. [[ 1. 2. 3.]
  10. [ 11. 12. 13.]
  11. [ 21. 22. 23.]
  12. [ 31. 32. 33.]]

下面的图片展示了数组b如何通过广播来与数组a兼容。

array

array

NumPy - 数组上的迭代

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

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

示例 1


 
 
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print '原始数组是:'
  5. print a print '\n'
  6. print '修改后的数组是:'
  7. for x in np.nditer(a):
  8. print x,

输出如下:


 
 
  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. 修改后的数组是:
  6. 0 5 10 15 20 25 30 35 40 45 50 55

示例 2

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


 
 
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print '原始数组是:'
  5. print a
  6. print '\n'
  7. print '原始数组的转置是:'
  8. b = a.T
  9. print b
  10. print '\n'
  11. print '修改后的数组是:'
  12. for x in np.nditer(b):
  13. print x,

输出如下:


 
 
  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. 原始数组的转置是:
  6. [[ 0 20 40]
  7. [ 5 25 45]
  8. [10 30 50]
  9. [15 35 55]]
  10. 修改后的数组是:
  11. 0 5 10 15 20 25 30 35 40 45 50 55

迭代顺序

如果相同元素使用 F 风格顺序存储,则迭代器选择以更有效的方式对数组进行迭代。

示例 1


 
 
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print '原始数组是:'
  5. print a print '\n'
  6. print '原始数组的转置是:'
  7. b = a.T
  8. print b
  9. print '\n'
  10. print '以 C 风格顺序排序:'
  11. c = b.copy(order='C')
  12. print c for x in np.nditer(c):
  13. print x,
  14. print '\n'
  15. print '以 F 风格顺序排序:'
  16. c = b.copy(order='F')
  17. print c
  18. for x in np.nditer(c):
  19. print x,

输出如下:


 
 
  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. 原始数组的转置是:
  6. [[ 0 20 40]
  7. [ 5 25 45]
  8. [10 30 50]
  9. [15 35 55]]
  10. C 风格顺序排序:
  11. [[ 0 20 40]
  12. [ 5 25 45]
  13. [10 30 50]
  14. [15 35 55]]
  15. 0 20 40 5 25 45 10 30 50 15 35 55
  16. F 风格顺序排序:
  17. [[ 0 20 40]
  18. [ 5 25 45]
  19. [10 30 50]
  20. [15 35 55]]
  21. 0 5 10 15 20 25 30 35 40 45 50 55

示例 2

可以通过显式提醒,来强制nditer对象使用某种顺序:


 
 
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print '原始数组是:'
  5. print a
  6. print '\n'
  7. print '以 C 风格顺序排序:'
  8. for x in np.nditer(a, order = 'C'):
  9. print x,
  10. print '\n'
  11. print '以 F 风格顺序排序:'
  12. for x in np.nditer(a, order = 'F'):
  13. print x,

输出如下:


 
 
  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. C 风格顺序排序:
  6. 0 5 10 15 20 25 30 35 40 45 50 55
  7. F 风格顺序排序:
  8. 0 20 40 5 25 45 10 30 50 15 35 55

修改数组的值

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

示例


 
 
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print '原始数组是:'
  5. print a
  6. print '\n'
  7. for x in np.nditer(a, op_flags=['readwrite']):
  8. x[...]=2*x
  9. print '修改后的数组是:'
  10. print a

输出如下:


 
 
  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. 修改后的数组是:
  6. [[ 0 10 20 30]
  7. [ 40 50 60 70]
  8. [ 80 90 100 110]]

外部循环

nditer类的构造器拥有flags参数,它可以接受下列值:

序号参数及描述
1.c_index 可以跟踪 C 顺序的索引
2.f_index 可以跟踪 Fortran 顺序的索引
3.multi-index 每次迭代可以跟踪一种索引类型
4.external_loop 给出的值是具有多个值的一维数组,而不是零维数组

示例

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


 
 
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print '原始数组是:'
  5. print a
  6. print '\n'
  7. print '修改后的数组是:'
  8. for x in np.nditer(a, flags = ['external_loop'], order = 'F'):
  9. print x,

输出如下:


 
 
  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. 修改后的数组是:
  6. [ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]

广播迭代

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

示例


 
 
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print '第一个数组:'
  5. print a
  6. print '\n'
  7. print '第二个数组:'
  8. b = np.array([1, 2, 3, 4], dtype = int)
  9. print b
  10. print '\n'
  11. print '修改后的数组是:'
  12. for x,y in np.nditer([a,b]):
  13. print "%d:%d" % (x,y),

输出如下:


 
 
  1. 第一个数组:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. 第二个数组:
  6. [1 2 3 4]
  7. 修改后的数组是:
  8. 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.reshape 不改变数据的条件下修改形状
2.flat 数组上的一维迭代器
3.flatten 返回折叠为一维的数组副本
4.ravel 返回连续的展开数组

numpy.reshape

这个函数在不改变数据的条件下修改形状,它接受如下参数:

numpy.reshape(arr, newshape, order')

 
 

其中:

  • arr:要修改形状的数组
  • newshape:整数或者整数数组,新的形状应当兼容原有形状
  • order'C'为 C 风格顺序,'F'为 F 风格顺序,'A'为保留原顺序。

例子


 
 
  1. import numpy as np
  2. a = np.arange(8)
  3. print '原始数组:'
  4. print a
  5. print '\n'
  6. b = a.reshape(4,2)
  7. print '修改后的数组:'
  8. print b

输出如下:


 
 
  1. 原始数组:
  2. [0 1 2 3 4 5 6 7]
  3. 修改后的数组:
  4. [[0 1]
  5. [2 3]
  6. [4 5]
  7. [6 7]]

numpy.ndarray.flat

该函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器。

例子


 
 
  1. import numpy as np
  2. a = np.arange(8).reshape(2,4)
  3. print '原始数组:'
  4. print a
  5. print '\n'
  6. print '调用 flat 函数之后:'
  7. # 返回展开数组中的下标的对应元素
  8. print a.flat[5]

输出如下:


 
 
  1. 原始数组:
  2. [[0 1 2 3]
  3. [4 5 6 7]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值