score[i, j]
二维数组i,j都从0开始score[5] = [85, 72, 61, 92, 80]
score[2,5] = [[85, 72, 61, 92, 80],[85, 72, 61, 92, 80]]
score[30,5] = [[85, 72, 61, 92, 80],
...
[85, 72, 61, 92, 80]]
描述数组的维度,以及各个唯独内部的元素个数。(n0,n1,...,ni,...nm)
shape:(30,5)#这是一个二维数组,形状是一个元组,使用一个小括号括起来,第一个数字30表示在第一个维度中有30个元素,第二个数字5表示在第二个维度中有5个元素,形状(30,5)表示这是一个30*5的二维矩阵
score[5] = [85, 72, 61, 92, 80]#对于这个一维数组,维度是1,形状中应该只有一个数字,数组中有5个数字,所以长度是5
shape:(5,)#形状是5,逗号','表示这是一个元组
例子:对于一个10个班级,30个同学,10科成绩来说
score[i,j,k] = [...]
shape:(10,30,5)
pip install numpy
常用方式
使用的时候必须加前缀
import numpy as np#会起一个别名np
from numpy import *
array([列表]/(元组))
例子:创建一维数组的例子
>>>a = np.array([0,1,2,3])
>>>a#直接输出数组名可以看到数组的定义
array([0, 1, 2, 3])
>>>print(a)#使用print()函数输出数组中的元素
[0,1,2,3]
>>>type(a)#使用type()函数可以得到a的类型
<class 'numpy.ndarray'>#是一个ndarry对象
>>>a[0]#使用索引访问numpy中的对象
0
>>>print(a[1],a[2],a[3])#使用print()函数输出指定的元素
1 2 3
>>>a[ 0:3 ]#和列表类似,也可以使用切片
array([0,1,2])
>>>a[ :3 ]
array([0,1,2])
>>>a[ 0: ]
array([0,1,2,3])
属性 | 描述 |
---|---|
ndim | 数组的维数 |
shape | 数组的形状 |
size | 数组元素的总个数 |
dtype | 数组中元素的数据类型 |
itemsize | 数组中每个元素的字节数 |
拿刚才建立的数组当例子:
>>>a = np.array([0,1,2,3])
>>>a#直接输出数组名可以看到数组的定义
array([0, 1, 2, 3])
>>>a.ndim
1
>>>a.shape
(4,)
>>>a.size
4
>>>b = np.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]])
>>> b[0]
array([0, 1, 2, 3])
>>> b[0][0]#和双下标有同样的效果
0
>>> b[0,1]
1
>>> b.ndim#维数
2
>>> b.shape#形状
(3, 4)
>>> b.size#大小
12
>>> t = 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]]])
>>> t
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]]])
#对三维数组的使用
>>> t[0]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> t[0][0]
array([0, 1, 2, 3])
>>> t[0][0][0]
0
>>> t[0][0][0]
0
#三维数组中的信息
>>> t.ndim
3
>>> t.shape
(2, 3, 4)
>>> t.size
24
#三维数组中的二维数组的信息
>>> t[0].ndim
2
>>> t[0].shape
(3, 4)
>>> t[0].size
12
array([列表]/(元组),dtype = numpy.数据类型)
一维数组例子:
>>> a = np.array([0,1,2,3],dtype = np.int64)
>>> a
array([0, 1, 2, 3], dtype=int64)
>>> a.dtype#a的类型
dtype('int64')
>>> a.itemsize#a的每个元素中的字节数
8
二维数组浮点数例子:
直接创建浮点数数组
>>> c = np.array([1.2,3.5,5.1])
>>> c.dtype
dtype('float64')
>>> c.itemsize
8
函数 | 功能描述 |
---|---|
np.arange() | 创建数字序列数组 |
np.ones() | 创建全1数组 |
np.zeros() | 创建全0数组 |
np.eye() | 创建单位矩阵 |
np.linspace() | 创建等差数列 |
np.logspace() | 创建等比数列 |
np.arange(起始数字,结束数字,步长,dtyoe=数据类型)
>>> np.arange(4)
array([0, 1, 2, 3])
>>> d = np.arange(0, 2, 0.3)
>>> d
array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
np.ones(shape,dtype=数据类型)#数据类型可以省略
>>> np.ones((3,2),dtype=np.int16)
array([[1, 1],
[1, 1],
[1, 1]], dtype=int16)
>>> np.ones((3,2))
array([[1., 1.],
[1., 1.],
[1., 1.]])
np.zeros(shape,dtype=数据类型)#dtype可以省略
>>> np.zeros((2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
np.eye(shape)#这里shape只需要写内容,不需要再有一个()
>>> np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
>>> np.eye(2,3)
array([[1., 0., 0.],
[0., 1., 0.]])
no.linspace(start,stop,num=50)
#开始数字
#结束数字
#元素个数
>>> np.linspace(1,10,10)
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
np.logspace(start,stop,num=50,base=10)
#起始指数
#终止指数
#元素个数
#基
#生成数组的第一个值是 基的起始指数次方;
#生成数组的最后一个值是 基的终止指数次方
>>> np.logspace(1,5,5,base=2)
array([ 2., 4., 8., 16., 32.])
>>> np.logspace(1,5,5,2)
array([1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05])
>>> import numpy as np
>>> list1=[[1,1,1],[1,1,1],[1,1,1]]
>>> arr1=np.array(list1)
>>> arr2=np.asarray(list1)
>>>
>>> list1[0][0] = 3
>>> print('list1:\n',list1)
list1:
[[3, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> print('arr1:\n',arr1)
arr1:
[[1 1 1]
[1 1 1]
[1 1 1]]
>>> print('arr2:\n',arr2)
arr2:
[[1 1 1]
[1 1 1]
[1 1 1]]
例子2:修改列表时,不会影响数组中的值
import numpy as np
arr1=np.ones((3,3))
arr2=np.array(arr1)
arr3=np.asarray(arr1)
arr1[0][0] = 3
print('arr1:\n',arr1)
print('arr2:\n',arr2)
print('arr3:\n',arr3)
例子2输出结果为:
arr1:
[[3. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
arr2:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
arr3:
[[3. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
使用数组记得导入numpy库
定义一个二维数组
>>> import NumPy as np
Traceback (most recent call last):
ModuleNotFoundError: No module named 'NumPy'
>>> b = np.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]])
对一个维度进行切片
>>> b[0]
array([0, 1, 2, 3])
>>> b[0:2]
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> b[:2]
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
对两个维度同时进行切片
>>> b[0:2,0:2]
array([[0, 1],
[4, 5]])
>>> b[0:2,1:3]
array([[1, 2],
[5, 6]])
>>> b[:,0]
array([0, 4, 8])#这里是一个向量,也就是一个一行三列的数组,而不是三行一列的数组
>>> t = 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]]])
>>> t
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]]])
>>> t[:,:,0]
array([[ 0, 4, 8],
[12, 16, 20]])
>>> t[:,:,1]
array([[ 1, 5, 9],
[13, 17, 21]])
函数 | 功能描述 |
---|---|
np.reshape(shape) | 不改变当前数组,按照shape创建新的数组 |
np.resize(shape) | 改变当前数组,按照shape创建数组 |
例子:
#定义一个十二个数的序列
>>> b = np.arange(12)
>>> b
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
#使用reshape()函数按照shape创建新的数组,没有改变当前数组b
>>> b.reshape(3,4)
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()函数按照shape改变了当前数组b
>>> b.resize(3,4)
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> b = np.arange(12)
>>> b
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> b.reshape(2,5)#这里由于2*5等于10≠12,所以会出现错误提示
Traceback (most recent call last):
File "" , line 1, in <module>
ValueError: cannot reshape array of size 12 into shape (2,5)
>>> b = np.arange(12)
>>> b.reshape(3,4)
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])
>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
创建三维数组的例子
>>> t = np.arange(24).reshape(2,3,4)
>>> t
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.reshape(shape)#可以把shape中某一个维度的值设置为-1
例如
>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> b.reshape(-1,1)#-1表示系统自动计算
array([[ 0],
[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10],
[11]])#这不是一维数组,而是一个12*1的二维数组
#使用reshape函数把上述12*1的二维数组改变为一维数组
>>> b.reshape(-1)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> a = np.array([0,1,2,3])
>>> d = np.array([2,3,4,5])
>>> a+d
array([2, 4, 6, 8])
>>> 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]])
幂运算:对数组中的每个元素求n次方
>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> b **2
array([[ 0, 1, 4, 9],
[ 16, 25, 36, 49],
[ 64, 81, 100, 121]], dtype=int32)
二维数组就是矩阵,是一种非常常用的数据组织形式
>>> A = np.array([[1,1],[0,1]])
>>> B = np.array([[2,0],[3,4]])
>>> C = A * B
>>> C
array([[2, 0],
[0, 4]])
使用NumPy库中的matmul()
函数和dot()
函数
>>> np.matmul(A,B)
array([[5, 4],
[3, 4]])
>>> np.dot(A,B)
array([[5, 4],
[3, 4]])
>>> 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]])
#对A、B分别求转置
>>> np.transpose(A)
array([[1, 0],
[1, 1]])
>>> np.transpose(B)
array([[2, 3],
[0, 4]])
#对A、B分别求逆
>>> np.linalg.inv(A)
array([[ 1., -1.],
[ 0., 1.]])
>>> np.linalg.inv(B)
array([[ 0.5 , 0. ],
[-0.375, 0.25 ]])
函数 | 功能描述 |
---|---|
numpy.sum() | 计算所有元素的和 |
numpy.prod() | 计算所有元素的乘积 |
numpy.diff() | 计算数组的相邻元素之间的差 |
np.sqrt() | 计算各元素的平方根 |
np.exp() | 计算各元素的指数值 |
np.abs() | 取各元素的绝对值 |
#对一维数组求和
>>> a = np.arange(4)
>>> a
array([0, 1, 2, 3])
>>> np.sum(a)
6
#对二维数组求和
>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.sum(b)
66
sum(A,axis=v)
函数,数字0代表着最高维,与reshaple()函数成(0,1,2)的对应关系先来看一维数组,形状是shape:(4,),轴等于0,对它使用sum()函数,就是把这个轴上的四个元素相加,相加后的结果中这个轴就消失了,收缩成了一个点,从一位数组变成了一个数字
对于二维数组,第一个维度维度上轴等于0,第二个维度上轴等于1,当执行如下代码轴等于0时,应该是将这个轴上所有三个元素相加,相加后这个元素就消失了,得到的四个数字就是结果,是一个一维数组;当执行数字等于1时,将行上的数字相加;
对于三维数组,轴从小到大对应着高维到低维
用法和sum()函数一摸一样
>>> d = np.logspace(1,4,4,base=2)
>>> d
array([ 2., 4., 8., 16.])
>>> np.sqrt(d)
array([1.41421356, 2. , 2.82842712, 4. ])
将一些低维组成高维数组,使用函数np.stack()
语法如下:
np.stack((数组1,数组2,...),axis)
#参数的第一部分是待堆叠的数组
#参数的第二部分是指定堆叠时使用的轴
>>> x = np.array([1,2,3]) #创建一维数组x
>>> y = np.array([4,5,6]) #创建一维数组y
>>> x
array([1, 2, 3])
>>> y
array([4, 5, 6])
>>> np.stack((x,y),axis=0) #首先在轴=0上堆叠
array([[1, 2, 3],
[4, 5, 6]])
>>> np.stack((x,y),axis=1) #首先在轴=1上堆叠
array([[1, 4],
[2, 5],
[3, 6]])
>>> m = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> n = np.array([[10,20,30],[40,50,60],[70,80,90]])
>>> m
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> n
array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
>>> m.shape
(3, 3)
>>> n.shape
(3, 3)
>>> np.stack((m,n),axis=0).shape#在轴0上堆叠
(2, 3, 3)
>>> np.stack((m,n),axis=1).shape#在轴1上堆叠
(3, 2, 3)
>>> np.stack((m,n),axis=2).shape#在轴2上堆叠
(3, 3, 2)
上节回顾:
matrix(字符串/列表/元组/数组)
mat(字符串/列表/元组/数组)#简写
创建矩阵两种方式的例子
>>> a = np.mat('1 2 3;4 5 6')
>>> a
matrix([[1, 2, 3],
[4, 5, 6]])
>>> b = np.mat([[1,2,3],[4,5,6]])
>>> b
matrix([[1, 2, 3],
[4, 5, 6]])
借助NumPy二维数组创建矩阵
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> m = np.mat(a)
>>> m
matrix([[1, 2, 3],
[4, 5, 6]])
>>> type(a)
<class 'numpy.ndarray'>
>>> type(m)
<class 'numpy.matrix'>
属性 | 说明 |
---|---|
.ndim | 矩阵的维数 |
.shape | 矩阵的形状 |
.size | 矩阵的元素个数 |
.dtype | 元素的数据类型 |
>>> m
matrix([[1, 2, 3],
[4, 5, 6]])
>>> m.ndim
2
>>> m.dtype
dtype('int32')
>>> m.shape
(2, 3)
>>> m.size
6
>>> a1 = np.mat([[0,1],[2,3]])
>>> a2 = np.mat([[1,1],[2,0]])
>>> a1
matrix([[0, 1],
[2, 3]])
>>> a2
matrix([[1, 1],
[2, 0]])
>>> a3 = a1 * a2
>>> a3
matrix([[2, 0],
[8, 2]])
.T
.I
>>> n = np.mat([[1,2],[-1,-3]])
>>> n
matrix([[ 1, 2],
[-1, -3]])
>>> n.T
matrix([[ 1, -1],
[ 2, -3]])
>>> n.I
matrix([[ 3., 2.],
[-1., -1.]])
>>> n*n.I
matrix([[1., 0.],
[0., 1.]])
也可以
>>> a = np.array([[1,2,3],[4,5,6]])
>>> m = np.mat(a)
>>> m
matrix([[1, 2, 3],
[4, 5, 6]])
>>> m.T
matrix([[1, 4],
[2, 5],
[3, 6]])
>>> m.I
matrix([[-0.94444444, 0.44444444],
[-0.11111111, 0.11111111],
[ 0.72222222, -0.22222222]])
>>> m*m.I
matrix([[ 1.0000000e+00, -4.4408921e-16],
[ 0.0000000e+00, 1.0000000e+00]])
函数 | 功能描述 | 返回值 |
---|---|---|
np.random.rand(d0,d1,…,dn) | 元素在[0,1]区间均匀分布的数组;d0~dn是数组形状 | 浮点数;参数空返回一个数字; |
np.random.uniform(low,hige,size) | 元素在[low,hige)区间均匀分布的数组;size是数组的形状 | 浮点数 |
numpy.random.randint(low,hige,size) | 元素在[low,hige)区间均匀分布的数组 | 整数 |
np.random.randn(d0,d1,…,dn) | 产生标准正态分布的数组 | 浮点数 |
np.random.normal(loc,scale,size) | 产生正态分布的数组;loc是均值;scale是标准差 | 浮点数 |
例如:
创建2*3的随机数组,取值是在[0,1]之间均匀分布的浮点数
参数为空,返回一个数字
# 创建2*3的随机数组,取值是在[0,1]之间均匀分布的浮点数
>>> np.random.rand(2,3)
array([[0.86141698, 0.6138186 , 0.06648614],
[0.03880645, 0.13625046, 0.37195718]])
#参数为空,返回一个数字
>>> np.random.rand()
0.8324939573755401
再例如:
创建3*2的随机数组,取值是在1至5之间均匀分布的浮点数
#创建3*2的随机数组,取值是在1至5之间均匀分布的浮点数
>>> np.random.uniform(1,5,(3,2))
array([[2.6016163 , 2.12817905],
[4.82779385, 4.04064114],
[1.89608031, 4.7236666 ]])
再如
创建2*3的随机数组,取值是在1至5之间的均匀分布的整数
# 创建2*3的随机数组,取值是在1至5之间的均匀分布的整数
>>> np.random.randint(1,5,(3,2))
array([[3, 1],
[4, 4],
[1, 2]])
创建2*3的随机数组,符合标准正态分布
#创建2*3的随机数组,符合标准正态分布
>>> np.random.randn(2,3)
array([[ 0.47533113, 1.74033136, -0.92451441],
[-0.7392184 , 2.92768514, -0.1467677 ]])
创建3*2的随机数组,符合正态分布,均值为0,方差为1
#创建3*2的随机数组,符合正态分布,均值为0,方差为1
>>> np.random.normal(0,1,(3,2))
array([[-1.27922759, -0.49258568],
[ 1.10361138, 0.44144055],
[ 1.92877588, -0.38763335]])
对于随机数,同样的语句执行有不同的结果
>>> np.random.rand(2,3)
array([[0.14347163, 0.49589878, 0.95454587],
[0.13751674, 0.85456667, 0.42853136]])
>>> np.random.seed(612)
>>> np.random.rand(2,3)# 这两次产生的随机数是一样的
array([[0.14347163, 0.49589878, 0.95454587],
[0.13751674, 0.85456667, 0.42853136]])
>>> np.random.rand(2,3)
array([[0.36969445, 0.94758214, 0.09295099],
[0.66035565, 0.84156851, 0.90694096]])
np.random.shuffle(序列/python列表/数组)
例如:
>>> 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]
>>> b = np.arange(12).reshape(4,3)
>>> b
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> np.random.shuffle(b)
>>> b
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 9, 10, 11],
[ 6, 7, 8]])