目录
1、安装NumPy库:
pip install numpy #在Anaconda中,已经安装了
2、数组属性:
ndim 数组的维数
shape 数组的形状
size 数组元素的总个数
dtype 数组中元素的数据类型
itemsize 数组中每个元素的字节数
>>>a.shape #a=np.array([0, 1, 2, 3])
(4,) #表示是一个一维数组,第一维度长度为4
3、创建数组:array([列表])或者array((元组))
也可以指定数据类型:array([列表]/(元组), dtype=数据类型) 数据类型下面将讲到
>>>a=np.array([0, 1, 2, 3])
>>>a
array([0, 1, 2, 3])
>>>type(a)
<class 'numpy.ndarray'>
>>>a[0:3]
array([0, 1, 2]) #注意没有3,前闭后开,等价于 a[:3])
>>>print(a)
[0, 1, 2, 3]
>>>type(a)
<class 'numpy.ndarray '>
>>>a[0]
0
3.1、多维数组:
array([[…这里一开始有多少个“[",第一个[划分第一个维度的不同元素
#二维数组及其切片
>>>b=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
>>>b
array([[ 0, 1, 2, 3], #b[0]
[ 4, 5, 6, 7], #b[1]
[ 8, 9, 10, 11]]) #b[2]
>>>b.shape
(3,4) #有2个维度,第一个维度长度3,第二个维度长度4
>>>b[0]
array([0,1,2,3]
>>>b[0:2] #等价于b[:2],即第一个维度从0到1
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>>b[0][1] #等价于b[0,1]
1
>>>b[:2,2:] #相当于b[0:2,2:4]
array([[2, 3],
[6, 7]])
#三维数组
>>>c=np.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]]])
>>>c
array([[[ 0, 1, 2, 3], #c[0]
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15], #c[1]
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>>c.shape
(2,3,4) #3个数字表示有3个维度,长度以此为2,3,4
>>>t.size
24 #共有24个元素
>>>t[0].shape
(3,4)
>>>c[:,:,0]
array([[ 0, 4, 8],
[12, 16, 20]])
>>>c[:,:,1]
array([[ 1, 5, 9],
[13, 17, 21]])
3.2、数据类型:
数组中数据类型必须一样
int8、uint8、int16、uint16、int32、uint32、int64、uint64
float16、 float32、 float64、 float128
complex64、complex128、complex256
bool、object、string_、unicode_
>>>a=np.array([[0,1,2,3],dtype=np.int64) #或者dtype=int64、'int64'、"np.int64"
>>>a
array([[0,1,2,3],dtype=int64)
>>>a.itemsize #每个元素所占字节数
8
>>b=np.array([1.2,3.5,5.1])
>>>b.dtype
dtype('float64') #由Python列表或元组创建时,由原来元素类型推导而来
3.3、创建特殊的数组:
np.arange(起始数字=0,结束数字,步长=1,dtype) 数字序列数组,前闭后开不包括结束数字
np.ones(shape, dtype) 全1数组,dtype可省
np.zeros(shape, dtype) 全0数组
np.eye(shape, dtype) 单位矩阵
np.linspace(start,stop,num=50,dtype) 等差数列,(始值,末值,元素个数,类型),注意包括末值
np.logspace(start,stop,num=50,base=1,dtype) 等比数列
例如:
>>>np.arange(4)
array([0,1,2,3])
>>>np.arange(0,2,0.3)
array(0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
>>>np.ones((2,3)) #省略数据类型时仍有2重括号!
array([[1., 1., 1.],
[1., 1., 1.]])
>>>np.eye(2) #用 np.eye[::-1] 可以生成反对角矩阵
array([[1., 0.],
[0., 1.]])
>>>np.eye(2,3) #不是2个括号
array([[1., 0., 0.],
[0., 1., 0.]])
>>>np.linspace(1,4,4)
array([1., 2., 3., 4.])
>>>np.logspace(1,5,5, base=2)
arrray([2., 4., 8., 16., 32.])
3.4、asarray():将列表或元组转化为数组对象
对比array与asrray:当数据原来就是ndarray对象(n维数组)时,array()会复制新副本(占内存),而asarray()则不复制副本,而是直接引用原数组(共享内存)
arraylist1=[1,1]
arr1=np.array(list1)
arr2=np.asarray(list1)
list1[0]=2 #则输出arr1和arr2时,均为[1,1]
#对比:
arr3=np.ones((1,2))
arr4=np.array(arr3)
arr5=np.asarray(arr3)
arr3[0]=2 #则输出arr4为[1,1],输出arr5为[2,1],arr5跟着arr3变化
3.5改变数组形状:reshape(shape)、resize(shape)
创建新数组reshape(shape)、改变原数组resize(shape)
>>>b=np.arange(12)
>>>b
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
#reshape #数组b没有改变形状,只是返回一个新的改变形状的数组
>>>b.reshape(3,4) #也可以:b.reshape(-1,4)、b.reshape(3,-1),允许一个维度为-1,自动计算个数
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>>b
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
#resize #原数组改变形状了,没有返回值的
>>>b.resize(3,4) #也可以b=np.arange(12).resize(3,4),但不支持像上述reshape的-1操作
>>>b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
4、加、减、乘、除
以加法为例:(乘法也是对应位相乘,不是矩阵乘法)
>>>a=np.array([0,1,2,3])
>>>b=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
>>>a+b #一维数组和多维数组相加会将一维数组扩展为多维,再对应位相加
array([[ 0, 2, 4, 6],
[ 4, 6, 8, 10],
[ 8, 10, 12, 14]])
5、数组元素间的运算:
np.sum() #计算所有元素的和 np.sum(B),返回值9,还可实现按行列求和
np.prod() #计算所有元素的乘积
np.diff() #计算数组的相邻元素之间的差
np.sqrt() #计算各元素的平方根 np.sqrt(A**)
np.exp() #计算各元素的指数值
np.abs() #取各元素的绝对值
>>>np.diff(B)
array([[-2],
[ 1]])
>>>t=np.arange(24).reshape(2,3,4) #三维数组,秩为3,与线代中的秩含义不同
>>>t #reshape(x1,x2,x3,x4...),xi分别对应axis=i
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]]])
>>>np.sum(t,axis=0)
array([[12, 14, 16, 18], #12=0+12,14=1+13,16=2+14
[20, 22, 24, 26], #axis=0就是第一个"[]"包起来的东西作为一个元素
[28, 30, 32, 34]]) #求这些元素之和
>>>np.sum(t,axis=1)
array([[12, 15, 18, 21], #12=0+4+8,15=1+5+9,18=2+6+10
[48, 51, 54, 57]])
>>>np.sum(t,axis=2)
array([[ 6, 22, 38], #6=0+1+2+3,22=4+5+6+7,38=8+9+10+11+12
[54, 70, 86]])
6、数组合并:
6.1、堆叠运算:np.stack((数组1,数组2,…),axis)
#一维数组堆叠
>>>x=np.array([1,2,3])
>>>y=np.array([4,5,6])
>>>np.stack((x,y),axis=0)
array([[1, 2, 3],
[4, 5, 6]])
#二维数组堆叠
>>>m=np.arange(9).reshape(3,3) #m=array([[0, 1, 2],[3, 4, 5],[6, 7, 8]])
>>>n=np.arange(9,18).reshape(3,3)#array([[ 9, 10, 11],[12, 13, 14],[15, 16, 17]])
>>>np.stack((m,n),axis=0) #shape:(2,3,3)
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]]])
np.stack((m,n),axis=1) #shape:(3,2,3)
Out[72]:
array([[[ 0, 1, 2],
[ 9, 10, 11]],
[[ 3, 4, 5],
[12, 13, 14]],
[[ 6, 7, 8],
[15, 16, 17]]])
>>>np.stack((m,n),axis=2) #shape:(3,3,2)
array([[[ 0, 9],
[ 1, 10],
[ 2, 11]],
[[ 3, 12],
[ 4, 13],
[ 5, 14]],
[[ 6, 15],
[ 7, 16],
[ 8, 17]]])
6.2、np.concatenate(数组,axis=0)
a=np.array([[1,2],[3,4]])
b=np.array([[5,6]]) #注意a、b维度相同
np.concatenate((a,b),axis=0)
Out[42]:
array([[1, 2],
[3, 4],
[5, 6]])
np.concatenate((a,b.T),axis=1)
Out[43]:
array([[1, 2, 5],
[3, 4, 6]])
6.3增加一个维度:np.expand_dims(数组,axis=0)
见tf.expand_dims()
7、获取numpy array 数组中指定元素的索引位置
a = np.array([1,2,3,4,5,6,6,7,6])
a==6
b = np.where(a == 6)
print('b={} shape(b)={}' .format(b,np.shape(b)))
b=(array([5, 6, 8], dtype=int64),) shape(b)=(1, 3)
b[0][2]
Out[92]: 8
8、矩阵与矩阵运算
矩阵:matrix(字符串/列表/元组/数组),其中,matrix可以简写为mat
>>>a=np.mat('1 2 3;4 5 6') #参数为字符串,各元素间用空格隔开,各行间用分号隔开,也可写为a=np.matrix(...
>>>a
matrix([[1,2,3] #或者参数为python列表:b=np.mat([1,2,3],[4,5,6]]),返回值相同
[4,5,6]])
>>>c=np.array([[1,2,3],[4,5,6]])
>>>d=np.mat(a) #参数为NumPy数组,d与a相同
9、矩阵属性:
.ndim 矩阵的维数
.shape 矩阵的形状
.size 矩阵的元素个数
.dtype 元素的数据类型
10、数组实现矩阵运算,
返回的是数组类型:
>>>A=np.array([[1,1],[0,1]])
>>>B=np.array([[2,0],[3,4]])
>>>A
array([[1, 1],
[0, 1]])
>>>B
array([[2, 0],
[3, 4]])
>>>·想·Thanks♪(・ω・)ノ #矩阵乘法:matmul(A,B)
array([[5, 4],
[3, 4]])
>>>np.transpose(A) #矩阵转置:transpose(A)
array([[1, 0],
[1, 1]])
>>>np.linalg.inv(A) #矩阵求逆:np.linalg.inv(A)
11、matrix矩阵运算:
>>>a1=np.mat([[1,1],[0,1]]) #定义a1,a2两个矩阵
>>>a2=np.mat([[2,0],[3,4]])
>>>a1*a2 #矩阵乘法:*
matrix([[5, 4],
[3, 4]])
>>>a1.T #矩阵转置:.T ,可非方阵转置
matrix([[1, 0],
[1, 1]])
>>>a1.I #矩阵求逆:.I ,是大写的i,可非方阵求逆
matrix([[ 1, -1],
[ 0, 1]])
>>>m=np.mat(np.array([[1,2,3],[4,5,6]]))
>>>m
matrix([[1,2,3],
[4,5,6]])
>>>m.I
matrix([[-0.94444444, 0.44444444],
[-0.11111111, 0.11111111],
[ 0.72222222,-0.22222222]])
>>>a1.T*a1 #矩阵乘以他的逆等于单位矩阵
matrix([[ 1, 0],
[ 0, 1]])
矩阵运算比较:用矩阵运算运算符号简单,二维数组能表示高维数组、灵活、速度快
12、随机数模块:numpy.random
np.random.rand(d0,d1,...,dn) 元素在[0,1)区间均匀分布的数组 浮点数(返回值,下同)其中d0 d1...是维度数
np.random.uniform(low,high,size) 元素在[low,high)区间均匀分布的数组 浮点数
numpy.random.randint(low,high,size) 元素在[low,high)区间均匀分布的数组 整数
np.random.randn(d0,d1,...,dn) 产生标准正态分布的数组 浮点数 其中d0 d1...是维度数
np.random.normal(low,scale,size) 产生正态分布的数组 浮点数
例如:
#创建2*3的随机数组,[0,1]内均匀分布
>>>np.random.rand(2,3)
array([[0.72550754, 0.13158811, 0.57582693],
[0.25416793, 0.28301289, 0.39419903]])
#参数为空,返回一个数字
>>>np.random.rand()
0.2734998983986443
#2*3的随机数组,[1,5]内均匀分布:
>>>np.random.uniform(1,5,(2,3))
array([[1.81097505, 1.62533782, 1.81681348],
[1.21360233, 2.84165401, 3.54578057]])
13、随机种子:用seed()设置
(仅设置一次有效),一般默认是根据系统时间生成,随机种子一样则随机数一样。不同系统随机数生成算法不一样
>>>np.random.seed(612)
>>>np.random.rand(2,3)
array([[0.14347163, 0.49589878, 0.95454587],
[0.13751674, 0.85456667, 0.42853136]]) #若seed(612)不变,则同一系统此数组值不变
>>>np.random.rand(2,3)
array([[0.36969445, 0.94758214, 0.09295099],
[0.66035565, 0.84156851, 0.90694096]]) #随机数的种子不再是612了,因而值变了
14、打乱顺序函数:shuffle(序列) 、get_state、set_state
可Python的列表和NumPy数组等等
>>>arr=np.arange(10)
>>>print(arr)
[0 1 2 3 4 5 6 7 8 9]
>>>np.random.shuffle(arr)
>>>print(arr)
[7 2 8 4 9 6 5 0 1 3]
#对于多维数组,只能打乱第一维的元素:
>>>arr2=np.arange(12).reshape(4,3)
>>>print(arr2)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
>>>np.random.shuffle(arr2)
>>>print(arr2)
[[ 0 1 2]
[ 3 4 5]
[ 9 10 11]
[ 6 7 8]]
get_state():记录下数组被打乱的操作,
set_state():接收get_state()返回的值,并进行同样的操作
import numpy as np
a = np.arange(0,10,1)
b = np.arange(10,20,1)
print(a,b)
#result:[0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19]
state = np.random.get_state()
np.random.shuffle(a)
print(a)
#result:[6 4 5 3 7 2 0 1 8 9]
np.random.set_state(state)
np.random.shuffle(b)
print(b)
#result:[16 14 15 13 17 12 10 11 18 19]
15、max(axis)
In [9]: arr1 = np.array([[1, 5, 3], [4, 2, 6]])
In [10]: arr1.max(axis=0)
Out[10]: array([4, 5, 6])
In [11]: arr1.max(axis=1)
Out[11]: array([5, 6])
In [12]: arr1.max()
Out[12]: 6
16、导入txt、jpg等的文件:
np.getfromtext(文件名,delimiter=‘分割字符’)
返回值是一个numpy数组,将文件读取出来,以分割字符划分数组的元素
numpy不能直接导入jpg,可以通过PIL来导入图片然后转换为numpy数组:
img = np.array(Image.open(“./test.jpg”))
17、交换维度:swapaxes
numpy.swapaxes(a,axis1,axis2)
In [115]: x=np.array([[1,2,3]])
In [116]: np.swapaxes(x,0,1)
Out[116]:
array([[1],
[2],
[3]])