NumPy是在1995年诞⽣的Python库Numeric的基础上建⽴起来的。
但真正促使NumPy的发⾏的是 Python的SciPy库,SciPy是2001年发⾏的⼀个类似于Matlab,Maple,Mathematica等数学计算软件的Python库,它实现⾥ ⾯的⼤多数功能
但SciPy中并没有合适的类似于Numeric中的对于基础的数据对象处理的功能。于是,SciPy的开发者将 SciPy中的⼀部分和Numeric的设计思想结合,在2005年发⾏了NumPy。
创建n维数组(矩阵)
对数组进行函数运算
数值积分
线性代数运算
傅里叶变换
随机数产生
Numpy 诞生为了弥补List的缺陷。它提供了两种基本的对象:
ndarray:全称(n-dimensional array object)是储存单⼀数据类型的多维数组。
ufunc:全称(universal function object)它是⼀种能够对数组进⾏处理的函数。
• ⼀个指向数据(内存或内存映射⽂件中的⼀块数据)的指针。
• 数据类型或 dtype,描述在数组中的固定⼤⼩值的格⼦。
一个表示数组形状(shape)的元组,表示各维度大小的元组
一个跨度元组(strdep) 其中的整数指的是为了前进到当前维度下⼀个元素需要"跨过"的字节数。
来⾃list和数据 • 特殊的创建
NumPy中的核⼼对象是ndarray。
ndarray可以看成数组,类似于matlab的向量或者矩阵。
NumPy⾥⾯所有的函数都是围绕ndarray展开的。
a=np.array([1,2,3,4])
b=np.array((5,6,7,8))
c=np.array([[1,2,3,4],[5,6,7,8]])
一维初始化
根据步长创建
a=np.array(0,1,0.1)
根据点数创建
b=np.linspace(0,1,10)
c=np.linspace(0,1,10,endpoint=False)
在Log域根据点数创建
d=np.logspace(0,2,5)
多维初始化
空数组
a=np.empty((2,3),np.int)
全零
b=np.zeros((2,4),np.int)
全一
c=np.ones((6,3),np.int)
其他值
d=np.full((6,3),np.pi)
自定义
def func(i,j):
return i % 4 + 1
e = np.fromfunction(func,(10,4))
print("e=",e)
ndarray的元素具有相同的元素类型。常用的有int(整型)float(浮点型),complex(复数型)
a=np.array([1,2,3,4].dtype=float)
print(a.dtype)
a=np.array([1,2,3,4])
print(a.dtype)
ndarray的shape属性用来获得它的形状,也可以自己指定
c=np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
print(c.shape)
a=np.array([1,2,3,4])
d=a.reshape((2,2))
• 从最后的维度存储
ls=[[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]]]
a=np.array(ls,dtype=int)
print(a)
print(a.strides)
ndarray通过切片产生一个新的数组b,b和a共享同一块数据存储空间。如果想改变这种情况,我们可以用列表对数组元素切片。或者使用copy函数
import numpy as np
a = np.arange(10)
print("a=",a)
a[2:4] = 100, 101
b = a[3:7] #浅copy
b[2] = -10 #b改变a也会改变
print("a=",a)
print("b=",b)
c = a[[3, 3, -3, 8]] #深copy
print("c=",c)
c[2] = 100 #C改变a不改变
print("a=",a)
print("c=",c)
d= a[3:7].copy() #深copy
d[2] = -99 #D改变a不改变
print("a=",a)
print("b=",b)
print("d=",d)
d= np.zeros(shape=(4))
d[:]= a[3:7]
d[2] = -99
print("a=",a)
print("b=",b)
print("d=",d.astype(int))
a= [0 1 2 3 4 5 6 7 8 9]
a= [ 0 1 100 101 4 -10 6 7 8 9]
b= [101 4 -10 6]
c= [101 101 7 8]
a= [ 0 1 100 101 4 -10 6 7 8 9]
c= [101 101 100 8]
a= [ 0 1 100 101 4 -10 6 7 8 9]
b= [101 4 -10 6]
d= [101 4 -99 6]
a= [ 0 1 100 101 4 -10 6 7 8 9]
b= [101 4 -10 6]
d= [101 4 -99 6]Process finished with exit code 0
当做切⽚的操作的时候-1代表最后的元素,-2代表倒数第⼆ 个.负索引还可以⽤作其它的时候如reshape.
import numpy as np
b = np.arange(0, 60, 10)
c = b.reshape(-1,1)
print(b[-1])
print(c[-2]) #这个打印和下个打印不一样,是一个行元素
print(c[-2,0])
50
[40]
40
C语⾔中可以通过struct关键字定义结构类型。NumPy中也 有类似的结构数组。
import numpy as np
#如何定义一个结构体
persontype = np.dtype({ 'names':['name', 'age', 'weight'],'formats':['S30','i', 'f']})
a = np.array([("Zhang", 32, 75.5), ("Wang", 24, 65.2)],dtype=persontype)
print(a[0])
ufunc是universal function的简称,它是⼀种能对数组每个 元素进⾏运算的函数。NumPy的许多ufunc函数都是⽤C语⾔ 实现的,因此它们的运算速度⾮常快。
import numpy as np
#import math
x=np.linspace(0,2*np.pi,10)
y=np.sin(x)
print(y)
[ 0.00000000e+00 6.42787610e-01 9.84807753e-01 8.66025404e-01
3.42020143e-01 -3.42020143e-01 -8.66025404e-01 -9.84807753e-01
-6.42787610e-01 -2.44929360e-16]
NumPy提供了许多ufunc函数,它们和相应的运算符运算结果 相同
>np.subtract(a,b)#减法
>np.multiply(a,b)#乘法
>np.divide(a,b) #如果两个数字都为整数,则为整数除法
>np.power(a,b) #乘方
使⽤==,>对两个数组进⾏⽐较,会返回⼀个布尔数组,每⼀ 个元素都是对应元素的⽐较结果。
> np.array([1, 2, 3]) < np.array([3, 2, 1])
array([ True, False, False], dtype=bool)
布尔运算在Numpy中也有对应的ufunc函数
Numpy提供的标准ufunc函数可以组合出复合的表达式,但是有些情况下,自己编写的则为更方便。我们可以把自己编写的函数用frompyfunc()转化成ufunc函数.
frompyfunc(func,nin,nout)
func:计算函数 nin:func()输⼊参数的个数 nout:func()输出参数的个数
import numpy as np
def num_judge(x,a): #对于一个数字如果使3或5的倍数
if x % 3 ==0:
r=0
elif x % 5 ==0:
r=0
else:
r=a
return r
x=np.linspace(0,10,11)
y=np.array([num_judge(t,2)for t in x])#列表生成式
print(y)
numb_judge = np.frompyfunc(num_judge,2,1)
y=numb_judge(x,2)
print(y)
[0 2 2 0 2 0 0 2 2 0 0]
[0 2 2 0 2 0 0 2 2 0 0]
使⽤ufunc对两个数组进⾏运算时,ufunc函数会对两个数组的 对应元素进⾏运算。如果数组的形状不相同,就会进⾏下⼴播 处理。
简⽽⾔之,就是向两个数组每⼀维度上的最⼤值靠⻬。
import numpy as np
a = np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
b = np.arange(0, 60, 10)
c = b.reshape(-1,1)
d = np.arange(0, 6)
e = c+d
print(a)
print(b)
print(c)
print(d)
print(e)
x, y = np.ogrid[:5, :5]
print(x)
print(y)
z= np.arange(4)
print(z[None, :])
print(z[:, None])
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
[ 0 10 20 30 40 50]
[[ 0]
[10]
[20]
[30]
[40]
[50]]
[0 1 2 3 4 5]
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
[[0]
[1]
[2]
[3]
[4]]
[[0 1 2 3 4]]
[[0 1 2 3]]
[[0]
[1]
[2]
[3]]Process finished with exit code 0
NumPy产⽣随机数的模块在random⾥⾯,其中有⼤量的分布⽅式。
rand: 0到1之间的随机数 normal:正态分布的随机数
randint:制定范围内的随机整数
uniform:均匀分布
randn:标准正太的随机数
poisson:泊松分布
choice:随机抽取样本
shuffle:随机打乱顺序
NumPy在均值等⽅⾯常⽤的函数如下:
sum:求和
average:加权平均值
var:方差
mean:期望
std:标准差
product:连乘积
axis,out,leepdims等特殊参数
import numpy as np
#随机数的例子
np.random.seed(42)
a = np.random.randint(0,10,size=(4,5))
print("a=",a)
print("np.sum(a, axis=1)=",np.sum(a, axis=1)) #第1维方向的数字的sum,也就是y方向的每横中数字和
print("np.sum(a, axis=0)=",np.sum(a, axis=0)) #第0维方向的数字的sum,也就是x方向的每列中数字和
print("np.sum(a,1,keepdims=True)=",np.sum(a,1,keepdims=True))
print("np.sum(a,0,keepdims=True)=",np.sum(a,0,keepdims=True))
#又有广播
#Maximum是逐点⽐较
a = np.array([1, 3, 5, 7])
b = np.array([2, 4, 6])
#b[:, None],a[None, :] 相当于reshape
print(np.maximum(a[None, :], b[:, None]))#maxinum返回两组矩阵广播计算后的结果
a= [[6 3 7 4 6]
[9 2 6 7 4]
[3 7 7 2 5]
[4 1 7 5 1]]
np.sum(a, axis=1)= [26 28 24 18]
np.sum(a, axis=0)= [22 13 27 18 16]
np.sum(a,1,keepdims=True)= [[26]
[28]
[24]
[18]]
np.sum(a,0,keepdims=True)= [[22 13 27 18 16]]
[[2 3 5 7]
[4 4 5 7]
[6 6 6 7]]
sort: 对数组进行排序会改变数组的内容,返回一个新的数组
percentile:percentile计算处于p%上的值
unique: unique有两个参数,return_index=True同时返回原始数组中的下标,return_inverse=True表示原始数据在新数组的下标
bincount:bincount()对非负整数数组中的各个元素出现的次数进行统计,返回数组中的第i个元素是整数i出现的次数。
histogram:对以为数字进行直方图统计,其参数为:
histogram(a,bins=10,range=None,weight=None)
函数返回两个一维数组,hist是每个区间的统计结果,bin_edges返回区间的边界
vstack(),hstack(),column_stack()拼接函数
import numpy as np
a1 = np.arange(1,11,2)
b1 = np.arange(5)
print(a1)
print(b1)
v1 = np.vstack((a1,b1))
h1=np.hstack((a1,b1))
c1 = np.column_stack((a1,b1))
print(v1)
print(h1)
print(c1)
[1 3 5 7 9]
[0 1 2 3 4]
[[1 3 5 7 9]
[0 1 2 3 4]]
[1 3 5 7 9 0 1 2 3 4]
[[1 0]
[3 1]
[5 2]
[7 3]
[9 4]]Process finished with exit code 0
import numpy as np
a = np.array([6, 3, 7, 4, 6, 9, 2, 6, 7, 4, 3, 7])
b = np.array([ 1, 3, 6, 9, 10])
c = np.array([2,4,6,8])
print(np.split(a, b))# 按元素位置进行分段
print(np.split(a, c))
print(np.split(a, 4))
print(np.split(a,6))
[array([6]), array([3, 7]), array([4, 6, 9]), array([2, 6, 7]), array([4]), array([3, 7])]
[array([6, 3]), array([7, 4]), array([6, 9]), array([2, 6]), array([7, 4, 3, 7])]
[array([6, 3, 7]), array([4, 6, 9]), array([2, 6, 7]), array([4, 3, 7])]
[array([6, 3]), array([7, 4]), array([6, 9]), array([2, 6]), array([7, 4]), array([3, 7])]
其它的库 • scipy • matplotlib • opencv
未完待续~