NumPy库003布尔索引、替换值、广播机制
1、布尔索引
结果是生成一个新数组,根据条件来判断,新数组的元素都是True或False
import numpy as np
a1=np.arange(24).reshape((4,6))
print(a1>10)
'''
[[False False False False False False]
[False False False False False True]
[ True True True True True True]
[ True True True True True True]]
'''
print(a1[a1>10])
#[11 12 13 14 15 16 17 18 19 20 21 22 23]
print(a1[(a1>10) |(a1<5)])
#[ 0 1 2 3 4 11 12 13 14 15 16 17 18 19 20 21 22 23]
2、数组值的替换
- 通过切片索引直接替换
- 通过条件索引来替换
- 通过函数来实现(生成新数组)
import numpy as np
a=np.zeros((3,3))
print(a)
'''
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]'''
#1通过索引切片实现
a[1]=[1,1,1]
print(a)
'''
[[0. 0. 0.]
[1. 1. 1.]
[0. 0. 0.]]
'''
a[2,2]=99
print(a)
'''
[[ 0. 0. 0.]
[ 1. 1. 1.]
[ 0. 0. 99.]]
'''
#2通过条件来实现
a2=np.random.randint(0,20,size=(3,4))
print(a2)
'''[[ 5 17 17 11]
[ 6 9 5 18]
[ 8 15 14 3]]
'''
a2[a2<10]=0
print(a2)
'''[[ 0 17 17 11]
[ 0 0 0 18]
[ 0 15 14 0]]'''
#3通过函数来替换
a3=np.arange(24).reshape((4,6))
print(a3)
'''[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]'''
a4=np.where(a3<10,0,1)#把a3中元素小于10的变成0,其余变成1
print(a4)
'''[[0 0 0 0 0 0]
[0 0 0 0 1 1]
[1 1 1 1 1 1]
[1 1 1 1 1 1]]'''
a5=np.where(a3<10)
print(a5)
# (array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1], dtype=int64), array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3], dtype=int64))
#这个就是符合where条件的索引
3、数组的广播机制
-
数组与数的运算
数组的每个元素与数进行运算
import numpy as np a=np.random.randint(0,5,size=(3,3)) print(a) '''[[4 3 1] [4 1 0] [4 4 0]]''' print(a*2) '''[[8 6 2] [8 2 0] [8 8 0]]''' # 原数组并没有发生改变哟
-
数组与数组的运算
-
shape一致
一一对应相运算
import numpy as np a1=np.random.randint(0,5,size=(3,3)) print(a1) '''[[2 4 3] [1 0 2] [3 3 1]]''' a2=np.random.randint(0,10,size=(3,3)) print(a2) '''[[8 3 2] [9 5 9] [2 9 5]]''' print(a1+a2) '''[[10 7 5] [10 5 11] [ 5 12 6]]''' print(a1*a2) '''[[16 12 6] [ 9 0 18] [ 6 27 5]]'''
-
shape不一致
不能通过广播方式进行计算。但是!
如果行数相同,其中一个数组只有一列。(3,1)和(3,8)
或者列数相同,其中一个数组只有一行(1,3)和(8,3),则可以进行运算
import numpy as np a1=np.random.randint(0,10,size=(3,1)) a2=np.random.randint(0,10,size=(3,4)) print(a1) ''' [[4] [1] [9]]''' print(a2) '''[[4 6 7 9] [4 9 3 5] [3 8 2 5]]''' print(a1+a2) ''' [[ 8 10 11 13] [ 5 10 4 6] [12 17 11 14]]''' print(a1*a2) '''[[16 24 28 36] [ 4 9 3 5] [27 72 18 45]] ''' a3=np.random.randint(0,10,size=(1,2)) a4=np.random.randint(0,10,size=(3,2)) print(a3) '''[[0 8]]''' print(a4) '''[[1 6] [2 0] [1 8]]''' print(a3+a4) '''[[ 1 14] [ 2 8] [ 1 16]]''' print(a3*a4) '''[[ 0 48] [ 0 0] [ 0 64]]'''
-
广播原则:
如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其 中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
shape 为 (3,8,2) 的数组能和 (8,3) 的数组不能进行运算
shape 为 (3,8,2) 的数组能和 (8,1) 的数组能进行运算
shape 为 (3,1,8) 的数组能和 (8,1) 的数组能进行运算
import numpy as np
a1=np.random.randint(0,10,size=(3,4,2))
a2=np.random.randint(0,10,size=(4,2))
print(a1)
'''[[[8 6]
[2 2]
[0 2]
[3 3]]
[[4 4]
[1 1]
[1 6]
[7 4]]
[[8 9]
[5 4]
[3 0]
[3 0]]]'''
print(a2)
'''
[[4 0]
[8 1]
[1 2]
[6 7]]'''
print(a1+a2)
'''
[[[12 6]
[10 3]
[ 1 4]
[ 9 10]]
[[ 8 4]
[ 9 2]
[ 2 8]
[13 11]]
[[12 9]
[13 5]
[ 4 2]
[ 9 7]]]'''
a3=np.random.randint(0,10,size=(3,4,2))
a4=np.random.randint(0,10,size=(4,1))
print(a3)
'''
[[[3 8]
[9 5]
[4 2]
[6 5]]
[[9 3]
[6 8]
[0 2]
[2 3]]
[[3 2]
[5 4]
[8 5]
[1 8]]]'''
print(a4)
'''
[[8]
[0]
[0]
[5]]'''
print(a3+a4)
'''
[[[11 16]
[ 9 5]
[ 4 2]
[11 10]]
[[17 11]
[ 6 8]
[ 0 2]
[ 7 8]]
[[11 10]
[ 5 4]
[ 8 5]
[ 6 13]]]'''
a5=np.random.randint(0,10,size=(3,1,4))
a6=np.random.randint(0,10,size=(3,4,1))
print(a5)
'''
[[[3 8 6 5]]
[[4 3 2 9]]
[[6 1 3 9]]]'''
print(a6)
'''
[[[4]
[3]
[5]
[2]]
[[0]
[1]
[6]
[2]]
[[9]
[7]
[0]
[3]]]'''
print(a5+a6)
'''
[[[ 7 12 10 9]
[ 6 11 9 8]
[ 8 13 11 10]
[ 5 10 8 7]]
[[ 4 3 2 9]
[ 5 4 3 10]
[10 9 8 15]
[ 6 5 4 11]]
[[15 10 12 18]
[13 8 10 16]
[ 6 1 3 9]
[ 9 4 6 12]]]'''