Numpy的功能
在Numpy官网中介绍:
“NumPy is the fundamental package for scientific computing in Python.It is a Python library that provides a multidimensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays, including mathematical, logical, shape manipulation, sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra, basic statistical operations, random simulation and much more.”
Numpy可以进行大量掩码数组、矩阵的运算,还有大量对数组的快速的操作(包括数学、逻辑、图形操作、排序、采集、I/O、离散傅里叶转换、基础的线性代数、基本的统计操作、随机数仿真等等)
到这里,可能有读者会问:“在Python&数模——拓展库(1)大体介绍 中不是说Numpy提供了多维数组功能,但它只是一般的数组,不是矩阵,所以才有了Scipy库吗?”
听我狡辩:
numpy是有矩阵类型,但主要是基于数组实现的,功能比较有限。
就像Python本来没有数组类型,只有列表,在不讲究的情况下就用列表代替数组了。nump跟Scipy的关系与Python跟numpy 的关系有点像,就是基于前者的补充吧。所以Scipy库的安装前提是要有一个numpy库。
好像有点跑题?得得得切回正题,开始我们numpy的学习
ndarray
Numpy的核心是ndarray(N-dimensional array,N为数组)
是Numpy提供的一种存储单一数据类型的多维数组
由同质元素组成的多维数组,元素数量是事先指定好的
同质:几乎所有元素的类型和大小都相同
数组的维数和元素的数量有数组的型(shape)来确定,数组的型由N个正整数组成的元组来指定,元组的每个元素对应每一维的大小。数组的维统称为轴(axes),轴的数量被称为秩(rank)
属性 | 说明 |
---|---|
ndim | 表示数组的维数 |
shape | 表示数组的尺寸,位于n行m列的矩阵,形状为(n,m) |
size | 表示数组的元素个数,等于数组形状的乘机,即shape中的n * m |
dtype | 表述数组中元素的类型 |
itemsize | 表示数组中每个元素的大小(以字节为单位) |
特点
-
几乎所有元素的类型和大小都相同
-
数组的大小固定,数组的大小一旦指定好,就不能改变
Numpy所支持的数据类型
数据类型 | 说明 |
---|---|
bool_ | 布尔值,一个字节存储,True或False |
int_ | 默认整型(与C中long相同,通常为int32或int64) |
intc | 完全等同于C座红的int(通常为int32或int64) |
intp | 表示索引的整型 |
int8 | 8位整型 |
int16 | 16位整型 |
int32 | 32位整型 |
uint8 | 8位无符号整型 |
uint16 | 16位无符号整型 |
uint32 | 32位无符号整型 |
float_ | 浮点型 |
float16 | 16位浮点型 |
float32 | 32位浮点型 |
float64 | 64位浮点型 |
complex_ | 复数 |
complex64 | 复数,由两个32为的浮点数来表示(实数部分和虚数部分) |
complex128 | 复数,由两个64为的浮点数来表示(实数部分和虚数部分) |
数组
数组的创建
函数 | 作用 |
---|---|
array(m,n) | 生成m行n列ndarray |
zeros(m,n) | 生成m行n列零矩阵 |
ones(m,n) | 生成m行n列单位元素全是1的矩阵 |
empty(m,n,dtyp) | 生成m行n列指定类型的空矩阵 |
arange(起始值,终值,步长,dtype) | 生成确定起始值,终值,步长的指定类型的矩阵 |
linspace(起始值,终值,个数) | 生成确定起始值,终值,元素个数的指定类型的矩阵 |
random(起始,终止(m,n)) | 生成确定范围[起始,终止)的m行n列的矩阵 |
array()
-
使用array()函数:以Python列表作为参数,列表元素即是ndarray元素
numpy.array(object.dtype=None,copy=True,order=)
import numpy as np x=np.array([3,7],dtype=int)
数组名=array(参数:列表形式,dtype=数据类型)
e.g.
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
>>>a
array([[1 2 3]
[4 5 6]]
>>>type(a)
<class 'numpy.ndarray'>
>>>a.dtype
dtype('int32')
>>>a.ndim #轴数量需要使用ndim属性
2
>>>a.size #数组长度要用size属性(元素个数)
6
>>>a.shape #数组的型要用shape
(2, 3)
>>>a.itemsize #itemsize定义了每个元素的长度为几个字节
4
>>>a.data #data表示数组实际元素的缓冲区
<memory at 0x000001D74C288040>
-
也可以用array嵌套元组
c=np.array(((1,2,3),(4,5,6)))
>>>c
array([[1, 2, 3],
[4, 5, 6]])
-
或元组欲列表
d=d=np.array([(1,2,3),(4,5,6)])
>>>d
array([[1, 2, 3],
[4, 5, 6]])
-
dtype的应用
e=np.array([[1,2,3],[1,2,3]],dtype=complex) >>>e >>>array([[1.+0.j, 2.+0.j, 3.+0.j], [1.+0.j, 2.+0.j, 3.+0.j]])
numpy.reshape(m,n)
-
作用:将数组定义为一个m行n列的矩阵
import numpy as np
x=np.arange(6) #生成一个[0,1,2,3,4,5]的一维数组
y=x.reshape(2,3) #将长度尾6的一维数组改为2行,3列的二维数组
>>>x[0,1,2,3,4,5]
>>>y[[0,1,2]
[3,4,5]]
补充:当reshape后的行数量确定后,列数量也应该确定,所以可以写numpy.reshape(n,-1)或numpy.reshape(-1,n)
前者表示确定了n行;后者表示确定了n列
zeros()
numpy.zeros((m,n)) #生成m行n列的零矩阵
生成指定维度、元素均为零的数组
>>>np.zeros((2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
>>>np.zeros((2,3,4))
array([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
ones()
numpy.ones((m,n))
#生成m行n列、元素全为1的矩阵
生成指定维度、元素均为1的数组
>>>np.ones((3,4))
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
empty()
np.empty((2,3),int) #创建2*3的整型空矩阵
arange()
根据传入的参数,按照特定的规则,生成包含一个数值升序的数组
输入的参数与规则与range相似
>>>np.arange(0,10) #0表示开始值,10表示终值,[0,10);默认步长为一
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>np.arange(0,10,2)
array([0, 2, 4, 6, 8])
linspace()
import numpy as np
x=np.linspace(1,10,4)
>>>x=[1,4,7,10]
y=np.linspace(1,10,5)
>>>[ 1. 3.25 5.5 7.75 10. ]
首位、尾位分别是开始值与终值,中间的数平均分配
数组的统计
数组的累加
np.sum(arr) #对数组的某一行或列进行累加
#axis=0代表按列统计和(行运算)
#axis=1代表安航统计和(列运算)
判断元素条件
np.any()
np.all()
#当所有元素满足指定条件,返回True
import numpy as np
arr=np.random.randn(3,6)
print(arr)
print(np.any(arr>0))
print(np.all(arr<0))
>>>
import numpy as np
arr=np.random.randn(3,6)
print(arr)
print(np.any(arr>0))
print(np.all(arr<0))
数组的乘法
import numpy as np
A=np.array([[1,2,3],[4,5,6],[7,8,9]])
B=np.array([[1,2,3],[4,5,6],[7,8,9]])
C=A*B
print(A)
print(B)
print(C)
>>>A=[[1 2 3]
[4 5 6]
[7 8 9]]
>>>B=[[1 2 3]
[4 5 6]
[7 8 9]]
>>>C=[[ 1 4 9]
[16 25 36]
[49 64 81]]
元素去重排序
np.unique() #找到唯一值并返回排序结果,类似Python语言的set集合
import numpy as np
arr=np.array([[1,2,6],[2,6,8]])
print(arr)
print(np.unique(arr))
>>>
[[1 2 6]
[2 6 8]]
[1 2 6 8]
相关参数的求解
函数 | 作用 |
---|---|
amin() | 计算数组中的元素沿指定轴的最小值 |
amax() | 计算数组中的元素沿指定轴的最大值 |
ptp() | 计算元素最大值与最小值的差(最大值-最小值) |
percentile() | 小于这个值的观察值的百分比 |
median() | 计算数组中元素的中位数 |
mean() | 返回数组中元素的算数平均数 |
average() | 根据另一个数组中给出的各自的权重计算数组元素的加权平均值 |
求最值
import numpy as np
li = [[i for i in range(1, 10)] for j in range(1, 10)]
arr=np.array(li)
print('arr=',arr)
print("max=",np.amax(arr))
print("min=",np.amin(arr))
>>>
arr= [[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]]
max= 9
min= 1
ptp()
import numpy as np
li = [[i for i in range(1, 10)] for j in range(1, 10)]
arr=np.array(li)
print('arr=',arr)
print("ptp=",np.ptp(arr))
>>>
arr= [[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]]
ptp= 8
percentile()
import numpy as np
li = [[i*i for i in range(1, 10)] for j in range(1, 10)]
arr=np.array(li)
print('arr=',arr)
print("axis=1:",np.percentile(arr,50,axis=1))
print("axis=0:",np.percentile(arr,25,axis=0))
>>>
arr= [[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]
[ 1 4 9 16 25 36 49 64 81]]
axis=1: [25. 25. 25. 25. 25. 25. 25. 25. 25.]
axis=0: [ 1. 4. 9. 16. 25. 36. 49. 64. 81.]
median()
import numpy as np
li = [[1,2,3],[4,5,6],[7,8,9]]
arr=np.array(li)
print('arr=',arr)
print("medium:",np.median(arr))
>>>
arr= [[1 2 3]
[4 5 6]
[7 8 9]]
medium: 5.0
average
import numpy as np
li = [[1,2,3],[4,5,6],[7,8,9]]
arr=np.array(li)
quan=np.array(li)
print('arr=',arr)
print("average_axis=0",np.average(arr,axis=0,weights=quan))
print("average_axis=1",np.average(arr,axis=1,weights=quan))
>>>
arr= [[1 2 3]
[4 5 6]
[7 8 9]]
average_axis=0 [5.5 6.2 7. ]
average_axis=1 [2.33333333 5.13333333 8.08333333]
数组索引的使用
一般索引
用法与列表相同
布尔索引
e.g.1
from numpy import array,nan,isnan
a=array([[1, nan ,2],[4, nan ,3]])
b=a[~isnan(a)]
print('b=',b)
print('b中大于2的元素有:',b[b>2])
>>>
b= [1. 2. 4. 3.]
b中大于2的元素有: [4. 3.]
e.g.2
import numpy as np
li=[[i for i in range(10)] for j in range(10)]
for i in range(100):
x=i//10
y=i%10
li[x][y]=i
a=np.array(li)
print("array=",a)
b=a[a==2]
print("b=",b)
c=a[a==1]
print("c=",c)
>>>
array= [[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]
b= [2]
c= [1]
注意
用布尔索引搜索时条件中只能含一个元素。
如:当把b=a[a==2]改为b=a[a==2 or a==3]时,则会报错
Error: b=a[ a==2 or a==3 ] ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
元素计算函数
将小数变为整数
函数 | 作用 |
---|---|
ceil() | 向上取整 |
floor() | 向下取整 |
rint() | 四舍五入(参数是number或array) |
计算
函数 | 作用 |
---|---|
multiply() | 元素相乘(参数是number或array) |
divide() | 元素相除(参数是number或array) |
abs() | 元素的绝对值(参数是number或array) |
exp(n) | e**n |
sqrt(n) | 对n开方 |
判断元素是否是NaN
函数 | 作用 |
---|---|
isnan() | 判断元素是否为NaN(Not a Number),参数是number或array |
三元运算符
函数 | 作用 |
---|---|
where(condition,x,y) | 三元运算符,意为x if condition else y |
矩阵
矩阵的转置
矩阵.T
import numpy as np
arry=np.arange(8).reshape(2,4)
print('arry=\n',arry)
print('arry.T=\n',arry.T)
>>>
arry=
[[0 1 2 3]
[4 5 6 7]]
arry.T=
[[0 4]
[1 5]
[2 6]
[3 7]]
矩阵的拼贴
横向拼贴
np.hstack((A,B)) #
import numpy as np
A=np.array([[1,2,3],[4,5,6],[7,8,9]])
B=np.array([[1,2,3],[4,5,6],[7,8,9]])
C=np.hstack((A,B))
print(C)
>>>
[[1 2 3 1 2 3]
[4 5 6 4 5 6]
[7 8 9 7 8 9]]
纵向拼贴
np.vstack((A,B)) #
import numpy as np
A=np.array([[1,2,3],[4,5,6],[7,8,9]])
B=np.array([[1,2,3],[4,5,6],[7,8,9]])
C=np.vstack((A,B))
print(C)
>>>
[[1 2 3]
[4 5 6]
[7 8 9]
[1 2 3]
[4 5 6]
[7 8 9]]
矩阵的切割
np.hsplit(A,n) #将矩阵A横向切为n份
import numpy as np
A=np.array([[1,2,3],[4,5,6],[7,8,9]])
B=np.array([[1,2,3],[4,5,6],[7,8,9]])
C=np.hsplit(A,3)
print(C)
>>>[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]
注意:当切割分配时不能平均分(如本例中n=2),则报错
np.hsplit(A,(m,n)) #将矩阵A索引m,n 的空隙横向切开
import numpy as np
A=np.array([[1,2,3],[4,5,6],[7,8,9]])
B=np.array([[1,2,3],[4,5,6],[7,8,9]])
C=np.hsplit(A,(2,3))
print(C)
>>>[array([[1, 2],
[4, 5],
[7, 8]]), array([[3],
[6],
[9]]), array([], shape=(3, 0), dtype=int32)]
矩阵的乘法
当矩阵A、B同维,A*B=A、B中各自元素相乘
要进行矩阵乘法,得用A.dot(B)或numpy.dot(A,B)
import numpy as np
A=np.array([[1,2,3],[4,5,6],[7,8,9]])
B=np.array([[1,2,3],[4,5,6],[7,8,9]])
C=A.dot(B)
D=np.dot(A,B)
print('A=',A)
print('B=',B)
print('C=',C)
print('D=',D)
>>>A= [[1 2 3]
[4 5 6]
[7 8 9]]
>>>B= [[1 2 3]
[4 5 6]
[7 8 9]]
>>>C= [[ 30 36 42]
[ 66 81 96]
[102 126 150]]
>>>D= [[ 30 36 42]
[ 66 81 96]
[102 126 150]]
逆矩阵
np.linalg.det
numpy.linalg模块有一组标准的矩阵分解运算以及注入求逆和行列式之类的函数
inv()
其他操作
exp()
np.exp(A) #对矩阵的每个数据进行exp()操作
sqrt()
np.sqrt(A) #对矩阵的每个数据进行开方
ravel()
将矩阵重新拉伸成一个向量,拉伸后可以重新定义成一个新矩阵
import numpy as np arry=np.arange(8).reshape(2,4) print(arry) print(arry.ravel())
numpy随机数模块
numpy模块随机数分为4个部分,对应4中功能
-
简单随机数:产生简单的随机数据,可以是任何维度
-
排列:将所给对象随机排列
-
分布:产生指定分布的时间,如高斯分布等。
-
生成器:种随机数种子,根据同一种子产生的随机数是相同的