相等判断:两个浮点数组的相等判断不是直接进行。在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)) #其误差是根据相对误差界限#rtol和atol给出的
运行结果:
[2.46971243e-04 6.77622235e-05]
[2.78354596e-17 6.88850359e-17]
[False False] True
3 数组索引
(1)除去基本的切片技术(见https://www.cnblogs.com/chenzhijuan-324/p/10577513.html)可以通过组合切片和整数来索引数组。这里介绍使用布尔数组根据数组中的元素的值来访问和修改数组的一部分。注意:索引操作的结果总是一个向量。
例如:
B=array([[True,False],[False,True]])
M=array([[2,3],[1,4]])
print(M[B]) #根据布尔数组进行索引
M[B]=10,20 #用其他值来替代索引所得的值
print(M)
M[M>2]=0 #M的所有大于2的元素均被0替代
print(M)
运算结果:
[2 4]
[[10 3]
[ 1 20]]
[[0 0]
[1 0]]
(2) Where命令:
基本结构:Where(condition,a,b) 该结构将布尔数组作为条件,并返回满足条件的数组元组的索引,或者根据布尔数组中的值返回不同的值
例如:
x=linspace(-4,4,5)
print(x)
print(where(x>0,sqrt(x),0))
print(where(x>0,1,-1)) #表示若x>0,返回1,否则返回-1
a=arange(9)
b=a.reshape((3,3))
print(b)
print(where(a>5)) #返回一个元组,这个元组包含了满足条件的元素的索引。
print(where(b>5))
运行结果:
[-4. -2. 0. 2. 4.]
[0. 0. 0. 1.41421356 2. ]
[-1 -1 -1 1 1]
[[0 1 2]
[3 4 5]
[6 7 8]]
(array([6, 7, 8], dtype=int64),)
(array([2, 2, 2], dtype=int64), array([0, 1, 2], dtype=int64))