(1)Python之Numpy库的使用

文章目录

  • 1 NumPy Ndarray 对象
  • 2 NumPy 数据类型
  • 3 NumPy 数组属性
  • 4 NumPy 创建数组
  • 5 NumPy 从已有的数组创建数组
  • 6 NumPy 从数值范围创建数组
  • 7 NumPy 切片和索引

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

SciPy 是一个开源的 Python 算法库和数学工具包。SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。

1 NumPy Ndarray 对象

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

ndarray 对象是用于存放同类型元素的多维数组。

ndarray 中的每个元素在内存中都有相同存储大小的区域。

ndarray 内部由以下内容组成:

  • 一个指向数据(内存或内存映射文件中的一块数据)的指针。
  • 数据类型或 dtype,描述在数组中的固定大小值的格子。
  • 一个表示数组形状(shape)的元组,表示各维度大小的元组。
  • 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。

ndarray 的内部结构:
(1)Python之Numpy库的使用_第1张图片
跨度可以是负数,这样会使数组在内存中后向移动,切片中 obj[::-1] 或 obj[:,::-1] 就是如此。

创建一个 ndarray 只需调用 NumPy 的 array 函数即可:

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

参数说明:

名称 描述
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度

实例1

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

输出结果:

[1, 2, 3]

实例2

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

输出结果:

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

实例3

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

输出结果:

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

实例4

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

输出结果:

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

2 NumPy 数据类型

常用 NumPy 基本类型:
(1)Python之Numpy库的使用_第2张图片
数据类型对象 (dtype)
数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面:

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

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

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

3 NumPy 数组属性

NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。

在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

NumPy 的数组中比较重要 ndarray 对象属性有:
(1)Python之Numpy库的使用_第3张图片
ndarray.ndim
ndarray.ndim 用于返回数组的维数,等于秩。

import numpy as np 
 
a = np.arange(24)  
print(a)
print (a.ndim)             # a 现只有一个维度
# 现在调整其大小
b = a.reshape(2,4,3)  # b 现在拥有三个维度
print(b)
print (b.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.shape
ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。

ndarray.shape 也可以用于调整数组大小。

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

输出结果为:

(2, 3)

调整数组大小

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]]

reshape 函数来调整数组大小

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

输出结果为:

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

 [[12 13 14]
  [15 16 17]
  [18 19 20]
  [21 22 23]]]
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]

 [[12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]]]

ndarray.itemsize
ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。

例如,一个元素类型为 float64 的数组 itemsiz 属性值为 8(float64 占用 64 个 bits,每个字节长度为 8,所以 64/8,占用 8 个字节),又如,一个元素类型为 complex32 的数组 item 属性为 4(32/8)。

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

输出结果为:

1
8

size和dtype

arr = np.array([[1,0,0],[0,2,0],[0,0,3]])
print(arr) 
print('数据的大小(size):',arr.size) 
print('数据的类型(type of data):',arr.dtype) 

输出结果为:

[[1 0 0]
 [0 2 0]
 [0 0 3]]
数据的大小(size): 9
数据的类型(type of data): int32

4 NumPy 创建数组

ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建。
numpy.empty
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:

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

参数说明:
(1)Python之Numpy库的使用_第4张图片

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

输出结果为:

[[844   0]
 [844   0]
 [  3   0]]

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

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

import numpy as np
 
# 默认为浮点数
x = np.zeros(5) 
print(x)
 
# 设置类型为整数
y = np.zeros((5,), dtype = np.int) 
print(y)
 
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'f2')])  
print(z)

输出结果为:

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

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

import numpy as np
 
# 默认为浮点数
x = np.ones(5) 
print(x)
 
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)

输出结果为:

[1. 1. 1. 1. 1.]
[[1 1]
 [1 1]]
print('创建单位矩阵:',np.eye(3)) 
print('创建空矩阵:',np.empty((3,4)))#实际有值
print('创建有序数列:',np.arange(20))   
print('创建有序数列,并指定范围和步长:',np.arange(10,20,2)) 
print('创建等差数列:',np.linspace(10,20,5))  #用于创建指定数量等间隔的序列,实际生成一个等差数列。
print('创建等比数列:',np.logspace(0,2,5))  #开始点和结束点是10的幂,0代表10的0次方,2代表10的2次方
print('创建等比数列:',np.logspace(1,5,5,base=2))  #想要改变基数,不让它以10为底数,可以改变base参数
print('创建随机数列:',np.random.random((2,4)))  
print('创建均匀分布的随机样本:',np.random.rand(3,2))
print('创建标准正态分布的随机样本:',np.random.randn(3,2))  
print('创建整数的随机样本:',np.random.randint(5, size=(2, 4)))
创建单位矩阵: [[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]
创建空矩阵: [[  2.12199579e-314   6.36598737e-314   1.06099790e-313   1.48539705e-313]
 [  1.90979621e-313   2.33419537e-313   2.75859453e-313   3.18299369e-313]
 [  3.60739285e-313   4.03179200e-313   4.45619116e-313   4.88059032e-313]]
创建有序数列: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
创建有序数列,并指定范围和步长: [10 12 14 16 18]
创建等差数列: [ 10.   12.5  15.   17.5  20. ]
创建等比数列: [   1.            3.16227766   10.           31.6227766   100.        ]
创建等比数列: [  2.   4.   8.  16.  32.]
创建随机数列: [[ 0.63321597  0.04509729  0.58885972  0.57665186]
 [ 0.17751284  0.83404061  0.45617162  0.69423087]]
创建均匀分布的随机样本: [[ 0.7150638   0.14111581]
 [ 0.16724618  0.76866606]
 [ 0.58339759  0.47012566]]
创建标准正态分布的随机样本: [[ 0.50611432 -0.47594534]
 [-0.56024213 -0.6939535 ]
 [-1.23815129 -0.46135415]]
创建整数的随机样本: [[1 4 3 3]
 [4 1 3 2]]

5 NumPy 从已有的数组创建数组

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

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

参数说明:
(1)Python之Numpy库的使用_第5张图片
将列表转换为 ndarray:

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

输出结果为:

[1  2  3]

将元组转换为 ndarray:

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

输出结果为:

[1  2  3]

将元组列表转换为 ndarray:

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

输出结果为:

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

设置了 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 可以是任意对象,会以流的形式读入
  • dtype 返回数组的数据类型,可选
  • count 读取的数据数量,默认为-1,读取所有数据。
  • offset 读取的起始位置,默认为0
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, count=-1)
  • iterable 可迭代对象
  • dtype 返回数组的数据类型
  • count 读取的数据数量,默认为-1,读取所有数据
 import numpy as np 
 
# 使用 range 函数创建列表对象  
list=range(5)
it=iter(list)
 
# 使用迭代器创建 ndarray 
x=np.fromiter(it, dtype=float)
print(x)

输出结果为:

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

6 NumPy 从数值范围创建数组

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

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

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

参数说明:
(1)Python之Numpy库的使用_第6张图片
生成 0 到 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)

参数说明:
(1)Python之Numpy库的使用_第7张图片

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(1,10,10).reshape([10,1])
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.]]

numpy.logspace
numpy.logspace 函数用于创建一个于等比数列。格式如下:

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

base 参数意思是取对数的时候 log 的下标。
(1)Python之Numpy库的使用_第8张图片

import numpy as np
# 默认底数是 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 :

import numpy as np
a = np.logspace(0,9,10,base=2)
print (a)

输出如下:

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

7 NumPy 切片和索引

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

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]

以上实例中,我们首先通过 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]

冒号 : 的解释:如果只放置一个参数,如 [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]

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

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]]

切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 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 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。
整数数组索引
以下实例获取数组中(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 (x)
print ('\n')
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print (y)

输出结果为:

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


[[ 0  2]
 [ 9 11]]

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

可以借助切片 : 或 … 与索引数组组合。如下面例子:

import numpy as np
 
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)

输出结果为:

[[5 6]
 [8 9]]
[[5 6]
 [8 9]]
[[2 3]
 [5 6]
 [8 9]]

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

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

以下实例获取大于 5 的元素:

import numpy as np 
 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
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]

你可能感兴趣的:((1)Python之Numpy库的使用)