使用前一定要先导入Numpy包,导入的方法有一下几种 import numpy import numpy as np from numpy import *
import numpy as npNumpy的数组对象及其索引 数组上的数学操作 不使用Numpy
a=[1,2,3,4]#错误示例 a+1
--------------------------------------------------------------------------- TypeError Traceback (most recent call last)in 1 a=[1,2,3,4]#错误示例 ----> 2 a+1 TypeError: can only concatenate list (not "int") to list
[x+1 for x in a]#列表生成式
[2, 3, 4, 5]
b=[2,3,4,5] a+b
[1, 2, 3, 4, 2, 3, 4, 5]
[x+y for (x,y) in zip(a,b)]
[3, 5, 7, 9]使用Numpy
a=np.array([1,2,3,4]) a
array([1, 2, 3, 4])
a+1
array([2, 3, 4, 5])
a*2
array([2, 4, 6, 8])
b=np.array([2,3,4,5]) a+b
array([3, 5, 7, 9])产生数组 从列表产生数组
l=[0,1,2,3] a=np.array(l) a
array([0, 1, 2, 3])从列表传入
a=np.array([1,2,3,4]) a
array([1, 2, 3, 4])生成全0数组
np.zeros(5)
array([0., 0., 0., 0., 0.])生产全1的数组
np.ones(5,dtype='int')
array([1, 1, 1, 1, 1])
np.ones(5,dtype='bool')#布尔值 False/True
array([ True, True, True, True, True])使用fill方法将数组设为指定值
a=np.array([1,2,3,4]) a
array([1, 2, 3, 4])
a.fill(5)#使数组中每个元素都等于5 a
array([5, 5, 5, 5])与列表不同,数组要求所有元素的dtype是一样的
a.fill(2.5) a
array([2, 2, 2, 2])
a=a.astype('float')
a.fill(2.5)
a
array([2.5, 2.5, 2.5, 2.5])使用特殊的方法生成特殊的数组 生成整数序列
a=np.arange(1,10)#不包括10 a
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a=np.arange(1,10,2) a
array([1, 3, 5, 7, 9])生成等差数列
a=np.linspace(1,10,21)#包括10 a
array([ 1. , 1.45, 1.9 , 2.35, 2.8 , 3.25, 3.7 , 4.15, 4.6 ,
5.05, 5.5 , 5.95, 6.4 , 6.85, 7.3 , 7.75, 8.2 , 8.65,
9.1 , 9.55, 10. ])
生成随机数
np.random.randn(10)#服从标准正太分布的10个数
array([-0.84360213, -0.09850149, 0.10516814, 1.56758761, 0.34209712,
-1.04007494, -1.36749533, 1.87998518, 1.05424183, 0.22655412])
np.random.randint(1,10,10)#10个随机整数
array([4, 1, 9, 7, 4, 4, 7, 3, 6, 3])数组的属性 查看类型
a
array([ 1. , 1.45, 1.9 , 2.35, 2.8 , 3.25, 3.7 , 4.15, 4.6 ,
5.05, 5.5 , 5.95, 6.4 , 6.85, 7.3 , 7.75, 8.2 , 8.65,
9.1 , 9.55, 10. ])
type(a)#numpy的N维数组
numpy.ndarray查看数组中的数据类型
a.dtype
dtype('float64')
查看形状
- 会返回一个元组,每个元素代表这一维的元素数目
a.shape
(21,)查看数组里面元素的数目
a.size
21查看数组的维度
a.ndim
1索引与切片 索引第一个元素
a=np.array([0,1,2,3]) a[0]
0修改第一个元素
a[0]=10 a
array([10, 1, 2, 3])切片
- 支持负索引
a=np.array([11,12,13,14,15]) a[1:3]
array([12, 13])
a[1:-2]
array([12, 13])
a[-4:3]
array([12, 13])
a[-2:]
array([14, 15])
a[::2]
array([11, 13, 15])实例
- 一部电影的累计票房
ob=np.array([21000,21800,22300,19800,25100])#记录一部电影的累计票房 ob
array([21000, 21800, 22300, 19800, 25100])
ob2=ob[1:]-ob[:-1]#计算每天的票房 ob2
array([ 800, 500, -2500, 5300])多维数组及其属性 array可以用来生成多维数组
a=np.array([[0,1,2,3],[10,11,12,13]]) a
array([[ 0, 1, 2, 3],
[10, 11, 12, 13]])
查看形状
a.shape
(2, 4)查看总的元素个数
a.size
8查看维度
a.ndim
2多维数组的索引
a
array([[ 0, 1, 2, 3],
[10, 11, 12, 13]])
a[1,3]#1是行索引,3是列索引,中间用逗号隔开
13索引赋值
a[1,3]=-1 a
array([[ 0, 1, 2, 3],
[10, 11, 12, -1]])
a[1]#输出第二行
array([10, 11, 12, -1])
a[:,1]#输出第二列
array([ 1, 11])多维数组切片
a=np.array([[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]]) a
array([[ 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]])
a[0,3:5]#第一行第4第5两个元素
array([3, 4])
a[4:,4:]#最后两列两行
array([[44, 45],
[54, 55]])
a[:,2]#第三列
array([ 2, 12, 22, 32, 42, 52])取出第3,5行的奇数列
a[2::2,::2]
array([[20, 22, 24],
[40, 42, 44]])
切片是引用
- 切片在内存中为引用机制
a=np.array([0,1,2,3,4]) b=a[2:4] print(b)
[2 3]
b[0]=10#b的改变也导致了a的改变 a
array([ 0, 1, 10, 3, 4])列表在切片时并不是引用机制
a=[1,2,3,4,5] b=a[2:4] b[0]=10 print(a)
[1, 2, 3, 4, 5]解决方法–copy
a=np.array([0,1,2,3,4])#不会改变a的值 b=a[2:4].copy() b[0]=10 a
array([0, 1, 2, 3, 4])
- 切片只能支持连续或者等间隔的切片操作,要想实现任意位置的操作,需要使用花式索引 fancy slicing
a=np.arange(0,100,10) a
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])花式索引需要指定索引位置
index=[1,2,-3] y=a[index] print(y)
[10 20 70]还可以使用布尔数组来花式索引
- mask必须是布尔数组,长度必须和数组长度相等
mask=np.array([0,2,2,0,0,1,0,0,1,0],dtype=bool)#0为False非0为True mask
array([False, True, True, False, False, True, False, False, True,
False])
a[mask]
array([10, 20, 50, 80])二维花式索引
a=np.array([[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]]) a
array([[ 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]])
返回一条次对角线上的五个值
a[(0,1,2,3,4),(1,2,3,4,5)]
array([ 1, 12, 23, 34, 45])返回最后三行的1,3,5列
a[3:,::2]#[3:,[0,2,4]]
array([[30, 32, 34],
[40, 42, 44],
[50, 52, 54]])
mask索引
mask=np.array([1,0,1,0,0,1],dtype=bool)#1,3,5行 a[mask,2]
array([ 2, 22, 52])
- 与切片不同,花式索引返回的是原来对象的一个复制而不是引用
y=a[:3] y
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25]])
使用花式索引取出第2,3,5行
con=np.array([0,1,1,0,1,0],dtype=bool) a[con]
array([[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[40, 41, 42, 43, 44, 45]])
三维花式索引拓展
花式索引
一维数组a=np.array([0,12,5,20])判断数组中的元素是否大于10
a>10
array([False, True, False, True])数组中所有大于10的元素的索引位置
np.where(a>10)
(array([1, 3], dtype=int64),)
- 注意到where的返回值是一个元组,返回的是索引位置,索引[1,3]大于10的数也可以直接用数组操作
a[a>10]
array([12, 20])
a[np.where(a>10)]
array([12, 20])类型转换
a=np.array([1.5,-3],dtype=float) a
array([ 1.5, -3. ])asarray函数
a=np.array([1,2,3]) np.asarray(a,dtype=float)
array([1., 2., 3.])astype方法 astype方法返回一个新数组
a=np.array([1,2,3]) a.astype(float)
array([1., 2., 3.])
a
array([1, 2, 3])
b=a.astype(float) b[0]=0.5 b
array([0.5, 2. , 3. ])数组操作 多维数组操作 数组形状
a=np.arange(6) a
array([0, 1, 2, 3, 4, 5])
a.shape=2,3#shape改变数组形状 a
array([[0, 1, 2],
[3, 4, 5]])
a.shape
(2, 3)
a1=np.arange(6) a1
array([0, 1, 2, 3, 4, 5])
a1.reshape(2,3)
array([[0, 1, 2],
[3, 4, 5]])
a1
array([0, 1, 2, 3, 4, 5])
- reshape不会改变原来数组的值
a.reshape(2,3) a
array([[0, 1, 2],
[3, 4, 5]])
a.T
array([[0, 3],
[1, 4],
[2, 5]])
a.transpose()
array([[0, 3],
[1, 4],
[2, 5]])
a#本身不会变化
array([[0, 1, 2],
[3, 4, 5]])
数组连接
- 注意,这些数组要用()包括到一个元组中去。除了给定的轴外,这些数组其他轴的长度必须是一样的
x=np.array([[0,1,2],[10,11,12]]) y=np.array([[50,51,52],[60,61,62]]) print(x.shape) print(y.shape)
(2, 3) (2, 3)默认沿着第一维进行连接
z=np.concatenate((x,y)) z
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
沿着二维进行连接
z=np.concatenate((x,y),axis=1) z
array([[ 0, 1, 2, 50, 51, 52],
[10, 11, 12, 60, 61, 62]])
z=np.array((x,y)) z
array([[[ 0, 1, 2],
[10, 11, 12]],
[[50, 51, 52],
[60, 61, 62]]])
- 注意到这里x和y的形状是一样的,还可以将他们连接成三维的数组,但是concatenate不能提供这样的功能
- vstack
- hstack
- dstack
np.vstack((x,y))#纵向
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
np.hstack((x,y))#横向
array([[ 0, 1, 2, 50, 51, 52],
[10, 11, 12, 60, 61, 62]])
np.dstack((x,y))
array([[[ 0, 50],
[ 1, 51],
[ 2, 52]],
[[10, 60],
[11, 61],
[12, 62]]])
Numpy内置函数
a=np.array([-1,2,3,-2]) b=np.array([3,1,-2,0])
np.sum(a)#求和
2
a.sum()
2
np.max(a)#最大值 最小值min
3
np.mean(a)#求均值
0.5
np.std(a)#求标准差
2.0615528128088303
np.cov(a,b)#相关系数矩阵
array([[ 5.66666667, -2.66666667],
[-2.66666667, 4.33333333]])
np.abs(a)#求绝对值
array([1, 2, 3, 2])
np.exp(a)#求指数
array([ 0.36787944, 7.3890561 , 20.08553692, 0.13533528])
np.median(a)#求中值
0.5
np.cumsum(a)#累计和
array([-1, 1, 4, 2], dtype=int32)
Numpy内置函数查询
Numpy网课



