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) #注意:如果修改v,M也会同时被修改
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]]
注意:在条件语句中不能直接使用数组比较,应使用all和any方法。
例:
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