广播机制是Numpy科学计算库里非常重要的概念。运用广播机制可以高效解决不同维度数组数据之间的运算。
一、理解一些基本概念
广播机制就是两个不同形状的数组在运算时,其中一个数组需要扩展为和另一数组后缘维度相同,如果不具备扩展为后缘维度相同的条件,则抛出错误。
后缘维度是指从数组的末尾开始算起的维度
e.g:
二维数组,形状为2行6列 ,shape=(2,6),后缘维度即为6
数组运算,需要符合广播原则的才能正常运算
原则:
如果两个数组的维度不同,那么较小维度的数组会在前面补1,直到两个数组的维度相同。
如果两个数组在某个维度上的大小不同,那么其中一个数组在该维度上的大小必须为1。从后缘维度开始逐一往前比较
如果两个数组在所有维度上的大小要么相等,要么其中一个为1,则它们可以进行广播
e.g:
两个数组形状分别为(2,6),(5,6),两个数组后缘维度都为6,但2和5不同且其中任一个都不是1,故无法广播
两个数组形状分别为(2,1),(5,3),两个数组后缘维度不同,但有一个为1,那么继续往前比较,2和5不同且其中任一个都不是1,故无法广播
两个数组形状分别为(2,1),(1,3),两个数组后缘维度不同,但有一个为1,那么继续往前比较,2和1不同且其中有一个是1,故可以广播
二、索引和切片
和python中列表中的索引和切片完全一致的理解
高维数组的索引使用: a[i,x,y]
i,x,y分别是每个轴上对应的下标值,其中切片时,可以使用p:q来取某个轴上的部分
e.g:
二维数组
取值3时,则a[0,2]
切片a[0:2,1:3] 0轴上切0-1行,1轴上切1-2列
三、广播常用方法函数
1、筛选 numpy.where(codition,x,y)
condition是布尔类型的表达式或者数组
x,condition为真时返回的数组,可选
y,condition为假时返回的数组,可选
根据条件,where()最后返回索引的数组或者x或者y组成的数组
e.g:
a = np.arange(12)
n = np.where(a>3)
n返回的是数组a元素大于3的索引值组成的数组
也可以用作数据替换清洗
a = np.arange(12)
n = np.where(a>3,10,0)
2、检查 numpy.any() /numpy.all()
any() 检查数组中是否至少有一个TRUE
all() 检查数组中是否全部为TRUE
a = np.array([0,1,0])
print(a.any())
print(np.any(a))
print(np.all(a))
print(np.any(a == 1))
3、排序sorted()/sort()/argsort()
sorted() 是公共库里的函数,直接传数组对象进行排序,返回新数组
xx.sort() 是数组对象的方法,直接对原数组排序
a = np.array([0,1,0])
b = sorted(a) #函数返回新数组
a.sort() #直接在原数组进行排序
numpy.argsort(a, axis=-1, kind='quicksort', order=None)
argsort()函数返回的是数组元素排序后的索引,而不是排序后的数组本身
numpy.argsort(a, axis=-1, kind='quicksort', order=None)
# a:要排序的数组
# axis :指定沿着哪个轴进行排序。默认是-1,表示对最后一个轴进行排序。
# kind :排序算法的选择,可以是'quicksor'、'mergesort'或'heapsort'。默认是'quicksort.kind
# order:如果a是结构体数组,该参数指定按哪个字段进行排序。
e.g:
a = np.array([0,1,0])
b = np.argsort(a)
print(b) #b为排序后索引组成的数组
4、去重unique
a = np.array([0,1,0])
print(np.unique(a))
5、包含 isin
numpy.isin(element, test elements, assume unique=False, invert=False)