设为首页 加入收藏

TOP

Python科学计算学习之高级数组(一)
2019-04-01 00:08:47 】 浏览:199
Tags:Python 科学 算学 习之 级数

1.1视图:就是与较大数组共享相同数据的较小数组。Numpy包提供数据视图的概念是为了精确地控制内存的使用方式。  数组视图、切片视图、转置和重塑视图等


数组视图实例:


from numpy import*


M=array([[1.,2.],[3.,4.]])


v=M[0,:]    #切片是数组的视图(切片视图),它与M享有相同的数据。


print(v)


v[-1]=0


print(v)


print(M)       #注意:如果修改vM也会同时被修改


print(v.base)       #数组的属性base能够访问拥有数据的对象,若数组拥有本身的数据,


#则其属性base的值为none


print(v.base is M)


print(M.base)


运行结果:


[1. 2.]


[1. 0.]


[[1. 0.]


 [3. 4.]]


[[1. 0.]


 [3. 4.]]


True


None


切片视图:只有基本切片(主要为带冒号的索引表达式)将返回视图,而任何高级切片(如使用布尔值的切片)都将返回数据的副本。


例如:


a=arange(4)


b=a[[2,3]]      #索引是一个列表[2,3],b是数组


print(b)


print(b.base is None)      #数据被复制,b是数组


c=a[1:3]                


print(c)


print(c.base is None)      


M=M[:]


print(M)


补充:Numpy的试图与副本:


 视图是数据的一个别称或引用,通过该别称或引用亦便访问、操作原有数据,但是原有数据不会产生拷贝。如果对视图进行修改,他就会影响到原有数据(原有数据同时被修改),物理内存在同一位置。


副本: 是对一个数据的完整拷贝,如果对副本进行修改,它不会影响到原有数据,物理地址不存在同一个位置。


具体分为:


① 无复制:简单的复制不会创建数组对象的副本。它使用原始数据的相同id()来访问它。Id()返回python对象的通用标识符,类似于C中的指针。


一个数组的任何变化都反映在另一个数组上。例如,一个数组的形状改变另一个数组的形状。


② 视图或者浅复制Numpy拥有ndarray.view()方法,是一个新的数组对象,并且可查看原始数组的相同数据。新数组的维数更改不会更改原始数据的维数。


实例:


from numpy import*                      


a=arange(6).reshape(3,2)


print(a)


b=a.view()


print(b)


c=b.reshape(2,3)


print(c)


print(a.shape)      #注意:数组b(新视图)的维数改变不影响原始数据的维数


print(id(a))


print(id(b))         #两个数组的id不变


运行结果:


[[0 1]


 [2 3]


 [4 5]]


[[0 1]


 [2 3]


 [4 5]]


[[0 1 2]


 [3 4 5]]


(3, 2)


144810752


144810112


③ 深复制(副本)ndarray.copy()函数创建一个深层副本。是数组及其数据的完整副本,不与原始数据共享。


实例:import numpy as np


a = np.array([[10,10],  [2,3],  [4,5]])  


print  ('数组 a')  


print (a)


print  ('创建 a 的深层副本:' )


b = a.copy()  


print  ('数组 b' )


print (b)


# b a 不共享任何内容  


print  ('我们能够写入 b 来写入 a 吗?' )


print (b is a )


print  ('修改 b 的内容:')


b[0,0]  =  100  


print  ('修改后的数组 b')  


print (b)


print  ('a 保持不变:')  


print (a)


运算结果:


数组 a


[[10 10]


 [ 2  3]


 [ 4  5]]


创建 a 的深层副本:


数组 b


[[10 10]


 [ 2  3]


 [ 4  5]]


我们能够写入 b 来写入 a 吗?


False


修改 b 的内容:


修改后的数组 b


[[100  10]


 [  2   3]


 [  4   5]]


a 保持不变:


[[10 10]


 [ 2  3]


 [ 4  5]]


  数组比较是为了检查两个矩阵是否彼此接近。


布尔数组:元素是bool类型的数组。任何作用于数组的比较运算都将创建一个布尔数组,而不是布尔值。


例如:M=array([[2.,3.],[1.,4.]])


print(M>2)       #数组的比较运算创建了布尔数组


运行结果为:[[False  True]


               [False  True]]


注意:在条件语句中不能直接使用数组比较,应使用allany方法。


例:


M=array([[2.,3.],[1.,4.]])


N=array([[1.,2.],[3.,3.]])


print(M==N)     #返回布尔数组


print((M==N).all())


print((M!=N).any())     #返回Ture


if (abs(N-M)<1e-10).all():     #abs()函数返回数字的绝对值


print("The two arrays are close enough")        


运行结果:[[False False]


           [False False]]


False


True


相等判断:两个浮点数组的相等判断不是直接进行。在Numpy中用allclose()函数来判断,该函数判断了两个到达精度的数组是否相等。


因为两个浮点数可能无限接近而不相等。


例如:


data=random.rand(2)*1e-3      #random.rand()生成随机数组


small_error=random.rand(2)*1e-16


print(data)


print(small_error)


print(data==data+small_error)


print(allclose(data,data+small_error,rtol=1.e-5,atol=1.e-8)) &

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python基础之数组和向量化计算总结 下一篇Python基础教程之Python数据分析..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目