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
#结果
numpy.itemsize 返回数组中每个元素的字节单位长度。
x = np.array(['sscss',232323,323232,4,5]) x.itemsize #输出结果 24
NumPy - 数组创建
numpy.empty 它创建指定形状和dtype
的未初始化数组
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
对象,包含给定范围内的等间隔值。
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()
函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长。 此函数的用法如下。
arange()
函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长。 此函数的用法如下。numpy.linspace(start, stop, num, endpoint, retstep, dtype)
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | start 序列的起始值 |
2. | stop 序列的终止值,如果endpoint 为true ,该值包含于序列中 |
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 序列的终止值,如果endpoint 为true ,该值包含于序列中 |
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])
如有错误欢迎指正