Nnumpy 教程(上)

NumPy - 简介

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

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

NumPy 操作

使用NumPy,开发人员可以执行以下操作:
  • 数组的算数和逻辑运算。

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

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

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

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

NumPy - Ndarray 对象

NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于0的索引访问集合中的项目。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。基本的ndarray是使用 NumPy 中的数组函数创建的,代码如

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. ndimin 指定返回数组的最小维数。

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

#列一
#一维数组
import numpy as np

np.array([1,2,3,4])
#输出结果
array([1, 2, 3, 4])
#列二

#二维数组

np.array([[1,2,3],[3,2,4]])
#输出结果
array([[1, 2, 3],
       [3, 2, 4]])
#列三
np.array([1,2,34,54,6577],dtype=float)
#输出结果
array([  1.00000000e+00,   2.00000000e+00,   3.40000000e+01,
         5.40000000e+01,   6.57700000e+03])

NumPy - 数据类型

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

序号 数据类型及描述
1. bool_存储为一个字节的布尔值(真或假)
2. int_默认整数,相当于 C 的long,通常为int32或int64
3. intc相当于 C 的int,通常为int32或int64
4. intp用于索引的整数,相当于 C 的size_t,通常为int32或int64
5. int8字节(-128 ~ 127)
6. int1616 位整数(-32768 ~ 32767)
7. int3232 位整数(-2147483648 ~ 2147483647)
8. int6464 位整数(-9223372036854775808 ~ 9223372036854775807)
9. uint88 位无符号整数(0 ~ 255)
10. uint1616 位无符号整数(0 ~ 65535)
11. uint3232 位无符号整数(0 ~ 4294967295)
12. uint6464 位无符号整数(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 对象)

  • 数据大小

  • 字节序(小端或大端)

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

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


#类型的转换

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

a.astype(np.float64)
#结果
array([[ 1.,  2.,  3.],
       [ 3.,  2.,  4.]])
#方法二
a = np.array([[1,2,3],[3,2,4]],dtype=np.float64)
#输出结果
array([[ 1.,  2.,  3.],
       [ 3.,  2.,  4.]])

NumPy - 数组属性

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

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

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

a.shape
#输出结果
(2, 3)
#这会调整数组大小 
a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2) #输出结果array([[1, 2], [3, 4], [5, 6]])

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

a = np.array([[1,2,3],[4,5,6]]).reshape(3,2) 
#输出结果
array([[1, 2],
       [3, 4],
       [5, 6]])

ndarray.ndim 这一数组属性返回数组的维数。

a = np.array([[1,2,3],[4,5,6]])
a.ndim
#输出结果
2
#三维
a = np.arange(16).reshape(2,2,4)
a.ndim
#结果
3

numpy.itemsize 返回数组中每个元素的字节单位长度。

x = np.array(['sscss',232323,323232,4,5])  
x.itemsize
#输出结果
24

NumPy - 数组创建

numpy.empty 它创建指定形状和dtype的未初始化数组

示例

x = np.empty([2,2])
#输出结果
array([[  9.33678148e-313,   1.10343781e-312],
       [  1.12465777e-312,   1.14587773e-312]])

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

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

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

构造器接受下列参数:

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

  

#列

x = np.zeros(6).reshape(2,3)
#输出结果
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

numpy.ones 定大小,以 1 填充的新数组。

和 numpy.zeros 的参数一样

#列

x = np.ones(6).reshape(2,3)
#输出结果
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

NumPy - 来自现有数据的数组

numpy.asarray

此函数类似于numpy.array,除了它有较少的参数。 这个例程对于将 Python 序列转换为ndarray非常有用。#自我感觉和numpy.array使用方法。我是习惯用numpy.array

NumPy - 来自数值范围的数组

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

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

构造器接受下列参数:

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

#列

x = np.arange(10,20,2)  
#输出结果
array([10, 12, 14, 16, 18])

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

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的数据类型

NumPy - 来自数值范围的数组

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

numpy.arange

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

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

构造器接受下列参数:

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

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

示例 1

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

输出如下:

[0  1  2  3  4]

示例 2

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

输出如下:

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

示例 3

# 设置了起始值和终止值参数  
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. start 序列的起始值
2. stop 序列的终止值,如果endpointtrue,该值包含于序列中
3. num 要生成的等间隔样例数量,默认为50
4. endpoint 序列中是否包含stop值,默认为ture
5. retstep 如果为true,返回样例,以及连续数字之间的步长
6. dtype 输出ndarray的数据类型

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

示例


 np.linspace(1,2,5, retstep =  True)  
#输出结果
(array([ 1.  ,  1.25,  1.5 ,  1.75,  2.  ]), 0.25)

NumPy - 切片和索引

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

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

基本切片是

和列表的切片一样

#列

a = np.arange(10)
a[3:6:2]
#输出结果
 array([3, 5])

#二维和三维数组的切片和索引

#先说二维

a = np.arange(16).reshape(4,4)

a[1,:]
#输出结果
array([4, 5, 6, 7])

这里的a[1,:] 这里的逗号前面的取的是行,可以用到列表的的切片,逗号后面的是列可以根据自己的需求来取

#三维

a = np.arange(18).reshape(2,3,3)
a[1,:,:]
array([[ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]])

#这里a[1,:,:] ,这里的1 是所选的组 第二组,索引都是从0开始,第一个 :是行,第二个:是列,可以根据自己需求取

NumPy - 高级索引

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

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

#

(整数)索引

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

#列

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

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

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

x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]]) 
x[1:4,[1,2]] 
#输出结果
array([[ 4,  5],
       [ 7,  8],
       [10, 11]])

这里取的是1到4行中的1和2列

布尔索引

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

示例 1

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

x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
x[x>5]
#结果
 array([ 6,  7,  8,  9, 10, 11])
x >5
#结果
 array([[False, False, False],
       [False, False, False],
       [ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

示例 2

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

a = np.array([np.nan,  1,2,np.nan,3,4,5])  
a[~np.isnan(a)]
#输出结果
 array([ 1.,  2.,  3.,  4.,  5.])

示例 3

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

a = np.array([1,  2+6j,  5,  3.5+5j])  
a[np.iscomplex(a)]
#结果
array([ 2.0+6.j,  3.5+5.j])

如有错误欢迎指正

猜你喜欢

转载自blog.csdn.net/yang_bingo/article/details/80627475
今日推荐