Python的Numpy库介绍与实践

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表示索引的整型
int88位整型
int1616位整型
int3232位整型
uint88位无符号整型
uint1616位无符号整型
uint3232位无符号整型
float_浮点型
float1616位浮点型
float3232位浮点型
float6464位浮点型
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中功能

  • 简单随机数:产生简单的随机数据,可以是任何维度

  • 排列:将所给对象随机排列

  • 分布:产生指定分布的时间,如高斯分布等。

  • 生成器:种随机数种子,根据同一种子产生的随机数是相同的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值