Python科学计算学习之高级数组

1.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]]

2.数组比较:

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

布尔数组:元素是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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f70cffe853f991834e45d0695b8fc419.html