Numpy是Python的第第三方模块,用于科学计算。
1.属性
ndim 维度
shape 行数和列数
size 元素个数
列表转化为数组:
>>>import numpy as np
>>>np.array(list(range(4))) #创建数组
array([0,1,2,3])
>>>a=np.array([list(range(1,4)),list(range(2,5))]) #创建数组
>>>a
array([[1, 2, 3],
[2, 3, 4]])
>>>a.dim
2
>>>a.shape
(2,3)
>>>a.size
6
2. array的创建
- 指定数据类型
dtype
# 数据类型有几种:int64,int32,以及flaot,flaot32等,默认为int64
>>>import numpy as np
>>>a=np.array(list(range(4)),dtype=np.int(64))
>>>a.dtype
dtype('int64')
- 创建一些特殊数组
zeros
,ones
,empty
,linspace
,arange
,reshape
# 利用zeros可以创建元素全部为0的数组
>>>import numpy as np
>>>a=np.zeros((3,4)) # 创建3行4列元素全部为零的数组
>>>a
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>>>
# 利用ones 创建元素全部为1的数组
>>>b=np.ones((3,4))
>>>b
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
>>>
# empty 用来创建全空数组,元素值都接近于零(3.6版本元素直接都为零)
>>>c=np.empty((3,4))
>>>c
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>>>
# 利用arange创建连续数组,arange用法类似range
>>>d=np.arange(12).reshape(3,4) #利用arange创建连续数组并用reshape改变数组行列数
>>>d
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>>
# 利用linespace创建等差数据
>>>e=np.linespace(1,20,10) #从1到20,分10份
>>>e
array([ 1. , 3.11111111, 5.22222222, 7.33333333,
9.44444444, 11.55555556, 13.66666667, 15.77777778,
17.88888889, 20. ])
3. Numpy基础运算
- 基本运算加减乘除,幂运算以及矩阵运算
>>>import numpy as np
>>>a=np.arange(10,41,10) # 创建数组array([10, 20, 30, 40])
>>>b=np.arange(4) # 创建数组 array([0, 1, 2, 3])
>>>a-b #a,b 数组行列数相同,做减法运算
array([10, 19, 28, 37])
>>>a+b
array([10, 21, 32, 43])
>>>a*b
array([ 0, 20, 60, 120])
>>>a**b #以b数组中元素作为a数组中相应元素的幂做运算
array([ 1, 20, 900, 64000])
>>>a**2 # 简单的幂运算
array([ 100, 400, 900, 1600])
>>>np.sin(a)
array([-0.54402111, 0.91294525, -0.98803162, 0.74511316]) # 三角函数运算
>>>a<20 #对数组中的值进行逻辑判断,返回一个bool值数组
array([ True, False, False, False], dtype=bool)
>>>
# 矩阵乘法dot
>>>np.dot(a,b) #简单一维矩阵乘法
200
>>>d=np.arange(1,7).reshape(2,3)
>>>e=np.arange(2,8).reshape(3,2)
>>>np.dot(d,e) #多维矩阵相乘
array([[28, 34],
[64, 79]])
# *表示矩阵点乘,如A*B表示A点乘B矩阵
- 数组一些其他常用方法
sum()
,min()
,max()
>>>import numpy as np
>>>a=np.random.random((2,4)) #生成1以内的随机数并创建2行4列的数组
>>>a
array([[ 0.67865178, 0.82898517, 0.19739667, 0.54224819],
[ 0.74727939, 0.33392007, 0.32268768, 0.81595398]])
>>>np.sum(a)
4.4671229255139142
>>>np.min(a)
0.19739667308187692
>>>np.max(a)
0.82898516901089903
>>>
# 如果仅需要对列或者行进行上述操作,可以加入axis参数,
# axis=0表示对行进行操作,axis=1表示对列进行操作
>>>np.sum(a,axis=1)
array([ 2.24728181, 2.21984112])
- 另一些常用方法
argmin() #寻找数组中最小值的索引,支持axis参数
argmax() #寻找数组中最大值的索引,支持axis参数
mean() #求平均值
average() #也是求平均值
median() #求中位数. [1,4,5,6]中位数是4.5,平均值是4
cumsum() #累加,[1,2,3,4]结果为[1,3,6,10]
diff() #类似累差,如[1,4,5,6]结果为[3,1,1]
nonezero # 返回非零元素的坐标
sort() #排序,同样也支持axis
transpose() #转置,array.T也可以达到相同的效果
clip(array,array_min,array_max) #将矩阵中比array_min小的元素变成array_min,将矩阵中比array_max大的元素变成array_max
一些例子
>>>import numpy as np
>>>a=np.arange(12,0,-1).reshape(3,4)
>>>a
array([[12, 11, 10, 9],
[ 8, 7, 6, 5],
[ 4, 3, 2, 1]])
>>>np.argmin(a) # 最小值索引
11
>>>np.argmax(a) # 最大值索引
0
>>>np.mean(a)
6.5
>>>np.average(a)
6.5
>>>np.median(a) # 偶数个元素无中位数取中位数两边值的平均值,奇数个元素直接取中间元素的值
6.5
>>>np.cumsum(a)
array([12, 23, 33, 42, 50, 57, 63, 68, 72, 75, 77, 78]
>>>np.diff(a)
array([[-1, -1, -1],
[-1, -1, -1],
[-1, -1, -1]])
>>>np.sort(a)
array([[ 9, 10, 11, 12],
[ 5, 6, 7, 8],
[ 1, 2, 3, 4]])
>>>np.transpose(a)
array([[12, 8, 4],
[11, 7, 3],
[10, 6, 2],
[ 9, 5, 1]])
>>>a.T
array([[12, 8, 4],
[11, 7, 3],
[10, 6, 2],
[ 9, 5, 1]])
>>>np.clip(a,4,9)
array([[9, 9, 9, 9],
[8, 7, 6, 5],
[5, 5, 5, 5]])
4. 索引与切片
数组索引与字符串列表中的索引用法类似
import numpy as np
# 对于一维数组,索引与string,list一样
>>>a=np.arange(12,0,-1)
>>>a
[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>>a[1]
12
>>>
# 对于二维数组乃至多维数组索引类似与列表中嵌套列表的索引方式
>>>b=np.arange(12,0,-1).reshape(3,4)
>>>b
array([[12, 11, 10, 9],
[ 8, 7, 6, 5],
[ 4, 3, 2, 1]])
>>>b[1][1]
7
数组中的切片与列表字符串小有差别,与R语言中的矩阵相差无异
>>>b=np.arange(12,0,-1).reshape(3,4)
>>>b
array([[12, 11, 10, 9],
[ 8, 7, 6, 5],
[ 4, 3, 2, 1]])
>>>b[1,1:3] # 第二行的第一列第二列
array([7, 6])
flat
是一个数组中的迭代器,flatten()
函数进行降维操作,将多维数组降为一维数组
>>>b.flatten()
array([12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
5. 数组的合并
简单的数组合并使用vstack()
和hstack()
即可,而对于复杂的合并使用concatenate()
则更简单。
>>>import numpy as np
>>>a=np.array([1,1,1])
>>>b=np.array([2,2,2])
>>>np.vstack((a,b)) # vstack()进行纵向合并,也即堆叠
array([[1, 1, 1],
[2, 2, 2]])
>>>np.hstack(a,b) # hstack()进行横向合并
array([1, 1, 1, 2, 2, 2])
对于一维数组,无法进行转置,需要先进行一些改变
>>>import numpy as np
>>>a=np.array([1,1,1])[np.newaxis,:] # 1行3列
>>>a.shape
(1,3)
>>>b=np.array([2,2,2])[:,np.newaxis] # 3行1列
>>>b.shape
(3,1)
>>>np.vstack((b,b))
array([[2],
[2],
[2],
[2],
[2],
[2]])
要合并多个矩阵或者序列时,则用concatenate
会更方便
>>>import numpy as np
>>>a=np.array([1,1,1])[:,np.newaxis]
>>>b=np.array([2,2,2])[:,np.newaxis]
>>>np.concatenate((a,b,b,a),axis=0) # axis=0 表示按行堆叠纵向合并
array([[1],
[1],
[1],
[2],
[2],
[2],
[2],
[2],
[2],
[1],
[1],
[1]])
>>>np.concatenate((a,b,b,a),axis=1) # axis=1表示横向以增加列的方式合并
array([[1, 2, 2, 1],
[1, 2, 2, 1],
[1, 2, 2, 1]])
6. 分割
数组中常用split()
以及array_split()
进行等量以及不等量分割,分割后的部分可以采用索引的方式取出想要的部分。
>>>import numpy as np
>>>a=np.arange(12).reshape((3,4))
>>>a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>>
# 利用np.split()进行等量分割
>>>np.split(a,3,axis=0) # 将a分成几行
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
>>>np.split(a,2,axis=1) #将a按列分成2半,每部分2列
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
>>>
# 利用np.array_split()进行不等量分割
>>>np.array_split(a,3,axis=1) # 将a按列分成2,1,1三列
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
>>>np.array_split(a,2,axis=0) # 将a按行分成2,1两部分
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
其他的分割方式:np.vsplit()
和np.hsplit()
。np.vsplit()
即纵向按行分割,np.hsplit()
即横向按列分割。但是这两种分割方式都不支持不等量分割。
>>>import numpy as np
>>>a=np.arange(12).reshape((3,4))
>>>np.hsplit(a,2) # 相当于np.split(a,2,axis=1),按列分割
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
>>> np.vsplit(a,3) # 相当于np.split(a,3,axis=0),按行分成三行
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
7. 数组的copy与deep copy
数组的复制与list复制方式类似,分浅复制与深度复制,简单的复制是使几个变量指向同一个指针,因此这几个变量中的一个改变,其余的几个也会跟着改变,而deep copy方式是将一个变量的值赋给另一个变量,两者指向不同的指针,只是值相同。
>>>import numpy as np
>>>a=np.arange(4)
>>>a
array([0, 1, 2, 3])
>>>b=a
>>>c=b
>>>d=c # a,b,c,d四个变量指向同一个地址
>>>e=a.copy() # 将a的值赋给e,两者指向不同的地址
>>>a[3]=10
>>>a
array([ 0, 1, 2, 10])
>>>b
array([ 0, 1, 2, 10])
>>>e
array([0, 1, 2, 3])
奇怪的是当使用[:]
的复制方式时与列表复制出现了不同的结果,列表中的[:]与copy复制效果是相同的,而在数组中却出现了不同,数组中[:]复制的两个变量的变化仍然保持一致性
>>>import numpy as np
>>>a=np.arange(4)
>>>b=a
>>>c=a[:]
>>>d=a.copy()
>>>a[3]=10
>>>id(a)
140572616448320
>>>id(b)
140572616448320 # a,b的指针地址相同
>>>id(c)
140572616446080
>>>id(d)
140572616448640
>>>a
array([ 0, 1, 2, 10])
>>>b
array([ 0, 1, 2, 10])
>>>c
array([ 0, 1, 2, 10]) # a,c的指针地址不同,变化却是一致的
>>>d
array([0, 1, 2, 3])
网友评论