栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Numpy学习笔记

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Numpy学习笔记

 
使用前一定要先导入Numpy包,导入的方法有一下几种 
import numpy 
import numpy as np 
from numpy import * 
import numpy as np
Numpy的数组对象及其索引 数组上的数学操作 不使用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不能提供这样的功能
Numpy提供的对应上述三种情况的函数
  • 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网课

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326286.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号