python学习笔记-numpy

NumPy 教程 | 菜鸟教程

NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多。
NumPy(Numeric Python)提供了许多高级的数值编程工具。Numpy的一个重要特征是它的数组计算,是我们做数据分析必不可少的一个包。

导入Python库使用关键字import,后面可以自定义库的简称,但是一般都将NumPy命名为np,pandas命名为pd。

Numpy的数组对象及其索引

数组上的数学操作(列表的操作)

假如我们想将列表中的每个元素增加1,但列表只能这样的操作:

a = [1,2,3,4]
[i+1 for i in a]
#输出[2, 3, 4, 5]

与另一个列表相加,得到对应元素相加的结果:

a=[1,2,3,4]
b=[2,3,4,5]
[x+y for (x,y) in zip(a,b)]
a=[1,2,3,4]
b=[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])
b=np.array([2,3,4,5])
a+1
# array([2, 3, 4, 5])
a+b
# array([3, 5, 7, 9])

使用Numpy转置

import numpy as np
A = np.mat([[1,2,3],[4,5,6],[7,8,9]])
print(A.T)
print(A.swapaxes(0, 1))
# 均输出
# [[1 4 7]
#  [2 5 8]
#  [3 6 9]]
import numpy as np
A = [[1,2,3],[4,5,6],[7,8,9]]
print(np.transpose(A))
# 输出
# [[1 4 7]
#  [2 5 8]
#  [3 6 9]]

使用numpy生成0矩阵

(1). np.zeros((行数,列数))

import numpy as np
### 生成一个两行,三列的矩阵
np.zeros((2,3))
Out[2]: 
array([[0., 0., 0.],
       [0., 0., 0.]])

NumPy Ndarray 对象

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

ndarray 对象是用于存放同类型元素的多维数组。

ndarray 中的每个元素在内存中都有相同存储大小的区域。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
object数组或嵌套的数列
dtype数组元素的数据类型,可选
copy对象是否需要复制,可选
order创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok默认返回一个与基类类型一致的数组
ndmin指定生成数组的最小维度

产生数组 array

从列表产生数据

l=[0,1,2,3]
a=np.array(l)
a
#array([0, 1, 2, 3])
生成全0数组
np.zeros(5)
#array([0., 0., 0., 0., 0.])
生成全1数组   加类型后变成布尔类型的数组
np.ones(5,dtype='bool')   ##dtype定义需要的数据类型
#array([ True,  True,  True,  True,  True])

可以使用fill方法将数组设定为指定值

与列表不同,数组中要求所有元素的dtype是一样的,如果传入参数的类型与数组类型不一样,需要按照已有的类型进行转换。

a=np.array([1,2,3,4])
a.fill(2.5)   ##传入的参数类型会按照原数组类型进行转换
a #array([2, 2, 2, 2])
##使用fill方法将原数组类型改变
a=np.array([1,2,3,4])
a=a.astype('float')
a.fill(2.5)  
a  #array([2.5, 2.5, 2.5, 2.5])

生成整数序列 arange

numpy.arange(start, stop, step, dtype)
np.arange(1,10,2)  ##arange(起点,终点,步长)
# array([1, 3, 5, 7, 9])

生成等差数列 linspace

#linspace(起点,终点,个数),此处从1开始到19结束,生成10个元素
np.linspace(1,19,10)   
# array([ 1.,  3.,  5.,  7.,  9., 11., 13., 15., 17., 19.])

生成随机数 random.rand/randn

a=np.random.rand(10)  ##生成0-1的10个随机数
b=np.random.randn(10)  ##生成0-1的10个随机数,随机数服从标准正太分布
c=np.random.randint(1,10,10)  ##生成1-10的10个随机整数

数组属性

ndarray.ndim秩,即轴的数量或维度的数量
ndarray.shape数组的维度,对于矩阵,n 行 m 列
ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtypendarray 对象的元素类型
ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位
ndarray.flagsndarray 对象的内存信息
ndarray.realndarray元素的实部
ndarray.imagndarray 元素的虚部
ndarray.data包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
a=np.array([1,2,3,4])
type(a)  #查看类型
#numpy.ndarray
a.dtype  #查看数组中的数据类型
#dtype('int32')
#查看形状,会返回一个元组,每个元素代表这一堆的元素数目
a.shape
#(4,)
a.size  #查看数组里面元素的数目
#4
#查看数组的维度
a.ndim
# 1

 多维v

将以列表为元素的列表传入,最终得到的额就是一个二维数组

a=np.array([[1,2,3,4],[5,6,7,8]])
#array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
a.shape #查看形状
#(2, 4)
a.size #查看总的元素个数
# 8
a.ndim #查看维数 
#2

索引与切片

切片,支持负索引
a=np.array([11,12,13,14,15])
a[1:3]
#array([12, 13])
a[1:-2]
#array([12, 13])
省略参数
a=np.array([11,12,13,14,15])
a[-2:]
#array([14, 15])
a[::2]
array([11, 13, 15])
错位相减
b=np.array([11,25,46,58,76])
b1=b[1:] #25,46,58,76
b2=b[:-1]#11,25,46,58
b1-b2
#array([14, 21, 12, 18])

多维数组索引

对于二维数组,可以传入两个数字来索引

a=np.array([[1,2,3,4],[5,6,7,8]])
#array([[1, 2, 3, 4],
 #      [5, 6, 7, 8]])
a[1,3]  #8
索引赋值
a[1,3]=9
a  #array([[1, 2, 3, 4],
     #    [5, 6, 7, 9]])
索引一整行内容
a[1]
#array([5, 6, 7, 9])
Python会将这单个元组当成对第一堆的索引,然后返回对应的内容
行索引在逗号前,列索引在逗号后
a[:,1]  ##返回的是第二列。
#array([2, 6])

多维数组切片

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]])
#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]])
取到第一行的第4和第5两个元素 
前面为行,后面为列
a[0,3:5]
#array([3, 4])
得到最后两行的最后两列
a[-2:,-2:]
a[4:,4:]
#array([[44, 45],
#       [54, 55]])
得到第3列
a[:,2]
#array([ 2, 12, 22, 32, 42, 52])
取出3,5行的奇数列
a[2:5:2,::2]
#array([[20, 22, 24],
 #      [40, 42, 44]])

切片是引用

切片在内存中使用的是引用机制。
引用机制意味着,Python并没有为b分配新的空间来存储它的值,而实让b指向了a所分配的内存空间,因此,改变b会改变a的值。

a=np.array([0,1,2,3,4])
b=a[2:4]
b #array([2, 3])
b[0]=10
a #array([ 0,  1, 10,  3,  4])

而这种现象在列表中并不会出现

list=[1,2,3,4,5]
list1=list[2:4]
list1 #[3, 4]
list1[0]=10
list #[1, 2, 3, 4, 5]

这样的好处在于,对于很大的数据,不用大量复制多余的值,节约了空间
缺点在于,可能出现改变一个值而改变另一个值的情况。
个解决方法是使用copy()方法产生一个复制,这个复制中会申请新的内存。

a=np.array([0,1,2,3,4])
b=a[2:4].copy()
b[0]=10
a #array([0, 1, 2, 3, 4])

花式索引

切片只能支撑连续或者等间隔的切片操作,要想实现任意位置的操作,需要使用花式索引 fancy slicing

一维花式索引  与range函数类似,我们可以使用arange函数来产生等差数组

a=np.arange(0,100,10)
#array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
花式索引需要指定索引位置
index=[1,2,-3]
y=a[index]
#array([10, 20, 70])
还可以使用布尔数组来花式索引
mask=np.array([0,2,2,0,0,1,0,0,1,0],dtype=bool)
#array([False,True,True, False, False,True,False,False,True,False])
y=a[mask] 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]])
"""
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]])
"""
返回的是一条次对角线上的5个值(此处取1,12,23,34,45)
a[(0,1,2,3,4),(1,2,3,4,5)]   ##两个括号相对位置的数分别为行标和列标
#array([ 1, 12, 23, 34, 45])
返回最后三行的1,3,5列
a[-3:,0:6:2]  #a[-3:,[0,2,4]]
#array([[30, 32, 34],
#       [40, 42, 44],
#       [50, 52, 54]])
使用布尔数组进行索引
mask=np.array([1,0,1,0,1,0],dtype=bool)
a[-3:,mask]
#array([[30, 32, 34],
#       [40, 42, 44],
#       [50, 52, 54]])
与切片不同,花式索引返回的是对象的一个复制而不是引用

与切片不同,花式索引返回的是对象的一个复制而不是引用

“不完全”索引 只给定行索引的时候,返回整行

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]])
y=a[:3]
#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]])

where语句

where(array)
where函数会返回所有非零元素的索引

a=np.random.randint(1,10,10)
#array([1, 2, 3, 3, 7, 6, 7, 8, 3, 4])
np.where(a>5)
#(array([4, 5, 6, 7], dtype=int64),)
np.where(a>5,1,0)
#array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0])

一维数组

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的返回值是一个元组,返回的是索引位置
也可以直接用数组操作
a[a>10]
#array([12, 20])
a[np.where(a>10)]
#array([12, 20])

数组类型

布尔型:bool:占一个字节
整型:int8/16/32/64/128,int:和C语言的long一样大
无符号整型:uint8/16/32/64/128,uint:和C语言中的unsigned long一样大
浮点数:float16/32/64,float,longfloat:默认为双精度float64,longfloat精度大小与系统有关
复数:complex64/128,complex,longconplex:默认为complex128,即实部虚部都为双精度
字符串:string,unicode:可以使用表示一个4字节字符串的数组
对象:object:数组中可以使用任意值
时间:datetime64,timedelta64

类型转换

a=np.array([1.5,-3],dtype=int)
#array([ 1, -3])
asarray函数
a=np.array([1,2,3])
np.asarray(a,dtype=float)
#array([1., 2., 3.])
astype函数 a数组没有发生改变
##astype方法返回一个新数组
a=np.array([1,2,3])
a.astype(float)
#array([1., 2., 3.])
a=np.array([1,2,3])
b=a.astype(float)
b[0]=0.5
b #array([0.5, 2. , 3. ])
a array([1, 2, 3])
astype引用不会对原数组产生影响

NumPy内置函数

numpy 内置函数总结_老男孩-Leo的博客-CSDN博客

a=np.array([-1,2,3,-2])
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)

数组排序

sort函数

mv_num=np.array([692795,42995,327855,580897,478523,157074,306904,662552,284652,159302])
np.sort(mv_num)
#array([692795,42995,327855,580897,478523,157074,306904,662552,284652,159302])

argsort函数

argsort返回从小到大的排列在数组中的索引位置

order=np.argsort(mv_num)
order
#array([1, 5, 9, 8, 6, 2, 4, 3, 7, 0], dtype=int64)

数学操作

求和sum最大值 max均值 mean标准差 std方差 var相关系数矩阵 cov

多维数组操作

数组形状 shape

a=np.arange(6)
#array([0, 1, 2, 3, 4, 5])
#修改原数组成2行3列
a.shape=2,3
#array([[0, 1, 2],
#       [3, 4, 5]])
a.shape
#(2, 3)
与之对应的方法是reshape,但它不会改变原来数组的值,而是返回一个新的数组
a=np.arange(6)
a.reshape(2,3)
#array([[0, 1, 2],
#       [3, 4, 5]])
a #array([0, 1, 2, 3, 4, 5])

转置 T/transpose

a=np.arange(6)
a=a.reshape(2,3)
#array([[0, 1, 2],
#       [3, 4, 5]])
a.T
#array([[0, 3],
#       [1, 4],
#       [2, 5]])
a.transpose()

两种都可以将数组转置,不会改变原数组的形状   

数组连接

concatenate((a0,a1,...,an),axis=0)

axis=0代表往跨行(down),而axis=1代表跨列(across)
使用0值表示沿着每一列或行标签\索引值向下执行方法
使用1值表示沿着每一行或者列标签模向执行对应的方法

注意:这些数组要用()包括到一个元组中去。
除了给定的轴外,这些数组其他轴的长度必须是一样的

x=np.array([[0,1,2],[10,11,12]])
y=np.array([[50,51,51],[60,61,62]])
print(x.shape,y.shape)
#(2, 3) (2, 3)
默认沿着第一维进行连接
z=np.concatenate((x,y),axis=0)
"""  z
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 51],
       [60, 61, 62]])
"""
沿着第二维进行连接
z=np.concatenate((x,y),axis=1)
""" z
array([[ 0,  1,  2, 50, 51, 51],
       [10, 11, 12, 60, 61, 62]])
"""
注意到这里x和y的形状是一样的,还可以将它们连接成三维的数组,
但是concatenate不提供这样的功能,可以这样操作:
z=np.array((x,y))
"""  z
array([[[ 0,  1,  2],
        [10, 11, 12]],

       [[50, 51, 51],
        [60, 61, 62]]])
"""

事实上,NumPy提供了分别对应这三种情况的函数

vstack hstack dstack

np.vstack((x,y))
"""
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 51],
       [60, 61, 62]])
"""
np.hstack((x,y))
"""
array([[ 0,  1,  2, 50, 51, 51],
       [10, 11, 12, 60, 61, 62]])
"""
np.dstack((x,y))
"""
array([[[ 0, 50],
        [ 1, 51],
        [ 2, 51]],

       [[10, 60],
        [11, 61],
        [12, 62]]])
"""

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python学习笔记》是由皮大庆编写的一本关于Python语言学习的教材。在这本书中,作者详细介绍了Python语言的基础知识、语法规则以及常用的编程技巧。 首先,作者简要介绍了Python语言的特点和优势。他提到,Python是一种易于学习和使用的编程语言,受到了广大程序员的喜爱。Python具有简洁、清晰的语法结构,使得代码可读性极高,同时也提供了丰富的库和模块,能够快速实现各种功能。 接着,作者详细讲解了Python的基本语法。他从变量、数据类型、运算符等基础知识开始,逐步介绍了条件语句、循环控制、函数、模块等高级概念。同时,作者通过大量的示例代码和实践案例,帮助读者加深对Python编程的理解和应用。 在书中,作者还特别强调了编写规范和良好的编程习惯。他从命名规范、注释风格、代码缩进等方面指导读者如何写出清晰、可读性强的Python代码。作者认为,良好的编程习惯对于提高代码质量和提高工作效率非常重要。 此外,作者还介绍了Python的常用库和模块。他提到了一些常用的库,如Numpy、Pandas、Matplotlib等。这些库在数据处理、科学计算、可视化等领域有广泛的应用,帮助读者更好地解决实际问题。 总的来说,《Python学习笔记》是一本非常实用和全面的Python学习教材。通过学习这本书,读者可以系统地学习和掌握Python编程的基础知识和高级应用技巧,为以后的编程学习和工作打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值